From 017e46212e1d67ecdafd39cc4da26b9d3d66a8ce Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2024 13:52:36 +0000 Subject: [PATCH] Deploy to GitHub pages --- 404.html | 21 +++++ CNAME | 1 + assets/app.2_UJsjMp.js | 1 + .../chunks/@localSearchIndexja-jp.CBrievQI.js | 1 + .../chunks/@localSearchIndexpt-br.DTBAfdU-.js | 1 + .../chunks/@localSearchIndexroot.C13dwPVu.js | 1 + .../@localSearchIndexzh-hans.BveK1egn.js | 1 + assets/chunks/VPLocalSearchBox.DzFCX21k.js | 7 ++ assets/chunks/framework.C9NVOr0y.js | 18 ++++ assets/chunks/theme.BQKOjM6g.js | 2 + assets/contribute_core.md.BABeyVan.js | 38 ++++++++ assets/contribute_core.md.BABeyVan.lean.js | 38 ++++++++ .../contribute_documentation.md.BYyBOKz0.js | 42 +++++++++ ...ntribute_documentation.md.BYyBOKz0.lean.js | 42 +++++++++ ...tribute_first-party-plugins.md.CpFWKmHh.js | 1 + ...te_first-party-plugins.md.CpFWKmHh.lean.js | 1 + .../contribute_github-actions.md.CA9Mkw8-.js | 1 + ...tribute_github-actions.md.CA9Mkw8-.lean.js | 1 + assets/guide_getting-started.md.C3BDv6cZ.js | 13 +++ .../guide_getting-started.md.C3BDv6cZ.lean.js | 13 +++ assets/guide_introduction.md.D7TZl5Xp.js | 1 + assets/guide_introduction.md.D7TZl5Xp.lean.js | 1 + assets/index.md.CX4EfemI.js | 1 + assets/index.md.CX4EfemI.lean.js | 1 + .../inter-italic-cyrillic-ext.r48I6akx.woff2 | Bin 0 -> 43112 bytes assets/inter-italic-cyrillic.By2_1cv3.woff2 | Bin 0 -> 31300 bytes assets/inter-italic-greek-ext.1u6EdAuj.woff2 | Bin 0 -> 17404 bytes assets/inter-italic-greek.DJ8dCoTZ.woff2 | Bin 0 -> 32564 bytes assets/inter-italic-latin-ext.CN1xVJS-.woff2 | Bin 0 -> 120840 bytes assets/inter-italic-latin.C2AdPX0b.woff2 | Bin 0 -> 74784 bytes assets/inter-italic-vietnamese.BSbpV94h.woff2 | Bin 0 -> 14884 bytes .../inter-roman-cyrillic-ext.BBPuwvHQ.woff2 | Bin 0 -> 40488 bytes assets/inter-roman-cyrillic.C5lxZ8CY.woff2 | Bin 0 -> 29164 bytes assets/inter-roman-greek-ext.CqjqNYQ-.woff2 | Bin 0 -> 16272 bytes assets/inter-roman-greek.BBVDIX6e.woff2 | Bin 0 -> 29920 bytes assets/inter-roman-latin-ext.4ZJIpNVo.woff2 | Bin 0 -> 110160 bytes assets/inter-roman-latin.Di8DUHzh.woff2 | Bin 0 -> 67792 bytes assets/inter-roman-vietnamese.BjW4sHH5.woff2 | Bin 0 -> 14072 bytes assets/ja-jp_contribute_core.md.Dl6llQ1K.js | 31 ++++++ .../ja-jp_contribute_core.md.Dl6llQ1K.lean.js | 31 ++++++ ...jp_contribute_documentation.md.DFrK7QhV.js | 42 +++++++++ ...ntribute_documentation.md.DFrK7QhV.lean.js | 42 +++++++++ ...tribute_first-party-plugins.md.C-K_bFJd.js | 1 + ...te_first-party-plugins.md.C-K_bFJd.lean.js | 1 + ...p_contribute_github-actions.md.vwGbnpnK.js | 1 + ...tribute_github-actions.md.vwGbnpnK.lean.js | 1 + ...ja-jp_guide_getting-started.md.BOrg7Hf7.js | 13 +++ ..._guide_getting-started.md.BOrg7Hf7.lean.js | 13 +++ .../ja-jp_guide_introduction.md.BiCZxaSp.js | 1 + ...-jp_guide_introduction.md.BiCZxaSp.lean.js | 1 + assets/ja-jp_index.md.Nw2yHZ3B.js | 1 + assets/ja-jp_index.md.Nw2yHZ3B.lean.js | 1 + assets/ja-jp_manage_commands.md.VPBtL-Un.js | 66 +++++++++++++ .../ja-jp_manage_commands.md.VPBtL-Un.lean.js | 66 +++++++++++++ .../ja-jp_manage_configuration.md.BoE7Ge6N.js | 9 ++ ...p_manage_configuration.md.BoE7Ge6N.lean.js | 9 ++ assets/ja-jp_manage_core.md.B1eqmXXm.js | 18 ++++ assets/ja-jp_manage_core.md.B1eqmXXm.lean.js | 18 ++++ assets/ja-jp_manage_plugins.md.Cbru-sBo.js | 11 +++ .../ja-jp_manage_plugins.md.Cbru-sBo.lean.js | 11 +++ assets/ja-jp_manage_versions.md.Dxk0G51J.js | 30 ++++++ .../ja-jp_manage_versions.md.Dxk0G51J.lean.js | 30 ++++++ ...-jp_more_community-projects.md.Drt5Trip.js | 1 + ...ore_community-projects.md.Drt5Trip.lean.js | 1 + assets/ja-jp_more_faq.md.DWV2Lkfg.js | 1 + assets/ja-jp_more_faq.md.DWV2Lkfg.lean.js | 1 + assets/ja-jp_more_thanks.md.DgZpeSyP.js | 1 + assets/ja-jp_more_thanks.md.DgZpeSyP.lean.js | 1 + assets/ja-jp_plugins_create.md.CF7Jmvco.js | 35 +++++++ .../ja-jp_plugins_create.md.CF7Jmvco.lean.js | 35 +++++++ assets/manage_commands.md.BSbw1HQ9.js | 66 +++++++++++++ assets/manage_commands.md.BSbw1HQ9.lean.js | 66 +++++++++++++ assets/manage_configuration.md.BTxM-Kga.js | 9 ++ .../manage_configuration.md.BTxM-Kga.lean.js | 9 ++ assets/manage_core.md.BUHLaRG4.js | 18 ++++ assets/manage_core.md.BUHLaRG4.lean.js | 18 ++++ assets/manage_plugins.md.BOsG6k4O.js | 11 +++ assets/manage_plugins.md.BOsG6k4O.lean.js | 11 +++ assets/manage_versions.md.CAp-N8AZ.js | 30 ++++++ assets/manage_versions.md.CAp-N8AZ.lean.js | 30 ++++++ assets/more_community-projects.md.B9Jb3CEv.js | 1 + ...ore_community-projects.md.B9Jb3CEv.lean.js | 1 + assets/more_faq.md.BjmX8xoH.js | 1 + assets/more_faq.md.BjmX8xoH.lean.js | 1 + assets/more_thanks.md.C4xnnmzS.js | 1 + assets/more_thanks.md.C4xnnmzS.lean.js | 1 + assets/plugins_create.md.Ba4Peca-.js | 35 +++++++ assets/plugins_create.md.Ba4Peca-.lean.js | 35 +++++++ assets/pt-br_contribute_core.md.BB7joZcW.js | 25 +++++ .../pt-br_contribute_core.md.BB7joZcW.lean.js | 25 +++++ ...br_contribute_documentation.md.D_CeZJ9y.js | 29 ++++++ ...ntribute_documentation.md.D_CeZJ9y.lean.js | 29 ++++++ ...tribute_first-party-plugins.md.TUKlMnR4.js | 1 + ...te_first-party-plugins.md.TUKlMnR4.lean.js | 1 + ...r_contribute_github-actions.md.BpD2TMaX.js | 1 + ...tribute_github-actions.md.BpD2TMaX.lean.js | 1 + ...pt-br_guide_getting-started.md.Bxtluukf.js | 13 +++ ..._guide_getting-started.md.Bxtluukf.lean.js | 13 +++ .../pt-br_guide_introduction.md.C231JBSG.js | 1 + ...-br_guide_introduction.md.C231JBSG.lean.js | 1 + assets/pt-br_index.md.B18T-HnP.js | 1 + assets/pt-br_index.md.B18T-HnP.lean.js | 1 + assets/pt-br_manage_commands.md.C9u0wbDc.js | 66 +++++++++++++ .../pt-br_manage_commands.md.C9u0wbDc.lean.js | 66 +++++++++++++ .../pt-br_manage_configuration.md.Bo5UByU1.js | 1 + ...r_manage_configuration.md.Bo5UByU1.lean.js | 1 + assets/pt-br_manage_core.md.CTnvZ9A5.js | 18 ++++ assets/pt-br_manage_core.md.CTnvZ9A5.lean.js | 18 ++++ assets/pt-br_manage_plugins.md.CuNF9gHf.js | 11 +++ .../pt-br_manage_plugins.md.CuNF9gHf.lean.js | 11 +++ assets/pt-br_manage_versions.md.Ctc109hL.js | 30 ++++++ .../pt-br_manage_versions.md.Ctc109hL.lean.js | 30 ++++++ ...-br_more_community-projects.md.C3m600b2.js | 1 + ...ore_community-projects.md.C3m600b2.lean.js | 1 + assets/pt-br_more_faq.md.Bch3gpm2.js | 1 + assets/pt-br_more_faq.md.Bch3gpm2.lean.js | 1 + assets/pt-br_more_thanks.md.BziNXVH9.js | 1 + assets/pt-br_more_thanks.md.BziNXVH9.lean.js | 1 + assets/pt-br_plugins_create.md.CnPY6mOB.js | 35 +++++++ .../pt-br_plugins_create.md.CnPY6mOB.lean.js | 35 +++++++ assets/style.p0L2iRKi.css | 1 + assets/zh-hans_contribute_core.md.oF4_zk5Q.js | 25 +++++ ...h-hans_contribute_core.md.oF4_zk5Q.lean.js | 25 +++++ ...ns_contribute_documentation.md.DL3_2XKG.js | 29 ++++++ ...ntribute_documentation.md.DL3_2XKG.lean.js | 29 ++++++ ...tribute_first-party-plugins.md.CaobaPwV.js | 1 + ...te_first-party-plugins.md.CaobaPwV.lean.js | 1 + ...s_contribute_github-actions.md.BMOvSElT.js | 1 + ...tribute_github-actions.md.BMOvSElT.lean.js | 1 + ...-hans_guide_getting-started.md.neLGUZQV.js | 13 +++ ..._guide_getting-started.md.neLGUZQV.lean.js | 13 +++ .../zh-hans_guide_introduction.md.4qLfdOnh.js | 1 + ...ans_guide_introduction.md.4qLfdOnh.lean.js | 1 + assets/zh-hans_index.md.DQ8VBECv.js | 1 + assets/zh-hans_index.md.DQ8VBECv.lean.js | 1 + assets/zh-hans_manage_commands.md.BJVPpY77.js | 66 +++++++++++++ ...h-hans_manage_commands.md.BJVPpY77.lean.js | 66 +++++++++++++ ...h-hans_manage_configuration.md.DckznVe9.js | 9 ++ ...s_manage_configuration.md.DckznVe9.lean.js | 9 ++ assets/zh-hans_manage_core.md._3uzcWzu.js | 18 ++++ .../zh-hans_manage_core.md._3uzcWzu.lean.js | 18 ++++ assets/zh-hans_manage_plugins.md.DY_Xuyjn.js | 11 +++ ...zh-hans_manage_plugins.md.DY_Xuyjn.lean.js | 11 +++ assets/zh-hans_manage_versions.md.BOLJYZ7r.js | 30 ++++++ ...h-hans_manage_versions.md.BOLJYZ7r.lean.js | 30 ++++++ ...ans_more_community-projects.md.yE4Odlba.js | 1 + ...ore_community-projects.md.yE4Odlba.lean.js | 1 + assets/zh-hans_more_faq.md.CgpfvsMk.js | 1 + assets/zh-hans_more_faq.md.CgpfvsMk.lean.js | 1 + assets/zh-hans_more_thanks.md.Dyz87Q2k.js | 1 + .../zh-hans_more_thanks.md.Dyz87Q2k.lean.js | 1 + assets/zh-hans_plugins_create.md.P38AmJ4g.js | 35 +++++++ ...zh-hans_plugins_create.md.P38AmJ4g.lean.js | 35 +++++++ contribute/core.html | 61 ++++++++++++ contribute/documentation.html | 65 +++++++++++++ contribute/first-party-plugins.html | 24 +++++ contribute/github-actions.html | 24 +++++ guide/getting-started.html | 36 +++++++ guide/introduction.html | 24 +++++ hashmap.json | 1 + index.html | 24 +++++ ja-jp/contribute/core.html | 54 +++++++++++ ja-jp/contribute/documentation.html | 65 +++++++++++++ ja-jp/contribute/first-party-plugins.html | 24 +++++ ja-jp/contribute/github-actions.html | 24 +++++ ja-jp/guide/getting-started.html | 36 +++++++ ja-jp/guide/introduction.html | 24 +++++ ja-jp/index.html | 24 +++++ ja-jp/manage/commands.html | 89 ++++++++++++++++++ ja-jp/manage/configuration.html | 32 +++++++ ja-jp/manage/core.html | 41 ++++++++ ja-jp/manage/plugins.html | 34 +++++++ ja-jp/manage/versions.html | 53 +++++++++++ ja-jp/more/community-projects.html | 24 +++++ ja-jp/more/faq.html | 24 +++++ ja-jp/more/thanks.html | 24 +++++ ja-jp/plugins/create.html | 82 ++++++++++++++++ manage/commands.html | 89 ++++++++++++++++++ manage/configuration.html | 32 +++++++ manage/core.html | 41 ++++++++ manage/plugins.html | 34 +++++++ manage/versions.html | 53 +++++++++++ more/community-projects.html | 24 +++++ more/faq.html | 24 +++++ more/thanks.html | 24 +++++ plugins/create.html | 82 ++++++++++++++++ pt-br/contribute/core.html | 48 ++++++++++ pt-br/contribute/documentation.html | 52 ++++++++++ pt-br/contribute/first-party-plugins.html | 24 +++++ pt-br/contribute/github-actions.html | 24 +++++ pt-br/guide/getting-started.html | 36 +++++++ pt-br/guide/introduction.html | 24 +++++ pt-br/index.html | 24 +++++ pt-br/manage/commands.html | 89 ++++++++++++++++++ pt-br/manage/configuration.html | 25 +++++ pt-br/manage/core.html | 41 ++++++++ pt-br/manage/plugins.html | 34 +++++++ pt-br/manage/versions.html | 53 +++++++++++ pt-br/more/community-projects.html | 24 +++++ pt-br/more/faq.html | 24 +++++ pt-br/more/thanks.html | 24 +++++ pt-br/plugins/create.html | 58 ++++++++++++ zh-hans/contribute/core.html | 48 ++++++++++ zh-hans/contribute/documentation.html | 52 ++++++++++ zh-hans/contribute/first-party-plugins.html | 24 +++++ zh-hans/contribute/github-actions.html | 24 +++++ zh-hans/guide/getting-started.html | 36 +++++++ zh-hans/guide/introduction.html | 24 +++++ zh-hans/index.html | 24 +++++ zh-hans/manage/commands.html | 89 ++++++++++++++++++ zh-hans/manage/configuration.html | 32 +++++++ zh-hans/manage/core.html | 41 ++++++++ zh-hans/manage/plugins.html | 34 +++++++ zh-hans/manage/versions.html | 53 +++++++++++ zh-hans/more/community-projects.html | 24 +++++ zh-hans/more/faq.html | 24 +++++ zh-hans/more/thanks.html | 24 +++++ zh-hans/plugins/create.html | 58 ++++++++++++ 218 files changed, 4604 insertions(+) create mode 100644 404.html create mode 100644 CNAME create mode 100644 assets/app.2_UJsjMp.js create mode 100644 assets/chunks/@localSearchIndexja-jp.CBrievQI.js create mode 100644 assets/chunks/@localSearchIndexpt-br.DTBAfdU-.js create mode 100644 assets/chunks/@localSearchIndexroot.C13dwPVu.js create mode 100644 assets/chunks/@localSearchIndexzh-hans.BveK1egn.js create mode 100644 assets/chunks/VPLocalSearchBox.DzFCX21k.js create mode 100644 assets/chunks/framework.C9NVOr0y.js create mode 100644 assets/chunks/theme.BQKOjM6g.js create mode 100644 assets/contribute_core.md.BABeyVan.js create mode 100644 assets/contribute_core.md.BABeyVan.lean.js create mode 100644 assets/contribute_documentation.md.BYyBOKz0.js create mode 100644 assets/contribute_documentation.md.BYyBOKz0.lean.js create mode 100644 assets/contribute_first-party-plugins.md.CpFWKmHh.js create mode 100644 assets/contribute_first-party-plugins.md.CpFWKmHh.lean.js create mode 100644 assets/contribute_github-actions.md.CA9Mkw8-.js create mode 100644 assets/contribute_github-actions.md.CA9Mkw8-.lean.js create mode 100644 assets/guide_getting-started.md.C3BDv6cZ.js create mode 100644 assets/guide_getting-started.md.C3BDv6cZ.lean.js create mode 100644 assets/guide_introduction.md.D7TZl5Xp.js create mode 100644 assets/guide_introduction.md.D7TZl5Xp.lean.js create mode 100644 assets/index.md.CX4EfemI.js create mode 100644 assets/index.md.CX4EfemI.lean.js create mode 100644 assets/inter-italic-cyrillic-ext.r48I6akx.woff2 create mode 100644 assets/inter-italic-cyrillic.By2_1cv3.woff2 create mode 100644 assets/inter-italic-greek-ext.1u6EdAuj.woff2 create mode 100644 assets/inter-italic-greek.DJ8dCoTZ.woff2 create mode 100644 assets/inter-italic-latin-ext.CN1xVJS-.woff2 create mode 100644 assets/inter-italic-latin.C2AdPX0b.woff2 create mode 100644 assets/inter-italic-vietnamese.BSbpV94h.woff2 create mode 100644 assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 create mode 100644 assets/inter-roman-cyrillic.C5lxZ8CY.woff2 create mode 100644 assets/inter-roman-greek-ext.CqjqNYQ-.woff2 create mode 100644 assets/inter-roman-greek.BBVDIX6e.woff2 create mode 100644 assets/inter-roman-latin-ext.4ZJIpNVo.woff2 create mode 100644 assets/inter-roman-latin.Di8DUHzh.woff2 create mode 100644 assets/inter-roman-vietnamese.BjW4sHH5.woff2 create mode 100644 assets/ja-jp_contribute_core.md.Dl6llQ1K.js create mode 100644 assets/ja-jp_contribute_core.md.Dl6llQ1K.lean.js create mode 100644 assets/ja-jp_contribute_documentation.md.DFrK7QhV.js create mode 100644 assets/ja-jp_contribute_documentation.md.DFrK7QhV.lean.js create mode 100644 assets/ja-jp_contribute_first-party-plugins.md.C-K_bFJd.js create mode 100644 assets/ja-jp_contribute_first-party-plugins.md.C-K_bFJd.lean.js create mode 100644 assets/ja-jp_contribute_github-actions.md.vwGbnpnK.js create mode 100644 assets/ja-jp_contribute_github-actions.md.vwGbnpnK.lean.js create mode 100644 assets/ja-jp_guide_getting-started.md.BOrg7Hf7.js create mode 100644 assets/ja-jp_guide_getting-started.md.BOrg7Hf7.lean.js create mode 100644 assets/ja-jp_guide_introduction.md.BiCZxaSp.js create mode 100644 assets/ja-jp_guide_introduction.md.BiCZxaSp.lean.js create mode 100644 assets/ja-jp_index.md.Nw2yHZ3B.js create mode 100644 assets/ja-jp_index.md.Nw2yHZ3B.lean.js create mode 100644 assets/ja-jp_manage_commands.md.VPBtL-Un.js create mode 100644 assets/ja-jp_manage_commands.md.VPBtL-Un.lean.js create mode 100644 assets/ja-jp_manage_configuration.md.BoE7Ge6N.js create mode 100644 assets/ja-jp_manage_configuration.md.BoE7Ge6N.lean.js create mode 100644 assets/ja-jp_manage_core.md.B1eqmXXm.js create mode 100644 assets/ja-jp_manage_core.md.B1eqmXXm.lean.js create mode 100644 assets/ja-jp_manage_plugins.md.Cbru-sBo.js create mode 100644 assets/ja-jp_manage_plugins.md.Cbru-sBo.lean.js create mode 100644 assets/ja-jp_manage_versions.md.Dxk0G51J.js create mode 100644 assets/ja-jp_manage_versions.md.Dxk0G51J.lean.js create mode 100644 assets/ja-jp_more_community-projects.md.Drt5Trip.js create mode 100644 assets/ja-jp_more_community-projects.md.Drt5Trip.lean.js create mode 100644 assets/ja-jp_more_faq.md.DWV2Lkfg.js create mode 100644 assets/ja-jp_more_faq.md.DWV2Lkfg.lean.js create mode 100644 assets/ja-jp_more_thanks.md.DgZpeSyP.js create mode 100644 assets/ja-jp_more_thanks.md.DgZpeSyP.lean.js create mode 100644 assets/ja-jp_plugins_create.md.CF7Jmvco.js create mode 100644 assets/ja-jp_plugins_create.md.CF7Jmvco.lean.js create mode 100644 assets/manage_commands.md.BSbw1HQ9.js create mode 100644 assets/manage_commands.md.BSbw1HQ9.lean.js create mode 100644 assets/manage_configuration.md.BTxM-Kga.js create mode 100644 assets/manage_configuration.md.BTxM-Kga.lean.js create mode 100644 assets/manage_core.md.BUHLaRG4.js create mode 100644 assets/manage_core.md.BUHLaRG4.lean.js create mode 100644 assets/manage_plugins.md.BOsG6k4O.js create mode 100644 assets/manage_plugins.md.BOsG6k4O.lean.js create mode 100644 assets/manage_versions.md.CAp-N8AZ.js create mode 100644 assets/manage_versions.md.CAp-N8AZ.lean.js create mode 100644 assets/more_community-projects.md.B9Jb3CEv.js create mode 100644 assets/more_community-projects.md.B9Jb3CEv.lean.js create mode 100644 assets/more_faq.md.BjmX8xoH.js create mode 100644 assets/more_faq.md.BjmX8xoH.lean.js create mode 100644 assets/more_thanks.md.C4xnnmzS.js create mode 100644 assets/more_thanks.md.C4xnnmzS.lean.js create mode 100644 assets/plugins_create.md.Ba4Peca-.js create mode 100644 assets/plugins_create.md.Ba4Peca-.lean.js create mode 100644 assets/pt-br_contribute_core.md.BB7joZcW.js create mode 100644 assets/pt-br_contribute_core.md.BB7joZcW.lean.js create mode 100644 assets/pt-br_contribute_documentation.md.D_CeZJ9y.js create mode 100644 assets/pt-br_contribute_documentation.md.D_CeZJ9y.lean.js create mode 100644 assets/pt-br_contribute_first-party-plugins.md.TUKlMnR4.js create mode 100644 assets/pt-br_contribute_first-party-plugins.md.TUKlMnR4.lean.js create mode 100644 assets/pt-br_contribute_github-actions.md.BpD2TMaX.js create mode 100644 assets/pt-br_contribute_github-actions.md.BpD2TMaX.lean.js create mode 100644 assets/pt-br_guide_getting-started.md.Bxtluukf.js create mode 100644 assets/pt-br_guide_getting-started.md.Bxtluukf.lean.js create mode 100644 assets/pt-br_guide_introduction.md.C231JBSG.js create mode 100644 assets/pt-br_guide_introduction.md.C231JBSG.lean.js create mode 100644 assets/pt-br_index.md.B18T-HnP.js create mode 100644 assets/pt-br_index.md.B18T-HnP.lean.js create mode 100644 assets/pt-br_manage_commands.md.C9u0wbDc.js create mode 100644 assets/pt-br_manage_commands.md.C9u0wbDc.lean.js create mode 100644 assets/pt-br_manage_configuration.md.Bo5UByU1.js create mode 100644 assets/pt-br_manage_configuration.md.Bo5UByU1.lean.js create mode 100644 assets/pt-br_manage_core.md.CTnvZ9A5.js create mode 100644 assets/pt-br_manage_core.md.CTnvZ9A5.lean.js create mode 100644 assets/pt-br_manage_plugins.md.CuNF9gHf.js create mode 100644 assets/pt-br_manage_plugins.md.CuNF9gHf.lean.js create mode 100644 assets/pt-br_manage_versions.md.Ctc109hL.js create mode 100644 assets/pt-br_manage_versions.md.Ctc109hL.lean.js create mode 100644 assets/pt-br_more_community-projects.md.C3m600b2.js create mode 100644 assets/pt-br_more_community-projects.md.C3m600b2.lean.js create mode 100644 assets/pt-br_more_faq.md.Bch3gpm2.js create mode 100644 assets/pt-br_more_faq.md.Bch3gpm2.lean.js create mode 100644 assets/pt-br_more_thanks.md.BziNXVH9.js create mode 100644 assets/pt-br_more_thanks.md.BziNXVH9.lean.js create mode 100644 assets/pt-br_plugins_create.md.CnPY6mOB.js create mode 100644 assets/pt-br_plugins_create.md.CnPY6mOB.lean.js create mode 100644 assets/style.p0L2iRKi.css create mode 100644 assets/zh-hans_contribute_core.md.oF4_zk5Q.js create mode 100644 assets/zh-hans_contribute_core.md.oF4_zk5Q.lean.js create mode 100644 assets/zh-hans_contribute_documentation.md.DL3_2XKG.js create mode 100644 assets/zh-hans_contribute_documentation.md.DL3_2XKG.lean.js create mode 100644 assets/zh-hans_contribute_first-party-plugins.md.CaobaPwV.js create mode 100644 assets/zh-hans_contribute_first-party-plugins.md.CaobaPwV.lean.js create mode 100644 assets/zh-hans_contribute_github-actions.md.BMOvSElT.js create mode 100644 assets/zh-hans_contribute_github-actions.md.BMOvSElT.lean.js create mode 100644 assets/zh-hans_guide_getting-started.md.neLGUZQV.js create mode 100644 assets/zh-hans_guide_getting-started.md.neLGUZQV.lean.js create mode 100644 assets/zh-hans_guide_introduction.md.4qLfdOnh.js create mode 100644 assets/zh-hans_guide_introduction.md.4qLfdOnh.lean.js create mode 100644 assets/zh-hans_index.md.DQ8VBECv.js create mode 100644 assets/zh-hans_index.md.DQ8VBECv.lean.js create mode 100644 assets/zh-hans_manage_commands.md.BJVPpY77.js create mode 100644 assets/zh-hans_manage_commands.md.BJVPpY77.lean.js create mode 100644 assets/zh-hans_manage_configuration.md.DckznVe9.js create mode 100644 assets/zh-hans_manage_configuration.md.DckznVe9.lean.js create mode 100644 assets/zh-hans_manage_core.md._3uzcWzu.js create mode 100644 assets/zh-hans_manage_core.md._3uzcWzu.lean.js create mode 100644 assets/zh-hans_manage_plugins.md.DY_Xuyjn.js create mode 100644 assets/zh-hans_manage_plugins.md.DY_Xuyjn.lean.js create mode 100644 assets/zh-hans_manage_versions.md.BOLJYZ7r.js create mode 100644 assets/zh-hans_manage_versions.md.BOLJYZ7r.lean.js create mode 100644 assets/zh-hans_more_community-projects.md.yE4Odlba.js create mode 100644 assets/zh-hans_more_community-projects.md.yE4Odlba.lean.js create mode 100644 assets/zh-hans_more_faq.md.CgpfvsMk.js create mode 100644 assets/zh-hans_more_faq.md.CgpfvsMk.lean.js create mode 100644 assets/zh-hans_more_thanks.md.Dyz87Q2k.js create mode 100644 assets/zh-hans_more_thanks.md.Dyz87Q2k.lean.js create mode 100644 assets/zh-hans_plugins_create.md.P38AmJ4g.js create mode 100644 assets/zh-hans_plugins_create.md.P38AmJ4g.lean.js create mode 100644 contribute/core.html create mode 100644 contribute/documentation.html create mode 100644 contribute/first-party-plugins.html create mode 100644 contribute/github-actions.html create mode 100644 guide/getting-started.html create mode 100644 guide/introduction.html create mode 100644 hashmap.json create mode 100644 index.html create mode 100644 ja-jp/contribute/core.html create mode 100644 ja-jp/contribute/documentation.html create mode 100644 ja-jp/contribute/first-party-plugins.html create mode 100644 ja-jp/contribute/github-actions.html create mode 100644 ja-jp/guide/getting-started.html create mode 100644 ja-jp/guide/introduction.html create mode 100644 ja-jp/index.html create mode 100644 ja-jp/manage/commands.html create mode 100644 ja-jp/manage/configuration.html create mode 100644 ja-jp/manage/core.html create mode 100644 ja-jp/manage/plugins.html create mode 100644 ja-jp/manage/versions.html create mode 100644 ja-jp/more/community-projects.html create mode 100644 ja-jp/more/faq.html create mode 100644 ja-jp/more/thanks.html create mode 100644 ja-jp/plugins/create.html create mode 100644 manage/commands.html create mode 100644 manage/configuration.html create mode 100644 manage/core.html create mode 100644 manage/plugins.html create mode 100644 manage/versions.html create mode 100644 more/community-projects.html create mode 100644 more/faq.html create mode 100644 more/thanks.html create mode 100644 plugins/create.html create mode 100644 pt-br/contribute/core.html create mode 100644 pt-br/contribute/documentation.html create mode 100644 pt-br/contribute/first-party-plugins.html create mode 100644 pt-br/contribute/github-actions.html create mode 100644 pt-br/guide/getting-started.html create mode 100644 pt-br/guide/introduction.html create mode 100644 pt-br/index.html create mode 100644 pt-br/manage/commands.html create mode 100644 pt-br/manage/configuration.html create mode 100644 pt-br/manage/core.html create mode 100644 pt-br/manage/plugins.html create mode 100644 pt-br/manage/versions.html create mode 100644 pt-br/more/community-projects.html create mode 100644 pt-br/more/faq.html create mode 100644 pt-br/more/thanks.html create mode 100644 pt-br/plugins/create.html create mode 100644 zh-hans/contribute/core.html create mode 100644 zh-hans/contribute/documentation.html create mode 100644 zh-hans/contribute/first-party-plugins.html create mode 100644 zh-hans/contribute/github-actions.html create mode 100644 zh-hans/guide/getting-started.html create mode 100644 zh-hans/guide/introduction.html create mode 100644 zh-hans/index.html create mode 100644 zh-hans/manage/commands.html create mode 100644 zh-hans/manage/configuration.html create mode 100644 zh-hans/manage/core.html create mode 100644 zh-hans/manage/plugins.html create mode 100644 zh-hans/manage/versions.html create mode 100644 zh-hans/more/community-projects.html create mode 100644 zh-hans/more/faq.html create mode 100644 zh-hans/more/thanks.html create mode 100644 zh-hans/plugins/create.html diff --git a/404.html b/404.html new file mode 100644 index 00000000..dc5acdf0 --- /dev/null +++ b/404.html @@ -0,0 +1,21 @@ + + + + + + 404 | asdf + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..b850b998 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +asdf-vm.com \ No newline at end of file diff --git a/assets/app.2_UJsjMp.js b/assets/app.2_UJsjMp.js new file mode 100644 index 00000000..e705c438 --- /dev/null +++ b/assets/app.2_UJsjMp.js @@ -0,0 +1 @@ +import{t as i}from"./chunks/theme.BQKOjM6g.js";import{R as o,a3 as u,a4 as c,a5 as l,a6 as f,a7 as d,a8 as m,a9 as h,aa as g,ab as A,ac as v,d as P,u as y,v as C,s as b,ad as w,ae as R,af as E,ag as S}from"./chunks/framework.C9NVOr0y.js";function p(e){if(e.extends){const a=p(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=p(i),T=P({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{b(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&w(),R(),E(),s.setup&&s.setup(),()=>S(s.Layout)}});async function D(){globalThis.__VITEPRESS__=!0;const e=j(),a=_();a.provide(c,e);const t=l(e.route);return a.provide(f,t),a.component("Content",d),a.component("ClientOnly",m),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:h}),{app:a,router:e,data:t}}function _(){return g(T)}function j(){let e=o,a;return A(t=>{let n=v(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&D().then(({app:e,router:a,data:t})=>{a.go().then(()=>{u(a.route,t.site),e.mount("#app")})});export{D as createApp}; diff --git a/assets/chunks/@localSearchIndexja-jp.CBrievQI.js b/assets/chunks/@localSearchIndexja-jp.CBrievQI.js new file mode 100644 index 00000000..b19f253a --- /dev/null +++ b/assets/chunks/@localSearchIndexja-jp.CBrievQI.js @@ -0,0 +1 @@ +const t='{"documentCount":130,"nextId":130,"documentIds":{"0":"/ja-jp/contribute/core.html#asdf","1":"/ja-jp/contribute/core.html#初期セットアップ","2":"/ja-jp/contribute/core.html#開発","3":"/ja-jp/contribute/core.html#gitignore","4":"/ja-jp/contribute/core.html#git-blame-ignore-revs","5":"/ja-jp/contribute/core.html#batsテスト","6":"/ja-jp/contribute/core.html#batsのヒント","7":"/ja-jp/contribute/core.html#プルリクエスト、リリース、conventional-commits","8":"/ja-jp/contribute/core.html#dockerイメージ","9":"/ja-jp/contribute/documentation.html#ドキュメント-サイト","10":"/ja-jp/contribute/documentation.html#初期セットアップ","11":"/ja-jp/contribute/documentation.html#開発","12":"/ja-jp/contribute/documentation.html#プルリクエスト、リリース、conventional-commits","13":"/ja-jp/contribute/documentation.html#vitepress","14":"/ja-jp/contribute/documentation.html#i18n","15":"/ja-jp/contribute/github-actions.html#github-actions","16":"/ja-jp/contribute/first-party-plugins.html#公式プラグイン","17":"/ja-jp/guide/getting-started.html#はじめよう","18":"/ja-jp/guide/getting-started.html#_1-依存関係のインストール","19":"/ja-jp/guide/getting-started.html#_2-asdfのダウンロード","20":"/ja-jp/guide/getting-started.html#公式ダウンロード","21":"/ja-jp/guide/getting-started.html#コミュニティがサポートするダウンロード方法","22":"/ja-jp/guide/getting-started.html#_3-asdfのインストール","23":"/ja-jp/guide/getting-started.html#コアのインストールが完了","24":"/ja-jp/guide/getting-started.html#_4-プラグインのインストール","25":"/ja-jp/guide/getting-started.html#プラグインの依存関係","26":"/ja-jp/guide/getting-started.html#プラグインのインストール","27":"/ja-jp/guide/getting-started.html#_5-特定のバージョンのインストール","28":"/ja-jp/guide/getting-started.html#_6-バージョンをセット","29":"/ja-jp/guide/getting-started.html#グローバル","30":"/ja-jp/guide/getting-started.html#ローカル","31":"/ja-jp/guide/getting-started.html#ツールごとに用意された既存バージョンファイルの利用","32":"/ja-jp/guide/getting-started.html#入門完了","33":"/ja-jp/guide/introduction.html#イントロダクション","34":"/ja-jp/guide/introduction.html#どうやって動いているの","35":"/ja-jp/guide/introduction.html#関連プロジェクト","36":"/ja-jp/guide/introduction.html#nvm-n-rbenv-etc","37":"/ja-jp/guide/introduction.html#direnv","38":"/ja-jp/guide/introduction.html#homebrew","39":"/ja-jp/guide/introduction.html#nixos","40":"/ja-jp/guide/introduction.html#なぜasdfを使うの","41":"/ja-jp/manage/commands.html#すべてのコマンド","42":"/ja-jp/manage/configuration.html#構成設定","43":"/ja-jp/manage/configuration.html#tool-versions","44":"/ja-jp/manage/configuration.html#asdfrc","45":"/ja-jp/manage/configuration.html#legacy-version-file","46":"/ja-jp/manage/configuration.html#use-release-candidates","47":"/ja-jp/manage/configuration.html#always-keep-download","48":"/ja-jp/manage/configuration.html#plugin-repository-last-check-duration","49":"/ja-jp/manage/configuration.html#disable-plugin-short-name-repository","50":"/ja-jp/manage/configuration.html#concurrency","51":"/ja-jp/manage/configuration.html#環境変数","52":"/ja-jp/manage/configuration.html#asdf-config-file","53":"/ja-jp/manage/configuration.html#asdf-default-tool-versions-filename","54":"/ja-jp/manage/configuration.html#asdf-dir","55":"/ja-jp/manage/configuration.html#asdf-data-dir","56":"/ja-jp/manage/configuration.html#asdf-concurrency","57":"/ja-jp/manage/configuration.html#asdf-force-prepend","58":"/ja-jp/manage/configuration.html#完全な構成の例","59":"/ja-jp/manage/configuration.html#内部構成","60":"/ja-jp/manage/core.html#コア","61":"/ja-jp/manage/core.html#インストール-セットアップ","62":"/ja-jp/manage/core.html#実行","63":"/ja-jp/manage/core.html#環境変数","64":"/ja-jp/manage/core.html#情報","65":"/ja-jp/manage/core.html#shimの再作成","66":"/ja-jp/manage/core.html#shimのバージョン","67":"/ja-jp/manage/core.html#更新","68":"/ja-jp/manage/core.html#アンインストール","69":"/ja-jp/manage/plugins.html#プラグイン","70":"/ja-jp/manage/plugins.html#追加","71":"/ja-jp/manage/plugins.html#インストール済みプラグイン一覧","72":"/ja-jp/manage/plugins.html#全プラグインのショートネーム一覧","73":"/ja-jp/manage/plugins.html#更新","74":"/ja-jp/manage/plugins.html#削除","75":"/ja-jp/manage/plugins.html#ショートネームリポジトリの同期","76":"/ja-jp/manage/versions.html#バージョン","77":"/ja-jp/manage/versions.html#バージョンのインストール","78":"/ja-jp/manage/versions.html#最新安定バージョンのインストール","79":"/ja-jp/manage/versions.html#インストール済みバージョン一覧","80":"/ja-jp/manage/versions.html#インストール可能な全バージョン一覧","81":"/ja-jp/manage/versions.html#最新安定バージョンの表示","82":"/ja-jp/manage/versions.html#カレントバージョンのセット","83":"/ja-jp/manage/versions.html#システムバージョンへの委任","84":"/ja-jp/manage/versions.html#カレントバージョンの表示","85":"/ja-jp/manage/versions.html#バージョンのアンインストール","86":"/ja-jp/manage/versions.html#shims","87":"/ja-jp/manage/versions.html#asdfのshimのバイパス","88":"/ja-jp/more/community-projects.html#コミュニティプロジェクト","89":"/ja-jp/more/faq.html#faq","90":"/ja-jp/more/faq.html#wsl1をサポートしていますか","91":"/ja-jp/more/faq.html#wsl2をサポートしていますか","92":"/ja-jp/more/faq.html#新しくインストールした実行ファイルが実行できないのですが","93":"/ja-jp/more/faq.html#シェルが、新しくインストールされたshimを検知してくれないのですが","94":"/ja-jp/more/thanks.html#謝辞","95":"/ja-jp/more/thanks.html#クレジット","96":"/ja-jp/more/thanks.html#メンテナー","97":"/ja-jp/more/thanks.html#コントリビューター","98":"/ja-jp/plugins/create.html#プラグインの作成","99":"/ja-jp/plugins/create.html#クイックスタート","100":"/ja-jp/plugins/create.html#プラグインスクリプトの鉄則","101":"/ja-jp/plugins/create.html#スクリプトの概要","102":"/ja-jp/plugins/create.html#環境変数の概要","103":"/ja-jp/plugins/create.html#必須スクリプト","104":"/ja-jp/plugins/create.html#bin-list-all","105":"/ja-jp/plugins/create.html#bin-download","106":"/ja-jp/plugins/create.html#bin-install","107":"/ja-jp/plugins/create.html#オプションスクリプト","108":"/ja-jp/plugins/create.html#bin-latest-stable","109":"/ja-jp/plugins/create.html#bin-help-overview","110":"/ja-jp/plugins/create.html#bin-help-deps","111":"/ja-jp/plugins/create.html#bin-help-config","112":"/ja-jp/plugins/create.html#bin-help-links","113":"/ja-jp/plugins/create.html#bin-list-bin-paths","114":"/ja-jp/plugins/create.html#bin-exec-env","115":"/ja-jp/plugins/create.html#bin-exec-path","116":"/ja-jp/plugins/create.html#bin-uninstall","117":"/ja-jp/plugins/create.html#bin-list-legacy-filenames","118":"/ja-jp/plugins/create.html#bin-parse-legacy-file","119":"/ja-jp/plugins/create.html#bin-post-plugin-add","120":"/ja-jp/plugins/create.html#bin-post-plugin-update","121":"/ja-jp/plugins/create.html#bin-pre-plugin-remove","122":"/ja-jp/plugins/create.html#asdf-cliの拡張コマンド","123":"/ja-jp/plugins/create.html#カスタムshimテンプレート","124":"/ja-jp/plugins/create.html#テスト","125":"/ja-jp/plugins/create.html#github-action","126":"/ja-jp/plugins/create.html#travisci-構成設定","127":"/ja-jp/plugins/create.html#apiレート制限","128":"/ja-jp/plugins/create.html#github-api-token","129":"/ja-jp/plugins/create.html#プラグインショートネームインデックス"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,3],"1":[1,1,47],"2":[1,1,40],"3":[1,2,14],"4":[5,2,37],"5":[1,1,13],"6":[1,2,32],"7":[4,1,66],"8":[1,1,8],"9":[3,1,3],"10":[1,3,38],"11":[1,3,27],"12":[4,3,16],"13":[1,3,27],"14":[1,3,57],"15":[2,1,8],"16":[1,1,23],"17":[1,1,12],"18":[2,1,40],"19":[2,1,1],"20":[1,3,14],"21":[1,3,22],"22":[2,1,200],"23":[2,1,9],"24":[2,1,6],"25":[1,3,26],"26":[1,3,11],"27":[2,1,20],"28":[2,1,16],"29":[1,3,24],"30":[1,3,20],"31":[1,3,25],"32":[2,1,15],"33":[1,1,22],"34":[1,1,10],"35":[1,1,1],"36":[4,2,14],"37":[1,2,8],"38":[1,2,11],"39":[1,2,16],"40":[2,1,13],"41":[1,1,144],"42":[1,1,6],"43":[3,1,75],"44":[2,1,34],"45":[3,2,18],"46":[3,2,11],"47":[3,2,12],"48":[5,2,40],"49":[5,2,43],"50":[1,2,18],"51":[1,1,18],"52":[3,2,18],"53":[5,2,17],"54":[2,2,16],"55":[3,2,20],"56":[2,2,10],"57":[3,2,24],"58":[1,1,65],"59":[1,1,15],"60":[1,1,3],"61":[3,1,2],"62":[1,1,7],"63":[1,1,6],"64":[1,1,7],"65":[1,1,30],"66":[1,1,28],"67":[1,1,21],"68":[1,1,102],"69":[1,1,7],"70":[1,1,22],"71":[1,1,14],"72":[1,1,7],"73":[1,1,22],"74":[1,1,13],"75":[1,1,29],"76":[1,1,1],"77":[1,1,21],"78":[1,1,12],"79":[1,1,11],"80":[1,1,12],"81":[1,1,11],"82":[1,1,47],"83":[1,1,17],"84":[1,1,20],"85":[1,1,10],"86":[1,1,65],"87":[1,2,6],"88":[1,1,18],"89":[1,1,3],"90":[2,1,10],"91":[2,1,20],"92":[2,1,17],"93":[3,1,19],"94":[1,1,3],"95":[1,1,10],"96":[1,1,6],"97":[1,1,2],"98":[1,1,16],"99":[1,1,22],"100":[1,2,9],"101":[1,1,53],"102":[1,1,44],"103":[1,1,1],"104":[3,2,55],"105":[2,2,81],"106":[2,2,91],"107":[1,1,1],"108":[3,2,89],"109":[3,2,57],"110":[3,2,55],"111":[3,2,55],"112":[3,2,67],"113":[3,2,60],"114":[3,2,45],"115":[3,2,72],"116":[2,2,34],"117":[4,2,46],"118":[4,2,43],"119":[4,2,35],"120":[4,2,39],"121":[4,2,31],"122":[2,1,57],"123":[1,1,18],"124":[1,1,56],"125":[2,2,40],"126":[2,2,37],"127":[1,1,28],"128":[3,2,11],"129":[1,1,25]},"averageFieldLength":[1.7846153846153847,1.5,28.100000000000005],"storedFields":{"0":{"title":"asdf","titles":[]},"1":{"title":"初期セットアップ","titles":["asdf"]},"2":{"title":"開発","titles":["asdf"]},"3":{"title":"Gitignore","titles":["asdf","開発"]},"4":{"title":".git-blame-ignore-revs","titles":["asdf","開発"]},"5":{"title":"Batsテスト","titles":["asdf"]},"6":{"title":"Batsのヒント","titles":["asdf","Batsテスト"]},"7":{"title":"プルリクエスト、リリース、Conventional Commits","titles":["asdf"]},"8":{"title":"Dockerイメージ","titles":["asdf"]},"9":{"title":"ドキュメント & サイト","titles":[]},"10":{"title":"初期セットアップ","titles":["ドキュメント & サイト"]},"11":{"title":"開発","titles":["ドキュメント & サイト"]},"12":{"title":"プルリクエスト、リリース、Conventional Commits","titles":["ドキュメント & サイト"]},"13":{"title":"Vitepress","titles":["ドキュメント & サイト"]},"14":{"title":"I18n","titles":["ドキュメント & サイト"]},"15":{"title":"GitHub Actions","titles":[]},"16":{"title":"公式プラグイン","titles":[]},"17":{"title":"はじめよう","titles":[]},"18":{"title":"1. 依存関係のインストール","titles":["はじめよう"]},"19":{"title":"2. asdfのダウンロード","titles":["はじめよう"]},"20":{"title":"公式ダウンロード","titles":["はじめよう","2. asdfのダウンロード"]},"21":{"title":"コミュニティがサポートするダウンロード方法","titles":["はじめよう","2. asdfのダウンロード"]},"22":{"title":"3. asdfのインストール","titles":["はじめよう"]},"23":{"title":"コアのインストールが完了!","titles":["はじめよう"]},"24":{"title":"4. プラグインのインストール","titles":["はじめよう"]},"25":{"title":"プラグインの依存関係","titles":["はじめよう","4. プラグインのインストール"]},"26":{"title":"プラグインのインストール","titles":["はじめよう","4. プラグインのインストール"]},"27":{"title":"5. 特定のバージョンのインストール","titles":["はじめよう"]},"28":{"title":"6. バージョンをセット","titles":["はじめよう"]},"29":{"title":"グローバル","titles":["はじめよう","6. バージョンをセット"]},"30":{"title":"ローカル","titles":["はじめよう","6. バージョンをセット"]},"31":{"title":"ツールごとに用意された既存バージョンファイルの利用","titles":["はじめよう","6. バージョンをセット"]},"32":{"title":"入門完了!","titles":["はじめよう"]},"33":{"title":"イントロダクション","titles":[]},"34":{"title":"どうやって動いているの","titles":["イントロダクション"]},"35":{"title":"関連プロジェクト","titles":["イントロダクション"]},"36":{"title":"nvm / n / rbenv etc","titles":["イントロダクション","関連プロジェクト"]},"37":{"title":"direnv","titles":["イントロダクション","関連プロジェクト"]},"38":{"title":"Homebrew","titles":["イントロダクション","関連プロジェクト"]},"39":{"title":"NixOS","titles":["イントロダクション","関連プロジェクト"]},"40":{"title":"なぜasdfを使うの?","titles":["イントロダクション"]},"41":{"title":"すべてのコマンド","titles":[]},"42":{"title":"構成設定","titles":[]},"43":{"title":".tool-versions","titles":["構成設定"]},"44":{"title":".asdfrc","titles":["構成設定"]},"45":{"title":"legacy_version_file","titles":["構成設定",".asdfrc"]},"46":{"title":"use_release_candidates","titles":["構成設定",".asdfrc"]},"47":{"title":"always_keep_download","titles":["構成設定",".asdfrc"]},"48":{"title":"plugin_repository_last_check_duration","titles":["構成設定",".asdfrc"]},"49":{"title":"disable_plugin_short_name_repository","titles":["構成設定",".asdfrc"]},"50":{"title":"concurrency","titles":["構成設定",".asdfrc"]},"51":{"title":"環境変数","titles":["構成設定"]},"52":{"title":"ASDF_CONFIG_FILE","titles":["構成設定","環境変数"]},"53":{"title":"ASDF_DEFAULT_TOOL_VERSIONS_FILENAME","titles":["構成設定","環境変数"]},"54":{"title":"ASDF_DIR","titles":["構成設定","環境変数"]},"55":{"title":"ASDF_DATA_DIR","titles":["構成設定","環境変数"]},"56":{"title":"ASDF_CONCURRENCY","titles":["構成設定","環境変数"]},"57":{"title":"ASDF_FORCE_PREPEND","titles":["構成設定","環境変数"]},"58":{"title":"完全な構成の例","titles":["構成設定"]},"59":{"title":"内部構成","titles":["構成設定"]},"60":{"title":"コア","titles":[]},"61":{"title":"インストール & セットアップ","titles":["コア"]},"62":{"title":"実行","titles":["コア"]},"63":{"title":"環境変数","titles":["コア"]},"64":{"title":"情報","titles":["コア"]},"65":{"title":"Shimの再作成","titles":["コア"]},"66":{"title":"Shimのバージョン","titles":["コア"]},"67":{"title":"更新","titles":["コア"]},"68":{"title":"アンインストール","titles":["コア"]},"69":{"title":"プラグイン","titles":[]},"70":{"title":"追加","titles":["プラグイン"]},"71":{"title":"インストール済みプラグイン一覧","titles":["プラグイン"]},"72":{"title":"全プラグインのショートネーム一覧","titles":["プラグイン"]},"73":{"title":"更新","titles":["プラグイン"]},"74":{"title":"削除","titles":["プラグイン"]},"75":{"title":"ショートネームリポジトリの同期","titles":["プラグイン"]},"76":{"title":"バージョン","titles":[]},"77":{"title":"バージョンのインストール","titles":["バージョン"]},"78":{"title":"最新安定バージョンのインストール","titles":["バージョン"]},"79":{"title":"インストール済みバージョン一覧","titles":["バージョン"]},"80":{"title":"インストール可能な全バージョン一覧","titles":["バージョン"]},"81":{"title":"最新安定バージョンの表示","titles":["バージョン"]},"82":{"title":"カレントバージョンのセット","titles":["バージョン"]},"83":{"title":"システムバージョンへの委任","titles":["バージョン"]},"84":{"title":"カレントバージョンの表示","titles":["バージョン"]},"85":{"title":"バージョンのアンインストール","titles":["バージョン"]},"86":{"title":"Shims","titles":["バージョン"]},"87":{"title":"asdfのShimのバイパス","titles":["バージョン","Shims"]},"88":{"title":"コミュニティプロジェクト","titles":[]},"89":{"title":"FAQ","titles":[]},"90":{"title":"WSL1をサポートしていますか?","titles":["FAQ"]},"91":{"title":"WSL2をサポートしていますか?","titles":["FAQ"]},"92":{"title":"新しくインストールした実行ファイルが実行できないのですが?","titles":["FAQ"]},"93":{"title":"シェルが、新しくインストールされたShimを検知してくれないのですが?","titles":["FAQ"]},"94":{"title":"謝辞","titles":[]},"95":{"title":"クレジット","titles":["謝辞"]},"96":{"title":"メンテナー","titles":["謝辞"]},"97":{"title":"コントリビューター","titles":["謝辞"]},"98":{"title":"プラグインの作成","titles":[]},"99":{"title":"クイックスタート","titles":["プラグインの作成"]},"100":{"title":"プラグインスクリプトの鉄則","titles":["プラグインの作成","クイックスタート"]},"101":{"title":"スクリプトの概要","titles":["プラグインの作成"]},"102":{"title":"環境変数の概要","titles":["プラグインの作成"]},"103":{"title":"必須スクリプト","titles":["プラグインの作成"]},"104":{"title":"bin/list-all","titles":["プラグインの作成","必須スクリプト"]},"105":{"title":"bin/download","titles":["プラグインの作成","必須スクリプト"]},"106":{"title":"bin/install","titles":["プラグインの作成","必須スクリプト"]},"107":{"title":"オプションスクリプト","titles":["プラグインの作成"]},"108":{"title":"bin/latest-stable","titles":["プラグインの作成","オプションスクリプト"]},"109":{"title":"bin/help.overview","titles":["プラグインの作成","オプションスクリプト"]},"110":{"title":"bin/help.deps","titles":["プラグインの作成","オプションスクリプト"]},"111":{"title":"bin/help.config","titles":["プラグインの作成","オプションスクリプト"]},"112":{"title":"bin/help.links","titles":["プラグインの作成","オプションスクリプト"]},"113":{"title":"bin/list-bin-paths","titles":["プラグインの作成","オプションスクリプト"]},"114":{"title":"bin/exec-env","titles":["プラグインの作成","オプションスクリプト"]},"115":{"title":"bin/exec-path","titles":["プラグインの作成","オプションスクリプト"]},"116":{"title":"bin/uninstall","titles":["プラグインの作成","オプションスクリプト"]},"117":{"title":"bin/list-legacy-filenames","titles":["プラグインの作成","オプションスクリプト"]},"118":{"title":"bin/parse-legacy-file","titles":["プラグインの作成","オプションスクリプト"]},"119":{"title":"bin/post-plugin-add","titles":["プラグインの作成","オプションスクリプト"]},"120":{"title":"bin/post-plugin-update","titles":["プラグインの作成","オプションスクリプト"]},"121":{"title":"bin/pre-plugin-remove","titles":["プラグインの作成","オプションスクリプト"]},"122":{"title":"asdf CLIの拡張コマンド","titles":["プラグインの作成"]},"123":{"title":"カスタムShimテンプレート","titles":["プラグインの作成"]},"124":{"title":"テスト","titles":["プラグインの作成"]},"125":{"title":"GitHub Action","titles":["プラグインの作成","テスト"]},"126":{"title":"TravisCI 構成設定","titles":["プラグインの作成","テスト"]},"127":{"title":"APIレート制限","titles":["プラグインの作成"]},"128":{"title":"GITHUB_API_TOKEN","titles":["プラグインの作成","APIレート制限"]},"129":{"title":"プラグインショートネームインデックス","titles":["プラグインの作成"]}},"dirtCount":0,"index":[["認証トークンをコードリポジトリで公開してはいけません",{"2":{"128":1}}],["次に",{"2":{"128":1}}],["次のような出力となります",{"2":{"113":1}}],["次のように実行します",{"2":{"11":2,"124":1}}],["次のいずれかの方法を使用することを推奨します",{"2":{"104":1}}],["次の2つの方法があります",{"2":{"99":1}}],["次のとおりです",{"2":{"75":1}}],["次のコマンドで",{"2":{"68":4}}],["次のコマンドを実行します",{"2":{"27":1,"29":1}}],["次の両方のファイルを参照してください",{"2":{"13":1}}],["次のスクリプト",{"2":{"2":1}}],["ブランチ",{"2":{"124":1}}],["ブランチをgithubからダウンロードし",{"2":{"43":1}}],["標準的なbashのshimを使用できないのです",{"2":{"123":1}}],["前に",{"2":{"121":1}}],["前回のリリースからのコミット履歴を読み込むことで生成されます",{"2":{"7":1}}],["呼び出されます",{"2":{"119":1,"120":1,"121":1}}],["後に",{"2":{"119":1,"120":1}}],["後続のコア実行によってこれらの出力が読み取られることはありません",{"2":{"116":1}}],["マシンに何がインストールされているか",{"2":{"118":1}}],["マネージャごとの異なるコマンド",{"2":{"36":1}}],["常に正確で同じバージョンを返す必要があります",{"2":{"118":1}}],["決定論的で",{"2":{"118":1}}],["パラメータは",{"2":{"124":1}}],["パスはasdf",{"2":{"113":1}}],["パッケージのインストールディレクトリにある実行ファイルの完全パス",{"2":{"86":1}}],["パッケージ管理とシステム構成に独自のアプローチを取り入れたツールです",{"2":{"39":1}}],["パッケージとその上位の依存関係を管理します",{"2":{"38":1}}],["パッケージマネージャやインテグレータ向けのasdfの内部構成について記述しているため",{"2":{"59":1}}],["パッケージマネージャでアンインストールします",{"2":{"68":9}}],["パッケージマネージャでもありません",{"2":{"38":1,"39":1}}],["パッケージマネージャで実行するコマンドの",{"2":{"18":1}}],["パッケージマネージャ",{"2":{"18":1}}],["形式は以下のいずれかである必要があります",{"2":{"112":1}}],["\\thttps",{"2":{"112":2}}],["短い1段落程度の説明が理想です",{"2":{"109":1}}],["自動テスト中にレート制限が発生することがあります",{"2":{"127":1}}],["自動的にshimが作成されますが",{"2":{"92":1}}],["自動的にpath",{"2":{"22":1}}],["自由な形式のテキストで出力できます",{"2":{"111":1}}],["自由な形式のテキストで出力して構いませんが",{"2":{"109":1}}],["ヘッダはasdfコア側で表示するため",{"2":{"109":1}}],["非安定版やリリース候補版は除外されるべきです",{"2":{"108":1}}],["今後作成するすべてのプラグインでこのスクリプトを含めるようにしてください",{"2":{"105":1}}],["終了コードは非ゼロとしてください",{"2":{"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1}}],["終了コードは0としてください",{"2":{"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1}}],["成功した場合",{"2":{"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1}}],["失敗した場合",{"2":{"105":2,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1}}],["解凍されたソースコードまたはバイナリのみを",{"2":{"105":1}}],["引数はありません",{"2":{"104":1,"105":1,"106":1,"116":1,"117":1,"119":1,"120":1,"121":1}}],["引き続き",{"2":{"23":1}}],["カスタムshimテンプレートを使用することができます",{"2":{"123":1}}],["カスタムshimテンプレート",{"0":{"123":1}}],["カスタムソートメソッドを自分で書く",{"2":{"104":1}}],["カレントワークディレクトリがwindowsドライブではなくunixドライブである場合に",{"2":{"91":1}}],["カレントバージョンの表示",{"0":{"84":1}}],["カレントバージョンのセットと同様の方法で",{"2":{"83":1}}],["カレントバージョンのセット",{"0":{"82":1}}],["カレントディレクトリ内",{"2":{"30":1}}],["カレントディレクトリにおいてツールのバージョンを解決可能か確認できるため",{"2":{"28":1}}],["カレントディレクトリから上位の$homeディレクトリまでに存在するすべての",{"2":{"28":1}}],["逆順にしたければ",{"2":{"104":1}}],["提供されている順序は正しいリリース順となっていることが多いため",{"2":{"104":1}}],["ウェブサイト上のリリースページからバージョンを取得する場合",{"2":{"104":1}}],["並べ替え",{"2":{"104":1}}],["出力フォーマット",{"2":{"104":1,"116":1}}],["ソースとなるファイルのフルパスに解決されます",{"2":{"102":1,"122":1}}],["ソースコードまたはバイナリのダウンロード先のパスです",{"2":{"105":1,"106":1}}],["ソースコードまたはバイナリをダウンロードする必要があります",{"2":{"105":1}}],["ソースコードからのダウンロード",{"2":{"77":1}}],["ソースコードのコンパイル時に使用するコア数です",{"2":{"50":1,"56":1,"102":1,"106":1}}],["ソースコードやバイナリを保持します",{"2":{"47":1}}],["ソースコードやバイナリを削除します",{"2":{"47":1}}],["される",{"2":{"121":1}}],["されるべき",{"2":{"102":1,"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"117":1}}],["されたプラグインがダウンロードされた",{"2":{"120":1}}],["された",{"2":{"119":1}}],["されている",{"2":{"102":1,"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"117":1}}],["場所へのパスです",{"2":{"102":1,"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"117":1}}],["場所",{"2":{"102":1,"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"117":1}}],["レガシーファイルのパスという1つの引数を受け取ります",{"2":{"118":1}}],["レガシーファイルの内容を読み込むために",{"2":{"118":1}}],["レガシーバージョンが有効で完全かどうかは関係ありません",{"2":{"118":1}}],["レガシーバージョンファイルのカスタムパーサーです",{"2":{"101":1}}],["レガシー",{"2":{"105":1}}],["レガシープラグインのサポートは最終的に削除される予定のため",{"2":{"105":1}}],["レガシープラグイン",{"2":{"105":1,"106":1}}],["レガシー構成ファイルのリストを出力します",{"2":{"101":1}}],["指定されたバージョンをダウンロード",{"2":{"106":1}}],["指定されたバージョンをasdf",{"2":{"106":1}}],["指定された場所にダウンロードします",{"2":{"105":1}}],["指定されたツールの最新安定バージョンをリストします",{"2":{"101":1}}],["指定されたタグ",{"2":{"43":1}}],["移植性のないツールやコマンドフラグの使用は避けてください",{"2":{"100":1}}],["スペース区切りのファイル名リストを出力してください",{"2":{"117":1}}],["スペース区切りのバージョンリストの文字列を出力する必要があります",{"2":{"104":1}}],["スペースで区切れば",{"2":{"43":1}}],["スクリプト内では表示しないでください",{"2":{"109":1}}],["スクリプト内で他のasdfコマンドを呼び出してはいけません",{"2":{"100":1}}],["スクリプトの第1引数で提供されます",{"2":{"108":1}}],["スクリプトの概要",{"0":{"101":1}}],["スクリプトは",{"2":{"105":1,"106":1,"108":1}}],["スクリプトで使用できる環境変数",{"2":{"104":1,"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1}}],["スクリプト",{"2":{"101":1}}],["テンプレートを対話的に更新していきます",{"2":{"99":1}}],["テスト",{"0":{"124":1},"1":{"125":1,"126":1}}],["テストを実行させています",{"2":{"82":1}}],["テストを作成する前に",{"2":{"5":1}}],["テストを作ってください",{"2":{"2":1}}],["テスト実行中に特殊なファイルディスクリプタ",{"2":{"6":1}}],["生成できたら",{"2":{"99":1}}],["生成",{"2":{"99":1}}],["名前はasdf",{"2":{"99":1}}],["やasdf",{"2":{"98":1}}],["言語",{"2":{"98":1}}],["言語開発者などが使用します",{"2":{"43":1}}],["メンテナー",{"0":{"96":1}}],["咳",{"2":{"95":1}}],["風邪",{"2":{"95":1}}],["高熱",{"2":{"95":1}}],["私",{"2":{"95":1}}],["クイックスタート",{"0":{"99":1},"1":{"100":1}}],["クレジット",{"0":{"95":1}}],["クローンしたリポジトリのパスを設定し",{"2":{"2":1}}],["謝辞",{"0":{"94":1},"1":{"95":1,"96":1,"97":1}}],["上記の例では",{"2":{"92":1}}],["限られる",{"2":{"91":1}}],["重要なのは",{"2":{"91":1}}],["動作するはずです",{"2":{"91":1}}],["詳細はreadmeをご確認ください",{"2":{"87":1}}],["詳しくはasdfの構成設定のリファレンスをご覧ください",{"2":{"75":2}}],["詳しくはnixosのドキュメントをご覧ください",{"2":{"39":1}}],["詳しくはhomebrewのドキュメントをご覧ください",{"2":{"38":1}}],["詳しくはdirenvのドキュメントをご覧ください",{"2":{"37":1}}],["詳しくは",{"2":{"4":1,"6":1,"12":1,"16":1,"29":1,"92":1}}],["詳しくはこちらをご覧ください",{"2":{"3":1}}],["何らかの理由でasdfのshimをバイパスしたい場合や",{"2":{"87":1}}],["何らかのトリガーイベントが発生した際に",{"2":{"48":1}}],["本システムはexec呼び出しを使用するため",{"2":{"86":1}}],["本番用アプリケーションの実行用途として使用することができます",{"2":{"8":1}}],["kim",{"2":{"84":3}}],["keep",{"0":{"47":1},"2":{"44":1,"58":1}}],["代替手段",{"2":{"82":1}}],["代わりにshimが実行され",{"2":{"34":1}}],["存在しない場合は作成されます",{"2":{"82":1}}],["存在しない場合はasdf",{"2":{"55":1}}],["タグでプラグイン自体をチェックアウトします",{"2":{"124":1}}],["タグ",{"2":{"77":1}}],["ターミナルのタブを新たに開けばokです",{"2":{"22":1}}],["過去x分の間に同期が行われていない場合",{"2":{"75":1}}],["定期的に更新されます",{"2":{"75":1}}],["削除",{"0":{"74":1},"2":{"121":1}}],["916",{"2":{"73":1}}],["全プラグインのショートネーム一覧については",{"2":{"72":1}}],["全プラグインのショートネーム一覧",{"0":{"72":1}}],["推奨されるプラグインのインストール方法は",{"2":{"129":1}}],["推奨されるインストール方法を使用した場合",{"2":{"67":1}}],["推奨",{"2":{"70":1}}],["追加",{"0":{"70":1},"2":{"119":1}}],["様々なツールをサポートするために使用されるプラグインapiについては",{"2":{"69":1}}],["🎉",{"2":{"68":1}}],["もし",{"2":{"68":1,"75":1}}],["アンインストールするときも",{"2":{"77":1}}],["アンインストール",{"0":{"68":1}}],["アンロードできる機能を付け加えます",{"2":{"37":1}}],["別の方法でインストールした場合",{"2":{"67":1}}],["別ファイルに切り出されており",{"2":{"13":1}}],["更新後のプラグインのgit",{"2":{"102":1,"120":1}}],["更新",{"0":{"67":1,"73":1},"2":{"120":1}}],["8",{"2":{"66":2,"106":1,"108":1}}],["8837でご覧いただくと分かるとおり",{"2":{"22":2}}],["が付与されていない場合",{"2":{"122":1}}],["が付与されている場合",{"2":{"122":1}}],["が",{"2":{"65":1}}],["がある場合",{"2":{"45":1}}],["情報",{"0":{"64":1}}],["現時点ではそうではないようです",{"2":{"91":1}}],["現時点での最新バージョンを指定できるasdfのヘルパーです",{"2":{"27":1}}],["現在のバージョンでshimコマンドを実行します",{"2":{"114":1,"115":1}}],["現在のバージョンのshimでコマンドを実行します",{"2":{"62":1}}],["現在のシェルセッションでのみバージョンを設定したい場合",{"2":{"82":1}}],["現在のシェルセッションでのみ有効となります",{"2":{"82":1}}],["現在開発中です",{"2":{"73":1}}],["実装内容",{"2":{"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"115":1,"117":1,"118":1}}],["実行可能ビット",{"2":{"122":2}}],["実行ファイルであると同時に",{"2":{"123":1}}],["実行ファイルは",{"2":{"123":1}}],["実行ファイルへの相対パスを文字列で出力する必要があります",{"2":{"115":2}}],["実行ファイルのパスを表示します",{"2":{"114":1,"115":1}}],["実行ファイルが含まれるディレクトリのパスをスペース区切りで出力してください",{"2":{"113":1}}],["実行ファイルが含まれるディレクトリの一覧を出力します",{"2":{"113":1}}],["実行ファイルをグローバルインストールができます",{"2":{"65":1}}],["実行します",{"2":{"86":1}}],["実行",{"0":{"62":1}}],["実バージョンの表記です",{"2":{"43":1}}],["セットアップと依存関係の解決を済ませれば",{"2":{"91":1}}],["セットアップ",{"0":{"61":1}}],["セマンティックバージョンやプロバイダをフィルタするために",{"2":{"108":1}}],["セマンティックバージョンのmajorを新しく作成します",{"2":{"7":1}}],["セマンティックバージョンのminorを新しく作成します",{"2":{"7":1}}],["セマンティックバージョンのpatchを新しく作成します",{"2":{"7":1}}],["セマンティックバージョンを自動的に引き上げ",{"2":{"7":1}}],["多くのワークフローを円滑に進めることができます",{"2":{"60":1}}],["値がセットされる過程",{"2":{"58":1}}],["値",{"2":{"58":1}}],["値をneverにしても",{"2":{"48":1}}],["結果として以下のような構成となります",{"2":{"58":1}}],["完全な構成の例",{"0":{"58":1}}],["quot",{"2":{"57":2,"105":2,"113":8,"117":2}}],["します",{"2":{"99":1}}],["しません",{"2":{"57":1}}],["しかし",{"2":{"23":1}}],["に作成されます",{"2":{"86":1}}],["における",{"2":{"73":1}}],["に対して",{"2":{"65":1}}],["に追加するかどうかを設定します",{"2":{"57":1}}],["によって異なります",{"2":{"51":1}}],["通常は",{"2":{"124":1}}],["通常",{"2":{"53":1}}],["有効なファイル名であれば何でも設定できます",{"2":{"53":1}}],["未設定の場合",{"2":{"52":1,"53":1,"54":1,"55":1,"56":1,"57":1}}],["必要に応じてカスタマイズしてください",{"2":{"126":1}}],["必要に応じて",{"2":{"109":1,"110":1,"111":1,"112":1}}],["必要なものは次のとおりです",{"2":{"25":1}}],["必須",{"2":{"105":1}}],["必須スクリプト",{"0":{"103":1},"1":{"104":1,"105":1,"106":1}}],["必ず絶対パスで設定してください",{"2":{"52":1,"54":1,"55":1}}],["任意の場所に設定できます",{"2":{"52":1,"54":1,"55":1}}],["環境変数経由で認証トークンを提供するコードパスがあることを確認してください",{"2":{"127":1}}],["環境変数が設定されることはありません",{"2":{"118":1}}],["環境変数の概要",{"0":{"102":1}}],["環境変数の設定値は",{"2":{"51":1}}],["環境変数は何も設定していない",{"2":{"58":1}}],["環境変数は通常",{"2":{"51":1}}],["環境変数",{"0":{"51":1,"63":1},"1":{"52":1,"53":1,"54":1,"55":1,"56":1,"57":1},"2":{"102":1}}],["環境変数など",{"2":{"33":1}}],["整数値",{"2":{"50":1}}],["同じバージョンを返すようにしてください",{"2":{"118":1}}],["同じレガシーファイルを解析したら",{"2":{"118":1}}],["同じ名前とバージョンを指定する必要があります",{"2":{"77":1}}],["同期が開始されます",{"2":{"75":1}}],["同期のタイミングの条件は",{"2":{"75":1}}],["同期イベントは",{"2":{"75":1}}],["同期イベントはすぐに終了します",{"2":{"49":1}}],["同期イベントが発生した際に",{"2":{"49":1}}],["同期は中止されます",{"2":{"75":1}}],["同期は",{"2":{"48":1,"49":1}}],["同期しません",{"2":{"48":1}}],["同様の手順を実施してください",{"2":{"32":1}}],["トリガーイベントのたびに同期します",{"2":{"48":1}}],["トリガーイベントで同期します",{"2":{"48":1}}],["設定されていない場合は",{"2":{"106":1}}],["設定されている場合は",{"2":{"106":1}}],["設定された間隔以上の時間が経過していた倍は",{"2":{"48":1}}],["設定してみましょう",{"2":{"24":1}}],["分",{"2":{"48":2}}],["保持しておくか削除するかを制御します",{"2":{"47":1}}],["利用可能なレガシーバージョンファイル",{"2":{"45":1}}],["説明",{"2":{"45":1,"46":1,"47":1,"48":1,"49":1,"101":1,"102":1,"104":1,"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1}}],["オペレーティングシステムと",{"2":{"109":1,"110":1,"111":1,"112":1}}],["オペレーティングシステムに合わせた依存関係のリストを出力します",{"2":{"101":1,"110":1}}],["オリジナルのプラグインを作成するには",{"2":{"99":1}}],["オプションで",{"2":{"124":2}}],["オプションの",{"2":{"124":1}}],["オプションのフィルタに基づいて",{"2":{"108":1}}],["オプションのbin",{"2":{"106":1}}],["オプションスクリプト",{"0":{"107":1},"1":{"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1}}],["オプション",{"2":{"45":1,"46":1,"47":1,"48":1,"49":1,"105":1}}],["オートコンプリートを使用するようにzshを設定する必要があります",{"2":{"22":1}}],["対応しているプラグインの場合",{"2":{"45":1}}],["対象となるディレクトリで",{"2":{"30":1}}],["ユーザは下記コマンドが実行できるようになります",{"2":{"122":1}}],["ユーザへの出力は",{"2":{"116":1}}],["ユーザが提供したフィルタは",{"2":{"108":1}}],["ユーザが気にする必要はありません",{"2":{"59":1}}],["ユーザがjavascriptを使用できない",{"2":{"11":1}}],["ユーザのマシン固有の構成を設定します",{"2":{"44":1}}],["直接編集するか",{"2":{"43":1}}],["7",{"2":{"43":4,"106":1,"108":1}}],["複数のバージョンのツールがインストールされている場合",{"2":{"66":1}}],["複数のバージョンを指定できます",{"2":{"43":1}}],["複数のcliのバージョンマネージャを用意する必要があり",{"2":{"33":1}}],["当該スクリプトが実行されます",{"2":{"122":1}}],["当該ツールの最新安定バージョンにセットします",{"2":{"108":2}}],["当該プラグインでインストールされたすべてのツールが削除されます",{"2":{"74":1}}],["当該ディレクトリおよびサブディレクトリで",{"2":{"43":1}}],["当該バージョンが実行されます",{"2":{"34":1}}],["他人と共有可能な",{"2":{"42":1}}],["他のciを使用する場合",{"2":{"126":1}}],["他のバージョンマネージャで使用されているバージョンファイルを読み込むことができます",{"2":{"45":1}}],["他のバージョンマネージャ向けに作られた既存のバージョンファイル",{"2":{"31":1}}],["他のツールと差別化することで",{"2":{"36":1}}],["`",{"2":{"125":1}}],["`$asdf",{"2":{"122":5}}],["`env`",{"2":{"41":1}}],["`asdf",{"2":{"41":1}}],["チームが確実に同じバージョンのツールを使用することを保証できます",{"2":{"40":1}}],["チーム全員に同じーバージョンのツールを使ってもらえるようになります",{"2":{"33":1}}],["親しみやすさによって",{"2":{"40":1}}],["親切ですね",{"2":{"22":1}}],["なぜasdfを使うの",{"0":{"40":1}}],["などの機能をサポートするコマンドを使って",{"2":{"98":1}}],["など",{"2":{"22":1}}],["繰り返しになりますが",{"2":{"39":1}}],["たったこれだけです",{"2":{"68":1}}],["たくさんのcliツール",{"2":{"39":1}}],["たいていの場合は",{"2":{"30":1}}],["たいていの場合",{"2":{"22":1}}],["独自のプログラミング言語",{"2":{"39":1}}],["真に再現可能な環境を構築することを目指しています",{"2":{"39":1}}],["関連するコマンドフックについても参照してください",{"2":{"119":1,"120":1,"121":1}}],["関連するasdfプラグインの更新が必要となることがあります",{"2":{"22":2}}],["関連プロジェクト",{"0":{"35":1},"1":{"36":1,"37":1,"38":1,"39":1}}],["どうしても必要な場合にのみ使用してください",{"2":{"123":1}}],["どうしても並べ替えが避けられない場合",{"2":{"104":1}}],["どうなっているの",{"2":{"92":1}}],["どうやって動いているの",{"0":{"34":1}}],["どのコマンドがどのスクリプトを呼び出すかについては",{"2":{"101":1}}],["どのようなツールでもasdfで管理できるようになりますが",{"2":{"40":1}}],["どのツールが実行に失敗するか検証することができます",{"2":{"28":1}}],["従来は",{"2":{"33":1}}],["すでに同期されたリポジトリは削除されません",{"2":{"49":1}}],["すべてのスクリプトですべての環境変数が使用できるわけではありません",{"2":{"102":1}}],["すべてのスクリプトで使用される環境変数の全リストです",{"2":{"102":1}}],["すべてのコマンド",{"0":{"41":1}}],["すべてのコマンドの説明を見ることができます",{"2":{"32":1}}],["すべてのツール",{"2":{"33":1}}],["すべてのツールのバージョンは単一のファイル",{"2":{"33":1}}],["すると",{"2":{"29":1,"30":1,"58":1}}],["以降のasdfコアの互換性を保つために",{"2":{"106":1}}],["以降に記載されている必要なスクリプトを実装します",{"2":{"99":1}}],["以前と0",{"2":{"106":1}}],["以前にこのソースからインストールされたプラグインは削除されません",{"2":{"49":1}}],["以下に例を示します",{"2":{"127":1}}],["以下は",{"2":{"101":1,"102":1,"126":1}}],["以下では",{"2":{"51":1}}],["以下の各スクリプトのドキュメントで",{"2":{"102":1}}],["以下のコマンドが実行されたときに発生します",{"2":{"48":1,"49":1}}],["以下の表は",{"2":{"18":1}}],["以下のとおりです",{"2":{"13":1}}],["以上の場合",{"2":{"113":1}}],["以上経過していた場合",{"2":{"48":1}}],["以上で",{"2":{"32":1}}],["入門完了",{"0":{"32":1}}],["構成",{"2":{"58":1}}],["構成に必要な項目とそのデフォルト値を示しています",{"2":{"44":1}}],["構成ファイル",{"2":{"33":1}}],["構成設定のdisable",{"2":{"75":1}}],["構成設定のリファレンスをご覧ください",{"2":{"31":1,"82":1}}],["構成設定",{"0":{"42":1,"126":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1}}],["構成設定でのその他のオプションについて詳しくは",{"2":{"31":1}}],["構成を示すために使用されるjsオブジェクト含んだ",{"2":{"13":1}}],["かasdf",{"2":{"86":1}}],["からの移行をサポートしています",{"2":{"31":1}}],["かつ",{"2":{"13":1,"22":1,"105":1,"106":1}}],["例",{"2":{"31":1,"65":1}}],["例えばasdf",{"2":{"65":1}}],["例えば次のとおりです",{"2":{"6":1,"104":1}}],["例えば",{"2":{"4":1,"43":1,"45":1,"66":1,"100":1,"108":1,"111":1,"113":1,"122":1,"124":1}}],["では",{"2":{"91":1}}],["で指定されたもの",{"2":{"86":1}}],["で指定されたツールのシステムバージョンを使用するには",{"2":{"83":1}}],["でバージョンを指定できます",{"2":{"77":1}}],["で定義されます",{"2":{"30":1}}],["です",{"2":{"11":1,"18":1,"88":1,"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"117":1,"124":1}}],["0をアンインストールし",{"2":{"116":1}}],["0をインストールします",{"2":{"106":1}}],["0のソースコードまたはバイナリをダウンロードし",{"2":{"105":1}}],["0のelixirプロジェクトに対して",{"2":{"82":1}}],["0以上が必要です",{"2":{"104":1}}],["000を超えるパッケージコレクションによって",{"2":{"39":1}}],["0",{"2":{"29":1,"30":1,"43":4,"48":1,"66":4,"82":1,"104":3,"105":3,"106":4,"115":1,"116":1}}],["エラーが発生します",{"2":{"28":1}}],["ジャストインタイムで行われます",{"2":{"28":1}}],["照会は",{"2":{"28":1}}],["60",{"2":{"44":1,"58":1}}],["6",{"0":{"28":1},"1":{"29":1,"30":1,"31":1},"2":{"84":1}}],["特定のツールバージョンでコマンドを実行するだけのためにバージョンを設定したい場合は",{"2":{"82":1}}],["特定のツールを管理するためのプラグインをインストールすることができるようになります",{"2":{"34":1}}],["特定のプレフィックスでの最新安定バージョンで表示することもできます",{"2":{"81":1}}],["特定のプレフィックスでの最新安定バージョンをインストールすることもできます",{"2":{"78":1}}],["特定のプレフィックスでのバージョンでフィルタすることもできます",{"2":{"79":1,"80":1}}],["特定のプラグインパッケージを更新したい場合は",{"2":{"73":1}}],["特定のパッケージ",{"2":{"65":1}}],["特定のインストールに対して正しい更新方法を適用するようにします",{"2":{"59":1}}],["特定のメジャーバージョンのサブセットはasdf",{"2":{"27":1}}],["特定のバージョンのインストール",{"0":{"27":1}}],["特定の順序を必要とするツールの動作に",{"2":{"22":1}}],["5",{"0":{"27":1},"2":{"29":1,"30":1,"43":2,"66":2,"84":1}}],["あくまで",{"2":{"40":1}}],["あらかじめインストールしておきましょう",{"2":{"25":1}}],["あなたが作成したプラグインを",{"2":{"129":1}}],["あなたが選択したwslディストリビューションに基づいて",{"2":{"91":1}}],["あなたが使用しているシェル",{"2":{"22":1}}],["あなたが使用している",{"2":{"18":1}}],["あなたが開発した変更内容を試したいときは",{"2":{"2":1}}],["ymlファイルの例です",{"2":{"126":1}}],["yamllanguage",{"2":{"126":1}}],["yamlname",{"2":{"125":1}}],["yamlのactionsワークフローの例は以下のとおりです",{"2":{"125":1}}],["yarnのshimを作成しなければいけません",{"2":{"92":1}}],["yarnのような新しい実行ファイルのshimを強制的に再作成させることができます",{"2":{"65":1}}],["yarnが実行できません",{"2":{"92":1}}],["yarnを実行したにも関わらず",{"2":{"92":1}}],["yarnコマンドでyarnをインストール",{"2":{"65":1}}],["yes以外の文字列を設定した場合",{"2":{"57":1}}],["yesの場合",{"2":{"57":1}}],["yes",{"2":{"31":1,"45":1,"46":1,"47":1,"49":1}}],["yum",{"2":{"25":1}}],["your",{"2":{"1":1,"10":1}}],["依存関係を1行ごとに出力します",{"2":{"110":1}}],["依存関係インストールコマンド",{"2":{"25":1}}],["依存関係のインストール",{"0":{"18":1},"2":{"17":1}}],["各スクリプトの詳細なドキュメントを参照してください",{"2":{"101":1}}],["各ツールの未使用バージョンを手っ取り早くクリーンアップ",{"2":{"74":1}}],["各ツールの依存関係ツリー全体でパッケージのバージョンを正確に管理することで",{"2":{"39":1}}],["各プラグインには依存関係があるため",{"2":{"25":1}}],["各ロケールのmarkdownコンテンツは",{"2":{"14":1}}],["4",{"0":{"24":1},"1":{"25":1,"26":1},"2":{"82":3,"104":1}}],["ガイドを進めていきましょう",{"2":{"23":1}}],["バージョニングされたプラグインの更新機能については",{"2":{"73":1}}],["バージョン番号を1行で出力してください",{"2":{"118":1}}],["バージョン番号を抽出するのに役立ちます",{"2":{"118":1}}],["バージョン番号やツールプロバイダによる出力をフィルタするために使用されるべきです",{"2":{"108":1}}],["バージョンとしてsystemを指定します",{"2":{"83":1}}],["バージョン1",{"2":{"82":1}}],["バージョンは$pwd",{"2":{"82":1}}],["バージョンは$home",{"2":{"82":1}}],["バージョンはasdf",{"2":{"82":1}}],["バージョン",{"0":{"76":1},"1":{"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1}}],["バージョンのフルナンバーです",{"2":{"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"117":1}}],["バージョンのダウンロード",{"2":{"105":1}}],["バージョンのアンインストール",{"0":{"85":1}}],["バージョンの表記形式は",{"2":{"82":1}}],["バージョンの表記は下記の形式があります",{"2":{"43":1}}],["バージョンのインストール",{"0":{"77":1}}],["バージョンのshimを再作成します",{"2":{"65":1}}],["バージョンの読み込みには",{"2":{"45":1}}],["バージョンのリファレンスをご覧ください",{"2":{"29":1}}],["バージョン管理をシステムに委任するように指示する必要があります",{"2":{"29":1}}],["バージョンをセット",{"0":{"28":1},"1":{"29":1,"30":1,"31":1}}],["バージョンを管理するようになってからです",{"2":{"23":1}}],["バグレポート作成時に共有してください",{"2":{"64":1}}],["バグ修正のレビューをスピードアップさせることができます",{"2":{"2":1}}],["バイナリへのshimを再作成します",{"2":{"113":1}}],["バイナリへのshimを初期作成します",{"2":{"113":1}}],["バイナリがダウンロードされます",{"2":{"43":1}}],["バイナリのダウンロードに対応しているプラグインの場合",{"2":{"43":1}}],["ようにしてください",{"2":{"22":1}}],["より詳細な説明が記述されています",{"2":{"14":1}}],["優先度を一番高くする",{"2":{"22":1}}],["強制的にpathエントリの先頭に追加する",{"2":{"22":1}}],["一貫性が無くなってしまいます",{"2":{"22":1}}],["一部のレガシーファイルのフォーマットは適切でないときもあります",{"2":{"118":1}}],["一部のosでは",{"2":{"29":1}}],["一部のプラグインではインストール後の事後処理でこれらの依存関係が必要となるため",{"2":{"25":1}}],["一部のasdfツールのdocker化されたイメージを提供する取り組みを継続的に行っています",{"2":{"8":1}}],["一部例",{"2":{"18":1}}],["内部構成",{"0":{"59":1}}],["内で定義されるため",{"2":{"33":1}}],["内の項目の順番を並び替えることができるため",{"2":{"22":1}}],["内にすでに作成されているテスト",{"2":{"5":1}}],["使用するパッケージのバージョン",{"2":{"86":1}}],["使用するツールをカスタムコンパイルしたバージョンへのパスです",{"2":{"43":1}}],["使用方法",{"2":{"52":1,"53":1,"54":1,"55":1,"56":1}}],["使用中のフレームワーク",{"2":{"22":1}}],["使用しているos",{"2":{"3":1}}],["使用しているツールを列挙します",{"2":{"1":1}}],["+",{"2":{"22":2}}],["|",{"2":{"22":10}}],["まず",{"2":{"128":1}}],["また",{"2":{"49":1,"118":1}}],["またはインストール",{"2":{"102":1,"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"117":1}}],["またはshellのいずれかにsystemをセットしてください",{"2":{"83":1}}],["またはコミット",{"2":{"77":1}}],["または下記のコマンドで",{"2":{"70":1}}],["または1",{"2":{"50":1}}],["またはasdf",{"2":{"43":1,"86":1}}],["またはlinux",{"2":{"38":1}}],["または",{"2":{"22":1,"68":1,"82":1,"112":1}}],["または好みのaurヘルパーを使用",{"2":{"21":1,"67":1}}],["または有効にしていない場合に",{"2":{"11":1}}],["まだ更新されていません",{"2":{"22":2}}],["警告",{"2":{"22":2,"28":1,"123":1,"128":1}}],["フィルタクエリという1つの引数を受け取ります",{"2":{"108":1}}],["フィルタクエリは",{"2":{"108":1}}],["ファイル内容は関係ありません",{"2":{"59":1}}],["ファイル内で宣言しているツールのバージョンが使用されます",{"2":{"43":1}}],["ファイルの場所は",{"2":{"44":1}}],["ファイルは",{"2":{"43":1}}],["フレームワークソース以下にcompinitがくるようにしてください",{"2":{"22":1}}],["フォーマッタ",{"2":{"1":1}}],["=s",{"2":{"68":2}}],["=",{"2":{"22":9,"31":1,"44":6,"68":6}}],["$releases",{"2":{"127":1}}],["$relative",{"2":{"115":1}}],["$github",{"2":{"127":2}}],["$travis",{"2":{"126":1}}],["$file",{"2":{"118":1}}],["$fpath",{"2":{"22":1,"68":1}}],["$cmd",{"2":{"115":1,"127":2}}],["$install",{"2":{"115":1}}],["$query",{"2":{"108":1}}],["$e",{"2":{"68":4}}],["$env",{"2":{"22":2}}],["$pathを設定した後",{"2":{"93":1}}],["$pathを設定したあと",{"2":{"22":1}}],["$pathに設定されることで",{"2":{"86":1}}],["$pathの操作",{"2":{"33":1}}],["$pwd",{"2":{"30":2}}],["$nu",{"2":{"22":3}}],["$",{"2":{"22":16,"41":1,"68":17,"82":2,"86":4,"104":1,"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":5,"114":1,"115":1,"116":1,"117":2,"118":1,"119":3,"120":3,"121":3,"122":4,"125":1}}],["$homeが存在するので",{"2":{"58":1}}],["$home",{"2":{"22":8,"29":2,"43":1,"52":1,"55":1,"58":5,"68":49}}],["$asdf",{"2":{"2":1,"49":1,"59":1,"68":2,"106":1,"122":1}}],["最高優先度",{"2":{"57":1}}],["最後に同期した時刻から指定時間",{"2":{"48":1}}],["最後に同期した時刻からの経過時間をチェックします",{"2":{"48":1}}],["最新バージョンが末尾にくる必要があります",{"2":{"104":1}}],["最新安定バージョンの表示",{"0":{"81":1}}],["最新安定バージョンのインストール",{"0":{"78":1}}],["最新コミット",{"2":{"73":1}}],["最新の安定リリース",{"2":{"67":1}}],["最新リリースを使用します",{"2":{"46":1}}],["最新リリースではなく",{"2":{"46":1}}],["最新版をインストールするには",{"2":{"27":1}}],["最終的にsystemのpythonにフォールバックさせるには",{"2":{"43":1}}],["最も適したものを選択してください",{"2":{"22":1}}],["最小限の構成でmarkdownファイルを書くことに重点を置いています",{"2":{"11":1}}],["方法",{"2":{"21":1,"67":1}}],["理由がない限り",{"2":{"21":1}}],["~",{"2":{"20":1,"22":50,"43":1,"68":23,"115":2}}],["22",{"2":{"108":1}}],["2014年から今まで",{"2":{"95":1}}],["2を使用し",{"2":{"43":1}}],["2",{"0":{"19":1},"1":{"20":1,"21":1},"2":{"43":6,"82":1,"91":1,"104":1,"108":4,"118":1}}],["接頭にsudoが必要となる場合もあります",{"2":{"18":1}}],["お使いのシステムやシェルによって異なります",{"2":{"51":1}}],["お使いのシステムの構成によっては",{"2":{"18":1}}],["およびawkが必要です",{"2":{"104":1}}],["およびasdfのデバッグ情報を表示するヘルパーコマンドです",{"2":{"64":1}}],["および実行環境",{"2":{"86":1}}],["および実装",{"2":{"33":1}}],["およびrbenvのようなツールはすべて",{"2":{"36":1}}],["およびmanpath",{"2":{"22":1}}],["およびインストール方法によって",{"2":{"22":1}}],["およびgitlens",{"2":{"4":1}}],["およびワークフロー固有のファイルは",{"2":{"3":1}}],["およびテストすることを推奨します",{"2":{"2":1}}],["備考",{"2":{"18":1,"27":1,"43":1,"48":1,"49":1,"50":1,"86":1,"88":1,"102":1,"124":1,"126":1}}],["zdotdir",{"2":{"22":1}}],["zshなど",{"2":{"93":1}}],["zshに適した場所に配置されますが",{"2":{"22":1}}],["zshrcで",{"2":{"68":3}}],["zshrc",{"2":{"22":1,"93":1}}],["zshrcにある可能性があります",{"2":{"68":1}}],["zshrcにasdf",{"2":{"22":1}}],["zshrcに下記の行を追記することで設定できます",{"2":{"22":1}}],["zshrcに下記の行を追記します",{"2":{"22":2}}],["zshフレームワークプラグインを使用します",{"2":{"68":1}}],["zshフレームワークasdfによって設定されるか",{"2":{"22":1}}],["zshフレームワークを使用している場合",{"2":{"22":2}}],["zshフレームワークでcompinitのセットアップをカスタマイズしている場合は",{"2":{"22":1}}],["zshフレームワークのasdfプラグインで設定するか",{"2":{"22":1}}],["zshの手順をご覧ください",{"2":{"68":1}}],["zshの手順を参照してください",{"2":{"22":2}}],["zshのようなzshフレームワークプラグインを使用して",{"2":{"22":1}}],["zsh",{"2":{"22":9,"68":3}}],["zypper",{"2":{"18":2}}],["zh",{"2":{"14":4}}],["1行ずつリストします",{"2":{"104":2}}],["18で始まるバージョンのみフィルタし",{"2":{"104":1}}],["18",{"2":{"104":2,"105":1,"106":1,"116":1}}],["11",{"2":{"84":1}}],["17",{"2":{"66":2,"77":1,"78":1,"79":1,"80":1,"81":1,"84":2,"85":1}}],["14",{"2":{"66":4}}],["14コマンドで確認できます",{"2":{"27":1}}],["1から999999999までの整数値",{"2":{"48":1}}],["15にフォールバックし",{"2":{"43":1}}],["15",{"2":{"43":4,"116":2}}],["10",{"2":{"43":3}}],["16",{"2":{"29":1,"30":1,"66":2}}],["13",{"2":{"20":1}}],["1",{"0":{"18":1},"2":{"20":1,"82":1,"90":1,"104":4,"108":1,"115":1}}],["グローバルのデフォルト値は",{"2":{"43":1}}],["グローバルのデフォルト設定は",{"2":{"29":1}}],["グローバルのバージョンをセットするには",{"2":{"29":1}}],["グローバル",{"0":{"29":1}}],["グローバルまたはプロジェクトのバージョンをセット",{"2":{"17":1}}],["グローバルな",{"2":{"3":1}}],["ランタイムごとのマネージャ",{"2":{"36":1}}],["ランタイムごとにプラグインをインストール",{"2":{"17":1}}],["ランタイムのバージョン管理という分野では競合しています",{"2":{"36":1}}],["ランタイムの特定バージョンをインストール",{"2":{"17":1}}],["ランタイムに拡張することができます",{"2":{"33":1}}],["管理したいツール",{"2":{"17":1}}],["システムバージョンへの委任",{"0":{"83":1}}],["システム上のツールバージョンへパススルーします",{"2":{"43":1}}],["ショートネームインデックスに追加することができます",{"2":{"129":1}}],["ショートネームインデックスリポジトリを使用します",{"2":{"129":1}}],["ショートネームリポジトリはローカルマシンに同期され",{"2":{"75":1}}],["ショートネームリポジトリの同期",{"0":{"75":1}}],["ショートネームリポジトリが無効となっている場合",{"2":{"49":1}}],["ショートネームのリストです",{"2":{"16":1}}],["シンプルなプラグインインターフェースを使って",{"2":{"33":1}}],["シェルのツール",{"2":{"100":1}}],["シェルの構成ファイル",{"2":{"93":1}}],["シェルが",{"0":{"93":1}}],["シェル",{"2":{"64":1}}],["シェル構成にたった1行のシェルスクリプトを記述するだけで使えるというシンプルさ",{"2":{"40":1}}],["シェルによってsourceされるパッケージ内のスクリプトは",{"2":{"86":1}}],["シェルに",{"2":{"37":1}}],["シェル上でasdfコアがセットアップすると",{"2":{"34":1}}],["シェルを再起動してください",{"2":{"22":1}}],["シェルスクリプトの静的解析ツールです",{"2":{"1":1}}],["ポピュラーなasdfプラグインを検索するためにasdfコアが使用する",{"2":{"16":1}}],["そうでなければ",{"2":{"115":2}}],["そちらのガイドに従って削除する行を見つけてください",{"2":{"68":2}}],["そしてbin",{"2":{"105":1}}],["そしてフレームワーク",{"2":{"93":1}}],["そして",{"2":{"68":4}}],["そして60",{"2":{"39":1}}],["そしてリポジトリ内の様々な",{"2":{"36":1}}],["それらがインストールされているかどうかを出力します",{"2":{"108":1}}],["それらの機能を支えています",{"2":{"39":1}}],["それらの管理はユーザが負担することとなりますが",{"2":{"38":1}}],["それがそのツールにとって最善の方法であるとは限りませんのでご注意ください",{"2":{"40":1}}],["それぞれが異なるapi",{"2":{"33":1}}],["それぞれのリポジトリを参照してください",{"2":{"16":1}}],["それを使用する場合",{"2":{"29":1}}],["そのコミット",{"2":{"124":1}}],["そのバージョンのツールがインストールされます",{"2":{"124":1}}],["そのバイナリ向けのshimを作成します",{"2":{"113":1}}],["そのため",{"2":{"123":1}}],["そのファイルをコピーします",{"2":{"123":1}}],["そのままの順序を使用することを推奨します",{"2":{"104":1}}],["そのスクリプトで利用可能な環境変数を確認してください",{"2":{"102":1}}],["そのリポジトリをクローンしてsetup",{"2":{"99":1}}],["そのパッケージに含まれるすべての実行プログラムのshimが$asdf",{"2":{"86":1}}],["その場合は",{"2":{"68":1}}],["その方法の手順に従ってください",{"2":{"67":1}}],["そのような時に",{"2":{"65":1}}],["その他のシステムでのデフォルト値はnoです",{"2":{"57":1}}],["そのプラグインでインストールされたすべてのツールバージョンが削除されます",{"2":{"49":1}}],["その際は",{"2":{"2":1}}],["そのディレクトリのbinとshimsディレクトリを一時的にパスの先頭へ追加します",{"2":{"2":1}}],["いくつかのバージョンは画面外にはみ出る場合があります",{"2":{"104":1}}],["いくつかのtypescriptファイルに記述されています",{"2":{"13":1}}],["いつでも歓迎しています",{"2":{"16":1}}],["日々のワークライフに関連するプラグインをいくつか作成しています",{"2":{"16":1}}],["公式ダウンロード",{"0":{"20":1}}],["公式プラグイン",{"0":{"16":1}}],["公式のvitepress",{"2":{"14":1}}],["議論",{"2":{"15":1}}],["既存のイシュー",{"2":{"15":1}}],["ご興味を持っていただきありがとうございます",{"2":{"15":1}}],["└─",{"2":{"14":4}}],["│",{"2":{"14":1}}],["modのようなファイルから",{"2":{"118":1}}],["mit",{"2":{"95":1}}],["mix",{"2":{"82":1}}],["might",{"2":{"18":1}}],["my",{"2":{"22":5,"93":1,"125":1,"126":2}}],["matrix",{"2":{"125":2}}],["man",{"2":{"122":3}}],["manage",{"2":{"41":1}}],["make",{"2":{"102":1,"106":1}}],["makepkg",{"2":{"21":1}}],["main",{"2":{"86":1,"125":1}}],["masterブランチの最新コミット",{"2":{"67":1}}],["master",{"2":{"41":1}}],["masosユーザの方は",{"2":{"22":1}}],["macosでのデフォルト値はyes",{"2":{"57":1}}],["macosでasdfを利用するときは",{"2":{"22":1}}],["macosでは",{"2":{"22":1}}],["macos",{"2":{"18":2,"22":4,"25":1,"38":1,"68":3,"125":1}}],["md",{"2":{"14":6}}],["messageのフォーマットを使用してください",{"2":{"7":1}}],["messagesでは",{"2":{"7":1}}],["├─",{"2":{"14":5}}],["配下に同じmarkdownファイルのセットを配置する必要があります",{"2":{"14":1}}],["を指定すると",{"2":{"124":2}}],["を実行します",{"2":{"114":1,"115":1}}],["を実行すると",{"2":{"65":1}}],["を",{"2":{"99":1}}],["を決定し",{"2":{"86":1}}],["を取得します",{"2":{"73":1}}],["を制御します",{"2":{"48":1}}],["を使用しているのれあればそれをsourceした後に",{"2":{"93":1}}],["を使用して更新してください",{"2":{"43":1}}],["を使う場合は",{"2":{"4":1}}],["を呼び出したあとに記述する必要があります",{"2":{"22":1}}],["を有効にするには",{"2":{"14":1}}],["简体中文",{"2":{"14":1}}],["h",{"2":{"127":1}}],["haxeの実行ファイルが実行ディレクトリから相対的に動的ライブラリを見つけようとしてしまう問題を修正します",{"2":{"122":1}}],["haxe",{"2":{"122":1}}],["haxeは",{"2":{"122":1}}],["hashnuke",{"2":{"95":1,"96":1}}],["halcyon",{"2":{"71":1}}],["hans",{"2":{"14":4}}],["hw",{"2":{"50":1}}],["head",{"2":{"41":1,"67":2}}],["helpとなります",{"2":{"124":1}}],["help",{"0":{"109":1,"110":1,"111":1,"112":1},"2":{"41":1,"101":4,"109":2,"110":3,"111":3,"112":3,"122":3}}],["helpコマンドで表示されるテキストです",{"2":{"41":1}}],["helpコマンドまたは単にasdfコマンドを実行すれば",{"2":{"32":1}}],["helperはpath",{"2":{"22":1}}],["helperというユーティリティが呼び出されます",{"2":{"22":1}}],["helperに関する警告を必ず参照してください",{"2":{"22":1}}],["home",{"2":{"22":2,"44":1,"52":1,"54":1,"55":1,"117":1}}],["homebrewで説明されている方法で設定されている可能性があるため",{"2":{"68":2}}],["homebrewは",{"2":{"38":1}}],["homebrewの説明に従って設定必要があります",{"2":{"22":1}}],["homebrewのガイドに従って設定を完了させるか",{"2":{"22":2}}],["homebrew",{"0":{"38":1},"2":{"18":1,"21":1,"22":8,"51":1,"67":1,"68":5}}],["htmlのみのフォールバックをサポートしたいからでした",{"2":{"11":1}}],["https",{"2":{"1":5,"10":3,"20":1,"21":1,"26":1,"41":2,"70":1,"71":2,"124":1,"126":1,"129":1}}],["edit",{"2":{"22":3,"68":3}}],["echo",{"2":{"22":7}}],["elm",{"2":{"70":2}}],["else",{"2":{"68":2}}],["elvで",{"2":{"68":3}}],["elv",{"2":{"22":12,"68":3}}],["elvを追加します",{"2":{"22":3}}],["elvにasdf",{"2":{"22":3}}],["elvishの場合は",{"2":{"51":1}}],["elvish",{"2":{"22":18,"68":9}}],["elixirファイルとしても読み込まれます",{"2":{"123":1}}],["elixirなどの様々なツールを取り扱えるようにするためのものです",{"2":{"69":1}}],["elixir",{"2":{"16":1,"43":1,"82":3}}],["etc",{"0":{"36":1},"2":{"22":2,"68":2}}],["e",{"2":{"22":9}}],["erlang",{"2":{"16":1,"70":1,"73":1,"74":1,"77":1,"78":2,"79":2,"80":2,"81":2,"84":3,"85":1}}],["envスクリプトで提供",{"2":{"86":1}}],["environment",{"2":{"41":1}}],["env",{"0":{"114":1},"2":{"41":1,"63":1,"101":1,"114":3,"115":2}}],["en",{"2":{"14":3}}],["english",{"2":{"14":1}}],["example",{"2":{"115":1}}],["examples",{"2":{"7":1}}],["execヘルパーは",{"2":{"86":1}}],["execします",{"2":{"86":1}}],["execというヘルパープログラムに",{"2":{"86":1}}],["execution",{"2":{"41":1}}],["executes",{"2":{"41":1}}],["executable",{"2":{"41":1,"86":1,"115":1,"122":2}}],["exec",{"0":{"114":1,"115":1},"2":{"41":1,"62":1,"101":2,"114":2,"115":4}}],["export",{"2":{"14":1,"52":1,"53":1,"54":1,"55":1,"56":1}}],["ルート構成が下記の場合",{"2":{"14":1}}],["ルート構成ファイル内のlocales内のキーと同じ名前のディレクトリ配下に配置する必要があります",{"2":{"14":1}}],["ルート構成ファイルであるdocs",{"2":{"14":1}}],["ルート構成ファイルを簡素化するために",{"2":{"13":1}}],["個別にエクスポートされます",{"2":{"14":1}}],["ドロップメニューのタイトル",{"2":{"14":1}}],["ドキュメントの変更に関するプルリクエストを作成する場合",{"2":{"12":1}}],["ドキュメントサイト開発用のツールは",{"2":{"10":1}}],["ドキュメントおよびサイトのコントリビューションガイドです",{"2":{"9":1}}],["ドキュメント",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1}}],["サポートされているロケールとそのurl",{"2":{"14":1}}],["サイドバーの構成設定は前述の構成ファイルにキャプチャされ",{"2":{"14":1}}],["サイドバーの構成への参照を定義しています",{"2":{"14":1}}],["サイドバー",{"2":{"13":1}}],["サイトのルート構成ファイルです",{"2":{"13":1}}],["サイトの構成設定は",{"2":{"13":1}}],["サイト",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1}}],["国際化対応に関して最高のサポートを備えています",{"2":{"14":1}}],["ロケールごとに分類され",{"2":{"14":1}}],["ロケールごとに分類されています",{"2":{"13":1}}],["ローカルディレクトリパスを指定することもできます",{"2":{"119":1}}],["ローカルのバージョン設定は",{"2":{"30":1}}],["ローカルの開発サーバを起動するには",{"2":{"11":1}}],["ローカル",{"0":{"30":1}}],["ローカルでテストを実行するには",{"2":{"5":1}}],["ローカルマシンで開発する際は",{"2":{"1":1}}],["のみ",{"2":{"112":1}}],["の問題を避けるために",{"2":{"106":1}}],["の一番下にないことが原因である可能性があります",{"2":{"93":1}}],["の",{"2":{"73":1}}],["のshimを提供するプラグインおよびバージョンを一覧で表示します",{"2":{"66":1}}],["の優先順でコア数を計算します",{"2":{"50":1}}],["のためのパッケージマネージャー",{"2":{"38":1}}],["の構成を示す大きなjsオブジェクトについては",{"2":{"13":1}}],["の種類は次のとおりです",{"2":{"7":1}}],["とされていますが",{"2":{"105":1}}],["という名前のリポジトリを自分で立ち上げ",{"2":{"99":1}}],["ということです",{"2":{"91":1}}],["というフォーマットで作成するようにしてください",{"2":{"12":1}}],["となっていました",{"2":{"33":1,"105":1}}],["と",{"2":{"13":1,"124":1}}],["仕様については",{"2":{"13":1}}],["rvmrc",{"2":{"117":1}}],["rs",{"2":{"68":4}}],["rf",{"2":{"68":26}}],["rm",{"2":{"49":1,"68":4}}],["rbenv",{"0":{"36":1}}],["rbenvの場合は",{"2":{"31":1}}],["rocky",{"2":{"25":1}}],["root",{"2":{"14":1}}],["rc",{"2":{"22":9,"68":3}}],["rubyの出力は",{"2":{"108":1}}],["rubyのrbenvであれば",{"2":{"45":1}}],["rubyプラグインでのasdf",{"2":{"108":1}}],["ruby",{"2":{"16":1,"31":1,"43":2,"45":2,"101":1,"108":3,"117":1}}],["running",{"2":{"122":5}}],["runs",{"2":{"41":1,"125":1}}],["run",{"2":{"11":2}}],["request",{"2":{"125":1}}],["requestで強制されます",{"2":{"7":1}}],["returns",{"2":{"86":2}}],["returned",{"2":{"41":1}}],["recursive",{"2":{"49":1}}],["recreate",{"2":{"41":1}}],["resources",{"2":{"41":1}}],["reshimコマンドを実行しても問題が解決しない場合",{"2":{"93":1}}],["reshimコマンドのドキュメントをご覧ください",{"2":{"92":1}}],["reshim",{"2":{"41":1,"65":2,"113":1}}],["remove",{"0":{"121":1},"2":{"41":3,"49":1,"74":2,"101":1,"121":6}}],["registered",{"2":{"41":1}}],["repoアクセスのみをもつ新しいパーソナルトークンを作成してください",{"2":{"128":1}}],["repositoryオプションがyesの場合",{"2":{"75":1}}],["repositoryコマンドを実行してください",{"2":{"49":1}}],["repositoryの節をご覧ください",{"2":{"48":1}}],["repository",{"0":{"48":1,"49":1},"2":{"41":1,"44":2,"58":2,"75":1,"112":1}}],["repo",{"2":{"41":3}}],["readme",{"2":{"14":4}}],["refです",{"2":{"102":2,"120":2}}],["refの値が入ります",{"2":{"102":1}}],["ref>",{"2":{"41":1,"124":1}}],["ref",{"2":{"41":2,"43":2,"77":1,"102":2,"120":3,"124":1}}],["refs",{"2":{"41":1}}],["referenceをご覧ください",{"2":{"13":1}}],["refactor",{"2":{"7":1}}],["revert",{"2":{"7":1}}],["revsを使用して",{"2":{"4":1}}],["revs",{"0":{"4":1},"2":{"4":5}}],["release",{"0":{"46":1},"2":{"7":1,"41":1,"44":1,"58":1}}],["類似ツールであるdocsify",{"2":{"11":1}}],["は必須です",{"2":{"124":1}}],["は公式にはサポートしていません",{"2":{"90":1}}],["は60",{"2":{"48":1}}],["はじめようのガイドで説明されています",{"2":{"61":1}}],["はじめよう",{"0":{"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1}}],["は",{"2":{"11":1}}],["jrubyやrbx",{"2":{"108":1}}],["jのようなフラグを設定する際に便利です",{"2":{"102":1,"106":1}}],["jthegedus",{"2":{"96":1}}],["javascriptのpackage",{"2":{"118":1}}],["javascriptエンジンをベースに構築されたjavascriptランタイムです",{"2":{"10":1}}],["java",{"2":{"71":3}}],["jobs",{"2":{"125":1}}],["john",{"2":{"52":1,"54":1,"55":1}}],["join",{"2":{"22":4,"68":2}}],["jsのバージョン18",{"2":{"105":1,"106":1}}],["jsの依存関係をインストールしてください",{"2":{"10":1}}],["jsやruby",{"2":{"69":1}}],["jsやvuepressに代わってvitepressが採用されたのは",{"2":{"11":1}}],["jsにはnodeとnpmという2つの実行ファイルが提供されています",{"2":{"66":1}}],["js用のプラグインをインストールしたので",{"2":{"27":1}}],["jsをインストール",{"2":{"24":1}}],["jsでは",{"2":{"14":1}}],["js",{"2":{"10":1,"13":3,"14":2,"16":1}}],["jsonや",{"2":{"118":1}}],["jsonのコード",{"2":{"11":1}}],["jsonには",{"2":{"11":1}}],["jsonに下記のように記述します",{"2":{"4":1}}],["jsonをもとに",{"2":{"10":1}}],["json",{"2":{"4":1}}],["破壊的変更を示します",{"2":{"7":1}}],["workflows",{"2":{"125":1}}],["wsl2でテストスイートを実行する予定ですが",{"2":{"91":1}}],["wsl2が正常に動作するのは",{"2":{"91":1}}],["wsl2",{"2":{"91":1}}],["wsl2をサポートしていますか",{"0":{"91":1}}],["wsl1を公式にサポートする予定はありません",{"2":{"90":1}}],["wsl1をサポートしていますか",{"0":{"90":1}}],["wsl1",{"2":{"90":1}}],["where",{"2":{"41":1,"86":1}}],["which",{"2":{"22":1,"41":1,"86":1,"114":1,"115":1}}],["windows",{"2":{"90":1,"91":1}}],["with",{"2":{"7":1,"22":1,"41":3,"125":1}}],["will",{"2":{"6":2,"22":1}}],["website",{"2":{"7":2}}],["ubuntu",{"2":{"125":1}}],["ubuntuプロジェクトは",{"2":{"8":1}}],["upgrade",{"2":{"67":2}}],["updated",{"2":{"120":4}}],["updateコマンドによる更新は無効になります",{"2":{"59":1}}],["updateコマンドでasdfを更新する際に",{"2":{"46":1}}],["updates",{"2":{"59":1}}],["update",{"0":{"120":1},"2":{"7":1,"41":8,"67":2,"73":3,"101":1,"120":2}}],["util",{"2":{"41":2,"63":1,"114":2,"115":2}}],["utils",{"2":{"41":1}}],["uninstall",{"0":{"116":1},"2":{"41":1,"68":5,"85":2,"101":1,"116":2}}],["urlが指定されなかった場合",{"2":{"129":1}}],["urlを決定するために",{"2":{"129":1}}],["urlをもとに直接インストールする方法です",{"2":{"129":1}}],["urlを使用することを推奨します",{"2":{"70":1}}],["urls",{"2":{"41":3,"71":1}}],["url",{"2":{"41":1,"48":1,"49":1,"102":1,"119":1,"124":1}}],["url>",{"2":{"41":1,"70":1,"124":2,"129":1}}],["uz",{"2":{"22":1,"68":1}}],["usage",{"2":{"57":1}}],["uses",{"2":{"125":1}}],["users",{"2":{"84":3}}],["user>",{"2":{"1":1,"10":1}}],["used",{"2":{"41":3}}],["use",{"0":{"46":1},"2":{"22":4,"44":1,"51":1,"58":1,"106":1}}],["us",{"2":{"14":1}}],["overviewを用意する必要があります",{"2":{"110":1,"111":1,"112":1}}],["overview",{"0":{"109":1},"2":{"101":1,"109":1}}],["of",{"2":{"41":9,"106":2}}],["output",{"2":{"41":1,"115":1}}],["one",{"2":{"41":1}}],["on",{"2":{"41":4,"125":2}}],["ohmyzsh",{"2":{"22":4}}],["oh",{"2":{"22":5,"93":1}}],["options",{"2":{"50":1}}],["optionally",{"2":{"41":3}}],["optional",{"2":{"7":2,"41":1}}],["opt",{"2":{"22":9,"68":3}}],["osx",{"2":{"126":1}}],["os",{"2":{"18":1,"22":1,"25":1,"41":1,"64":1,"125":2,"126":1}}],["origin",{"2":{"73":1}}],["org",{"2":{"21":1}}],["or",{"2":{"1":1,"10":1,"22":1,"41":6,"43":1}}],["リンクを1行ごとに出力してください",{"2":{"112":1}}],["リンクを1行ごとに出力します",{"2":{"112":1}}],["リポジトリのショートネームに依存しないために",{"2":{"70":1}}],["リポジトリをご覧ください",{"2":{"15":1}}],["リリース候補版を使用します",{"2":{"46":1}}],["リリース候補版へ更新するか制御します",{"2":{"46":1}}],["リリース",{"0":{"7":1,"12":1}}],["リモートにコミットまたはプッシュする前に",{"2":{"2":1}}],["39cb398vb39",{"2":{"43":1}}],["3",{"0":{"22":1},"2":{"6":1,"43":4,"66":2,"77":1,"84":2,"85":1,"104":1,"108":2,"118":1}}],["3を使用して出力を表示できるため",{"2":{"6":1}}],[">>",{"2":{"22":15}}],[">",{"2":{"6":1,"7":1,"108":3}}],["dylibs",{"2":{"122":1}}],["danhper",{"2":{"96":1}}],["data",{"0":{"55":1},"2":{"49":1,"55":1,"58":2,"68":11,"86":1,"122":5}}],["durationオプションで変更することができます",{"2":{"75":1}}],["duration",{"0":{"48":1},"2":{"44":1,"58":1}}],["during",{"2":{"6":2}}],["doe",{"2":{"52":1,"54":1,"55":1}}],["downloadスクリプトがすでにバージョンをダウンロードしていると想定し",{"2":{"106":1}}],["downloadスクリプトが存在しない場合",{"2":{"106":1}}],["downloadによってソースコードまたはバイナリがダウンロードされる場所へのパスです",{"2":{"102":1}}],["download",{"0":{"47":1,"105":1},"2":{"44":1,"58":1,"101":1,"102":1,"105":6,"106":2}}],["dockerイメージ",{"0":{"8":1}}],["documentation",{"2":{"7":1,"41":1,"112":1}}],["docsifyとvitepressがvuepressに急速に取って代わっていた場合には不可能でした",{"2":{"11":1}}],["docs",{"2":{"7":3,"10":1,"12":1,"13":3,"14":2,"41":1}}],["disabled",{"2":{"59":1}}],["disable",{"0":{"49":1},"2":{"44":1,"48":1,"58":1}}],["display",{"2":{"41":4}}],["dirは空であり",{"2":{"58":1}}],["dirは空なので",{"2":{"58":1}}],["directory",{"2":{"57":1,"86":1}}],["direnvプラグインが役に立ちます",{"2":{"87":1}}],["direnvプラグインが存在します",{"2":{"37":1}}],["direnvの動作をasdfに統合するasdf",{"2":{"37":1}}],["direnv",{"0":{"37":1}}],["dirの値を使用します",{"2":{"55":1}}],["dirmngr",{"2":{"25":1}}],["dir=",{"2":{"22":3,"54":1,"55":1}}],["dir",{"0":{"54":1,"55":1},"2":{"22":4,"49":1,"58":2,"59":1,"68":12,"86":1,"122":5,"126":1}}],["dir変数に",{"2":{"2":1}}],["d",{"2":{"22":2,"68":2}}],["dnf",{"2":{"18":2}}],["deps",{"0":{"110":1},"2":{"101":1,"110":1}}],["debug",{"2":{"41":1}}],["debian",{"2":{"25":1}}],["defineconfig",{"2":{"14":1}}],["default",{"0":{"53":1},"2":{"13":1,"14":1,"41":3,"53":1,"58":2}}],["description",{"2":{"12":1,"50":1}}],["description>",{"2":{"7":1}}],["dev",{"2":{"11":1,"88":2}}],["npm",{"2":{"65":2,"66":1,"92":1,"116":1}}],["nproc",{"2":{"50":1}}],["ncpu",{"2":{"50":1}}],["name",{"0":{"49":1},"2":{"41":1,"43":1,"44":1,"48":3,"49":3,"58":1,"75":2,"83":1,"98":2,"99":2,"104":1,"108":1,"109":1,"110":1,"111":1,"112":1,"116":1,"119":2,"120":2,"121":2,"124":2,"125":2}}],["name>",{"2":{"41":19,"65":1,"70":2,"73":1,"74":1,"77":1,"78":2,"79":2,"80":2,"81":2,"82":5,"83":1,"84":1,"85":1,"124":2,"126":1,"129":1}}],["nav",{"2":{"14":3}}],["navbars",{"2":{"13":1,"14":3}}],["navバー",{"2":{"13":1,"14":2}}],["nixは",{"2":{"39":1}}],["nixosは",{"2":{"39":2}}],["nixos",{"0":{"39":1}}],["nvm",{"0":{"36":1},"2":{"36":1}}],["nvmrcファイルと",{"2":{"31":1}}],["n$env",{"2":{"22":3}}],["nu",{"2":{"22":6}}],["nuを追加します",{"2":{"22":3}}],["nuにasdf",{"2":{"22":3}}],["nushell",{"2":{"22":6}}],["nsource",{"2":{"22":1}}],["neko",{"2":{"122":1}}],["never",{"2":{"48":1}}],["nexport",{"2":{"22":1}}],["nested",{"2":{"14":2}}],["new",{"2":{"7":1}}],["no",{"2":{"44":4,"45":1,"46":1,"47":1,"49":1,"58":4}}],["node",{"2":{"10":2,"16":1,"27":1,"31":1,"66":2,"84":1,"105":1,"106":1,"124":1}}],["nodejsプラグインをテストするときは",{"2":{"124":1}}],["nodejsプラグインを使用してnode",{"2":{"24":1}}],["nodejsプラグインで",{"2":{"66":1}}],["nodejsのバージョン18",{"2":{"116":1}}],["nodejsの",{"2":{"65":1}}],["nodejsの場合",{"2":{"25":1}}],["nodejsであれば",{"2":{"31":1}}],["nodejsコマンドで確認できますし",{"2":{"27":1}}],["nodejs",{"2":{"10":2,"26":2,"27":2,"29":2,"30":2,"43":2,"65":1,"66":6,"71":3,"84":1,"104":2,"105":1,"106":1,"116":1,"124":2,"129":2}}],["note",{"2":{"40":1}}],["not",{"2":{"6":1}}],["n",{"0":{"36":1},"2":{"6":2,"22":16,"36":1,"127":1}}],["public",{"2":{"128":1}}],["push",{"2":{"125":1}}],["pull",{"2":{"7":1,"125":1}}],["python",{"2":{"43":3,"83":1}}],["pythonのように",{"2":{"29":1}}],["parse",{"0":{"118":1},"2":{"101":1,"118":1}}],["particular",{"2":{"41":1}}],["path>",{"2":{"115":2,"126":1}}],["pathからの相対パスである必要があります",{"2":{"113":1}}],["path環境変数が設定されているかを確認してください",{"2":{"106":1}}],["pathにファイルを配置するようなスクリプトとしてください",{"2":{"106":1}}],["pathのパスのディレクトリにインストールする必要があります",{"2":{"106":1}}],["pathの変更を反映するために",{"2":{"22":1}}],["pathディレクトリに",{"2":{"106":1}}],["pathディレクトリに配置します",{"2":{"105":1}}],["pathディレクトリに配置する必要があります",{"2":{"105":1}}],["pathディレクトリ内に何もファイルを配置しないようにしてください",{"2":{"105":1}}],["pathで指定されたディレクトリに",{"2":{"105":1}}],["pathsスクリプトでカスタマイズできます",{"2":{"106":1}}],["paths",{"0":{"113":1},"2":{"101":1,"113":1}}],["pathコールバックで操作可能",{"2":{"86":1}}],["path",{"0":{"115":1},"2":{"22":8,"41":2,"43":1,"57":1,"86":2,"101":1,"102":3,"104":1,"105":3,"106":4,"108":2,"109":2,"110":2,"111":2,"112":2,"113":6,"114":2,"115":7,"116":1,"117":2,"118":2,"119":2,"120":2,"121":2,"127":1}}],["pacmanやhomebrewのようなパッケージマネージャによって使用され",{"2":{"59":1}}],["pacman",{"2":{"18":2,"21":1,"22":7,"67":1,"68":4}}],["packages",{"2":{"41":3}}],["package",{"2":{"10":1,"11":2,"41":15,"86":1}}],["ps1にasdf",{"2":{"22":1}}],["ps1に下記の行を追記します",{"2":{"22":2}}],["ps1",{"2":{"22":4}}],["post",{"0":{"119":1,"120":1},"2":{"101":2,"102":1,"119":3,"120":4,"121":2}}],["posix",{"2":{"22":3}}],["powershell",{"2":{"22":7}}],["portuguese",{"2":{"14":1}}],["p",{"2":{"22":4}}],["project",{"2":{"84":1}}],["proc",{"2":{"50":1}}],["provide",{"2":{"41":1}}],["provided",{"2":{"41":2}}],["profileで",{"2":{"68":2}}],["profile",{"2":{"22":8,"93":1}}],["profileに設定が見つからない場合は",{"2":{"68":1}}],["profileにasdf",{"2":{"22":2}}],["profileに下記の行を追記します",{"2":{"22":4}}],["prev",{"2":{"102":1,"120":1}}],["pre",{"0":{"121":1},"2":{"101":1,"119":2,"120":2,"121":3}}],["prepend=no",{"2":{"57":1}}],["prepend",{"0":{"57":1}}],["prepend環境変数で制御できます",{"2":{"22":1}}],["prefix",{"2":{"22":12,"68":6}}],["pr",{"2":{"14":1}}],["print",{"2":{"41":2}}],["printed",{"2":{"6":2}}],["printf",{"2":{"6":2}}],["pt",{"2":{"14":6}}],["perf",{"2":{"7":1}}],["pleaseという自動リリースツールを使用して",{"2":{"7":1}}],["plugins",{"2":{"41":6,"115":1,"122":5}}],["pluginsショートネームリポジトリ",{"2":{"16":1}}],["pluginトピック検索",{"2":{"16":1}}],["plugin",{"0":{"48":1,"49":1,"119":1,"120":1,"121":1},"2":{"1":3,"10":1,"22":1,"26":1,"41":12,"44":2,"48":4,"49":4,"58":2,"70":4,"71":4,"72":1,"73":3,"74":2,"75":3,"86":2,"99":1,"101":3,"102":4,"104":1,"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":2,"116":1,"117":1,"118":1,"119":11,"120":12,"121":10,"124":12,"125":4,"126":2,"129":2}}],["ディレクトリごとに環境変数をロード",{"2":{"37":1}}],["デフォルトは",{"2":{"124":1}}],["デフォルトは~",{"2":{"86":1}}],["デフォルト",{"2":{"114":1,"115":1}}],["デフォルトブランチ",{"2":{"73":1}}],["デフォルトブランチでのコミットメッセージのフォーマットとなる",{"2":{"7":1}}],["デフォルトでは",{"2":{"65":1}}],["デフォルト構成を使用します",{"2":{"58":5}}],["デフォルト構成のconcurrencyの値に依存します",{"2":{"58":1}}],["デフォルトロケーションは",{"2":{"51":1}}],["デフォルトのスクリプトが実装されたプラグインリポジトリ",{"2":{"99":1}}],["デフォルトのシェルがzshに変更されました",{"2":{"68":1}}],["デフォルトのシェルはzshです",{"2":{"22":2}}],["デフォルトのブランチをgitクローンしてください",{"2":{"1":1,"10":1}}],["デバッグが簡単になります",{"2":{"6":1}}],["go言語のgo",{"2":{"118":1}}],["gでグローバルにインストールしたものを含むすべてのshimを削除します",{"2":{"116":1}}],["g",{"2":{"65":1,"92":1}}],["given",{"2":{"41":1}}],["gitref",{"2":{"124":2}}],["gitのref",{"2":{"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"117":1}}],["gitのurlからプラグインを追加します",{"2":{"70":1}}],["gitのオプションで",{"2":{"4":1}}],["git経由",{"2":{"67":1}}],["git経由でインストール",{"2":{"58":1}}],["git依存のアップデートコマンドが用意されています",{"2":{"67":1}}],["gitクローン",{"2":{"51":1}}],["gitコマンドを使用した公式ダウンロードの手順を使用することを強く推奨します",{"2":{"21":1}}],["gitlens",{"2":{"4":1}}],["gitignoreコード",{"2":{"3":1}}],["gitignore構成で無視する必要があります",{"2":{"3":1}}],["gitignoreファイルです",{"2":{"3":1}}],["gitignore",{"0":{"3":1}}],["github上でホストされているプラグインをテストするためのgithub",{"2":{"125":1}}],["githubのコントリビューターリスト🙏をご覧ください",{"2":{"97":1}}],["github",{"0":{"15":1,"125":1,"128":1},"2":{"1":6,"7":1,"10":4,"16":1,"20":1,"26":1,"41":2,"70":1,"71":2,"88":2,"91":1,"112":1,"124":1,"125":1,"126":1,"128":1,"129":1}}],["githubでasdfをフォークするか",{"2":{"1":1,"10":1}}],["git",{"0":{"4":1},"2":{"1":7,"4":6,"10":4,"18":6,"20":1,"21":2,"22":8,"26":1,"41":6,"48":1,"49":1,"68":5,"70":2,"71":2,"104":2,"120":1,"124":3,"126":2,"129":1}}],["globalの場合",{"2":{"82":1}}],["globalコマンド",{"2":{"43":1}}],["global",{"2":{"29":1,"41":4,"82":4,"83":1,"86":1,"108":1}}],["gnupg2",{"2":{"25":1}}],["gawk",{"2":{"25":3}}],["gpg",{"2":{"25":2}}],["get",{"2":{"25":1}}],["gt",{"2":{"6":1,"7":2,"12":1,"43":1,"48":3,"49":4,"57":1,"65":2,"66":1,"75":1,"83":1,"98":3,"99":2,"104":1,"105":2,"106":3,"108":5,"109":2,"110":2,"111":2,"112":5,"113":3,"114":3,"115":3,"116":2,"119":1,"120":2,"121":1,"124":7}}],["難しいことがあります",{"2":{"6":1}}],["毎回手動でファイルを指定しなくても",{"2":{"4":1}}],["i",{"2":{"116":1}}],["io",{"2":{"112":1}}],["is",{"2":{"43":2}}],["if",{"2":{"41":1,"127":1}}],["information",{"2":{"41":1}}],["info",{"2":{"41":1,"64":1}}],["inside",{"2":{"41":1}}],["installs",{"2":{"115":1}}],["installでソースコードをダウンロードするようにしてください",{"2":{"106":1}}],["installスクリプトを実行します",{"2":{"105":1}}],["installスクリプトがあると想定して",{"2":{"105":1}}],["installation",{"2":{"86":1}}],["installコマンドでダウンロードしたソースコードやバイナリを",{"2":{"47":1}}],["installコマンドを引数を指定せずに実行します",{"2":{"43":1}}],["installed",{"2":{"41":5}}],["install",{"0":{"106":1},"2":{"1":1,"4":1,"10":2,"18":6,"21":1,"25":3,"27":1,"41":10,"43":1,"65":1,"77":2,"78":4,"92":1,"98":1,"101":1,"102":4,"105":8,"106":15,"108":6,"109":7,"110":7,"111":7,"112":7,"113":11,"114":5,"115":6,"117":5}}],["into",{"2":{"22":2}}],["initialise",{"2":{"22":1}}],["in",{"2":{"18":1,"41":3,"86":1}}],["i18nドキュメントには",{"2":{"14":1}}],["i18n",{"0":{"14":1}}],["ideを設定することもできます",{"2":{"4":1}}],["ignorerevsfile",{"2":{"4":1}}],["ignore",{"0":{"4":1},"2":{"4":6}}],["bit",{"2":{"122":2}}],["binディレクトリ内にあるバイナリを探し",{"2":{"113":1}}],["bin内にあるファイルに対して作成されます",{"2":{"106":1}}],["bin",{"0":{"104":1,"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":2,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1},"2":{"54":1,"58":1,"86":1,"101":18,"102":1,"104":1,"105":1,"106":5,"108":1,"109":1,"110":2,"111":2,"112":2,"113":3,"114":1,"115":5,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"127":1}}],["by",{"2":{"41":1}}],["branches",{"2":{"125":1}}],["branch",{"2":{"20":1,"41":3,"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"117":1}}],["brazilian",{"2":{"14":1}}],["brew",{"2":{"18":1,"21":1,"22":12,"25":1,"67":2,"68":7}}],["breaking",{"2":{"7":1}}],["br",{"2":{"14":7}}],["build",{"2":{"7":1,"126":1}}],["before",{"2":{"126":1}}],["begins",{"2":{"41":1}}],["being",{"2":{"41":2}}],["be",{"2":{"6":2}}],["blameを呼び出すたびにこのファイルを使うように設定することもできます",{"2":{"4":1}}],["blameを実行するときは",{"2":{"4":1}}],["blameを実行する際のノイズを減らしています",{"2":{"4":1}}],["blameのドキュメントをご覧ください",{"2":{"4":1}}],["blame",{"0":{"4":1},"2":{"4":7}}],["baz`",{"2":{"122":1}}],["baz",{"2":{"122":1}}],["bar`",{"2":{"122":1}}],["bar",{"2":{"122":1}}],["bat",{"2":{"122":6}}],["batsでのデバッグは",{"2":{"6":1}}],["batsのヒント",{"0":{"6":1}}],["batsテスト",{"0":{"5":1},"1":{"6":1}}],["bats",{"2":{"1":3,"2":2,"4":1,"5":1,"6":6}}],["basgまたはzshシェルを起動すると",{"2":{"22":1}}],["bash`",{"2":{"122":3}}],["bashスクリプトまたは実行ファイルを用意することで",{"2":{"122":1}}],["bash1",{"2":{"118":1}}],["bashbin",{"2":{"113":1}}],["bashgit",{"2":{"110":1,"112":1}}],["bashのスクリプトを実行し",{"2":{"99":1}}],["bashasdf",{"2":{"74":1}}],["bashシェル",{"2":{"58":1}}],["bashシェルでの使用方法について説明します",{"2":{"51":1}}],["bashrcで",{"2":{"68":3}}],["bashrc",{"2":{"22":2}}],["bashrcにasdf",{"2":{"22":1}}],["bashrcに下記の行を追記します",{"2":{"22":3}}],["bashに変更していない限り",{"2":{"22":2}}],["bashで使用されている既存のbatsの設定",{"2":{"5":1}}],["bash",{"2":{"2":4,"5":1,"22":17,"68":14,"93":1,"104":1,"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":2,"118":1,"119":1,"120":1,"121":1,"122":6}}],["bashをサポートするシェルパーサ",{"2":{"1":1}}],["bash自動テストシステムです",{"2":{"1":1}}],["bashまたはposix準拠のスクリプトを単体テストするための",{"2":{"1":1}}],["ツールに関連するユーティリティを提供したり",{"2":{"122":1}}],["ツールによってはこれが望ましくないことがあります",{"2":{"108":1}}],["ツールによってインストールされる実行ファイルのshimを作成するシェルスクリプトです",{"2":{"36":1}}],["ツールがインストール",{"2":{"102":1,"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"117":1}}],["ツール名とバージョンの情報を格納するファイルのファイル名です",{"2":{"53":1}}],["ツールは",{"2":{"43":1}}],["ツールのインストール",{"2":{"111":1}}],["ツールの最新バージョンを出力します",{"2":{"108":1}}],["ツールの最新安定バージョンをインストールします",{"2":{"108":1}}],["ツールの最新安定バージョンを標準出力する必要があります",{"2":{"108":1}}],["ツールの最新安定バージョンを判定します",{"2":{"108":1}}],["ツールのローカルバージョンとして",{"2":{"108":1}}],["ツールのグローバルバージョンとして",{"2":{"108":1}}],["ツールのビルドとインストールが成功したとみなされた場合にのみ",{"2":{"106":1}}],["ツールのバイナリのshimを実行する前に環境を準備します",{"2":{"101":1,"114":1}}],["ツールのバージョン管理をサポートするための実行スクリプトを含めたgitリポジトリのことです",{"2":{"98":1}}],["ツールのバージョンを決定します",{"2":{"118":1}}],["ツールのバージョンを決定するために使用されるレガシー構成ファイルのリストを出力します",{"2":{"117":1}}],["ツールのバージョンを読み込むすべてのコマンドから呼び出されます",{"2":{"117":1,"118":1}}],["ツールのバージョンをインストールする場所です",{"2":{"55":1}}],["ツールのバージョンを照会します",{"2":{"28":1}}],["ツールのバージョンマネージャです",{"2":{"40":1}}],["ツールのバージョン",{"2":{"32":1}}],["ツールの特定バージョンにおける",{"2":{"113":1}}],["ツールの特定バージョンを指定された場所にインストールします",{"2":{"106":1}}],["ツールの特定バージョンをアンインストールします",{"2":{"101":1,"116":1}}],["ツールの特定バージョンをインストールします",{"2":{"101":1}}],["ツールの特定バージョンの実行ファイルパスを取得します",{"2":{"115":2}}],["ツールの特定バージョンの実行ファイルパスを出力します",{"2":{"101":1}}],["ツールの特定バージョンのソースコードまたはバイナリを",{"2":{"105":1}}],["ツールの特定バージョンのソースコードまたはバイナリをダウンロードします",{"2":{"101":1}}],["ツールのためのバージョンマネージャです",{"2":{"33":1}}],["ツールごとに用意された既存バージョンファイルの利用",{"0":{"31":1}}],["ツールで指定されたバージョンが見つからない場合",{"2":{"28":1}}],["ツール",{"2":{"3":1,"17":1,"36":2}}],["プルーニングするのに有用です",{"2":{"74":1}}],["プルリクエストをテストする際に便利です",{"2":{"124":1}}],["プルリクエストを作成する前に",{"2":{"2":1}}],["プルリクエストタイトルのconventional",{"2":{"12":1}}],["プルリクエストタイトルのフォーマットを定義しています",{"2":{"7":1}}],["プルリクエストのタイトルには",{"2":{"7":1}}],["プルリクエストのタイトルは",{"2":{"7":1,"12":1}}],["プルリクエスト",{"0":{"7":1,"12":1}}],["プロジェクトのディレクトリに移動した際に自動的に環境変数を設定したい場合は",{"2":{"87":1}}],["プロジェクトのgitリポジトリにチェックインして共有することで",{"2":{"33":1}}],["プロジェクトのgitリポジトリ内となるでしょう",{"2":{"30":1}}],["プロジェクトで使用するツールごとに",{"2":{"32":1}}],["プロジェクトでのnodejsのバージョン管理ができるようになりました",{"2":{"32":1}}],["プロジェクト固有のファイルは無視をしています",{"2":{"3":1}}],["プラグイン内にshims",{"2":{"123":1}}],["プラグイン開発者はこの機能を使って",{"2":{"122":1}}],["プラグイン名をサブコマンドとして使用し",{"2":{"122":1}}],["プラグイン名と",{"2":{"86":1}}],["プラグインおよび管理されているツールに関する概要説明を出力します",{"2":{"109":1}}],["プラグインおよびツールで設定必須または任意設定可能な構成設定一覧を出力します",{"2":{"111":1}}],["プラグインおよびツールのドキュメントを出力します",{"2":{"109":1,"110":1,"111":1,"112":1}}],["プラグインおよびツールの構成設定一覧を出力します",{"2":{"101":1}}],["プラグインおよびツールに関する概要説明を出力します",{"2":{"101":1}}],["プラグインで使用できます",{"2":{"108":1}}],["プラグインでは",{"2":{"105":1}}],["プラグインソースのurlです",{"2":{"102":1,"119":1}}],["プラグインとツールに関連するリンクリストを出力します",{"2":{"101":1,"112":1}}],["プラグインとは",{"2":{"98":1}}],["プラグインスクリプトの鉄則",{"0":{"100":1}}],["プラグインによってインストールされるものは",{"2":{"92":1}}],["プラグインによってツールがインストールされると",{"2":{"34":1}}],["プラグインがインストールされている場所へのパスです",{"2":{"102":1,"119":1,"120":1,"121":1}}],["プラグインが削除される前に実行されるフックです",{"2":{"101":1}}],["プラグインが更新された後に実行されるフックです",{"2":{"101":1}}],["プラグインが追加された後に実行されるフックです",{"2":{"101":1}}],["プラグインが",{"2":{"77":1,"119":1,"121":1}}],["プラグインはshimで指定された実行ファイルパスを条件付きで上書きして返すか",{"2":{"115":1}}],["プラグインは",{"2":{"69":1}}],["プラグインリポジトリの",{"2":{"73":1}}],["プラグインリポジトリのショートネームを指定して追加します",{"2":{"70":1}}],["プラグインリポジトリの初期同期は停止されません",{"2":{"48":1}}],["プラグインリポジトリを削除するには",{"2":{"49":1}}],["プラグインショートネームインデックス",{"0":{"129":1}}],["プラグインショートネームの一覧もご覧ください",{"2":{"72":1}}],["プラグインショートネームリポジトリを無効化しても",{"2":{"49":2}}],["プラグインショートネームリポジトリを無効化します",{"2":{"49":1}}],["プラグインシステムによって多くのツールをサポートしており",{"2":{"40":1}}],["プラグインをテストするためのplugin",{"2":{"124":1}}],["プラグインを削除すると",{"2":{"49":1,"74":1}}],["プラグインを削除するには",{"2":{"49":1}}],["プラグインを作成することで",{"2":{"40":1}}],["プラグインをインストールしてからツールをインストールし",{"2":{"23":1}}],["プラグイン",{"0":{"69":1},"1":{"70":1,"71":1,"72":1,"73":1,"74":1,"75":1},"2":{"32":1}}],["プラグインの場所への相対パスを渡す必要がある場合があります",{"2":{"126":1}}],["プラグインのciにおいて",{"2":{"124":1}}],["プラグインのreadmeには",{"2":{"122":1}}],["プラグインのヘルプを表示するために必要です",{"2":{"109":1}}],["プラグインの以前のgit",{"2":{"102":1,"120":1}}],["プラグインの作成",{"0":{"98":1},"1":{"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1}}],["プラグインの作成をご覧ください",{"2":{"69":1}}],["プラグインのexec",{"2":{"86":2}}],["プラグインの同期はトリガーされません",{"2":{"48":1,"49":1}}],["プラグインのフォールバックで使用します",{"2":{"45":1}}],["プラグインのリポジトリを確認しておきましょう",{"2":{"25":1}}],["プラグインの依存関係",{"0":{"25":1}}],["プラグインのインストール",{"0":{"24":1,"26":1},"1":{"25":1,"26":1}}],["新しくインストールされたshimを検知してくれないのですが",{"0":{"93":1}}],["新しくインストールした実行ファイルが実行できないのですが",{"0":{"92":1}}],["新しいasdfコマンドを定義することができます",{"2":{"122":1}}],["新しいpkgbuildをダウンロードしてリビルド",{"2":{"67":1}}],["新しいzshコマンド補完を使用するには",{"2":{"22":2}}],["新しいコードをカバーするようなテストを作成してください",{"2":{"2":1}}],["新たに同期が開始されます",{"2":{"48":1}}],["新機能にとってテストは必要不可欠であり",{"2":{"2":1}}],["ヒント",{"2":{"2":1,"7":1,"43":1,"129":1}}],["xのデフォルト値は60ですが",{"2":{"75":1}}],["x26",{"2":{"2":1,"6":1,"22":2,"68":2}}],["x3c",{"2":{"1":1,"7":3,"10":1,"41":38,"62":1,"63":1,"65":2,"66":1,"70":3,"73":1,"74":1,"77":2,"78":3,"79":3,"80":3,"81":3,"82":13,"83":1,"84":1,"85":2,"115":3,"124":6,"125":1,"126":5,"129":2}}],["faq",{"0":{"89":1},"1":{"90":1,"91":1,"92":1,"93":1}}],["f",{"2":{"68":3}}],["fetch",{"2":{"67":1}}],["feature",{"2":{"7":2}}],["feat",{"2":{"7":4}}],["from",{"2":{"41":1}}],["framework",{"2":{"22":1}}],["fpath経由で",{"2":{"22":2}}],["fpath=",{"2":{"22":1,"68":1}}],["fpath",{"2":{"22":1}}],["fooファイルが存在すれば",{"2":{"123":1}}],["fooという実行ファイルに対して",{"2":{"123":1}}],["fooというプラグインがあるとすると",{"2":{"122":1}}],["foox",{"2":{"115":1}}],["fooは特定のブランチ",{"2":{"77":1}}],["fooの形式",{"2":{"77":1}}],["foo",{"2":{"14":2,"115":4,"122":10}}],["force",{"0":{"57":1},"2":{"22":1,"57":1,"68":5}}],["for",{"2":{"2":1,"7":1,"22":2,"41":7,"90":1,"91":1}}],["format",{"2":{"2":1,"11":1}}],["fork",{"2":{"1":1,"10":1}}],["fi",{"2":{"127":1}}],["filter",{"2":{"41":2}}],["file環境変数は",{"2":{"122":1}}],["file環境変数で設定できます",{"2":{"44":1}}],["fileオプションを有効にしたユーザにのみ適用されます",{"2":{"117":1}}],["fileは空なので",{"2":{"58":1}}],["filenames",{"0":{"117":1},"2":{"101":1,"117":1}}],["filenameは空なので",{"2":{"58":1}}],["filename=tool",{"2":{"53":1}}],["filename",{"0":{"53":1},"2":{"58":1}}],["file=",{"2":{"52":1}}],["file",{"0":{"45":1,"52":1,"118":1},"2":{"4":2,"31":1,"41":2,"44":1,"58":2,"101":1,"102":1,"118":1}}],["fishのsourceが",{"2":{"93":1}}],["fishなど",{"2":{"93":1}}],["fishなどによって",{"2":{"86":1}}],["fishなどをsourceする前に設定する必要があります",{"2":{"51":1}}],["fishをsourceしている行を削除します",{"2":{"68":3}}],["fishで",{"2":{"68":3}}],["fishにasdf",{"2":{"22":1}}],["fishに下記の行を追記します",{"2":{"22":2}}],["fish",{"2":{"22":15,"68":11}}],["fix",{"2":{"2":2,"7":4}}],["same",{"2":{"122":5}}],["save",{"2":{"22":3}}],["subsystem",{"2":{"90":1,"91":1}}],["sysctl",{"2":{"50":1}}],["system",{"2":{"43":2,"83":2}}],["src",{"2":{"43":1}}],["sort",{"2":{"100":1,"104":3}}],["sourceする必要があります",{"2":{"93":1}}],["source",{"2":{"22":4,"86":2,"102":1,"119":1}}],["some",{"2":{"6":3,"7":3,"18":1}}],["silent",{"2":{"127":1}}],["si",{"2":{"21":1}}],["sidebar",{"2":{"14":3}}],["sidebars",{"2":{"13":1,"14":3}}],["specified",{"2":{"41":1}}],["specific",{"2":{"2":1,"41":2}}],["specifying",{"2":{"41":1}}],["spack",{"2":{"18":2}}],["stdoutまたはstderrへ適切に送信してください",{"2":{"116":1}}],["stableのように",{"2":{"127":1}}],["stable",{"0":{"108":1},"2":{"41":5,"101":1,"108":1}}],["strategy",{"2":{"125":1}}],["stratus3d",{"2":{"96":1}}],["string",{"2":{"22":2,"41":1,"68":2}}],["str",{"2":{"22":1}}],["steps",{"2":{"18":1,"125":1}}],["style",{"2":{"7":1}}],["ssg",{"2":{"11":1}}],["script",{"2":{"22":1,"86":2,"126":2}}],["scripts",{"2":{"2":3,"5":2}}],["scope",{"2":{"7":1}}],["sed",{"2":{"104":1,"110":1}}],["setup",{"2":{"22":1}}],["set",{"2":{"22":3,"41":7,"68":3}}],["settings",{"2":{"4":1}}],["semantic",{"2":{"7":1}}],["s",{"2":{"6":2,"18":1,"22":5}}],["shやasdf",{"2":{"86":1,"93":1}}],["shをsourceしている行を削除します",{"2":{"68":2}}],["shを追加します",{"2":{"22":6}}],["shおよびコマンド補完をsourceしている行を削除します",{"2":{"68":6}}],["short",{"0":{"49":1},"2":{"44":1,"48":1,"58":1,"75":1}}],["show",{"2":{"41":3}}],["shimで指定されたデフォルトのパスを返してください",{"2":{"115":1}}],["shimで指定されたデフォルトのパスを返すことができます",{"2":{"115":1}}],["shimで指定された実行ファイルパスを条件付きで上書きして返すか",{"2":{"115":1}}],["shimコマンドの実行時に使用される環境において",{"2":{"114":1,"115":1}}],["shimを作成するバイナリが存在するディレクトリへの相対パスの一覧を出力します",{"2":{"101":1}}],["shimを作成しなければならないということをasdfに通知する必要があります",{"2":{"92":1}}],["shimラッパーを経由させずに直接アクセスする必要があります",{"2":{"86":1}}],["shimがラップしているインストール済みパッケージの実行ファイルのパスを渡して",{"2":{"86":1}}],["shim自体は非常に単純なラッパーであり",{"2":{"86":1}}],["shimのバージョン",{"0":{"66":1}}],["shimの再作成",{"0":{"65":1}}],["shimはデフォルトで",{"2":{"106":1}}],["shimはまだ存在しません",{"2":{"65":1}}],["shimはプラグインによってツールのインストール中に作成されます",{"2":{"65":1}}],["shimsディレクトリ",{"2":{"86":1}}],["shims",{"0":{"86":1},"1":{"87":1},"2":{"41":1,"86":1}}],["shim",{"2":{"33":1,"41":3,"55":1,"66":4}}],["shソース以下にcompinitがくるようにしてください",{"2":{"22":1}}],["sh",{"2":{"22":12,"51":1,"57":1,"68":8,"86":2,"126":1}}],["shgit",{"2":{"4":2}}],["shfmt",{"2":{"1":3}}],["shellcmd=",{"2":{"127":1}}],["shellcheck",{"2":{"1":3}}],["shell$",{"2":{"122":1}}],["shellfoo",{"2":{"122":1}}],["shellusage",{"2":{"115":1}}],["shelluse",{"2":{"68":3}}],["shellの場合",{"2":{"82":1}}],["shellのhomebrewが担います",{"2":{"22":1}}],["shellif",{"2":{"68":2}}],["shellpacman",{"2":{"68":4}}],["shellbrew",{"2":{"68":5}}],["shellrm",{"2":{"68":25}}],["shell➜",{"2":{"66":2}}],["shellexport",{"2":{"22":2}}],["shellecho",{"2":{"22":8}}],["shellmkdir",{"2":{"22":4}}],["shellsource",{"2":{"22":2,"68":3}}],["shellgit",{"2":{"20":1}}],["shelldocs",{"2":{"14":1}}],["shellnpm",{"2":{"10":1,"11":2}}],["shellasdf",{"2":{"1":2,"10":2,"26":1,"27":1,"29":1,"30":1,"62":1,"63":1,"64":1,"65":1,"66":1,"70":2,"71":2,"72":1,"73":2,"77":1,"78":2,"79":2,"80":2,"81":2,"82":2,"83":1,"84":1,"85":1,"124":1,"126":1}}],["shell",{"2":{"1":1,"2":1,"5":1,"6":1,"10":1,"22":16,"41":3,"68":8,"82":1,"86":1,"124":1,"129":1}}],["location",{"2":{"58":1}}],["localの場合",{"2":{"82":1}}],["localコマンド",{"2":{"43":1}}],["local",{"2":{"30":1,"41":4,"82":2,"83":3,"86":1,"108":1}}],["locales",{"2":{"14":1}}],["legacy",{"0":{"45":1,"117":1,"118":1},"2":{"31":1,"58":1,"101":2,"117":1,"118":1}}],["ln",{"2":{"22":4}}],["last",{"0":{"48":1},"2":{"44":1,"58":1,"75":1}}],["latestは",{"2":{"27":1}}],["latest",{"0":{"108":1},"2":{"27":1,"29":1,"30":1,"41":15,"78":4,"81":4,"82":3,"101":1,"105":1,"106":1,"108":9,"124":1,"125":2,"127":1}}],["later",{"2":{"18":1}}],["lang",{"2":{"14":3,"41":1}}],["label",{"2":{"14":3}}],["lt",{"2":{"7":2,"12":1,"43":1,"48":3,"49":4,"57":1,"65":2,"66":1,"75":1,"83":1,"98":3,"99":2,"104":1,"105":2,"106":3,"108":5,"109":2,"110":2,"111":2,"112":5,"113":3,"114":3,"115":3,"116":2,"119":1,"120":2,"121":1,"124":7}}],["license",{"2":{"95":1}}],["like",{"2":{"22":1}}],["lib",{"2":{"22":6,"68":3,"122":6}}],["libexec",{"2":{"22":10,"68":4}}],["linkを提供しており",{"2":{"122":1}}],["link",{"2":{"112":2}}],["links",{"0":{"112":1},"2":{"101":1,"112":1}}],["linuxとmacosの両方のci環境でテストすることを推奨します",{"2":{"124":1}}],["linux",{"2":{"18":4,"25":1,"90":1,"91":1,"126":1}}],["lint",{"2":{"2":4}}],["listed",{"2":{"41":1}}],["list",{"0":{"104":1,"113":1,"117":1},"2":{"2":1,"27":2,"41":9,"48":1,"49":1,"71":4,"72":1,"75":1,"79":4,"80":4,"98":1,"101":3,"104":4,"106":1,"108":2,"113":1,"116":1,"117":1,"127":1}}],["luizm",{"2":{"1":2}}],["コピーライト",{"2":{"95":1}}],["コントリビューター",{"0":{"97":1}}],["コントリビューションガイドについては",{"2":{"15":1}}],["コンパイルに必要な環境変数やその他フラグについて説明します",{"2":{"111":1}}],["コンパイルをサポートしている場合",{"2":{"77":1}}],["コンパイル時に使用するデフォルトのコア数です",{"2":{"50":1}}],["コンパイルされます",{"2":{"43":1}}],["コメントを含めることもできます",{"2":{"43":1}}],["コマンドが外部apiへのアクセスに依存している場合",{"2":{"127":1}}],["コマンドで",{"2":{"119":1,"120":1,"121":1}}],["コマンドでは",{"2":{"48":1,"49":1}}],["コマンドへの依存関係を小さく保つようにしてください",{"2":{"100":1}}],["コマンドを実行してください",{"2":{"49":1}}],["コマンドを実行します",{"2":{"43":1}}],["コマンドを使用してください",{"2":{"2":1}}],["コマンドは大きく分けて3つのカテゴリに分けられます",{"2":{"32":1}}],["コマンド補完を削除します",{"2":{"68":1}}],["コマンド補完をセットアップします",{"2":{"22":1}}],["コマンド補完については",{"2":{"68":2}}],["コマンド補完は自動的に設定されます",{"2":{"22":6}}],["コマンド補完は",{"2":{"22":5}}],["コマンド補完が必要な場合は",{"2":{"22":6}}],["コマンド",{"2":{"18":1,"21":1}}],["コミット",{"2":{"43":1}}],["コミットする前にコードをフォーマットするには",{"2":{"11":1}}],["コミュニティ主導の共同プロジェクトです",{"2":{"88":1}}],["コミュニティプロジェクト",{"0":{"88":1}}],["コミュニティプラグインについては",{"2":{"16":1}}],["コミュニティがサポートするダウンロード方法",{"0":{"21":1}}],["コアとなるasdf",{"2":{"109":1}}],["コアとなるasdfのコマンドはかなり少量ですが",{"2":{"60":1}}],["コア",{"0":{"60":1},"1":{"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1}}],["コアのインストールが完了",{"0":{"23":1}}],["コアのコントリビューションガイドのドキュメントに記述されています",{"2":{"12":1}}],["コア開発用のツールは",{"2":{"1":1}}],["コードをローカルでフォーマット",{"2":{"2":1}}],["イントロダクション",{"0":{"33":1},"1":{"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1}}],["インストールしたツールが正しく動作するかを確認するために実行するコマンドです",{"2":{"124":1}}],["インストールした場所や方法",{"2":{"51":1}}],["インストールをする必要があります",{"2":{"106":1}}],["インストールが実行されます",{"2":{"105":1}}],["インストールが成功したら",{"2":{"47":1}}],["インストールされているツールのバージョンに合わせて出力を調整する必要があります",{"2":{"109":1,"110":1,"111":1,"112":1}}],["インストールされているプログラムが当該環境で利用できるようになります",{"2":{"86":1}}],["インストールされたパッケージへのパスを返すため",{"2":{"86":1}}],["インストールされる実行ファイルごとにshimが作成されます",{"2":{"34":1}}],["インストール可能なすべてのバージョンをリストします",{"2":{"101":1,"104":1}}],["インストール可能な全バージョン一覧",{"0":{"80":1}}],["インストール可能なバージョンはasdf",{"2":{"27":1}}],["インストール済みバージョン一覧",{"0":{"79":1}}],["インストール済みプラグイン一覧",{"0":{"71":1}}],["インストール済みのasdfに変更を加えずに",{"2":{"2":1}}],["インストール",{"0":{"61":1}}],["インストール先は$home",{"2":{"58":1}}],["インストール後も",{"2":{"47":1}}],["インタプリタです",{"2":{"1":1}}],["開発ワークフローを簡素化するための単一インターフェースと構成ファイルを提供しており",{"2":{"33":1}}],["開発に必要なスクリプトが含まれています",{"2":{"11":1}}],["開発に必要なバージョンを",{"2":{"10":1}}],["開発用サーバのベースとしたり",{"2":{"8":1}}],["開発",{"0":{"2":1,"11":1},"1":{"3":1,"4":1}}],["開発ツールに影響を与える特定の機能を壊す可能性もあるため",{"2":{"1":1}}],["下記ディレクトリ内のファイルへのshimを作成するよう",{"2":{"113":1}}],["下記コマンドによってトリガーされます",{"2":{"75":1}}],["下記コマンドを実行します",{"2":{"22":3,"30":1}}],["下記コマンドでは",{"2":{"70":1}}],["下記コマンドで",{"2":{"22":12}}],["下記をご覧ください",{"2":{"16":1}}],["下記リンクから",{"2":{"16":1}}],["下記の例では",{"2":{"82":1}}],["下記の行を追記してください",{"2":{"31":1}}],["下記のフォーマットに従います",{"2":{"7":1}}],["下記のように使用できます",{"2":{"124":1}}],["下記のように指定してください",{"2":{"73":1}}],["下記のようにテストを呼び出します",{"2":{"5":1}}],["下記のように",{"2":{"4":1,"14":1,"58":1,"78":1,"79":1,"80":1,"81":1,"86":1,"118":1}}],["下記のようにインストールします",{"2":{"1":1,"10":1}}],["下記のようにプラグインを追加してください",{"2":{"1":1,"10":1}}],["下記項目を一通り参照してください",{"2":{"5":1}}],["下記は",{"2":{"3":1,"44":1}}],["下記に",{"2":{"1":1}}],["良いかもしれません",{"2":{"1":1}}],["title",{"2":{"112":1}}],["time",{"2":{"106":2}}],["timgluz",{"2":{"1":1}}],["tag",{"2":{"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"117":1}}],["tscをパイプで通すだけで十分です",{"2":{"104":1}}],["travis",{"2":{"126":1}}],["travisci",{"0":{"126":1}}],["trash",{"2":{"49":1}}],["truffleruby+graalvm",{"2":{"108":1}}],["truffleruby",{"2":{"108":1}}],["trufflerubyなどの多くのプロバイダのrubyバージョンをリストアップします",{"2":{"108":1}}],["trim",{"2":{"22":1}}],["txt1",{"2":{"104":1}}],["txtlegacy",{"2":{"44":1}}],["txtmanage",{"2":{"41":1}}],["that",{"2":{"41":2}}],["this",{"2":{"22":1,"43":2}}],["then",{"2":{"127":1}}],["they",{"2":{"41":1}}],["these",{"2":{"18":1}}],["themeconfig",{"2":{"14":3}}],["theme",{"2":{"13":1}}],["the",{"2":{"6":1,"7":1,"41":28,"86":1}}],["type環境変数の値を使用してください",{"2":{"109":1,"110":1,"111":1,"112":1}}],["type=refの場合",{"2":{"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"117":1}}],["type=versionの場合",{"2":{"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"117":1}}],["typeに応じてフルバージョンナンバーまたはgit",{"2":{"102":1}}],["typeをdocsとして",{"2":{"12":1}}],["type",{"2":{"7":1,"102":1,"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"117":1}}],["types",{"2":{"7":1}}],["type>",{"2":{"7":1}}],["templateリポジトリを使用し",{"2":{"99":1}}],["terminalで説明されています",{"2":{"6":1}}],["testコマンドを用意しており",{"2":{"124":1}}],["tests",{"2":{"2":1,"6":3}}],["test",{"2":{"2":4,"4":1,"5":3,"6":3,"7":1,"82":1,"124":6,"125":6,"126":2}}],["tokenを利用する際は",{"2":{"128":1}}],["token",{"0":{"128":1},"2":{"127":3}}],["toctou",{"2":{"106":1}}],["to",{"2":{"6":1,"22":1,"41":8,"57":1,"86":2,"106":1}}],["tool>",{"2":{"125":1,"126":2}}],["tools",{"2":{"18":1,"113":2}}],["tool",{"0":{"43":1,"53":1},"2":{"1":1,"10":1,"17":1,"28":1,"29":2,"30":2,"33":1,"34":1,"41":4,"42":1,"43":9,"45":1,"53":3,"58":4,"68":14,"82":6,"84":3,"86":1,"99":2,"105":2,"106":3,"108":3,"113":2,"119":1,"120":1,"121":1,"124":4,"126":2}}],["t",{"2":{"6":1}}],["tフラグを指定してtap出力を有効にすると",{"2":{"6":1}}],["another",{"2":{"43":1}}],["an",{"2":{"41":2}}],["and",{"2":{"22":2,"41":9}}],["at",{"2":{"41":1}}],["as",{"2":{"41":1,"122":5}}],["asdf拡張コマンドに関することを必ず記載するようにしてください",{"2":{"122":1}}],["asdf自体のコマンド拡張プラグインを作成したりすることができます",{"2":{"122":1}}],["asdf自身でこれらのツールを管理したい場合は",{"2":{"1":1}}],["asdfコマンドラインインターフェースを通して呼び出すことのできるlib",{"2":{"122":1}}],["asdfコアはbin",{"2":{"108":1}}],["asdfコアは各バージョンを1行ずつ表示するため",{"2":{"104":1}}],["asdfコアでは",{"2":{"88":1}}],["asdfコアチームが把握している限り",{"2":{"123":1}}],["asdfコアチームは",{"2":{"88":1}}],["asdfコアチームでは",{"2":{"16":1}}],["asdfコアの禁止コマンド一覧もご覧ください",{"2":{"100":1}}],["asdfコアのダウンロード",{"2":{"17":1}}],["asdfコアのコントリビューションガイドです",{"2":{"0":1}}],["asdfへ指示されます",{"2":{"113":1}}],["asdfからの呼び出しシグネチャ",{"2":{"104":1,"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1}}],["asdfから呼び出せるスクリプトの全リストです",{"2":{"101":1}}],["asdfモジュールを削除します",{"2":{"68":3}}],["asdfモジュールを使用している行を削除します",{"2":{"68":3}}],["asdfをアンインストールするには以下の手順に従ってください",{"2":{"68":1}}],["asdfをシンプルにセットアップしたとします",{"2":{"58":1}}],["asdfを使用しないほうが",{"2":{"1":1}}],["asdfディレクトリを削除します",{"2":{"68":9}}],["asdfディレクトリを強制的にpathの先頭に配置することは",{"2":{"57":1}}],["asdfディレクトリを強制的にpathの先頭に配置します",{"2":{"57":1}}],["asdfディレクトリが存在すればその場所",{"2":{"55":1}}],["asdf構成ファイルのconcurrencyの値が使用されます",{"2":{"56":1}}],["asdf構成ファイルのconcurrencyの値よりも優先されます",{"2":{"56":1}}],["asdf実行ファイルの親ディレクトリが使用されます",{"2":{"54":1}}],["asdfが管理しているツールによって実行ファイルがインストールされた場合は",{"2":{"92":1}}],["asdfが管理していない",{"2":{"43":1}}],["asdfがパッケージをインストールすると",{"2":{"86":1}}],["asdfがnode",{"2":{"69":1}}],["asdfが使用されます",{"2":{"58":1}}],["asdfがプラグイン",{"2":{"55":1}}],["asdfが役に立つようになるのは",{"2":{"23":1}}],["asdfrc内のlegacy",{"2":{"117":1}}],["asdfrc内に",{"2":{"31":1}}],["asdfrcファイルのplugin",{"2":{"75":1}}],["asdfrcファイルは何もカスタマイズしていない",{"2":{"58":1}}],["asdfrcをカスタマイズしていないので",{"2":{"58":5}}],["asdfrcが使用されます",{"2":{"58":1}}],["asdfrcの値が使用されます",{"2":{"52":1}}],["asdfrc構成ファイルへのパスです",{"2":{"52":1}}],["asdfrcに構成ファイルを配置します",{"2":{"44":1}}],["asdfrcでは",{"2":{"44":1}}],["asdfrc",{"0":{"44":1},"1":{"45":1,"46":1,"47":1,"48":1,"49":1,"50":1},"2":{"52":1,"58":1,"68":14}}],["asdfrcや環境変数によってカスタマイズ可能なユーザ固有の設定とがあります",{"2":{"42":1}}],["asdfによって発見されたレガシーファイルをパースして",{"2":{"118":1}}],["asdfによって管理されているすべてのツールの最新バージョンと",{"2":{"108":1}}],["asdfによって実行されます",{"2":{"98":1}}],["asdfによってdocs",{"2":{"10":1}}],["asdfに関するよくある質問を紹介します",{"2":{"89":1}}],["asdfに関連するコミュニティプロジェクトをいくつか紹介します",{"2":{"88":1}}],["asdfには",{"2":{"67":1}}],["asdfには使いこなすと便利なコマンドが他にもいっぱいあり",{"2":{"32":1}}],["asdfに対して",{"2":{"29":1}}],["asdfで用意されているwhichおよびwhereコマンドは",{"2":{"86":1}}],["asdfで管理されているバージョンではなく",{"2":{"83":1}}],["asdfで管理するツールを実行した際に",{"2":{"28":1}}],["asdfで利用可能なすべてのコマンドの一覧です",{"2":{"41":1}}],["asdfでそのようなことはできません",{"2":{"39":1}}],["asdfではなくシステムが管理するツールが既にインストールされていることがあります",{"2":{"29":1}}],["asdfでは正確なバージョン番号を指定してください",{"2":{"27":1}}],["asdfでは",{"2":{"4":1,"123":1,"124":1}}],["asdfプラグインリポジトリをクローンまたは更新します",{"2":{"49":1}}],["asdfプラグインリポジトリの同期間隔",{"2":{"48":1}}],["asdfプラグインの長期的なメンテナンスを目的とした",{"2":{"88":1}}],["asdfプラグインの長期的なメンテナンスを目的としたコミュニティ主導の共同プロジェクトです",{"2":{"16":1}}],["asdfプラグインのショートネームリポジトリの同期を無効化します",{"2":{"49":1}}],["asdfプラグインは",{"2":{"22":2}}],["asdf~",{"2":{"22":6,"68":6}}],["asdfの各種コマンドでgit",{"2":{"129":1}}],["asdfの実行に代わって",{"2":{"122":1}}],["asdfのasdf",{"2":{"119":1,"120":1,"121":1}}],["asdfのオーサーおよびコントリビューターの皆様に感謝を申し上げます",{"2":{"94":1}}],["asdfのshimのバイパス",{"0":{"87":1}}],["asdfのshimやパスのディレクトリをpathの先頭",{"2":{"57":1}}],["asdfのすべての構成ファイルを削除するために次のコマンドを実行します",{"2":{"68":14}}],["asdfの親ディレクトリが使用されます",{"2":{"58":1}}],["asdfの上側に設定します",{"2":{"51":1}}],["asdfの構成設定には",{"2":{"42":1}}],["asdfの構成設定ファイルである$home",{"2":{"31":1}}],["asdfのコアスクリプト場所です",{"2":{"54":1}}],["asdfのコア",{"2":{"32":1}}],["asdfのコアのインストールは完了です🎉",{"2":{"23":1}}],["asdfの入門は完了です🎉",{"2":{"32":1}}],["asdfのスクリプトは",{"2":{"22":1}}],["asdfのダウンロード",{"0":{"19":1},"1":{"20":1,"21":1}}],["asdfの動作にはgitおよびcurlが必要です",{"2":{"18":1}}],["asdfのインストール",{"0":{"22":1},"2":{"17":1}}],["asdfのインストールには次の手順が必要です",{"2":{"17":1}}],["asdfの開発に必要なバージョンを",{"2":{"1":1}}],["asdfドキュメントサイトを構築するために使用している静的サイトジェネレータ",{"2":{"11":1}}],["asdfは正確なgit",{"2":{"129":1}}],["asdfは正常に動作しない可能性があります",{"2":{"90":1}}],["asdfは標準shimテンプレートを使用する代わりに",{"2":{"123":1}}],["asdfは当該スクリプトをbashスクリプトとしてsourceします",{"2":{"122":1}}],["asdfは単純にレガシーファイルをcatしてバージョンを決定します",{"2":{"118":1}}],["asdfはbin",{"2":{"105":1}}],["asdfはshimを使って実行ファイルを管理しています",{"2":{"92":1}}],["asdfはデフォルトで$",{"2":{"44":1}}],["asdfはシステムのパッケージマネージャになることを目指してはいません",{"2":{"40":1}}],["asdfはなるべく依存関係のリストを小さく保つように努めています",{"2":{"38":1}}],["asdfは上位の依存関係を管理することはしませんし",{"2":{"38":1,"39":1}}],["asdfは環境変数を管理することはしませんが",{"2":{"37":1}}],["asdfはプラグインシステムを採用し",{"2":{"36":1}}],["asdfはこれらのツールと非常に似ていて",{"2":{"36":1}}],["asdfは",{"2":{"7":1,"12":1,"28":1,"31":1,"33":2,"40":1,"113":1}}],["asdfリポジトリの",{"2":{"3":1}}],["asdf",{"0":{"0":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"122":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1},"2":{"1":9,"3":1,"8":1,"10":6,"15":1,"16":3,"20":3,"21":3,"22":92,"24":1,"25":1,"26":2,"28":1,"31":1,"32":1,"41":42,"43":3,"44":1,"46":1,"47":1,"48":3,"49":4,"50":1,"51":2,"52":2,"53":1,"54":2,"55":2,"56":1,"57":3,"58":10,"59":2,"66":3,"67":5,"68":88,"70":3,"71":5,"73":1,"74":1,"75":2,"77":1,"78":2,"79":2,"80":2,"81":2,"82":7,"83":1,"84":3,"85":1,"86":6,"87":1,"88":2,"92":1,"93":2,"98":1,"99":3,"102":11,"104":3,"105":13,"106":15,"108":13,"109":7,"110":7,"111":7,"112":7,"113":11,"114":8,"115":10,"116":2,"117":5,"119":6,"120":7,"121":5,"122":6,"124":9,"125":4,"126":6,"129":4}}],["api",{"0":{"128":1},"2":{"127":2,"128":1}}],["apiレート制限",{"0":{"127":1},"1":{"128":1}}],["append",{"2":{"22":4}}],["apt",{"2":{"18":1,"25":1}}],["aptitude",{"2":{"18":1}}],["are",{"2":{"41":1}}],["args",{"2":{"41":1,"62":1,"114":1,"115":1}}],["arg",{"2":{"22":6,"68":6}}],["archlinux",{"2":{"21":1}}],["authorization",{"2":{"127":1}}],["autoremove",{"2":{"68":1}}],["auto",{"2":{"44":1,"50":1,"58":1}}],["autoload",{"2":{"22":1,"68":1}}],["automatically",{"2":{"18":1}}],["aurパッケージのインストール時に自動的に設定されます",{"2":{"22":1}}],["aur",{"2":{"21":1,"51":1}}],["always",{"0":{"47":1},"2":{"44":1,"58":1}}],["almalinux",{"2":{"25":1}}],["alpineおよびasdf",{"2":{"8":1}}],["allやbin",{"2":{"127":1}}],["allの出力をtailした結果をもとに判定しますが",{"2":{"108":1}}],["all",{"0":{"104":1},"2":{"2":1,"27":2,"41":9,"48":1,"49":1,"72":1,"73":1,"75":1,"80":4,"98":1,"101":1,"104":4,"108":2,"116":1}}],["a",{"2":{"7":1,"22":1,"41":15,"43":2}}],["actionを提供しています",{"2":{"125":1}}],["actionsリポジトリでは",{"2":{"125":1}}],["actionsでホストランナーのサポートが可能になれば",{"2":{"91":1}}],["actions",{"0":{"15":1},"2":{"15":1,"125":1}}],["action",{"0":{"125":1},"2":{"7":1}}],["actionamannn",{"2":{"7":1}}],["amp",{"0":{"9":1,"61":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1},"2":{"6":1,"21":4,"22":23,"68":14}}],["advanced",{"2":{"4":1}}],["add",{"0":{"119":1},"2":{"1":3,"10":1,"26":1,"41":3,"48":2,"49":2,"70":4,"75":1,"101":1,"119":6,"129":2}}],["veggies",{"2":{"113":2}}],["versionまたは",{"2":{"124":1}}],["versionまたはrefです",{"2":{"102":1,"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"117":1}}],["versionおよびasdf",{"2":{"109":1,"110":1,"111":1,"112":1}}],["versionのような",{"2":{"101":1}}],["version=1",{"2":{"82":1}}],["versionという環境変数で設定することができます",{"2":{"82":1}}],["versionという環境変数に設定され",{"2":{"82":1}}],["versionなど",{"2":{"45":1}}],["version`",{"2":{"41":1}}],["version>",{"2":{"41":13,"65":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":8,"85":1,"124":1}}],["version",{"0":{"45":1},"2":{"31":1,"41":23,"44":1,"58":1,"65":2,"86":1,"98":1,"102":1,"104":1,"105":3,"106":3,"108":2,"109":2,"110":2,"111":2,"112":2,"113":3,"114":1,"115":1,"116":1,"117":3,"124":4,"125":1,"126":2}}],["versionファイルを読み込みます",{"2":{"45":1}}],["versionファイルといったものを排除しています",{"2":{"36":1}}],["versionファイルの両方に対応しています",{"2":{"31":1}}],["versionファイル",{"2":{"31":1}}],["versionsは下記のような一覧を返します",{"2":{"66":1}}],["versionsが使用されます",{"2":{"58":1}}],["versionsの値が使用されます",{"2":{"53":1}}],["versionsを使用します",{"2":{"45":1}}],["versionsに下記の行を追記します",{"2":{"43":1}}],["versions",{"0":{"43":1,"53":1},"2":{"33":1,"41":10,"53":2,"58":3,"66":3,"68":14,"84":3}}],["versions内には次のように書き込まれます",{"2":{"29":1,"30":1}}],["versionsファイルについて詳しくは",{"2":{"82":1}}],["versionsファイルに書き込まれます",{"2":{"82":2}}],["versionsファイルを無視したい場合を除き",{"2":{"53":1}}],["versionsファイルを含むディレクトリで",{"2":{"43":2}}],["versionsファイルをもとに",{"2":{"28":1}}],["versionsファイル内は下記のような記述となっています",{"2":{"43":1}}],["versionsファイルがディレクトリに存在する場合",{"2":{"43":1}}],["versionsファイルと",{"2":{"42":1}}],["versionsファイル",{"2":{"30":1}}],["versionsファイルで指定されたもの",{"2":{"86":1}}],["versionsファイルで指定されたバージョンでインストールされます",{"2":{"43":1}}],["versionsファイルでサポートされているものと同じです",{"2":{"82":1}}],["versionsファイルで定義されている単一のツールをインストールするには",{"2":{"43":1}}],["versionsファイルで定義されているすべてのツールをインストールするには",{"2":{"43":1}}],["versionsファイルで設定できます",{"2":{"43":1}}],["versionsファイルで",{"2":{"17":1}}],["versionsで定義されているバージョンをasdfが認識して",{"2":{"34":1}}],["versionsで定義されています",{"2":{"1":1}}],["versionsで管理されます",{"2":{"29":1}}],["versionsで管理されています",{"2":{"10":1}}],["v",{"2":{"112":1}}],["vlang",{"2":{"112":2}}],["vは移植性が無いため",{"2":{"104":1}}],["vなどです",{"2":{"100":1}}],["vic",{"2":{"70":1,"96":1}}],["vitepressは",{"2":{"14":1}}],["vitepressのドキュメントをご覧ください",{"2":{"13":1}}],["vitepress",{"0":{"13":1},"2":{"11":1,"13":3,"14":2}}],["v1",{"2":{"43":1}}],["var",{"2":{"22":3,"68":3}}],["v0",{"2":{"20":1}}],["v2",{"2":{"11":1,"104":1,"125":1}}],["vscode",{"2":{"4":2}}],["vmドキュメントですでに説明されている情報は出力しないでください",{"2":{"109":1}}],["vm",{"2":{"1":1,"3":1,"10":2,"20":1,"21":2,"22":9,"26":1,"41":2,"68":7,"71":1,"99":1,"124":1,"125":2,"126":1,"129":1}}],["ここに掲載されているものに関連する品質やセキュリティについては責任を負いません",{"2":{"88":1}}],["ここまでで",{"2":{"32":1}}],["ここでは",{"2":{"89":1}}],["ここではデモとして",{"2":{"24":1}}],["ここでの設定方法が変わります",{"2":{"22":1}}],["これを軽減するため",{"2":{"127":1}}],["これを回避するため",{"2":{"22":1}}],["これにより",{"2":{"115":1}}],["これで",{"2":{"23":1}}],["これらのスクリプトは",{"2":{"98":1}}],["これらのプロジェクトやコードを所有していません",{"2":{"88":1}}],["これらのプラグインのメンテナンスおよび改善にご協力いただける方を",{"2":{"16":1}}],["これらの実行ファイルはプラグインのライフサイクルを通してインストールされないため",{"2":{"65":1}}],["これらの実行ファイルを実行しようとすると",{"2":{"34":1}}],["これらの構成設定に関する公式ドキュメントは",{"2":{"13":1}}],["これらのdockerイメージは",{"2":{"8":1}}],["これ以外の機能セットはほとんど同じで",{"2":{"11":1}}],["これはプラグイン単位でのサポートです",{"2":{"31":1}}],["これは",{"2":{"0":1,"7":1,"9":1,"11":1,"22":1,"59":1,"74":1,"124":1}}],["このトークンをciパイプライン環境変数に追加してください",{"2":{"128":1}}],["この機能は公式プラグインであるelixirプラグインでのみ使用されています",{"2":{"123":1}}],["この機能は賢く使う必要があります",{"2":{"123":1}}],["この機能使ったプラグインの素晴らしい例です",{"2":{"122":1}}],["このプラグインは",{"2":{"122":1}}],["この内容は",{"2":{"117":1}}],["このクエリは",{"2":{"108":1}}],["この動作は",{"2":{"106":1}}],["この動作については",{"2":{"48":1}}],["このスクリプトの出力を考慮するために",{"2":{"110":1,"111":1,"112":1}}],["このスクリプトは",{"2":{"108":1,"109":1,"118":1,"119":1,"120":1,"121":1}}],["このスクリプトはすべてのプラグインで",{"2":{"105":1}}],["このスクリプトでは",{"2":{"106":1}}],["このスクリプトで返されるすべてのバージョンから",{"2":{"104":1}}],["このスクリプトで返されるすべてのバージョンを",{"2":{"104":1}}],["このスクリプトが呼び出される前に",{"2":{"118":1}}],["このスクリプトが存在しない場合",{"2":{"105":1,"108":1,"113":1,"118":1}}],["このスクリプトが導入される以前の",{"2":{"105":1}}],["このスクリプトを呼び出すコマンド",{"2":{"104":1,"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1}}],["このスクリプトをsourceし",{"2":{"22":1}}],["このスクリプトに環境変数は提供されません",{"2":{"104":1,"116":1}}],["このページを借りて",{"2":{"94":1}}],["この状況を解決するのに役立ちます",{"2":{"86":1}}],["このディレクトリが",{"2":{"86":1}}],["この更新コマンドは",{"2":{"73":1}}],["この節では",{"2":{"59":1}}],["この節の最後にあるpath",{"2":{"22":1}}],["この環境変数の値は",{"2":{"56":1}}],["この値を変更するべきではありません",{"2":{"53":1}}],["このキーワードを指定した場合",{"2":{"43":1}}],["この一覧は",{"2":{"41":1}}],["このサポートを有効にするには",{"2":{"31":1}}],["このツールの特定のバージョンをインストールしましょう",{"2":{"27":1}}],["このフォーマットに従う必要があります",{"2":{"7":1}}],["このファイルが存在する場合",{"2":{"59":1}}],["このファイルを使用するように",{"2":{"4":1}}],["このファイルと共に使います",{"2":{"4":1}}],["この情報は",{"2":{"7":1}}],["このリポジトリの指示に従うことで",{"2":{"129":1}}],["このリポジトリの",{"2":{"1":1}}],["c",{"2":{"126":1}}],["cmd=",{"2":{"127":2}}],["cmd",{"2":{"102":1,"122":1}}],["cliの拡張コマンド",{"0":{"122":1}}],["cliなどのツールは",{"2":{"65":1}}],["clone",{"2":{"1":4,"10":4,"20":1,"21":1,"126":1}}],["cpuinfo",{"2":{"50":1}}],["call",{"2":{"115":1}}],["capabilityを使用する",{"2":{"104":1}}],["catalina以降では",{"2":{"68":1}}],["catalina以降を使用している場合",{"2":{"22":2}}],["candidates",{"0":{"46":1},"2":{"44":1,"58":1}}],["centos",{"2":{"25":1}}],["cd",{"2":{"21":1}}],["currently",{"2":{"41":1}}],["current",{"2":{"41":7,"84":4,"86":1}}],["currentコマンドを実行すると",{"2":{"28":1}}],["curl",{"2":{"18":6,"25":2,"110":1,"127":1}}],["customarguments",{"2":{"4":1}}],["ci",{"2":{"7":1}}],["chromeのv8",{"2":{"10":1}}],["chore",{"2":{"7":1}}],["change",{"2":{"7":2}}],["changelogを生成しています",{"2":{"7":1}}],["check",{"0":{"48":1},"2":{"2":1,"44":1,"58":1,"75":1,"106":1}}],["codespacesでasdfによるツール管理をサポートする",{"2":{"88":1}}],["cool",{"2":{"84":1}}],["container",{"2":{"88":2}}],["concurrencyは空なので",{"2":{"58":1}}],["concurrency=32",{"2":{"56":1}}],["concurrency環境変数が設定されている場合はそちらが優先されます",{"2":{"50":1}}],["concurrency",{"0":{"50":1,"56":1},"2":{"44":1,"58":1,"102":1,"106":1}}],["conventional",{"0":{"7":1,"12":1},"2":{"7":3,"12":1}}],["config",{"0":{"52":1,"111":1},"2":{"4":1,"13":1,"14":2,"22":38,"44":1,"52":2,"54":1,"58":2,"68":13,"93":1,"101":1,"111":1}}],["coreutils",{"2":{"18":2}}],["coreドキュメント内のprinting",{"2":{"6":1}}],["coreのドキュメント",{"2":{"5":1}}],["coreのドキュメントもご覧ください",{"2":{"2":1}}],["core",{"2":{"1":1,"22":3}}],["compinitのセットアップをカスタマイズしている場合は",{"2":{"22":1}}],["compinit",{"2":{"22":3,"68":2}}],["completer~",{"2":{"22":3,"68":3}}],["completer",{"2":{"22":3,"68":3}}],["completionをインストールします",{"2":{"22":1}}],["completion",{"2":{"22":5,"68":5}}],["completions",{"2":{"22":9,"68":4}}],["community",{"2":{"88":1}}],["communityオーガナイゼーション",{"2":{"16":1}}],["comment",{"2":{"43":2}}],["commitは",{"2":{"7":1}}],["commit",{"2":{"7":2,"12":1,"41":2,"105":1,"106":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"117":1}}],["commitsに依存する自動リリースパイプラインを使用しています",{"2":{"12":1}}],["commits",{"0":{"7":1,"12":1}}],["command>",{"2":{"41":4,"62":1,"63":1,"66":1,"115":1,"126":1}}],["commands",{"2":{"2":1,"122":7}}],["command",{"2":{"2":1,"4":1,"41":3,"66":1,"114":3,"115":3,"122":10,"124":3,"125":1}}],["com",{"2":{"1":5,"10":3,"20":1,"26":1,"41":2,"70":1,"71":2,"112":1,"124":1,"126":1,"129":1}}],["初期セットアップ",{"0":{"1":1,"10":1}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/@localSearchIndexpt-br.DTBAfdU-.js b/assets/chunks/@localSearchIndexpt-br.DTBAfdU-.js new file mode 100644 index 00000000..2120be37 --- /dev/null +++ b/assets/chunks/@localSearchIndexpt-br.DTBAfdU-.js @@ -0,0 +1 @@ +const e='{"documentCount":103,"nextId":103,"documentIds":{"0":"/pt-br/contribute/core.html#asdf","1":"/pt-br/contribute/core.html#configuracao-inicial","2":"/pt-br/contribute/core.html#desenvolvimento","3":"/pt-br/contribute/core.html#teste-de-bats","4":"/pt-br/contribute/core.html#pull-requests-releases-e-commits-convencionais","5":"/pt-br/contribute/core.html#imagens-docker","6":"/pt-br/contribute/documentation.html#docs-site","7":"/pt-br/contribute/documentation.html#configuracao-inicial","8":"/pt-br/contribute/documentation.html#desenvolvimento","9":"/pt-br/contribute/documentation.html#pull-requests-releases-e-commits-convencionais","10":"/pt-br/contribute/documentation.html#vuepress","11":"/pt-br/contribute/documentation.html#i18n","12":"/pt-br/contribute/first-party-plugins.html#first-party-plugins","13":"/pt-br/contribute/github-actions.html#github-actions","14":"/pt-br/guide/getting-started.html#comecando","15":"/pt-br/guide/getting-started.html#_1-instalando-as-dependencias","16":"/pt-br/guide/getting-started.html#_2-download-asdf","17":"/pt-br/guide/getting-started.html#official-download","18":"/pt-br/guide/getting-started.html#community-supported-download-methods","19":"/pt-br/guide/getting-started.html#_3-adicionando-ao-seu-shell","20":"/pt-br/guide/getting-started.html#_4-instalando-um-plugin","21":"/pt-br/guide/getting-started.html#dependencias-dos-plugins","22":"/pt-br/guide/getting-started.html#instalando-o-plugin","23":"/pt-br/guide/getting-started.html#_5-instalando-uma-versao","24":"/pt-br/guide/getting-started.html#_6-definindo-uma-versao","25":"/pt-br/guide/getting-started.html#versoes-globais","26":"/pt-br/guide/getting-started.html#versoes-locais","27":"/pt-br/guide/getting-started.html#usando-arquivos-de-versao-existentes","28":"/pt-br/guide/getting-started.html#setup-finalizado","29":"/pt-br/guide/introduction.html#introducao","30":"/pt-br/guide/introduction.html#funcionamento","31":"/pt-br/guide/introduction.html#projetos-relacionados","32":"/pt-br/guide/introduction.html#nvm-n-rbenv-etc","33":"/pt-br/guide/introduction.html#direnv","34":"/pt-br/guide/introduction.html#homebrew","35":"/pt-br/guide/introduction.html#nixos","36":"/pt-br/guide/introduction.html#por-que-usar-o-asdf","37":"/pt-br/manage/commands.html#all-commands","38":"/pt-br/manage/configuration.html#configuration","39":"/pt-br/manage/configuration.html#tool-versions","40":"/pt-br/manage/configuration.html#home-asdfrc","41":"/pt-br/manage/configuration.html#variaveis-de-ambiente","42":"/pt-br/manage/core.html#core","43":"/pt-br/manage/core.html#instalacao-e-configuracao","44":"/pt-br/manage/core.html#execute","45":"/pt-br/manage/core.html#variavel-de-ambiente","46":"/pt-br/manage/core.html#informacoes","47":"/pt-br/manage/core.html#reshim","48":"/pt-br/manage/core.html#versionamento-do-shim","49":"/pt-br/manage/core.html#atualizar","50":"/pt-br/manage/core.html#desinstalar","51":"/pt-br/manage/plugins.html#plugins","52":"/pt-br/manage/plugins.html#adicionar","53":"/pt-br/manage/plugins.html#listar-instalados","54":"/pt-br/manage/plugins.html#listar-todos-nomes-abreviados-no-repositorio","55":"/pt-br/manage/plugins.html#atualizar","56":"/pt-br/manage/plugins.html#remover","57":"/pt-br/manage/plugins.html#sincronizar-nome-abreviado-no-repositorio","58":"/pt-br/manage/versions.html#versoes","59":"/pt-br/manage/versions.html#instalar-versao","60":"/pt-br/manage/versions.html#instalar-ultima-versao-estavel","61":"/pt-br/manage/versions.html#listar-versoes-instaladas","62":"/pt-br/manage/versions.html#listar-todas-as-versoes-disponiveis","63":"/pt-br/manage/versions.html#mostrar-ultima-versao-estavel","64":"/pt-br/manage/versions.html#selecionar-versao-atual","65":"/pt-br/manage/versions.html#resposta-do-sistema-de-versao","66":"/pt-br/manage/versions.html#verificar-a-versao-atual","67":"/pt-br/manage/versions.html#desinstalar-versao","68":"/pt-br/manage/versions.html#shims","69":"/pt-br/manage/versions.html#ignorando-shims-do-asdf","70":"/pt-br/more/community-projects.html#community-projects","71":"/pt-br/more/faq.html#perguntas-frequentes","72":"/pt-br/more/faq.html#suporte-wsl1","73":"/pt-br/more/faq.html#suporte-wsl2","74":"/pt-br/more/faq.html#exectable-recem-instalado-nao-esta-funcionando","75":"/pt-br/more/faq.html#shell-nao-detecta-shims-recem-instalados","76":"/pt-br/more/thanks.html#creditos","77":"/pt-br/more/thanks.html#mantenedores","78":"/pt-br/more/thanks.html#contribuidores","79":"/pt-br/plugins/create.html#criar-um-plug-in","80":"/pt-br/plugins/create.html#o-que-ha-em-um-plug-in","81":"/pt-br/plugins/create.html#scripts-obrigatorios","82":"/pt-br/plugins/create.html#variaveis-de-ambiente","83":"/pt-br/plugins/create.html#bin-list-all","84":"/pt-br/plugins/create.html#bin-download","85":"/pt-br/plugins/create.html#bin-install","86":"/pt-br/plugins/create.html#scripts-opcional","87":"/pt-br/plugins/create.html#scripts-bin-help","88":"/pt-br/plugins/create.html#bin-list-bin-paths","89":"/pt-br/plugins/create.html#bin-exec-env","90":"/pt-br/plugins/create.html#bin-exec-path","91":"/pt-br/plugins/create.html#bin-uninstall","92":"/pt-br/plugins/create.html#bin-list-legacy-filenames","93":"/pt-br/plugins/create.html#bin-parse-legacy-file","94":"/pt-br/plugins/create.html#bin-post-plugin-add","95":"/pt-br/plugins/create.html#bin-pre-plugin-remove","96":"/pt-br/plugins/create.html#comandos-de-extensao-para-asdf-cli","97":"/pt-br/plugins/create.html#modelos-de-calcos-personalizados","98":"/pt-br/plugins/create.html#testando-plug-ins","99":"/pt-br/plugins/create.html#exemplo-github-action","100":"/pt-br/plugins/create.html#exemplo-de-configuracao-do-travisci","101":"/pt-br/plugins/create.html#limitacao-de-taxa-da-api-do-github","102":"/pt-br/plugins/create.html#enviando-plugins-para-o-repositorio-oficial-de-plugins"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,35],"1":[2,1,100],"2":[1,1,89],"3":[3,1,72],"4":[6,1,112],"5":[2,1,31],"6":[3,1,37],"7":[2,3,67],"8":[1,3,79],"9":[6,3,44],"10":[1,3,60],"11":[1,3,97],"12":[3,1,92],"13":[2,1,49],"14":[1,1,75],"15":[4,1,59],"16":[3,1,1],"17":[2,4,14],"18":[4,4,32],"19":[5,1,243],"20":[4,1,15],"21":[3,5,50],"22":[3,5,11],"23":[4,1,56],"24":[4,1,59],"25":[2,5,60],"26":[2,5,33],"27":[5,5,55],"28":[3,1,52],"29":[1,1,106],"30":[1,1,53],"31":[2,1,1],"32":[4,3,55],"33":[1,3,35],"34":[1,3,32],"35":[1,3,60],"36":[6,1,64],"37":[2,1,178],"38":[1,1,52],"39":[3,1,131],"40":[2,1,120],"41":[3,1,91],"42":[1,1,46],"43":[3,1,6],"44":[1,1,14],"45":[3,1,6],"46":[1,1,24],"47":[1,1,70],"48":[3,1,46],"49":[1,1,53],"50":[1,1,142],"51":[1,1,56],"52":[1,1,41],"53":[2,1,14],"54":[6,1,17],"55":[1,1,42],"56":[1,1,33],"57":[5,1,65],"58":[1,1,30],"59":[2,1,44],"60":[4,1,20],"61":[3,1,18],"62":[5,1,19],"63":[4,1,19],"64":[3,1,81],"65":[5,1,42],"66":[4,1,22],"67":[2,1,10],"68":[1,1,111],"69":[4,2,36],"70":[2,1,48],"71":[2,1,8],"72":[3,2,27],"73":[3,2,57],"74":[7,2,57],"75":[7,2,48],"76":[1,1,17],"77":[1,1,6],"78":[1,1,9],"79":[4,1,30],"80":[7,4,46],"81":[2,4,22],"82":[3,4,82],"83":[3,7,106],"84":[2,7,80],"85":[2,7,116],"86":[2,4,1],"87":[3,6,170],"88":[3,6,63],"89":[3,6,10],"90":[3,6,53],"91":[2,6,7],"92":[4,6,39],"93":[4,6,37],"94":[4,6,49],"95":[4,6,44],"96":[7,4,143],"97":[4,4,63],"98":[3,4,111],"99":[3,6,37],"100":[5,6,67],"101":[7,4,84],"102":[7,4,46]},"averageFieldLength":[2.902912621359222,2.4466019417475726,55.01941747572816],"storedFields":{"0":{"title":"asdf","titles":[]},"1":{"title":"Configuração inicial","titles":["asdf"]},"2":{"title":"Desenvolvimento","titles":["asdf"]},"3":{"title":"Teste de BATS","titles":["asdf"]},"4":{"title":"Pull Requests, Releases e Commits Convencionais","titles":["asdf"]},"5":{"title":"Imagens Docker","titles":["asdf"]},"6":{"title":"Docs & Site","titles":[]},"7":{"title":"Configuração inicial","titles":["Docs & Site"]},"8":{"title":"Desenvolvimento","titles":["Docs & Site"]},"9":{"title":"Pull Requests, Releases e Commits Convencionais","titles":["Docs & Site"]},"10":{"title":"Vuepress","titles":["Docs & Site"]},"11":{"title":"I18n","titles":["Docs & Site"]},"12":{"title":"First-Party Plugins","titles":[]},"13":{"title":"GitHub Actions","titles":[]},"14":{"title":"Começando","titles":[]},"15":{"title":"1. Instalando as dependências","titles":["Começando"]},"16":{"title":"2. Download asdf","titles":["Começando"]},"17":{"title":"Official Download","titles":["Começando","2. Download asdf"]},"18":{"title":"Community Supported Download Methods","titles":["Começando","2. Download asdf"]},"19":{"title":"3. Adicionando ao seu shell","titles":["Começando"]},"20":{"title":"4. Instalando um plugin","titles":["Começando"]},"21":{"title":"Dependências dos plugins","titles":["Começando","4. Instalando um plugin"]},"22":{"title":"Instalando o plugin","titles":["Começando","4. Instalando um plugin"]},"23":{"title":"5. Instalando uma versão","titles":["Começando"]},"24":{"title":"6. Definindo uma versão","titles":["Começando"]},"25":{"title":"Versões globais","titles":["Começando","6. Definindo uma versão"]},"26":{"title":"Versões locais","titles":["Começando","6. Definindo uma versão"]},"27":{"title":"Usando arquivos de versão existentes","titles":["Começando","6. Definindo uma versão"]},"28":{"title":"Setup finalizado!","titles":["Começando"]},"29":{"title":"Introdução","titles":[]},"30":{"title":"Funcionamento","titles":["Introdução"]},"31":{"title":"Projetos relacionados","titles":["Introdução"]},"32":{"title":"nvm / n / rbenv etc","titles":["Introdução","Projetos relacionados"]},"33":{"title":"direnv","titles":["Introdução","Projetos relacionados"]},"34":{"title":"Homebrew","titles":["Introdução","Projetos relacionados"]},"35":{"title":"NixOS","titles":["Introdução","Projetos relacionados"]},"36":{"title":"Por que usar o asdf?","titles":["Introdução"]},"37":{"title":"All Commands","titles":[]},"38":{"title":"Configuration","titles":[]},"39":{"title":".tool-versions","titles":["Configuration"]},"40":{"title":"$HOME/.asdfrc","titles":["Configuration"]},"41":{"title":"Variáveis de ambiente","titles":["Configuration"]},"42":{"title":"Core","titles":[]},"43":{"title":"Instalação e configuração","titles":["Core"]},"44":{"title":"Execute","titles":["Core"]},"45":{"title":"Variável de Ambiente","titles":["Core"]},"46":{"title":"Informações","titles":["Core"]},"47":{"title":"Reshim","titles":["Core"]},"48":{"title":"Versionamento do Shim","titles":["Core"]},"49":{"title":"Atualizar","titles":["Core"]},"50":{"title":"Desinstalar","titles":["Core"]},"51":{"title":"Plugins","titles":[]},"52":{"title":"Adicionar","titles":["Plugins"]},"53":{"title":"Listar Instalados","titles":["Plugins"]},"54":{"title":"Listar todos nomes abreviados no repositório","titles":["Plugins"]},"55":{"title":"Atualizar","titles":["Plugins"]},"56":{"title":"Remover","titles":["Plugins"]},"57":{"title":"Sincronizar nome abreviado no repositório","titles":["Plugins"]},"58":{"title":"Versões","titles":[]},"59":{"title":"Instalar Versão","titles":["Versões"]},"60":{"title":"Instalar última versão estável","titles":["Versões"]},"61":{"title":"Listar versões instaladas","titles":["Versões"]},"62":{"title":"Listar todas as versões disponíveis","titles":["Versões"]},"63":{"title":"Mostrar última versão estável","titles":["Versões"]},"64":{"title":"Selecionar versão atual","titles":["Versões"]},"65":{"title":"Resposta do sistema de versão","titles":["Versões"]},"66":{"title":"Verificar a versão atual","titles":["Versões"]},"67":{"title":"Desinstalar versão","titles":["Versões"]},"68":{"title":"Shims","titles":["Versões"]},"69":{"title":"Ignorando shims do asdf","titles":["Versões","Shims"]},"70":{"title":"Community Projects","titles":[]},"71":{"title":"Perguntas frequentes","titles":[]},"72":{"title":"Suporte WSL1?","titles":["Perguntas frequentes"]},"73":{"title":"Suporte WSL2?","titles":["Perguntas frequentes"]},"74":{"title":"Exectable recém-instalado não está funcionando?","titles":["Perguntas frequentes"]},"75":{"title":"Shell não detecta shims recém-instalados?","titles":["Perguntas frequentes"]},"76":{"title":"Créditos","titles":[]},"77":{"title":"Mantenedores","titles":["Créditos"]},"78":{"title":"Contribuidores","titles":["Créditos"]},"79":{"title":"Criar um plug-in","titles":[]},"80":{"title":"O que há em um plug-in","titles":["Criar um plug-in"]},"81":{"title":"Scripts obrigatórios","titles":["Criar um plug-in"]},"82":{"title":"Variavéis de Ambiente","titles":["Criar um plug-in"]},"83":{"title":"bin/list-all","titles":["Criar um plug-in","Variavéis de Ambiente"]},"84":{"title":"bin/download","titles":["Criar um plug-in","Variavéis de Ambiente"]},"85":{"title":"bin/install","titles":["Criar um plug-in","Variavéis de Ambiente"]},"86":{"title":"Scripts Opcional","titles":["Criar um plug-in"]},"87":{"title":"scripts bin/help","titles":["Criar um plug-in","Scripts Opcional"]},"88":{"title":"bin/list-bin-paths","titles":["Criar um plug-in","Scripts Opcional"]},"89":{"title":"bin/exec-env","titles":["Criar um plug-in","Scripts Opcional"]},"90":{"title":"bin/exec-path","titles":["Criar um plug-in","Scripts Opcional"]},"91":{"title":"bin/uninstall","titles":["Criar um plug-in","Scripts Opcional"]},"92":{"title":"bin/list-legacy-filenames","titles":["Criar um plug-in","Scripts Opcional"]},"93":{"title":"bin/parse-legacy-file","titles":["Criar um plug-in","Scripts Opcional"]},"94":{"title":"bin/post-plugin-add","titles":["Criar um plug-in","Scripts Opcional"]},"95":{"title":"bin/pre-plugin-remove","titles":["Criar um plug-in","Scripts Opcional"]},"96":{"title":"Comandos de extensão para asdf CLI.","titles":["Criar um plug-in"]},"97":{"title":"Modelos de calços personalizados","titles":["Criar um plug-in"]},"98":{"title":"Testando plug-ins","titles":["Criar um plug-in"]},"99":{"title":"Exemplo GitHub Action","titles":["Criar um plug-in","Testando plug-ins"]},"100":{"title":"Exemplo de configuração do TravisCI","titles":["Criar um plug-in","Testando plug-ins"]},"101":{"title":"Limitação de taxa da API do GitHub","titles":["Criar um plug-in"]},"102":{"title":"Enviando plugins para o repositório oficial de plugins","titles":["Criar um plug-in"]}},"dirtCount":0,"index":[["à",{"2":{"101":2}}],["às",{"2":{"3":1,"96":1}}],["🙏",{"2":{"78":1}}],["​​por",{"2":{"74":1}}],["kim",{"2":{"66":3}}],["keep",{"2":{"40":1}}],["916",{"2":{"55":1}}],["8",{"2":{"48":2,"85":1}}],["8837",{"2":{"19":2}}],["7",{"2":{"39":4,"85":1}}],["`$asdf",{"2":{"96":5}}],["`env`",{"2":{"37":1}}],["`asdf",{"2":{"37":1}}],["🎉",{"2":{"28":1,"50":1}}],["yml",{"2":{"100":1}}],["yamllanguage",{"2":{"100":1}}],["yamlsteps",{"2":{"99":1}}],["yarn",{"2":{"47":2,"74":3}}],["yes",{"2":{"27":1,"40":4}}],["your",{"2":{"1":1,"7":1,"15":2,"18":1}}],["you",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"29":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["000",{"2":{"35":1}}],["0",{"2":{"25":1,"26":1,"39":3,"40":1,"48":4,"64":2,"83":3,"84":1,"85":3,"90":1}}],["60",{"2":{"35":1,"40":1,"57":1}}],["6",{"0":{"24":1},"1":{"25":1,"26":1,"27":1},"2":{"66":1}}],["4",{"0":{"20":1},"1":{"21":1,"22":1},"2":{"64":3,"83":1}}],["+",{"2":{"19":2}}],["|",{"2":{"19":11}}],["=s",{"2":{"50":2}}],["=",{"2":{"19":9,"27":1,"40":1,"50":6}}],["zero",{"2":{"84":1,"85":1}}],["zdotdir",{"2":{"19":1}}],["zshrc",{"2":{"19":5,"50":4,"75":1}}],["zsh",{"2":{"19":24,"50":6,"75":1}}],["zypper",{"2":{"15":2}}],["$releases",{"2":{"101":1}}],["$cmd",{"2":{"101":2}}],["$github",{"2":{"101":2}}],["$travis",{"2":{"100":1}}],["$e",{"2":{"50":4}}],["$env",{"2":{"19":2}}],["$pwd",{"2":{"26":2,"64":1}}],["$path",{"2":{"19":1,"29":1,"68":1,"75":1}}],["$nu",{"2":{"19":3}}],["$fpath",{"2":{"19":1,"50":1}}],["$",{"2":{"19":16,"37":1,"50":18,"64":2,"68":6,"94":4,"95":3,"96":4,"99":1}}],["$home",{"0":{"40":1},"2":{"19":8,"24":1,"25":2,"27":1,"39":1,"50":48,"64":1}}],["$asdf",{"2":{"2":1,"50":2,"68":1,"85":1,"96":2}}],["~",{"2":{"17":1,"19":49,"39":1,"41":3,"50":23,"68":1,"90":2,"92":1}}],["2014",{"2":{"76":1}}],["2",{"0":{"16":1},"1":{"17":1,"18":1},"2":{"39":6,"64":1,"73":1,"83":1}}],["11",{"2":{"66":1}}],["17",{"2":{"48":2,"59":1,"60":1,"61":1,"62":1,"63":1,"66":2,"67":1}}],["15",{"2":{"39":4}}],["10",{"2":{"39":2}}],["16",{"2":{"25":1,"26":1,"48":2}}],["14",{"2":{"17":1,"23":1,"48":4}}],["1",{"0":{"15":1},"2":{"17":1,"40":1,"64":2,"72":1,"83":4,"90":1}}],["└─",{"2":{"11":4}}],["│",{"2":{"11":1}}],["├─",{"2":{"11":5}}],["5",{"0":{"23":1},"2":{"8":1,"25":1,"26":1,"39":1,"48":2,"66":1}}],["já",{"2":{"83":2,"85":1,"87":1}}],["j",{"2":{"82":1}}],["jthegedus",{"2":{"77":1}}],["java",{"2":{"53":3}}],["javascript",{"2":{"7":2,"8":1,"10":1}}],["janela",{"2":{"19":1}}],["join",{"2":{"19":4,"50":2}}],["json",{"2":{"7":1,"8":2}}],["js",{"2":{"7":2,"8":1,"10":5,"11":2,"12":1,"20":1,"23":1,"48":1,"51":1}}],["ões",{"2":{"7":1}}],["rvmrc",{"2":{"92":1}}],["rm",{"2":{"50":4}}],["rs",{"2":{"50":4}}],["rf",{"2":{"50":26}}],["roda",{"2":{"30":1}}],["root",{"2":{"11":1}}],["rbenv",{"0":{"32":1},"2":{"27":1,"32":1,"40":1}}],["rc",{"2":{"19":9,"50":3}}],["raiz",{"2":{"10":2,"11":1}}],["ramificação",{"2":{"4":1}}],["ruby",{"2":{"12":1,"27":1,"39":1,"40":2,"51":1,"92":1}}],["running",{"2":{"96":5}}],["runner",{"2":{"73":1}}],["runs",{"2":{"37":1}}],["run",{"2":{"8":2,"15":1}}],["ruptura",{"2":{"4":1}}],["registre",{"2":{"92":1}}],["registered",{"2":{"37":1}}],["retorne",{"2":{"90":1}}],["retorna",{"2":{"68":2,"98":1}}],["retornar",{"2":{"48":1}}],["retorno",{"2":{"68":1,"85":1,"87":5}}],["returned",{"2":{"37":1}}],["real",{"2":{"39":1}}],["readme",{"2":{"11":4,"69":1,"96":1}}],["remoção",{"2":{"50":2,"95":1}}],["removido",{"2":{"84":1,"95":1}}],["remova",{"2":{"50":27}}],["removendo",{"2":{"56":1}}],["remover",{"0":{"56":1},"2":{"50":14,"56":2}}],["remove",{"0":{"95":1},"2":{"37":3,"56":2,"95":4}}],["remoto",{"2":{"2":1}}],["rest",{"2":{"98":1}}],["resfriado",{"2":{"76":1}}],["resolve",{"2":{"96":1}}],["resolvendo",{"2":{"75":1}}],["resources",{"2":{"37":1}}],["ressaltar",{"2":{"73":1}}],["responsible",{"2":{"70":1}}],["resposta",{"0":{"65":1}}],["respositório",{"2":{"55":1}}],["reshim",{"0":{"47":1},"2":{"37":1,"47":2,"74":2,"75":1}}],["reservada",{"2":{"34":1}}],["resultará",{"2":{"24":1}}],["resulta",{"2":{"23":1}}],["relativas",{"2":{"96":1}}],["relativo",{"2":{"90":1,"100":1}}],["relativos",{"2":{"88":1}}],["relate",{"2":{"70":1}}],["related",{"2":{"70":1}}],["relatório",{"2":{"46":1}}],["relaciona",{"2":{"35":1}}],["relacionados",{"0":{"31":1},"1":{"32":1,"33":1,"34":1,"35":1},"2":{"94":1,"95":1,"96":1}}],["relevantes",{"2":{"12":1,"87":1}}],["release",{"2":{"4":1,"37":1,"40":1,"49":1}}],["releases",{"0":{"4":1,"9":1}}],["reinicie",{"2":{"19":1}}],["required",{"2":{"15":1}}],["requires",{"2":{"15":1}}],["requests",{"0":{"4":1,"9":1}}],["request",{"2":{"2":1,"4":1,"98":1}}],["ref>",{"2":{"37":1,"98":1}}],["ref",{"2":{"37":2,"39":2,"59":1,"82":2,"98":1}}],["refs",{"2":{"37":1}}],["refencia",{"2":{"27":1}}],["referências",{"2":{"11":1}}],["referência",{"2":{"10":1,"25":1,"59":1}}],["refactor",{"2":{"4":1}}],["replicáveis",{"2":{"35":1}}],["repository",{"2":{"37":1,"40":1,"57":1}}],["repositório",{"0":{"54":1,"57":1,"102":1},"2":{"1":1,"2":1,"12":1,"13":1,"21":1,"26":1,"29":1,"40":3,"52":2,"57":1,"80":1,"82":1,"98":1,"99":1,"100":1,"102":3}}],["repo",{"2":{"12":1,"37":3,"101":1}}],["representam",{"2":{"10":1}}],["representar",{"2":{"10":1}}],["revert",{"2":{"4":1}}],["revisão",{"2":{"2":1}}],["receberá",{"2":{"93":1}}],["recente",{"2":{"19":2,"40":2,"50":1,"83":1,"85":1}}],["recently",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"29":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["recém",{"0":{"74":1,"75":1}}],["reconstruir",{"2":{"49":1}}],["recomendável",{"2":{"83":1,"98":1}}],["recomendado",{"2":{"3":1,"49":1}}],["recommendation",{"2":{"52":1}}],["recommend",{"2":{"18":1}}],["recálculo",{"2":{"47":1}}],["recria",{"2":{"47":1}}],["recreate",{"2":{"37":1}}],["recurso",{"2":{"40":1,"96":2,"97":1}}],["recursos",{"2":{"2":1,"8":1}}],["últimos",{"2":{"57":1}}],["último",{"2":{"55":1,"83":1}}],["última",{"0":{"60":1,"63":1},"2":{"4":1,"23":1,"40":2,"60":1,"63":1}}],["única",{"2":{"29":1}}],["único",{"2":{"29":1,"36":1}}],["útil",{"2":{"1":1,"69":1,"82":1,"83":1,"98":1}}],["x",{"2":{"57":2}}],["x26",{"2":{"3":1,"19":2}}],["x3c",{"2":{"1":1,"4":3,"7":1,"37":38,"44":1,"45":1,"47":2,"48":1,"52":3,"55":1,"56":1,"59":2,"60":3,"61":3,"62":3,"63":3,"64":13,"65":1,"66":1,"67":2,"90":3,"98":4}}],[">>",{"2":{"19":15}}],[">",{"2":{"3":1,"4":1}}],["39cb398vb39",{"2":{"39":1}}],["3",{"0":{"19":1},"2":{"3":2,"8":1,"39":3,"48":2,"59":1,"66":2,"67":1,"83":1}}],["é",{"2":{"2":1,"3":1,"4":2,"8":2,"11":1,"12":1,"19":3,"25":1,"27":1,"29":1,"30":2,"32":2,"34":2,"35":2,"36":2,"37":1,"39":1,"40":4,"41":4,"42":1,"50":1,"52":1,"57":2,"59":1,"64":1,"68":3,"72":1,"73":2,"75":1,"80":1,"82":1,"83":5,"87":2,"96":2,"97":1,"98":4}}],["upgrade",{"2":{"49":2}}],["update",{"2":{"4":1,"37":8,"40":1,"49":2,"55":3}}],["utilitários",{"2":{"96":1}}],["utilizá",{"2":{"19":1}}],["utilizar",{"2":{"33":1}}],["utilizadas",{"2":{"24":1,"56":1}}],["utilização",{"2":{"19":1}}],["utilizando",{"2":{"19":3,"23":1}}],["utilizem",{"2":{"36":1}}],["utilize",{"2":{"19":2}}],["util",{"2":{"37":2,"45":1}}],["utils",{"2":{"37":1,"96":1}}],["unix",{"2":{"73":1}}],["unidade",{"2":{"73":2}}],["uninstall",{"0":{"91":1},"2":{"37":1,"50":5,"67":2,"80":1}}],["unitários",{"2":{"1":1}}],["uz",{"2":{"19":1,"50":1}}],["urls",{"2":{"37":3,"53":1}}],["url>",{"2":{"37":1,"52":1,"98":1}}],["url",{"2":{"11":1,"37":1,"52":2,"94":2,"102":1}}],["ubuntu",{"2":{"5":1,"87":1}}],["uma",{"0":{"23":1,"24":1},"1":{"25":1,"26":1,"27":1},"2":{"4":2,"11":1,"14":3,"19":3,"23":2,"24":4,"25":1,"29":2,"30":1,"35":2,"36":1,"39":4,"47":1,"56":1,"57":1,"59":1,"64":1,"73":2,"74":1,"82":1,"83":4,"85":1,"87":4,"88":3,"90":1,"91":2,"92":2,"99":1,"101":1}}],["um",{"0":{"20":1,"79":1,"80":1},"1":{"21":1,"22":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1},"2":{"1":1,"2":1,"3":1,"5":1,"8":1,"9":2,"14":1,"19":6,"25":1,"26":2,"29":5,"30":2,"32":1,"34":1,"35":1,"36":2,"39":4,"40":1,"46":2,"47":1,"48":1,"49":3,"55":1,"56":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":2,"65":1,"68":2,"74":1,"80":2,"83":1,"84":1,"85":1,"87":7,"96":5,"97":5,"98":2,"100":2,"101":2,"102":1}}],["usá",{"2":{"98":1}}],["uso",{"2":{"39":1,"87":1}}],["usuário",{"2":{"34":1,"38":1,"83":1}}],["usuários",{"2":{"8":1,"87":1,"92":1,"96":1,"102":1}}],["using",{"2":{"18":1}}],["us",{"2":{"11":1}}],["usa",{"2":{"68":1,"74":1}}],["usado",{"2":{"56":1,"68":1,"93":1,"94":2,"95":1,"97":2}}],["usados",{"2":{"10":1,"40":1,"82":1}}],["usada",{"2":{"51":1}}],["usadas",{"2":{"39":1}}],["usamos",{"2":{"8":1}}],["usando",{"0":{"27":1},"2":{"4":1,"9":1,"19":3,"29":1,"49":1,"50":8,"73":1,"96":2,"102":1}}],["usará",{"2":{"40":1}}],["usar",{"0":{"36":1},"2":{"1":1,"3":1,"5":1,"39":2,"49":1,"59":1,"65":1,"96":1,"97":2,"100":1}}],["uses",{"2":{"99":1}}],["user",{"2":{"102":1}}],["users",{"2":{"66":3}}],["user>",{"2":{"1":1,"7":1}}],["used",{"2":{"12":1,"37":3}}],["use",{"2":{"2":1,"4":1,"18":1,"19":3,"39":2,"40":1,"41":1,"50":1,"55":1,"97":1}}],["quality",{"2":{"70":1}}],["qualquer",{"2":{"36":1,"41":3,"68":1,"80":1,"84":1,"85":2,"87":2,"94":1,"95":1}}],["qual",{"2":{"29":1,"30":1,"59":1,"100":1}}],["quanto",{"2":{"27":1,"38":1}}],["quando",{"2":{"8":1,"26":1,"30":2,"40":1,"48":1,"68":1,"73":2,"80":1,"84":1,"85":2,"87":4,"96":1}}],["quaisquer",{"2":{"47":1,"87":1}}],["quais",{"2":{"23":1,"24":1,"51":1}}],["quiser",{"2":{"2":1,"55":1,"64":1,"85":1,"87":1}}],["que",{"0":{"36":1,"80":1},"2":{"1":1,"3":1,"4":1,"8":1,"9":1,"10":1,"14":1,"19":11,"24":3,"25":1,"29":1,"30":2,"32":2,"35":2,"36":4,"39":5,"40":4,"41":3,"48":1,"49":1,"50":3,"60":1,"61":1,"62":1,"63":1,"68":3,"69":1,"73":1,"74":2,"82":1,"83":4,"84":1,"85":3,"87":8,"88":1,"90":1,"92":1,"94":2,"95":2,"96":6,"97":1,"98":4}}],["quebrariam",{"2":{"1":1}}],["quebrar",{"2":{"1":1}}],["quot",{"2":{"0":2,"6":2,"12":2,"13":2,"14":2,"29":2,"37":2,"38":2,"42":2,"51":2,"58":2,"79":2}}],["módulo",{"2":{"50":6}}],["método",{"2":{"49":3,"52":1,"57":1}}],["métodos",{"2":{"19":1}}],["muitos",{"2":{"42":1}}],["muitas",{"2":{"35":1,"48":1,"83":2}}],["mudado",{"2":{"57":1}}],["mudanças",{"2":{"19":1}}],["mudança",{"2":{"4":1}}],["mudou",{"2":{"19":2}}],["modelo",{"2":{"97":1}}],["modelos",{"0":{"97":1},"2":{"97":1}}],["modificadas",{"2":{"39":1}}],["motivo",{"2":{"69":1}}],["mostrar",{"0":{"63":1},"2":{"63":1}}],["mostrará",{"2":{"24":1}}],["momento",{"2":{"24":1}}],["my",{"2":{"19":5,"99":1,"102":3}}],["md",{"2":{"11":6,"74":1}}],["mínima",{"2":{"8":1}}],["mapeia",{"2":{"100":1}}],["make",{"2":{"82":1}}],["makepkg",{"2":{"18":1}}],["master",{"2":{"37":1,"49":1}}],["mas",{"2":{"19":1,"36":1,"42":1,"57":1,"74":1,"87":2}}],["may",{"2":{"15":1}}],["macos",{"2":{"15":2,"19":4,"21":1,"34":1,"50":3}}],["man",{"2":{"96":3}}],["mantenedores",{"0":{"77":1}}],["mantenha",{"2":{"40":1}}],["manipulado",{"2":{"68":1}}],["manipulação",{"2":{"29":1}}],["managed",{"2":{"70":1}}],["manage",{"2":{"37":1,"74":1}}],["manager",{"2":{"15":2}}],["maneira",{"2":{"29":1}}],["manualmente",{"2":{"19":3,"49":1,"83":1}}],["manutenção",{"2":{"12":1}}],["maintenance",{"2":{"12":1,"70":1}}],["mais",{"2":{"11":1,"19":3,"27":1,"33":1,"34":1,"35":2,"36":1,"40":2,"50":1,"51":1,"52":1,"57":1,"64":1,"69":1,"75":1,"83":2,"85":1,"87":1,"93":1,"102":1}}],["maiores",{"2":{"10":1}}],["markdown",{"2":{"8":1,"11":2}}],["major",{"2":{"4":1}}],["mit",{"2":{"76":1}}],["mix",{"2":{"64":1}}],["minutos",{"2":{"57":1}}],["min",{"2":{"40":1}}],["minor",{"2":{"4":1}}],["migração",{"2":{"27":1}}],["migrated",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"29":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["might",{"2":{"15":1}}],["meu",{"2":{"75":1}}],["meio",{"2":{"32":1,"47":1,"74":1}}],["mesma",{"2":{"29":1,"36":1}}],["mesmo",{"2":{"8":1,"11":2,"39":2,"59":1,"64":1,"85":1,"96":1}}],["method",{"2":{"18":2,"49":1}}],["methods",{"0":{"18":1}}],["mencioná",{"2":{"96":1}}],["mencionado",{"2":{"41":1,"85":1}}],["mencionados",{"2":{"11":1}}],["menos",{"2":{"41":1}}],["menu",{"2":{"11":1}}],["mensagem",{"2":{"4":2}}],["mensagens",{"2":{"4":1}}],["mecanismo",{"2":{"7":1}}],["melhoria",{"2":{"12":1}}],["melhor",{"2":{"2":1,"83":1}}],["máquina",{"2":{"1":1,"57":1}}],["ln",{"2":{"19":4}}],["lo",{"2":{"19":1,"25":1,"39":1,"96":1,"98":1,"101":1}}],["lookup",{"2":{"12":1}}],["longo",{"2":{"52":1}}],["long",{"2":{"12":1,"70":1}}],["locais",{"0":{"26":1},"2":{"11":1,"26":1}}],["localização",{"2":{"41":1}}],["localizados",{"2":{"11":1}}],["localidade",{"2":{"10":1,"11":2}}],["locales",{"2":{"11":2}}],["localmente",{"2":{"2":1}}],["local",{"2":{"1":1,"8":1,"14":1,"19":1,"26":1,"37":4,"39":1,"41":3,"57":1,"64":3,"65":4,"68":1}}],["last",{"2":{"40":1,"57":1}}],["lang",{"2":{"37":1,"64":1}}],["lançamentos",{"2":{"83":1}}],["lançamento",{"2":{"4":1,"9":1}}],["la",{"2":{"24":1}}],["latest",{"2":{"23":3,"25":1,"26":1,"37":15,"49":2,"60":4,"63":4,"64":3,"98":1}}],["later",{"2":{"15":1}}],["lateral",{"2":{"11":1}}],["leva",{"2":{"98":1}}],["legado",{"2":{"93":1}}],["legados",{"2":{"84":2}}],["legacy",{"0":{"92":1,"93":1},"2":{"27":1,"40":2,"92":1,"93":1}}],["leiam",{"2":{"40":1}}],["leia",{"2":{"10":1}}],["lendo",{"2":{"4":1}}],["lt",{"2":{"4":2,"9":1,"40":1,"47":2,"57":1,"65":1,"87":3,"88":3,"98":1}}],["luizm",{"2":{"1":2}}],["limitação",{"0":{"101":1},"2":{"101":1}}],["limite",{"2":{"61":1,"62":1}}],["lido",{"2":{"97":1}}],["lidar",{"2":{"51":1}}],["livre",{"2":{"87":2}}],["license",{"2":{"76":1}}],["libexec",{"2":{"19":6,"50":4}}],["lib",{"2":{"19":6,"50":3,"96":8}}],["liste",{"2":{"88":1}}],["listed",{"2":{"37":1,"70":1}}],["list",{"0":{"83":1,"88":1,"92":1},"2":{"2":1,"12":1,"15":1,"23":2,"37":9,"40":1,"53":4,"54":1,"57":1,"61":4,"62":4,"80":1,"81":1,"82":1,"83":1,"85":1,"101":2}}],["listado",{"2":{"102":1}}],["listados",{"2":{"87":1}}],["listada",{"2":{"83":1}}],["listadas",{"2":{"21":1}}],["listar",{"0":{"53":1,"54":1,"61":1,"62":1}}],["lista",{"2":{"1":1,"4":1,"23":1,"37":2,"42":1,"48":1,"54":1,"78":1,"81":1,"83":1,"87":2,"88":1,"92":1}}],["linguagens",{"2":{"39":1}}],["linguagem",{"2":{"35":1,"36":1,"80":1}}],["linhas",{"2":{"19":1,"50":14,"87":1}}],["linha",{"2":{"19":13,"27":1,"35":1,"39":1,"83":1,"87":2,"96":1}}],["linux",{"2":{"15":4,"21":1,"34":1,"72":1,"73":1,"98":1,"100":1}}],["lint",{"2":{"2":1}}],["links",{"2":{"87":2}}],["link",{"2":{"0":1,"6":1,"12":2,"13":1,"14":1,"29":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1,"87":3,"96":1}}],["like",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"29":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["funções",{"2":{"96":1}}],["função",{"2":{"83":1}}],["funcione",{"2":{"19":1,"85":1,"98":1}}],["funciona",{"2":{"84":1,"98":1}}],["funcionando",{"0":{"74":1}}],["funcionamento",{"0":{"30":1}}],["funcionalidade",{"2":{"27":2}}],["funcionalidades",{"2":{"1":1}}],["funcionar",{"2":{"19":1,"72":1,"73":2}}],["f",{"2":{"50":3}}],["frequentes",{"0":{"71":1},"1":{"72":1,"73":1,"74":1,"75":1}}],["from",{"2":{"37":1}}],["framework",{"2":{"19":9,"50":1,"75":1}}],["fluxos",{"2":{"42":1}}],["fluxo",{"2":{"29":1}}],["fpath=",{"2":{"19":1,"50":1}}],["fpath",{"2":{"19":3}}],["fi",{"2":{"101":1}}],["fiquem",{"2":{"83":1}}],["finalmente",{"2":{"68":1,"101":1}}],["final",{"2":{"68":1,"76":1}}],["finalizada",{"2":{"28":1}}],["finalizado",{"0":{"28":1}}],["fio",{"2":{"47":1}}],["filter",{"2":{"37":2}}],["filenames",{"0":{"92":1}}],["filename",{"2":{"41":1}}],["file",{"0":{"93":1},"2":{"27":1,"37":2,"40":2,"41":1,"92":1,"93":1,"96":1}}],["ficará",{"2":{"25":1,"26":1}}],["fish",{"2":{"19":19,"41":1,"50":16,"68":1,"75":2}}],["first",{"0":{"12":1}}],["fix",{"2":{"4":4}}],["fonte",{"2":{"40":2,"59":1,"81":1,"82":3,"84":3,"85":1}}],["foox",{"2":{"90":1}}],["foo",{"2":{"11":2,"59":2,"90":4,"96":11,"97":2}}],["foco",{"2":{"8":1}}],["foi",{"2":{"8":1,"19":1,"28":1,"32":1,"36":1,"47":1,"82":2,"94":2,"95":1}}],["forma",{"2":{"98":1}}],["formate",{"2":{"8":1}}],["formato",{"2":{"4":5,"9":1,"39":1,"64":1,"87":3}}],["format",{"2":{"2":1,"8":1}}],["formatado",{"2":{"40":1}}],["formatador",{"2":{"1":1}}],["formatar",{"2":{"2":1}}],["forem",{"2":{"87":1}}],["forneça",{"2":{"87":1}}],["fornecidos",{"2":{"68":1}}],["fornecido",{"2":{"68":1,"75":2}}],["fornece",{"2":{"96":1,"99":1}}],["fornecendo",{"2":{"96":1}}],["fornecem",{"2":{"48":1}}],["fornecer",{"2":{"5":1,"41":1,"96":2,"101":1}}],["force",{"2":{"50":5}}],["forçará",{"2":{"47":1}}],["foram",{"2":{"10":1,"30":1}}],["fora",{"2":{"8":1,"83":1}}],["fortemente",{"2":{"3":1}}],["for",{"2":{"2":1,"4":1,"12":1,"15":1,"24":1,"37":7,"40":1,"70":2,"72":1,"84":1,"85":2,"88":1,"93":1,"94":1,"97":1,"98":2,"100":1}}],["fork",{"2":{"1":2,"7":2}}],["febre",{"2":{"76":1}}],["feitas",{"2":{"56":1}}],["feito",{"2":{"36":1}}],["fetch",{"2":{"49":1}}],["feature",{"2":{"4":2}}],["feat",{"2":{"4":4}}],["ferramenta",{"2":{"1":1,"4":1,"7":1,"14":2,"23":1,"24":3,"27":1,"28":1,"30":2,"32":1,"35":2,"36":3,"39":5,"47":1,"56":1,"64":1,"65":2,"74":1,"80":2,"85":3,"87":4,"88":1,"90":1,"91":1,"98":2}}],["ferramentas",{"2":{"1":4,"5":1,"7":1,"24":2,"25":1,"28":1,"29":3,"30":1,"32":3,"35":1,"36":1,"39":1,"41":1,"47":1,"48":1,"51":2,"96":1}}],["facilmente",{"2":{"102":2}}],["facilitar",{"2":{"42":1,"102":1}}],["farão",{"2":{"39":1}}],["fará",{"2":{"19":1,"40":3,"84":1}}],["faz",{"2":{"35":2,"39":1}}],["fazer",{"2":{"2":1,"46":1,"80":1,"101":1}}],["falhar",{"2":{"84":2,"85":1,"101":1}}],["falharão",{"2":{"24":1}}],["faltante",{"2":{"34":1}}],["falta",{"2":{"24":1}}],["familiaridade",{"2":{"36":1}}],["familiar",{"2":{"19":1}}],["faça",{"2":{"9":1}}],["favor",{"2":{"2":1,"9":1,"97":1}}],["v",{"2":{"83":1}}],["válido",{"2":{"41":1}}],["várias",{"2":{"39":1}}],["v1",{"2":{"39":1,"99":1}}],["vêm",{"2":{"25":1}}],["valor",{"2":{"41":1,"87":1}}],["vamos",{"2":{"20":1,"23":1}}],["variavéis",{"0":{"82":1},"1":{"83":1,"84":1,"85":1}}],["variáveis",{"0":{"41":1},"2":{"29":1,"33":2,"38":1,"69":1,"82":2,"87":2}}],["variável",{"0":{"45":1},"2":{"2":1,"19":2,"64":2,"84":1,"85":1,"100":1,"101":1}}],["vars",{"2":{"80":1,"82":1}}],["varredura",{"2":{"24":1}}],["var",{"2":{"19":3,"50":3}}],["voltado",{"2":{"19":2}}],["você",{"2":{"1":2,"2":3,"3":1,"5":1,"14":2,"19":8,"24":2,"25":1,"28":2,"29":1,"30":1,"36":1,"41":4,"49":1,"55":1,"59":2,"64":2,"69":1,"74":1,"75":1,"80":1,"83":1,"85":1,"87":1,"98":2,"100":2,"102":1}}],["v0",{"2":{"17":1}}],["vídeo",{"2":{"14":1}}],["vinculada",{"2":{"73":1}}],["vinda",{"2":{"12":1}}],["vic",{"2":{"52":1,"77":1}}],["via",{"2":{"47":1,"49":1,"52":1,"57":1}}],["visa",{"2":{"35":1}}],["vida",{"2":{"12":1,"47":1}}],["vivendo",{"2":{"10":1}}],["v2",{"2":{"8":1}}],["vuepress",{"0":{"10":1},"2":{"8":1,"10":4,"11":3}}],["v8",{"2":{"7":1}}],["vm",{"2":{"1":1,"7":2,"17":1,"18":2,"19":9,"22":1,"37":2,"41":1,"50":7,"53":1,"87":1,"98":1,"99":2,"100":1,"102":1}}],["veggies",{"2":{"88":2}}],["vem",{"2":{"48":1}}],["vez",{"2":{"40":1,"85":1,"87":1,"97":1}}],["vezes",{"2":{"3":1,"40":1,"83":1}}],["verifique",{"2":{"69":1,"85":1,"98":1}}],["verificado",{"2":{"98":1}}],["verifica",{"2":{"85":1}}],["verificar",{"0":{"66":1},"2":{"100":1}}],["verificará",{"2":{"40":1}}],["verificação",{"2":{"24":1,"40":1}}],["verdadeiramente",{"2":{"35":1}}],["ver",{"2":{"13":1,"23":1,"28":1}}],["version=1",{"2":{"64":1}}],["versionamento",{"0":{"48":1},"2":{"80":1}}],["version`",{"2":{"37":1}}],["version>",{"2":{"37":13,"47":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":8,"67":1,"98":1}}],["version",{"2":{"27":3,"37":23,"40":3,"47":2,"64":2,"82":3,"87":1,"92":2,"98":4,"99":1,"100":2}}],["versions",{"0":{"39":1},"2":{"1":1,"7":1,"14":1,"24":1,"25":2,"26":2,"29":1,"30":1,"37":10,"38":1,"39":9,"41":3,"48":4,"50":14,"64":4,"66":3,"68":1}}],["versão",{"0":{"23":1,"24":1,"27":1,"59":1,"60":1,"63":1,"64":1,"65":1,"66":1,"67":1},"1":{"25":1,"26":1,"27":1},"2":{"4":2,"7":1,"14":3,"23":3,"24":2,"25":1,"27":2,"29":3,"30":2,"32":1,"36":1,"39":4,"40":3,"44":1,"47":1,"60":1,"63":1,"64":8,"65":3,"68":2,"81":2,"82":1,"83":2,"84":1,"85":5,"88":1,"90":1,"91":1,"93":1,"98":1}}],["versões",{"0":{"25":1,"26":1,"58":1,"61":1,"62":1},"1":{"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1},"2":{"1":1,"23":3,"24":1,"25":1,"26":1,"28":2,"29":1,"32":1,"35":1,"36":1,"39":3,"41":1,"48":2,"55":1,"56":1,"61":1,"62":1,"65":1,"81":1,"83":7}}],["veja",{"2":{"10":1,"12":1,"19":2,"27":1,"33":1,"34":1,"35":1,"51":1,"54":1,"64":1,"74":1,"78":1,"94":1,"95":1}}],["ve",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"29":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["bom",{"2":{"96":1}}],["bottom",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"29":1,"37":1,"38":1,"42":1,"51":1,"58":1,"75":1,"79":1}}],["bibliotecas",{"2":{"96":1}}],["bit",{"2":{"96":1}}],["bits",{"2":{"96":1}}],["binário",{"2":{"40":2,"81":1,"82":2,"84":3}}],["binários",{"2":{"39":2,"89":1}}],["bin",{"0":{"83":1,"84":1,"85":1,"87":1,"88":2,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1},"2":{"2":1,"68":1,"81":3,"82":5,"84":1,"85":5,"87":5,"88":2,"90":4,"101":1}}],["by",{"2":{"12":1,"37":1,"66":3}}],["buscar",{"2":{"55":1}}],["bug",{"2":{"46":1}}],["bugs",{"2":{"2":1}}],["build",{"2":{"4":1,"100":1}}],["before",{"2":{"100":1}}],["begins",{"2":{"37":1}}],["being",{"2":{"37":2}}],["bem",{"2":{"12":1,"32":1,"40":1,"84":1,"85":2}}],["be",{"2":{"3":2,"15":1}}],["baz`",{"2":{"96":1}}],["baz",{"2":{"96":1}}],["bar`",{"2":{"96":1}}],["bar",{"2":{"96":1}}],["barra",{"2":{"11":2}}],["bat",{"2":{"96":6}}],["bats",{"0":{"3":1},"2":{"1":3,"2":3,"3":8}}],["baixar",{"2":{"84":1}}],["baixado",{"2":{"40":2,"82":2,"84":1,"85":1}}],["baixe",{"2":{"81":1,"85":1}}],["bastante",{"2":{"42":1}}],["basicamente",{"2":{"8":1}}],["baseado",{"2":{"43":1}}],["baseada",{"2":{"27":1}}],["base",{"2":{"5":1,"33":1}}],["bash`",{"2":{"96":3}}],["bashasdf",{"2":{"56":1}}],["bashrc",{"2":{"19":6,"50":3}}],["bash",{"2":{"1":3,"2":3,"19":19,"50":14,"75":1,"96":9,"97":1}}],["brew",{"2":{"15":1,"18":1,"19":12,"21":1,"49":2,"50":6}}],["breaking",{"2":{"4":1}}],["brazilian",{"2":{"11":1}}],["branch",{"2":{"1":1,"7":1,"17":1,"37":3,"39":1,"55":1,"59":1,"82":1,"98":2}}],["br",{"2":{"11":6}}],["bruta",{"2":{"1":1}}],["c",{"2":{"100":1}}],["certifique",{"2":{"96":1,"101":1}}],["cmd=",{"2":{"101":2}}],["cmd",{"2":{"96":1}}],["cd",{"2":{"18":1}}],["curto",{"2":{"87":1,"102":1}}],["curtos",{"2":{"54":1}}],["currently",{"2":{"37":1}}],["current",{"2":{"24":1,"37":7,"66":4,"68":1}}],["curl",{"2":{"15":7,"21":1,"101":1}}],["customizada",{"2":{"19":2}}],["cubra",{"2":{"2":1}}],["calço",{"2":{"97":1}}],["calços",{"0":{"97":1},"2":{"47":1,"97":1}}],["call",{"2":{"90":1}}],["callback",{"2":{"68":1}}],["candidates",{"2":{"40":1}}],["caso",{"2":{"40":1,"50":2,"73":1,"74":1,"82":2,"83":1,"87":1,"90":1,"101":1}}],["camando",{"2":{"39":2}}],["caminhos",{"2":{"2":1,"88":2}}],["caminho",{"2":{"2":2,"68":2,"82":2,"84":1,"85":1,"88":1,"90":4,"93":1,"94":1,"95":1,"96":1,"100":2}}],["cat",{"2":{"93":1}}],["categorias",{"2":{"28":1}}],["catalina",{"2":{"19":2,"50":1}}],["cada",{"2":{"11":1,"12":1,"14":1,"21":1,"27":1,"28":1,"29":1,"30":1,"32":1,"35":1,"50":1,"68":1,"83":1,"87":1}}],["capturadas",{"2":{"11":1}}],["classificação",{"2":{"83":1}}],["classificar",{"2":{"83":2}}],["classe",{"2":{"11":1}}],["cli",{"0":{"96":1},"2":{"47":1}}],["clonou",{"2":{"2":1}}],["clone",{"2":{"1":5,"7":5,"17":1,"18":1,"100":1}}],["créditos",{"0":{"76":1},"1":{"77":1,"78":1}}],["crie",{"2":{"64":1,"101":1}}],["criou",{"2":{"12":1}}],["criando",{"2":{"51":1}}],["criam",{"2":{"32":1}}],["criados",{"2":{"30":1,"47":1,"74":1}}],["criado",{"2":{"7":1,"32":1,"68":1}}],["criará",{"2":{"85":1,"88":1}}],["criar",{"0":{"79":1},"1":{"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1},"2":{"2":1,"9":1,"36":1,"74":2,"88":1,"96":1}}],["create",{"2":{"4":3}}],["check",{"2":{"40":1,"57":1}}],["checar",{"2":{"21":1}}],["chrome",{"2":{"7":1}}],["chore",{"2":{"4":1}}],["chamado",{"2":{"19":1,"96":1,"97":1}}],["chamados",{"2":{"19":1}}],["chamadas",{"2":{"68":1}}],["chamada",{"2":{"4":1,"19":2,"85":1,"87":5,"101":1}}],["chaves",{"2":{"11":1}}],["change",{"2":{"4":2}}],["changelog",{"2":{"4":1}}],["ciclo",{"2":{"47":1}}],["ci",{"2":{"4":1,"98":2,"101":1}}],["código",{"2":{"2":2,"8":1,"40":2,"59":1,"81":1,"82":3,"84":3,"85":1,"101":1}}],["copiará",{"2":{"97":1}}],["copyright",{"2":{"76":1}}],["coberta",{"2":{"87":1}}],["coisa",{"2":{"80":1}}],["cool",{"2":{"66":1}}],["costumizado",{"2":{"39":1}}],["colocar",{"2":{"84":1,"85":1}}],["colocado",{"2":{"19":1,"84":2}}],["coleção",{"2":{"35":1}}],["collaborative",{"2":{"12":1,"70":1}}],["codespaces",{"2":{"70":1}}],["code",{"2":{"8":1,"70":1}}],["corrigir",{"2":{"96":1}}],["correta",{"2":{"83":1}}],["corretamente",{"2":{"72":1,"73":1,"98":1}}],["correções",{"2":{"2":1,"41":1}}],["coreutils",{"2":{"15":2}}],["core",{"0":{"42":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1},"2":{"1":1,"2":1,"3":2,"12":1,"19":3,"70":2,"74":1}}],["comuns",{"2":{"71":1}}],["comunidade",{"2":{"12":1}}],["começa",{"2":{"68":1}}],["começando",{"0":{"14":1},"1":{"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1}}],["comando",{"2":{"19":13,"23":1,"25":1,"28":1,"35":1,"37":1,"40":2,"44":1,"46":1,"48":1,"49":1,"50":18,"64":1,"74":1,"83":1,"96":3,"98":2,"102":1}}],["comandos",{"0":{"96":1},"2":{"2":1,"28":1,"32":1,"37":1,"42":1,"57":1,"68":1,"80":1,"85":1,"96":2}}],["combinações",{"2":{"19":1}}],["complementos",{"2":{"50":9}}],["completo",{"2":{"96":1}}],["completer~",{"2":{"19":3,"50":3}}],["completer",{"2":{"19":3,"50":3}}],["completion",{"2":{"19":6,"50":5}}],["completions",{"2":{"19":8,"50":4}}],["completar",{"2":{"19":15}}],["completa",{"2":{"4":1}}],["compilar",{"2":{"82":1,"87":1}}],["compilada",{"2":{"39":1}}],["compilação",{"2":{"39":1,"59":1,"85":1,"101":1}}],["compi",{"2":{"39":1}}],["compinit",{"2":{"19":7,"50":2}}],["comportamento",{"2":{"33":1}}],["competir",{"2":{"32":1}}],["compactado",{"2":{"84":1}}],["compartilhe",{"2":{"46":1}}],["compartilháveis",{"2":{"38":1}}],["compartilhar",{"2":{"29":1}}],["compatíveis",{"2":{"1":1}}],["community",{"0":{"18":1,"70":1},"2":{"12":2,"70":3}}],["commit",{"2":{"4":1,"9":1,"37":2,"39":1,"49":1,"55":1,"59":1,"82":1,"98":1}}],["commits",{"0":{"4":1,"9":1},"2":{"9":1}}],["command>",{"2":{"37":4,"44":1,"45":1,"48":1,"90":1}}],["commands",{"0":{"37":1},"2":{"2":1,"15":1,"96":7}}],["command",{"2":{"2":1,"15":1,"18":1,"37":3,"96":10,"98":1,"99":1}}],["como",{"2":{"3":1,"5":1,"19":2,"32":1,"40":5,"47":3,"48":1,"51":1,"56":1,"68":3,"83":2,"87":1,"93":1,"96":3,"97":1,"101":2}}],["com",{"2":{"1":9,"3":2,"4":1,"7":6,"8":3,"9":1,"10":2,"11":2,"17":1,"19":3,"22":1,"23":1,"25":1,"29":2,"32":1,"33":2,"36":2,"37":2,"38":1,"39":2,"40":3,"48":2,"50":6,"51":1,"52":1,"53":2,"56":1,"57":1,"60":1,"61":1,"62":1,"63":1,"65":1,"68":1,"80":1,"83":1,"84":2,"85":4,"88":1,"90":1,"92":1,"97":1,"98":2,"100":2,"101":1,"102":1}}],["condicionalmente",{"2":{"90":1}}],["concurrency",{"2":{"82":1}}],["concluir",{"2":{"19":6}}],["conforme",{"2":{"41":1,"65":1}}],["confiar",{"2":{"83":1}}],["configure",{"2":{"89":1}}],["configurada",{"2":{"30":1}}],["configurado",{"2":{"19":11}}],["configurar",{"2":{"20":1,"30":1,"80":1}}],["configuration",{"0":{"38":1},"1":{"39":1,"40":1,"41":1},"2":{"15":1}}],["configurações",{"2":{"10":1,"11":2,"35":1,"39":1,"40":2,"50":11,"101":1}}],["configuração",{"0":{"1":1,"7":1,"43":1,"100":1},"2":{"8":1,"10":5,"11":2,"14":1,"19":3,"27":3,"28":1,"29":2,"32":1,"36":1,"38":1,"50":6,"57":1,"64":1,"73":1,"75":1,"87":1}}],["config",{"2":{"10":1,"11":2,"19":38,"41":1,"50":13,"75":1,"87":1}}],["confirmação",{"2":{"4":4}}],["confirmar",{"2":{"2":1,"8":1}}],["conversas",{"2":{"13":1}}],["convencional",{"2":{"4":2,"9":1}}],["convencionais",{"0":{"4":1,"9":1},"2":{"4":1,"9":1}}],["considerados",{"2":{"98":1}}],["consideradas",{"2":{"85":1}}],["considerar",{"2":{"85":1}}],["consigo",{"2":{"74":1}}],["conseguir",{"2":{"19":1}}],["construir",{"2":{"8":1,"35":1}}],["consulte",{"2":{"2":1,"12":1,"13":1}}],["contêm",{"2":{"88":1}}],["container",{"2":{"70":2}}],["contido",{"2":{"68":1,"84":1}}],["contidas",{"2":{"29":1}}],["contida",{"2":{"10":1}}],["contendo",{"2":{"35":1}}],["conteúdo",{"2":{"11":1}}],["contém",{"2":{"8":1,"98":1}}],["contínuo",{"2":{"5":1}}],["contrário",{"2":{"82":1,"90":1,"101":1}}],["contribuidores",{"0":{"78":1},"2":{"78":1}}],["contribuição",{"2":{"0":1,"6":1,"9":1,"13":1}}],["controle",{"2":{"2":1}}],["conjunto",{"2":{"3":1,"8":1,"11":1,"73":1,"87":1}}],["eventualmente",{"2":{"84":1}}],["eu",{"2":{"76":1}}],["either",{"2":{"65":1}}],["etapas",{"2":{"49":1}}],["etc",{"0":{"32":1},"2":{"19":3,"50":2,"51":1,"68":1,"75":2}}],["efeito",{"2":{"19":1}}],["echo",{"2":{"19":7}}],["erro",{"2":{"24":1}}],["erlang",{"2":{"12":1,"52":1,"55":1,"56":1,"59":1,"60":2,"61":2,"62":2,"63":2,"66":2,"67":1}}],["era",{"2":{"8":1}}],["ela",{"2":{"101":1}}],["elas",{"2":{"21":1}}],["elm",{"2":{"52":2}}],["else",{"2":{"50":2}}],["ele",{"2":{"39":1,"40":3,"47":1,"52":1,"75":1,"98":1}}],["eles",{"2":{"10":1,"28":2,"87":1,"88":1,"96":2}}],["elimina",{"2":{"32":1}}],["elixir",{"2":{"12":1,"39":1,"51":1,"64":4,"97":2}}],["elv",{"2":{"19":18,"50":6}}],["elvish",{"2":{"19":18,"41":1,"50":9}}],["equipes",{"2":{"36":1}}],["equipe",{"2":{"12":1}}],["esses",{"2":{"80":1}}],["esse",{"2":{"40":1,"41":1,"49":1,"50":1,"57":1,"68":1,"73":1,"87":1,"96":1,"97":1}}],["essa",{"2":{"27":2,"85":2,"98":1}}],["essas",{"2":{"4":1,"5":1,"10":1,"32":1,"82":2}}],["esperam",{"2":{"96":1}}],["específico",{"2":{"55":1}}],["específicas",{"2":{"38":1}}],["específica",{"2":{"23":1,"64":1,"91":1,"98":1}}],["especificando",{"2":{"102":1}}],["especificado",{"2":{"68":1,"88":1,"90":2,"98":2}}],["especificadas",{"2":{"40":1}}],["especificada",{"2":{"24":1,"39":1,"81":2,"88":1,"90":1}}],["especifica",{"2":{"59":1}}],["especificar",{"2":{"59":1}}],["especificações",{"2":{"10":1}}],["especial",{"2":{"3":1,"87":1}}],["espaços",{"2":{"88":1,"92":1}}],["espaço",{"2":{"39":1,"83":1}}],["escolhida",{"2":{"73":1}}],["escolhido",{"2":{"8":1}}],["escolha",{"2":{"34":1,"83":1}}],["escreve",{"2":{"64":2}}],["escrever",{"2":{"3":1,"8":1}}],["escritas",{"2":{"32":1}}],["esforço",{"2":{"5":1}}],["estiverem",{"2":{"83":1}}],["estiver",{"2":{"19":2,"26":1,"39":1,"41":1,"73":1,"84":2,"85":3,"96":1}}],["esta",{"2":{"19":2,"30":1,"32":1,"36":1,"37":1,"55":1,"83":1,"87":1}}],["estarão",{"2":{"82":2}}],["estar",{"2":{"11":1,"39":1,"75":1,"87":5}}],["estejam",{"2":{"29":1}}],["esteja",{"2":{"19":2,"50":2,"87":1}}],["este",{"2":{"4":2,"47":1,"50":6,"68":1,"82":1,"84":4,"85":1,"87":4,"88":1,"92":1,"97":1}}],["estável",{"0":{"60":1,"63":1},"2":{"60":1,"63":1}}],["estática",{"2":{"1":1}}],["está",{"0":{"74":1},"2":{"1":1,"3":1,"4":1,"9":1,"10":1,"19":4,"30":1,"68":1,"75":1,"84":1,"85":1,"87":1,"96":1,"97":1,"100":1}}],["estão",{"2":{"1":1,"10":1,"21":1,"28":1,"29":1,"55":1,"71":1,"83":1,"87":1}}],["extensões",{"2":{"96":1}}],["extensão",{"0":{"96":1},"2":{"96":2}}],["extraídas",{"2":{"83":1}}],["extraídos",{"2":{"10":1}}],["exceto",{"2":{"82":1}}],["excluído",{"2":{"40":1}}],["exatamente",{"2":{"29":1,"36":1}}],["exatas",{"2":{"23":1,"35":1}}],["example",{"2":{"90":1}}],["examples",{"2":{"4":1}}],["examinar",{"2":{"3":1}}],["expanda",{"2":{"19":1}}],["exportadas",{"2":{"11":1}}],["exhaustive",{"2":{"15":1}}],["exibida",{"2":{"87":1}}],["existência",{"2":{"85":1}}],["existe",{"2":{"33":1,"47":1}}],["existem",{"2":{"19":1}}],["existentes",{"0":{"27":1},"2":{"13":1,"33":1}}],["existente",{"2":{"3":1}}],["exige",{"2":{"23":1}}],["exigem",{"2":{"21":1}}],["exigirá",{"2":{"11":1,"74":1}}],["exectable",{"0":{"74":1}}],["exec",{"0":{"89":1,"90":1},"2":{"37":1,"44":1,"68":5,"90":2}}],["execution",{"2":{"37":1}}],["executes",{"2":{"37":1}}],["execute",{"0":{"44":1},"2":{"26":1,"30":1,"39":2,"50":14}}],["executável",{"2":{"47":1,"68":1,"90":3,"96":2,"97":3}}],["executáveis",{"2":{"30":2,"32":1,"47":2,"48":1,"74":2,"80":1,"88":2,"96":3}}],["executá",{"2":{"24":1}}],["executavél",{"2":{"68":1}}],["executam",{"2":{"68":1}}],["executable",{"2":{"37":1,"90":1}}],["executados",{"2":{"80":2,"85":1,"96":1}}],["executado",{"2":{"30":1,"40":1,"68":3,"98":1,"100":1}}],["executadas",{"2":{"24":1}}],["executa",{"2":{"24":2,"44":1,"64":1}}],["executar",{"2":{"5":1,"64":1,"73":1,"74":1,"89":1,"94":1,"95":1,"96":1,"98":1}}],["execução",{"2":{"3":1,"7":1,"23":1,"68":2,"96":1}}],["exemplo",{"0":{"99":1,"100":1},"2":{"3":1,"21":1,"25":1,"27":1,"29":1,"39":1,"40":1,"41":1,"47":1,"48":1,"64":1,"83":1,"87":1,"88":1,"96":2,"98":1,"100":1,"102":2}}],["encontrar",{"2":{"96":1}}],["encontrado",{"2":{"93":1}}],["encontrada",{"2":{"9":1}}],["enquanto",{"2":{"74":1,"97":1}}],["enviando",{"0":{"102":1}}],["enviar",{"2":{"2":1}}],["environment",{"2":{"37":1}}],["env",{"0":{"89":1},"2":{"37":1,"45":1,"68":1,"80":1,"82":1,"89":1,"99":1}}],["envolve",{"2":{"14":1}}],["entretanto",{"2":{"33":1}}],["entrar",{"2":{"69":1}}],["entra",{"2":{"11":1}}],["então",{"2":{"1":1,"24":1,"75":1,"82":1}}],["en",{"2":{"11":2}}],["english",{"2":{"11":1}}],["embutido",{"2":{"49":1}}],["em",{"0":{"80":1},"2":{"1":2,"2":1,"3":1,"7":1,"8":1,"9":1,"10":2,"11":3,"19":1,"24":2,"25":1,"28":1,"32":1,"37":1,"39":5,"40":1,"41":1,"50":17,"57":3,"64":3,"65":1,"68":4,"78":1,"83":3,"85":3,"88":2,"92":1,"94":1,"95":1,"97":1,"98":2,"101":2}}],["e",{"0":{"4":1,"9":1,"43":1},"2":{"1":2,"2":4,"3":1,"4":1,"5":1,"6":1,"7":1,"10":2,"11":2,"12":1,"13":1,"14":1,"19":13,"20":1,"24":1,"25":1,"29":3,"30":2,"32":3,"34":1,"35":4,"36":2,"38":1,"39":6,"40":1,"41":2,"46":1,"48":2,"49":1,"50":12,"55":1,"57":1,"59":2,"68":4,"73":2,"75":1,"76":1,"80":1,"84":3,"85":4,"87":5,"88":2,"94":1,"96":1,"98":2,"101":1,"102":1}}],["edite",{"2":{"39":1}}],["edit",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"19":3,"29":1,"37":1,"38":1,"42":1,"50":3,"51":1,"58":1,"79":1}}],["g",{"2":{"47":1,"74":1}}],["given",{"2":{"37":1}}],["gitref",{"2":{"98":1}}],["git",{"2":{"1":8,"7":5,"15":7,"17":1,"18":3,"19":8,"22":1,"26":1,"29":1,"37":6,"49":2,"50":5,"52":3,"53":2,"80":1,"82":1,"98":3,"100":2,"102":1}}],["github",{"0":{"13":1,"99":1,"101":1},"2":{"1":7,"4":1,"7":5,"12":1,"17":1,"22":1,"37":2,"39":1,"52":1,"53":2,"70":2,"73":1,"78":1,"98":1,"99":4,"100":1,"101":2,"102":1}}],["grande",{"2":{"32":1}}],["guiá",{"2":{"25":1}}],["guia",{"2":{"0":1,"6":1,"9":1,"43":1,"50":2}}],["globais",{"0":{"25":1},"2":{"25":1,"39":1}}],["global",{"2":{"14":1,"25":2,"37":4,"39":1,"47":1,"64":5,"65":2,"68":1}}],["ganchos",{"2":{"94":1,"95":1}}],["garante",{"2":{"36":1}}],["garantir",{"2":{"29":1,"98":1}}],["garanta",{"2":{"19":2}}],["gawk",{"2":{"21":2}}],["gpg",{"2":{"21":2}}],["gostaria",{"2":{"14":1}}],["gostaríamos",{"2":{"8":1}}],["get",{"2":{"21":1,"87":1}}],["generator",{"2":{"8":1}}],["gerência",{"2":{"35":1}}],["gerais",{"2":{"87":1}}],["geral",{"2":{"87":1}}],["geralmente",{"2":{"26":1}}],["gerar",{"2":{"4":1,"87":4}}],["gerenciamento",{"2":{"25":1,"32":1,"35":1}}],["gerenciada",{"2":{"39":1,"74":1,"87":1}}],["gerenciadas",{"2":{"7":1,"25":1}}],["gerenciador",{"2":{"29":1,"32":1,"34":3,"35":1,"36":1,"50":9,"65":1}}],["gerenciadores",{"2":{"27":1,"29":1,"40":1}}],["gerenciados",{"2":{"25":1}}],["gerencia",{"2":{"24":1,"33":1,"34":2,"35":1}}],["gerenciar",{"2":{"1":2,"14":1,"28":1,"30":1,"36":1,"74":1}}],["gt",{"2":{"3":1,"4":2,"9":1,"40":1,"47":2,"50":2,"57":1,"65":1,"87":3,"88":3,"98":1}}],["número",{"2":{"82":2}}],["núcleos",{"2":{"82":1}}],["núcleo",{"2":{"1":1,"14":1,"28":1,"42":1}}],["npm",{"2":{"47":2,"48":2,"74":1}}],["nix",{"2":{"35":1}}],["nixos",{"0":{"35":1},"2":{"35":3}}],["nvm",{"0":{"32":1},"2":{"32":1}}],["nvmrc",{"2":{"27":1}}],["nós",{"2":{"23":1}}],["n$env",{"2":{"19":3}}],["nunca",{"2":{"101":1}}],["nu",{"2":{"19":9}}],["nushell",{"2":{"19":6}}],["nsource",{"2":{"19":1}}],["nas",{"2":{"73":1,"101":1}}],["name>",{"2":{"37":19,"47":1,"52":2,"55":1,"56":1,"59":1,"60":2,"61":2,"62":2,"63":2,"64":5,"65":1,"66":1,"67":1,"98":1}}],["name",{"2":{"12":1,"37":1,"57":1,"65":1,"94":2,"95":2,"98":1,"99":1}}],["navegação",{"2":{"11":1}}],["navbar",{"2":{"10":2,"11":5}}],["na",{"2":{"4":1,"9":1,"10":1,"11":1,"12":1,"19":1,"23":2,"36":1,"39":1,"41":1,"55":1,"64":3,"65":1,"83":2,"84":1,"87":1}}],["n",{"0":{"32":1},"2":{"3":2,"19":16,"32":1,"101":1}}],["neko",{"2":{"96":1}}],["nem",{"2":{"87":1}}],["nenhum",{"2":{"84":1,"87":1}}],["nenhuma",{"2":{"57":1,"87":1}}],["nesse",{"2":{"39":1,"83":1,"98":1}}],["neste",{"2":{"32":1,"74":1}}],["nested",{"2":{"11":2}}],["necessária",{"2":{"80":1}}],["necessário",{"2":{"19":1,"64":1,"97":1}}],["necessários",{"2":{"2":1,"8":1,"87":1,"98":1}}],["necessidades",{"2":{"100":1}}],["necessidade",{"2":{"32":1,"74":1}}],["necessitava",{"2":{"29":1}}],["nexport",{"2":{"19":1}}],["new",{"2":{"0":1,"4":4,"6":1,"12":1,"13":1,"14":1,"29":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["não",{"0":{"74":1,"75":1},"2":{"1":1,"8":2,"19":3,"24":1,"25":1,"33":1,"34":2,"35":3,"36":2,"39":1,"41":1,"47":2,"50":1,"56":1,"57":1,"72":3,"73":2,"74":1,"75":2,"83":3,"84":1,"85":2,"87":3,"88":1,"93":1,"96":1}}],["normalmente",{"2":{"41":1,"98":1}}],["novas",{"2":{"96":1}}],["novamente",{"2":{"35":1}}],["nova",{"2":{"19":1}}],["novo",{"2":{"19":2,"49":1,"101":1}}],["novos",{"2":{"2":2,"47":1,"96":1}}],["non",{"2":{"15":1}}],["nomes",{"0":{"54":1},"2":{"41":1,"54":1,"92":1}}],["nome",{"0":{"57":1},"2":{"11":1,"40":1,"41":2,"52":2,"57":1,"59":1,"68":1,"96":1}}],["nosso",{"2":{"49":1}}],["nos",{"2":{"11":1,"57":1}}],["node",{"2":{"7":2,"12":1,"20":1,"23":1,"27":1,"48":3,"51":1,"66":1,"98":1,"100":2}}],["nodejs",{"2":{"7":2,"20":1,"21":1,"22":2,"23":3,"25":2,"26":2,"27":1,"28":1,"39":1,"47":2,"48":7,"53":3,"66":1,"98":3,"100":2}}],["notifique",{"2":{"74":1}}],["notas",{"2":{"100":1}}],["nota",{"2":{"23":1,"36":1,"92":1}}],["note",{"2":{"15":1,"70":1}}],["not",{"2":{"3":1,"70":2}}],["no",{"0":{"54":1,"57":1},"2":{"1":1,"3":1,"7":2,"9":2,"11":1,"21":1,"24":2,"26":2,"27":1,"29":2,"30":2,"33":1,"39":7,"40":6,"43":1,"55":1,"59":1,"68":10,"69":1,"73":1,"75":1,"78":1,"82":2,"83":1,"84":4,"85":4,"87":2,"89":1,"96":1,"97":2,"98":3,"99":1,"100":1,"102":1}}],["ic",{"2":{"100":1}}],["idealmente",{"2":{"87":1}}],["identifique",{"2":{"30":1}}],["ignorar",{"2":{"69":1}}],["ignorando",{"0":{"69":1}}],["ignore",{"2":{"41":1}}],["irá",{"2":{"19":2,"25":1,"55":1,"56":1,"93":1}}],["isntalar",{"2":{"39":1}}],["is",{"2":{"15":1}}],["isso",{"2":{"3":1,"4":1,"8":2,"11":1,"21":1,"35":1,"41":2,"46":1,"47":1,"56":1,"83":1,"85":1,"88":1,"90":1,"92":1,"93":1,"94":1,"95":1,"97":1,"101":1}}],["i18n",{"0":{"11":1},"2":{"11":1}}],["impossível",{"2":{"97":1}}],["importante",{"2":{"73":1}}],["importa",{"2":{"50":3}}],["implementado",{"2":{"93":1}}],["impresso",{"2":{"87":1}}],["imprimem",{"2":{"87":1}}],["imprime",{"2":{"83":1}}],["imprimirá",{"2":{"87":1}}],["imprimir",{"2":{"46":1,"83":1,"87":1,"88":1,"90":1,"92":1}}],["imprimindo",{"2":{"3":1}}],["imprima",{"2":{"3":1}}],["impactar",{"2":{"19":1}}],["imagens",{"0":{"5":1},"2":{"5":2}}],["início",{"2":{"85":1}}],["invocados",{"2":{"96":1}}],["inversa",{"2":{"83":1}}],["invés",{"2":{"68":1}}],["index",{"2":{"54":1}}],["independente",{"2":{"52":1}}],["individualmente",{"2":{"11":1}}],["indicar",{"2":{"25":1}}],["indica",{"2":{"4":1}}],["informação",{"2":{"87":1}}],["informações",{"0":{"46":1},"2":{"4":1,"46":1,"87":2}}],["information",{"2":{"37":1}}],["info",{"2":{"37":1,"46":1}}],["ins",{"0":{"98":1},"1":{"99":1,"100":1},"2":{"40":1,"74":1}}],["inside",{"2":{"37":1}}],["instruirá",{"2":{"88":1}}],["instruções",{"2":{"19":5,"50":2,"73":1,"102":1}}],["instancia",{"2":{"68":1}}],["instalável",{"2":{"102":1}}],["instaláveis",{"2":{"81":1}}],["instalou",{"2":{"49":1}}],["instalações",{"2":{"41":1,"56":1}}],["instalação",{"0":{"43":1},"2":{"14":2,"19":4,"21":2,"23":1,"40":1,"47":2,"49":1,"74":1,"85":7,"88":2,"94":1}}],["instala",{"2":{"41":1,"68":1,"81":1}}],["instaladas",{"0":{"61":1},"2":{"48":1}}],["instalada",{"2":{"30":1,"39":1,"85":2,"98":2}}],["instalados",{"0":{"53":1,"75":1},"2":{"30":2,"32":1,"74":1,"87":1}}],["instalado",{"0":{"74":1},"2":{"2":1,"19":1,"47":1,"68":5,"82":2,"85":1,"94":1,"95":1}}],["instalando",{"0":{"15":1,"20":1,"22":1,"23":1},"1":{"21":1,"22":1},"2":{"41":1,"47":1}}],["instalará",{"2":{"84":1}}],["instalar",{"0":{"59":1,"60":1},"2":{"14":4,"20":1,"21":2,"23":2,"30":1,"39":1,"41":1,"74":1,"85":1,"87":1,"102":1}}],["installs",{"2":{"90":1}}],["installed",{"2":{"37":5}}],["install",{"0":{"85":1},"2":{"1":1,"7":2,"15":6,"18":1,"21":2,"23":1,"37":10,"39":2,"40":2,"47":1,"59":2,"60":4,"80":1,"81":1,"82":6,"84":1,"85":6,"87":2,"88":3,"90":1}}],["instale",{"2":{"1":1,"7":2,"60":1}}],["intruções",{"2":{"50":1}}],["introdução",{"0":{"29":1},"1":{"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1},"2":{"43":1}}],["intenção",{"2":{"72":1}}],["integrar",{"2":{"33":1}}],["interface",{"2":{"29":1,"96":1}}],["interesse",{"2":{"13":1}}],["internacionalização",{"2":{"11":1}}],["interpretador",{"2":{"1":1}}],["into",{"2":{"19":2}}],["inicie",{"2":{"61":1,"62":1,"63":1,"65":1}}],["inicia",{"2":{"60":1}}],["iniciar",{"2":{"8":1}}],["inicial",{"0":{"1":1,"7":1},"2":{"28":1}}],["initialise",{"2":{"19":1}}],["in",{"0":{"79":1,"80":1},"1":{"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1},"2":{"15":1,"37":3,"47":1,"70":1,"87":2,"90":1,"94":1,"95":1,"96":3,"97":1,"98":3,"101":1}}],["incluir",{"2":{"84":1}}],["inclui",{"2":{"1":1,"36":1}}],["if",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"29":1,"37":2,"38":1,"42":1,"51":1,"58":1,"79":1,"101":1}}],["publique",{"2":{"101":1}}],["public",{"2":{"101":1}}],["pull",{"0":{"4":1,"9":1},"2":{"2":1,"4":4,"98":1}}],["pós",{"2":{"94":1}}],["pkgbuild",{"2":{"49":1}}],["página",{"2":{"27":1,"83":1}}],["python",{"2":{"25":1,"39":3,"65":1}}],["ps1",{"2":{"19":8}}],["p",{"2":{"19":4}}],["pessoal",{"2":{"101":1}}],["pequena",{"2":{"42":1}}],["pela",{"2":{"19":1}}],["pelos",{"2":{"68":1}}],["pelo",{"2":{"13":1,"19":2,"25":2,"39":1,"52":1,"64":1,"68":4,"82":1,"85":1,"90":1,"93":1}}],["personalize",{"2":{"100":1}}],["personalizados",{"0":{"97":1},"2":{"97":1}}],["personalizado",{"2":{"85":1}}],["personalizada",{"2":{"39":1}}],["personalizações",{"2":{"38":1}}],["perguntas",{"0":{"71":1},"1":{"72":1,"73":1,"74":1,"75":1},"2":{"71":1}}],["período",{"2":{"57":1}}],["periodicamente",{"2":{"57":1}}],["permite",{"2":{"90":1,"97":1}}],["permitem",{"2":{"47":1}}],["permitindo",{"2":{"30":1}}],["permitirá",{"2":{"3":1}}],["perf",{"2":{"4":1}}],["pt",{"2":{"11":6}}],["pipeline",{"2":{"9":1}}],["plug",{"0":{"79":1,"80":1,"98":1},"1":{"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":2,"100":2,"101":1,"102":1},"2":{"40":1,"47":1,"74":1,"87":2,"90":1,"94":1,"95":1,"96":3,"97":1,"98":3,"101":1}}],["plugin",{"0":{"20":1,"22":1,"94":1,"95":1},"1":{"21":1,"22":1},"2":{"1":3,"7":1,"12":1,"14":1,"19":5,"20":1,"21":1,"22":1,"23":1,"27":1,"29":1,"30":1,"33":1,"36":1,"37":12,"40":3,"50":1,"51":1,"52":4,"53":4,"54":1,"55":3,"56":4,"57":3,"59":1,"68":6,"80":1,"85":1,"87":2,"90":1,"92":1,"94":9,"95":8,"96":1,"97":1,"98":10,"99":2,"100":3,"102":7}}],["plugins",{"0":{"12":1,"21":1,"51":1,"102":2},"1":{"52":1,"53":1,"54":1,"55":1,"56":1,"57":1},"2":{"1":1,"7":1,"12":6,"21":1,"28":1,"30":1,"32":1,"36":1,"37":6,"39":1,"40":2,"41":1,"47":1,"48":1,"51":2,"52":2,"54":2,"55":1,"70":1,"84":3,"90":1,"96":9,"99":1,"102":5}}],["please",{"2":{"4":1}}],["powershell",{"2":{"19":7}}],["popular",{"2":{"12":1}}],["post",{"0":{"94":1},"2":{"94":2,"95":2}}],["possíveis",{"2":{"87":1}}],["possível",{"2":{"8":1,"36":1,"83":2,"84":1,"85":1,"87":2,"96":1}}],["possibilidade",{"2":{"33":1}}],["possuem",{"2":{"30":1}}],["possui",{"2":{"21":1,"28":1}}],["possa",{"2":{"24":1,"87":1}}],["posix",{"2":{"1":1,"19":3}}],["porque",{"2":{"97":1}}],["portuguese",{"2":{"11":1}}],["por",{"0":{"36":1},"2":{"2":1,"9":1,"10":1,"11":1,"21":2,"25":1,"27":1,"29":1,"30":1,"36":1,"39":3,"40":7,"41":1,"47":4,"50":1,"57":1,"69":1,"74":1,"83":2,"85":1,"87":3,"88":1,"92":1,"96":1,"97":2,"98":1,"100":1,"102":2}}],["pois",{"2":{"1":1,"8":1,"21":1,"52":1,"83":1,"87":2}}],["poderá",{"2":{"83":1,"84":1}}],["podendo",{"2":{"29":1}}],["podemos",{"2":{"23":2,"98":1}}],["podem",{"2":{"19":1,"30":1,"39":3,"72":1,"85":1,"87":1,"96":2,"101":1}}],["pode",{"2":{"1":2,"2":1,"3":1,"5":1,"14":1,"19":4,"28":2,"29":1,"41":4,"42":1,"48":1,"56":1,"57":2,"59":1,"64":1,"68":2,"69":1,"80":1,"82":1,"85":1,"87":3,"93":1,"94":1,"95":1,"98":1,"102":2}}],["pré",{"2":{"95":1}}],["próxima",{"2":{"83":1}}],["própria",{"2":{"35":1,"83":1}}],["próprio",{"2":{"1":1,"25":1,"96":1}}],["pre",{"0":{"95":1},"2":{"94":2,"95":2}}],["presença",{"2":{"85":1}}],["presentes",{"2":{"87":1}}],["presente",{"2":{"24":1,"39":1,"84":2,"87":2}}],["preenchido",{"2":{"85":1}}],["pretendemos",{"2":{"73":1}}],["precisamos",{"2":{"21":1}}],["precisam",{"2":{"19":1,"50":2}}],["precisa",{"2":{"19":1,"25":1,"68":1,"75":1}}],["precisará",{"2":{"59":1,"100":1}}],["precisar",{"2":{"1":1,"19":1,"83":1}}],["prefira",{"2":{"52":1}}],["prefix",{"2":{"19":12,"50":6}}],["preferências",{"2":{"49":1}}],["preferred",{"2":{"18":1}}],["primeiros",{"2":{"98":1}}],["primeiro",{"2":{"21":1,"93":1}}],["primeiras",{"2":{"83":1}}],["primeira",{"2":{"11":1}}],["primarily",{"2":{"15":1}}],["print",{"2":{"37":2}}],["printed",{"2":{"3":2}}],["printf",{"2":{"3":2}}],["principal",{"2":{"0":1,"9":1,"12":1,"87":1}}],["pr",{"2":{"9":3}}],["procurará",{"2":{"88":1}}],["processo",{"2":{"85":1}}],["prompt",{"2":{"83":1}}],["problema",{"2":{"75":1,"96":1}}],["problemas",{"2":{"13":1}}],["programa",{"2":{"68":3}}],["programação",{"2":{"35":1}}],["pronto",{"2":{"50":1}}],["pronta",{"2":{"39":1}}],["provável",{"2":{"75":1}}],["provide",{"2":{"37":1}}],["provided",{"2":{"37":2,"99":1}}],["provê",{"2":{"29":1}}],["provenientes",{"2":{"27":1}}],["profile",{"2":{"19":14,"50":3,"75":1}}],["profissional",{"2":{"12":1}}],["projeto",{"2":{"26":1,"28":1,"29":1,"64":1,"69":1}}],["projetos",{"0":{"31":1},"1":{"32":1,"33":1,"34":1,"35":1},"2":{"5":1,"28":1}}],["projects",{"0":{"70":1},"2":{"70":2}}],["project",{"2":{"12":1,"66":1,"70":1}}],["produção",{"2":{"5":1}}],["padrões",{"2":{"25":1}}],["padrão",{"2":{"1":1,"4":1,"7":1,"10":1,"19":2,"25":1,"40":4,"41":5,"47":1,"50":1,"55":1,"57":1,"68":1,"85":1,"90":1,"97":2,"98":2}}],["palavra",{"2":{"23":1}}],["path>",{"2":{"90":2}}],["paths",{"0":{"88":1},"2":{"85":1}}],["path",{"0":{"90":1},"2":{"19":8,"37":2,"39":3,"68":4,"82":3,"84":3,"85":6,"88":3,"90":2,"94":1,"95":1,"101":1}}],["patch",{"2":{"4":1}}],["pacotes",{"2":{"34":5,"35":5,"36":1,"50":9,"87":1}}],["pacote",{"2":{"19":2,"47":1,"55":1,"68":8,"89":1}}],["pacman",{"2":{"15":2,"18":1,"19":7,"49":1,"50":4}}],["packages",{"2":{"37":3}}],["package",{"2":{"7":1,"8":1,"15":2,"37":15}}],["passar",{"2":{"100":1}}],["passado",{"2":{"82":1,"88":1}}],["passando",{"2":{"68":1}}],["passe",{"2":{"39":1}}],["passos",{"2":{"28":1,"50":1}}],["passo",{"2":{"14":2}}],["pasta",{"2":{"11":1}}],["parse",{"0":{"93":1},"2":{"93":1}}],["parágrafo",{"2":{"87":1}}],["parece",{"2":{"39":1,"73":1}}],["particular",{"2":{"37":1}}],["partir",{"2":{"19":2}}],["party",{"0":{"12":1}}],["para",{"0":{"96":1,"102":1},"2":{"1":5,"2":4,"4":2,"5":3,"7":1,"8":4,"9":1,"10":4,"11":3,"12":3,"13":1,"14":1,"19":26,"20":1,"21":1,"23":1,"24":2,"25":3,"26":1,"27":3,"28":3,"29":2,"30":2,"32":4,"33":2,"34":2,"35":1,"36":4,"39":9,"40":2,"41":5,"44":1,"46":1,"47":4,"48":1,"49":2,"50":15,"51":2,"54":1,"56":1,"64":5,"65":2,"68":3,"69":1,"72":1,"73":2,"74":3,"80":3,"81":1,"82":7,"83":1,"84":2,"85":2,"87":8,"88":3,"89":1,"90":1,"92":1,"93":2,"94":1,"95":1,"96":5,"97":1,"98":4,"99":1,"100":2,"101":3,"102":3}}],["page",{"2":{"0":3,"6":3,"12":3,"13":3,"14":3,"29":3,"37":3,"38":3,"42":3,"51":3,"58":3,"79":3}}],["pages",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"29":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["dylibs",{"2":{"96":1}}],["d",{"2":{"19":2,"50":2}}],["dnf",{"2":{"15":2}}],["driven",{"2":{"12":1,"70":1}}],["dar",{"2":{"80":1}}],["danhper",{"2":{"77":1}}],["data",{"2":{"23":1,"41":1,"50":11,"68":1,"96":5}}],["das",{"2":{"11":1,"19":1,"24":2,"29":2,"35":1,"41":1,"48":1,"55":1}}],["da",{"0":{"101":1},"2":{"4":3,"7":1,"11":1,"12":1,"14":1,"19":9,"23":2,"27":1,"30":1,"35":3,"39":2,"40":3,"64":1,"65":1,"68":1,"74":1,"82":1,"83":2,"85":4,"88":1,"90":1,"98":1}}],["duração",{"2":{"40":2}}],["duration",{"2":{"40":1,"57":1}}],["durante",{"2":{"1":1,"3":1,"19":1,"47":1,"85":1}}],["during",{"2":{"3":2}}],["dinâmicas",{"2":{"96":1}}],["disso",{"2":{"96":1}}],["distribuição",{"2":{"73":1}}],["disponibilizado",{"2":{"68":1}}],["disponíveis",{"0":{"62":1},"2":{"23":1,"37":1,"82":2,"96":1}}],["disponível",{"2":{"8":1,"23":1,"73":1,"87":1}}],["disparam",{"2":{"57":1}}],["display",{"2":{"37":4}}],["diferente",{"2":{"49":1,"84":1,"85":1,"87":1}}],["diferentes",{"2":{"29":1,"32":1,"33":1,"51":1}}],["diferencial",{"2":{"32":1}}],["difícil",{"2":{"3":1}}],["divididos",{"2":{"28":1}}],["diversos",{"2":{"28":1,"29":1}}],["diversas",{"2":{"19":1,"36":1}}],["diária",{"2":{"12":1}}],["direnv",{"0":{"33":1},"2":{"33":3,"69":1}}],["diretamente",{"2":{"39":1,"68":1}}],["diretrizes",{"2":{"13":1}}],["diretórios",{"2":{"88":1}}],["diretório",{"2":{"2":2,"24":3,"26":2,"33":1,"39":5,"40":1,"41":2,"50":9,"68":4,"69":1,"73":1,"82":1,"84":2,"85":3,"88":1,"96":1,"100":1}}],["dirmngr",{"2":{"21":1}}],["dir=",{"2":{"19":3}}],["dir",{"2":{"2":1,"19":4,"41":2,"50":12,"68":1,"96":6,"100":1}}],["dos",{"0":{"21":1},"2":{"35":1,"41":1,"76":1,"87":1}}],["download",{"0":{"16":1,"17":1,"18":1,"84":1},"1":{"17":1,"18":1},"2":{"39":3,"40":1,"59":1,"81":1,"82":4,"84":7,"85":2}}],["dois",{"2":{"10":1,"48":1,"68":1,"98":1}}],["docker",{"0":{"5":1},"2":{"5":1}}],["documentation",{"2":{"4":1,"37":1}}],["documentado",{"2":{"3":1}}],["documentação",{"2":{"2":1,"3":1,"6":1,"8":1,"9":2,"10":2,"11":1,"29":1,"33":1,"34":1,"35":1,"57":1,"74":1,"87":2}}],["docsify",{"2":{"8":2}}],["docs",{"0":{"6":1},"1":{"7":1,"8":1,"9":1,"10":1,"11":1},"2":{"0":1,"4":3,"6":1,"7":3,"9":2,"10":3,"11":2,"12":1,"13":1,"14":1,"29":1,"37":2,"38":1,"42":1,"51":1,"58":1,"79":1}}],["do",{"0":{"48":1,"65":1,"69":1,"100":1,"101":1},"2":{"1":1,"2":2,"3":2,"4":1,"6":1,"7":3,"8":1,"9":1,"10":3,"11":1,"12":1,"14":3,"19":25,"20":1,"23":1,"24":1,"25":1,"27":1,"28":4,"29":1,"32":1,"33":2,"34":2,"35":1,"36":3,"37":1,"38":2,"40":3,"41":2,"42":1,"46":1,"47":2,"49":1,"50":25,"51":1,"52":2,"57":2,"59":1,"64":2,"65":2,"68":11,"69":2,"70":1,"72":1,"73":1,"74":1,"82":1,"83":2,"85":2,"87":2,"90":1,"93":1,"95":1,"96":4,"98":3,"99":1,"100":1,"101":4,"102":1}}],["deasdf",{"2":{"75":1}}],["dentro",{"2":{"52":1}}],["declara",{"2":{"39":1}}],["debug",{"2":{"37":1}}],["debian",{"2":{"21":1}}],["default",{"2":{"37":3,"41":1,"98":1}}],["definam",{"2":{"96":1}}],["defina",{"2":{"25":1,"41":1}}],["definidos",{"2":{"87":1,"96":1}}],["definido",{"2":{"40":5,"41":3,"85":2,"96":1}}],["definida",{"2":{"39":1}}],["definidas",{"2":{"26":1,"39":2,"69":1,"87":1}}],["definições",{"2":{"29":1}}],["definindo",{"0":{"24":1},"1":{"25":1,"26":1,"27":1}}],["definir",{"2":{"2":1,"14":1,"41":1,"75":1,"80":1,"82":1}}],["define",{"2":{"11":1,"40":1}}],["definem",{"2":{"4":1}}],["deles",{"2":{"29":1,"30":1}}],["delas",{"2":{"36":1}}],["dela",{"2":{"24":1}}],["demonstração",{"2":{"20":1}}],["detecta",{"0":{"75":1}}],["determinar",{"2":{"68":1,"85":1,"93":1}}],["determinado",{"2":{"57":1,"61":1,"62":1,"63":1}}],["determinadas",{"2":{"4":1,"30":1}}],["detalhes",{"2":{"11":1,"33":1,"34":1,"35":1,"64":1,"69":1}}],["detalhada",{"2":{"9":1}}],["devido",{"2":{"75":1,"101":1}}],["devolver",{"2":{"25":1}}],["dev",{"2":{"8":1,"70":2}}],["devem",{"2":{"68":1,"84":1,"87":2,"88":1}}],["devemos",{"2":{"21":1}}],["deve",{"2":{"4":1,"11":1,"19":6,"40":1,"41":2,"73":2,"82":2,"83":3,"84":5,"85":4,"87":10,"88":1,"90":1,"92":1,"97":1}}],["deps",{"2":{"87":2}}],["depois",{"2":{"19":2,"75":2,"94":1}}],["dependência",{"2":{"73":1,"87":1}}],["dependências",{"0":{"15":1,"21":1},"2":{"7":1,"14":1,"21":2,"34":1,"35":2,"87":2}}],["depending",{"2":{"15":1}}],["depender",{"2":{"101":1}}],["dependencias",{"2":{"34":1}}],["dependencia",{"2":{"21":1}}],["depende",{"2":{"9":1,"49":1}}],["depuração",{"2":{"3":2,"46":1}}],["desse",{"2":{"96":1}}],["desses",{"2":{"12":1,"87":1}}],["descompactado",{"2":{"84":1}}],["descrição",{"2":{"87":1}}],["descrito",{"2":{"41":1,"65":1}}],["descritor",{"2":{"3":1}}],["description",{"2":{"9":1}}],["description>",{"2":{"4":1}}],["desmarcar",{"2":{"80":1}}],["desinstala",{"2":{"91":1}}],["desinstalar",{"0":{"50":1,"67":1},"2":{"50":1,"59":1}}],["desinstale",{"2":{"50":12}}],["desta",{"2":{"14":1,"23":1}}],["destes",{"2":{"30":1,"34":1,"35":1}}],["deste",{"2":{"1":1,"14":1}}],["desde",{"2":{"4":1,"24":1}}],["desenvolvidas",{"2":{"55":1}}],["desenvolvimento",{"0":{"2":1,"8":1},"2":{"1":3,"5":1,"7":1,"8":2,"29":1,"39":1}}],["desenvolver",{"2":{"1":1}}],["desejado",{"2":{"26":1}}],["deseja",{"2":{"1":1,"41":1,"69":2}}],["de",{"0":{"3":1,"27":1,"41":1,"45":1,"65":1,"82":1,"96":1,"97":1,"100":1,"101":1,"102":1},"1":{"83":1,"84":1,"85":1},"2":{"0":1,"1":6,"2":5,"3":4,"4":10,"5":3,"6":1,"7":2,"8":5,"9":5,"10":2,"11":7,"13":2,"14":2,"19":8,"21":1,"23":1,"25":2,"27":8,"28":1,"29":10,"32":7,"33":3,"34":3,"35":8,"36":5,"37":1,"38":1,"39":6,"40":4,"41":3,"42":2,"43":1,"46":2,"47":6,"49":2,"50":28,"52":2,"54":2,"55":1,"56":2,"57":1,"64":5,"65":2,"69":1,"72":1,"73":3,"74":4,"75":4,"78":1,"80":1,"82":3,"83":4,"84":4,"85":8,"87":22,"88":4,"91":1,"92":2,"94":1,"95":1,"96":8,"97":4,"100":4,"101":5,"102":3}}],["overview",{"2":{"87":2}}],["oasdf",{"2":{"74":1}}],["own",{"2":{"70":1}}],["ocorre",{"2":{"24":1,"57":1}}],["ohmyzsh",{"2":{"19":4}}],["oh",{"2":{"19":5,"75":1}}],["opção",{"2":{"92":1,"100":1}}],["opções",{"2":{"27":1,"57":1}}],["operacional",{"2":{"87":4}}],["operacionais",{"2":{"19":1,"25":1}}],["opcionais",{"2":{"87":2}}],["opcional",{"0":{"86":1},"1":{"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1},"2":{"85":1,"87":1}}],["opt",{"2":{"19":9,"41":1,"50":3}}],["optionally",{"2":{"37":3}}],["optional",{"2":{"4":2,"37":1}}],["one",{"2":{"37":1}}],["on",{"2":{"15":1,"37":4,"49":1}}],["onde",{"2":{"2":1,"21":1,"41":1,"82":3,"96":1}}],["obtenha",{"2":{"90":1}}],["obter",{"2":{"10":1,"49":1}}],["obrigatória",{"2":{"87":1}}],["obrigatórios",{"0":{"81":1}}],["obrigado",{"2":{"13":1}}],["observe",{"2":{"68":1,"83":1,"87":1}}],["observação",{"2":{"68":1}}],["observar",{"2":{"24":1}}],["objetos",{"2":{"10":2}}],["osx",{"2":{"83":1,"98":1,"100":1}}],["os",{"2":{"1":1,"2":2,"3":1,"5":1,"7":1,"8":2,"10":2,"11":1,"13":1,"15":1,"19":1,"25":1,"30":1,"32":1,"33":1,"37":2,"38":1,"39":1,"40":2,"41":2,"47":2,"48":1,"50":18,"52":1,"64":1,"68":2,"80":1,"82":1,"84":1,"85":1,"87":2,"88":3,"89":1,"94":1,"95":1,"96":4,"98":2,"100":1}}],["origem",{"2":{"94":1}}],["originado",{"2":{"96":2}}],["origin",{"2":{"55":1}}],["ordem",{"2":{"83":2}}],["org",{"2":{"18":1}}],["organisation",{"2":{"12":1}}],["or",{"2":{"1":1,"7":1,"18":1,"37":6,"65":1,"70":2}}],["o",{"0":{"22":1,"36":1,"80":1,"102":1},"2":{"1":4,"2":5,"3":3,"4":8,"7":1,"8":8,"9":2,"10":1,"11":4,"12":1,"13":1,"14":3,"19":39,"20":1,"21":1,"23":2,"24":2,"25":3,"27":2,"28":2,"29":5,"30":3,"32":3,"33":3,"34":4,"35":6,"36":4,"37":1,"39":7,"40":9,"41":8,"44":1,"47":1,"48":1,"50":29,"52":1,"55":1,"56":2,"57":2,"59":2,"64":3,"65":2,"68":12,"69":2,"73":5,"74":3,"76":1,"80":1,"81":1,"82":11,"83":1,"84":13,"85":8,"87":10,"88":3,"89":1,"90":5,"93":6,"94":4,"95":3,"96":7,"97":3,"98":8,"99":1,"100":3,"101":2,"102":1}}],["output",{"2":{"37":1,"90":1}}],["outra",{"2":{"80":1}}],["outras",{"2":{"36":1}}],["outro",{"2":{"41":1,"100":1}}],["outros",{"2":{"27":1,"28":1,"39":1,"40":1,"85":2,"87":2}}],["ou",{"2":{"1":2,"2":1,"5":1,"7":1,"8":1,"19":10,"23":1,"24":1,"28":1,"34":1,"39":3,"40":2,"41":1,"49":1,"50":2,"52":1,"57":1,"59":1,"64":1,"65":1,"68":1,"69":1,"75":1,"80":3,"81":1,"82":4,"83":1,"84":3,"87":4,"96":2,"98":1}}],["our",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"29":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["official",{"0":{"17":1},"2":{"18":1}}],["oficialmente",{"2":{"72":1}}],["oficial",{"0":{"102":1},"2":{"10":1,"11":1,"72":1,"102":1}}],["oferecer",{"2":{"8":1}}],["of",{"2":{"0":1,"6":1,"12":2,"13":1,"14":1,"15":1,"29":1,"37":10,"38":1,"42":1,"51":1,"58":1,"70":1,"79":1}}],["só",{"2":{"84":1,"92":1}}],["src",{"2":{"39":1}}],["same",{"2":{"96":5}}],["sair",{"2":{"84":2,"85":2}}],["sabedoria",{"2":{"97":1}}],["sabe",{"2":{"51":1}}],["save",{"2":{"19":3}}],["saídas",{"2":{"3":1}}],["saída",{"2":{"3":1,"83":1,"84":1,"85":1,"87":5,"88":1}}],["specified",{"2":{"37":1}}],["specific",{"2":{"2":1,"37":2}}],["specifying",{"2":{"37":1}}],["spack",{"2":{"15":2}}],["ssg",{"2":{"8":1}}],["stdout",{"2":{"87":1}}],["status",{"2":{"84":2,"85":2}}],["static",{"2":{"8":1}}],["stable",{"2":{"37":5,"49":1}}],["stratus3d",{"2":{"77":1}}],["string",{"2":{"19":2,"37":1,"50":2,"83":1,"88":1,"90":1,"92":1}}],["str",{"2":{"19":2}}],["steps",{"2":{"15":1}}],["style",{"2":{"4":1}}],["script",{"2":{"19":2,"36":1,"68":2,"82":4,"84":8,"85":7,"87":9,"88":1,"93":1,"94":1,"95":1,"100":3}}],["scripts",{"0":{"81":1,"86":1,"87":1},"1":{"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1},"2":{"1":2,"2":3,"8":1,"19":1,"32":1,"68":1,"80":2,"82":1,"87":4,"96":2}}],["scope",{"2":{"4":1}}],["sort",{"2":{"83":1}}],["sourcing",{"2":{"75":1}}],["source",{"2":{"19":3,"68":2,"94":1}}],["sobre",{"2":{"71":1,"74":1,"87":1}}],["solução",{"2":{"36":1}}],["solicitação",{"2":{"4":3}}],["so",{"2":{"21":1,"46":1}}],["somente",{"2":{"8":1,"23":1,"39":1}}],["some",{"2":{"0":1,"3":3,"4":3,"6":1,"12":1,"13":1,"14":1,"15":1,"29":1,"37":1,"38":1,"42":1,"51":1,"58":1,"70":1,"79":1}}],["s",{"2":{"3":2,"7":1,"15":1,"19":5,"101":1}}],["sincronização",{"2":{"57":2}}],["sincronizado",{"2":{"57":1}}],["sincronizar",{"0":{"57":1}}],["sinalizadores",{"2":{"87":1}}],["sinalizador",{"2":{"3":1}}],["sim",{"2":{"36":1,"87":1}}],["similar",{"2":{"32":1}}],["simplicidade",{"2":{"36":1}}],["simplificar",{"2":{"10":1,"29":1}}],["simplificando",{"2":{"3":1}}],["simples",{"2":{"29":1,"68":1}}],["simplesmente",{"2":{"28":1,"93":1}}],["siga",{"2":{"19":2,"28":1,"49":1,"50":4,"102":1}}],["sistema",{"0":{"65":1},"2":{"19":1,"25":2,"32":1,"35":1,"36":2,"39":1,"65":2,"68":2,"87":4}}],["sistemas",{"2":{"19":1,"25":1}}],["si",{"2":{"18":1,"68":1,"98":1}}],["sidebar",{"2":{"10":2,"11":5}}],["sites",{"2":{"7":1}}],["site",{"0":{"6":1},"1":{"7":1,"8":1,"9":1,"10":1,"11":1},"2":{"6":1,"8":2,"10":2,"83":1}}],["são",{"2":{"2":1,"4":1,"5":1,"7":1,"11":1,"21":1,"25":2,"26":1,"32":1,"47":1,"48":1,"51":1,"68":1,"80":2,"85":1,"87":2,"96":2,"98":2}}],["sucedido",{"2":{"84":1}}],["sucedidas",{"2":{"85":1}}],["sucedida",{"2":{"40":1,"85":1}}],["suficiente",{"2":{"83":1}}],["sujeiras",{"2":{"56":1}}],["subcomando",{"2":{"96":1}}],["subsistema",{"2":{"73":1}}],["subsystem",{"2":{"72":1}}],["substituem",{"2":{"96":1}}],["substitua",{"2":{"90":1}}],["substituto",{"2":{"8":1}}],["substituir",{"2":{"8":1,"41":1}}],["subdiretórios",{"2":{"39":1}}],["suponha",{"2":{"85":1,"96":1}}],["suportado",{"2":{"64":1,"72":1,"83":1}}],["suportados",{"2":{"11":1}}],["suportar",{"2":{"51":1,"84":1}}],["suportam",{"2":{"39":1,"40":1}}],["suporta",{"2":{"27":2,"59":1}}],["suporte",{"0":{"72":1,"73":1},"2":{"1":1,"8":1,"11":1,"36":1,"72":1,"73":1,"80":1,"84":1}}],["supporting",{"2":{"70":1}}],["supported",{"0":{"18":1}}],["sudo",{"2":{"15":1}}],["suspenso",{"2":{"11":1}}],["suas",{"2":{"1":1,"2":1,"49":1,"69":1,"96":1,"100":1}}],["sua",{"2":{"1":1,"10":1,"11":1,"12":1,"19":1,"24":1,"35":1,"52":1,"64":1,"83":1,"87":2}}],["system",{"2":{"1":1,"15":1,"39":2,"65":4}}],["show",{"2":{"37":3}}],["short",{"2":{"12":1}}],["shortname",{"2":{"12":1,"54":1}}],["shim",{"0":{"48":1},"2":{"30":1,"37":3,"44":1,"47":1,"48":4,"68":2,"74":1,"90":2,"97":1}}],["shims",{"0":{"68":1,"69":1,"75":1},"1":{"69":1},"2":{"2":1,"29":1,"30":1,"32":1,"37":1,"47":2,"48":1,"68":4,"69":1,"74":3,"85":1,"88":2,"97":1}}],["sh",{"2":{"19":17,"41":1,"50":17,"68":3,"75":1,"100":1}}],["shfmt",{"2":{"1":4,"2":1}}],["shellcmd=",{"2":{"101":1}}],["shellcheck",{"2":{"1":3,"2":2}}],["shell$",{"2":{"96":1}}],["shellfoo",{"2":{"96":1}}],["shellusage",{"2":{"90":1}}],["shelluse",{"2":{"50":3}}],["shellbin",{"2":{"88":1}}],["shellbrew",{"2":{"50":5}}],["shell1",{"2":{"83":1}}],["shellif",{"2":{"50":2}}],["shellpacman",{"2":{"50":4}}],["shellrm",{"2":{"50":25}}],["shell➜",{"2":{"48":2}}],["shellexport",{"2":{"19":2}}],["shellecho",{"2":{"19":8}}],["shellmkdir",{"2":{"19":4}}],["shellsource",{"2":{"19":2,"50":3}}],["shells",{"2":{"19":1,"33":1}}],["shellgit",{"2":{"17":1}}],["shelldocs",{"2":{"11":1}}],["shellnpm",{"2":{"7":1,"8":2}}],["shellasdf",{"2":{"1":2,"7":2,"22":1,"23":1,"25":1,"26":1,"44":1,"45":1,"46":1,"47":1,"48":1,"52":2,"53":2,"54":1,"55":2,"59":1,"60":2,"61":2,"62":2,"63":2,"64":2,"65":1,"66":1,"67":1,"98":2}}],["shell",{"0":{"19":1,"75":1},"2":{"1":3,"2":1,"3":1,"7":1,"14":1,"19":20,"30":1,"32":1,"36":2,"37":3,"46":1,"50":9,"64":4,"65":2,"68":2,"75":1,"92":1}}],["secure",{"2":{"101":1}}],["security",{"2":{"70":1}}],["secrets",{"2":{"99":1}}],["sendo",{"2":{"55":1,"83":1,"87":1,"96":1,"97":1}}],["separando",{"2":{"39":1}}],["separada",{"2":{"88":1}}],["separadas",{"2":{"11":1,"83":1}}],["separados",{"2":{"10":1,"92":1}}],["sessão",{"2":{"19":1}}],["sejam",{"2":{"69":1}}],["seja",{"2":{"19":1,"57":1,"87":1,"95":1}}],["setter",{"2":{"92":1}}],["setup",{"0":{"28":1}}],["set",{"2":{"19":3,"37":7,"50":3,"65":1,"66":3}}],["seção",{"2":{"19":1,"25":1,"41":1,"64":1}}],["search",{"2":{"12":1}}],["selecione",{"2":{"64":1,"65":1}}],["selecionar",{"0":{"64":1},"2":{"64":2,"65":2}}],["selectlanguagename",{"2":{"11":2}}],["seleção",{"2":{"11":1,"64":1}}],["seguida",{"2":{"101":1}}],["seguindo",{"2":{"19":2}}],["seguinte",{"2":{"19":12,"27":1,"39":1,"57":1,"64":1,"83":1,"98":1,"101":1}}],["seguintes",{"2":{"2":1,"19":3,"82":1}}],["seguir",{"2":{"4":1}}],["segue",{"2":{"4":1}}],["seus",{"2":{"5":2,"28":1,"34":1,"39":1,"50":6,"96":1,"99":1,"101":1,"102":1}}],["seu",{"0":{"19":1},"2":{"2":3,"4":1,"13":1,"14":1,"19":21,"24":1,"26":1,"27":1,"28":1,"29":1,"30":1,"32":1,"36":2,"39":1,"40":1,"50":24,"55":1,"57":1,"64":1,"69":1,"75":4,"85":1,"87":1,"92":1,"93":1,"96":2,"97":1,"98":3,"101":3,"102":2}}],["semântica",{"2":{"40":1}}],["semelhantes",{"2":{"28":1}}],["sempre",{"2":{"12":1,"36":1,"39":1,"40":1,"87":1}}],["semantic",{"2":{"4":1}}],["semver",{"2":{"4":4}}],["sem",{"2":{"2":1,"39":2,"84":1}}],["seria",{"2":{"83":1,"88":1,"98":1}}],["serão",{"2":{"39":1,"87":1,"96":1}}],["serem",{"2":{"24":2,"82":1}}],["será",{"2":{"19":1,"26":1,"36":1,"39":1,"40":1,"82":3,"84":1,"96":1,"98":1}}],["servidor",{"2":{"8":1}}],["servidores",{"2":{"5":1}}],["ser",{"2":{"1":1,"3":1,"19":14,"29":1,"30":1,"36":2,"39":2,"40":1,"41":4,"56":1,"57":2,"68":3,"69":1,"73":1,"75":1,"82":2,"83":2,"84":2,"85":1,"87":5,"88":1,"93":1,"94":1,"95":1,"97":2,"98":1}}],["se",{"2":{"1":1,"2":1,"4":1,"19":7,"24":1,"28":1,"39":1,"40":5,"41":2,"49":1,"50":1,"55":1,"57":1,"59":1,"64":2,"69":1,"75":2,"82":1,"83":4,"84":5,"85":7,"87":1,"88":1,"92":1,"93":1,"94":1,"96":4,"97":2,"98":3,"100":1,"101":2}}],["see",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"29":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["têm",{"2":{"74":1}}],["tudo",{"2":{"50":1}}],["txtmanage",{"2":{"37":1}}],["tão",{"2":{"23":1}}],["travis",{"2":{"100":1,"101":1}}],["travisci",{"0":{"100":1}}],["trabalho",{"2":{"42":1,"73":1}}],["trabalhar",{"2":{"29":1}}],["translate",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"29":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["três",{"2":{"28":1}}],["trim",{"2":{"19":2}}],["taxa",{"0":{"101":1},"2":{"101":1}}],["tac",{"2":{"83":1}}],["tais",{"2":{"51":1}}],["talvez",{"2":{"50":1}}],["tanto",{"2":{"27":1,"38":1}}],["tag",{"2":{"23":1,"39":1,"59":1,"82":1,"98":1}}],["também",{"2":{"14":1,"39":1,"59":1,"68":1,"87":1,"94":1,"95":1,"97":1,"100":1}}],["tap",{"2":{"3":1}}],["type",{"2":{"4":1,"82":2,"87":1}}],["types",{"2":{"4":1}}],["type>",{"2":{"4":1}}],["títulos",{"2":{"9":1,"87":1}}],["título",{"2":{"4":3,"9":1,"11":1,"87":1}}],["t",{"2":{"3":2}}],["title",{"2":{"87":1}}],["time",{"2":{"29":1}}],["timgluz",{"2":{"1":1}}],["tiverem",{"2":{"8":1,"96":1}}],["tipo",{"2":{"9":1}}],["tip",{"2":{"2":1,"4":1}}],["tendo",{"2":{"96":1}}],["tenham",{"2":{"19":1}}],["tenha",{"2":{"19":2,"85":1,"96":1}}],["tela",{"2":{"83":1}}],["texto",{"2":{"37":1,"60":1,"61":1,"62":1,"63":1,"87":2}}],["terão",{"2":{"82":1}}],["ter",{"2":{"19":2,"75":1,"102":1}}],["terminais",{"2":{"85":1}}],["terminal",{"2":{"3":1,"19":1}}],["term",{"2":{"12":1,"70":1}}],["temos",{"2":{"23":1,"72":1}}],["tem",{"2":{"11":1,"49":1,"94":1,"95":1,"100":1}}],["tema",{"2":{"10":1}}],["tempos",{"2":{"76":1}}],["tempo",{"2":{"7":1}}],["temporariamente",{"2":{"2":1}}],["testando",{"0":{"98":1},"1":{"99":1,"100":1}}],["testar",{"2":{"2":2,"98":3,"99":1}}],["teste",{"0":{"3":1},"2":{"3":1,"98":1,"100":1}}],["testes",{"2":{"1":1,"2":2,"3":2,"64":1,"73":1,"101":1}}],["tests",{"2":{"2":1,"3":3}}],["test",{"2":{"2":4,"3":3,"4":1,"64":1,"98":4,"99":2,"100":3}}],["testing",{"2":{"1":1}}],["those",{"2":{"70":1}}],["that",{"2":{"37":2}}],["then",{"2":{"101":1}}],["their",{"2":{"70":1}}],["they",{"2":{"37":1,"70":1}}],["these",{"2":{"15":1,"70":1}}],["themeconfig",{"2":{"11":1}}],["the",{"2":{"0":3,"4":1,"6":3,"12":3,"13":3,"14":3,"18":1,"29":3,"37":31,"38":3,"42":3,"51":3,"58":3,"70":1,"79":3}}],["this",{"2":{"0":2,"6":2,"12":2,"13":2,"14":2,"29":2,"37":2,"38":2,"42":2,"51":2,"58":2,"79":2}}],["token",{"2":{"99":2,"101":7}}],["totalmente",{"2":{"85":1}}],["tosse",{"2":{"76":1}}],["toda",{"2":{"54":1}}],["todas",{"0":{"62":1},"2":{"29":2,"39":1,"40":1,"56":1,"81":1,"96":1}}],["todos",{"0":{"54":1},"2":{"28":1,"29":1,"37":1,"50":14,"82":1,"84":1,"87":1}}],["topic",{"2":{"12":1}}],["torna",{"2":{"4":1,"97":1}}],["tools",{"2":{"15":1,"70":1,"88":2}}],["tool",{"0":{"39":1},"2":{"1":1,"7":1,"14":1,"24":1,"25":2,"26":2,"29":1,"30":1,"37":4,"38":1,"39":9,"41":3,"50":14,"64":5,"66":3,"68":1,"98":1,"99":1}}],["to",{"2":{"0":1,"6":1,"12":2,"13":1,"14":1,"15":1,"19":1,"29":1,"37":9,"38":1,"42":1,"51":1,"58":1,"70":2,"79":1}}],["h",{"2":{"101":1}}],["há",{"0":{"80":1}}],["haxe",{"2":{"96":3}}],["habilitaram",{"2":{"92":1}}],["hashnuke",{"2":{"76":1,"77":1}}],["halcyon",{"2":{"53":1}}],["hospedados",{"2":{"99":1}}],["host",{"2":{"73":1}}],["houver",{"2":{"57":1,"75":1,"83":1,"97":1}}],["home",{"2":{"19":2,"40":1,"50":1}}],["homebrew",{"0":{"34":1},"2":{"15":1,"18":1,"19":12,"34":2,"49":1,"50":7}}],["hrs",{"2":{"40":1}}],["head",{"2":{"37":1,"49":2}}],["here",{"2":{"15":1,"70":2}}],["helper",{"2":{"18":1}}],["help",{"0":{"87":1},"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"28":1,"29":1,"37":3,"38":1,"42":1,"51":1,"58":1,"79":1,"87":5,"96":3,"98":1}}],["html",{"2":{"8":1}}],["https",{"2":{"1":5,"7":3,"17":1,"18":1,"22":1,"37":2,"52":1,"53":2,"98":1,"100":1,"102":1}}],["highly",{"2":{"18":1}}],["histórico",{"2":{"4":1}}],["hi",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"29":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["wsl",{"2":{"73":1}}],["wsl2",{"0":{"73":1},"2":{"73":3}}],["wsl1",{"0":{"72":1},"2":{"72":2}}],["which",{"2":{"37":1,"68":2}}],["where",{"2":{"37":1,"68":2}}],["warning",{"2":{"24":1}}],["windows",{"2":{"72":1,"73":2}}],["with",{"2":{"4":1,"19":1,"37":3,"65":1,"99":1}}],["will",{"2":{"3":2,"4":3}}],["would",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"29":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["website",{"2":{"4":2}}],["we",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"18":1,"29":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["afaik",{"2":{"97":1}}],["ação",{"2":{"94":1,"95":1,"99":1}}],["ações",{"2":{"13":1,"21":1,"73":1}}],["agir",{"2":{"82":1}}],["agora",{"2":{"23":1,"28":1,"96":1}}],["aqueles",{"2":{"74":1}}],["aqui",{"2":{"1":1,"71":1,"100":1}}],["aessado",{"2":{"68":1}}],["absolutamente",{"2":{"97":1}}],["abreviados",{"0":{"54":1}}],["abreviado",{"0":{"57":1},"2":{"52":2,"57":1}}],["abrange",{"2":{"38":1}}],["abrir",{"2":{"19":1}}],["abaixo",{"2":{"12":1,"19":3,"39":1,"87":1}}],["ainda",{"2":{"19":2,"28":1,"47":1,"93":1}}],["aviso",{"2":{"19":1}}],["armazena",{"2":{"41":1}}],["are",{"2":{"37":1,"70":2}}],["argumento",{"2":{"93":1}}],["argumentos",{"2":{"39":2,"98":2}}],["args",{"2":{"37":1,"44":1}}],["arg",{"2":{"19":6,"50":6}}],["archlinux",{"2":{"18":1}}],["arquivos",{"0":{"27":1},"2":{"8":1,"10":1,"11":2,"27":2,"29":1,"32":1,"38":1,"40":1,"41":2,"50":14,"84":1,"85":1,"88":1,"92":2}}],["arquivo",{"2":{"3":1,"10":1,"14":1,"24":1,"26":1,"27":1,"29":2,"30":1,"39":6,"40":3,"41":2,"64":2,"68":1,"75":1,"84":1,"85":1,"93":3,"96":1,"97":3,"100":1}}],["apareça",{"2":{"83":1}}],["apagar",{"2":{"56":1}}],["apontar",{"2":{"82":1}}],["apenas",{"2":{"55":1,"73":1,"84":2,"85":1,"87":2,"96":2,"97":3,"98":1,"101":1}}],["api",{"0":{"101":1},"2":{"51":1,"99":1,"101":4}}],["após",{"2":{"21":1,"30":1,"40":1}}],["append",{"2":{"19":4}}],["apt",{"2":{"15":1,"21":1,"87":1}}],["aptitude",{"2":{"15":1}}],["aplica",{"2":{"92":1}}],["aplicativos",{"2":{"5":1}}],["aplicado",{"2":{"4":1}}],["ajudar",{"2":{"68":1}}],["ajuda",{"2":{"12":1,"68":1,"87":4}}],["aos",{"2":{"82":1}}],["ao",{"0":{"19":1},"2":{"9":1,"14":1,"19":32,"24":2,"27":1,"33":1,"34":1,"40":1,"46":1,"59":1,"68":1,"69":1,"73":1,"75":1,"80":1,"82":1,"87":4,"88":1,"94":2,"95":1,"96":1,"100":1,"101":1,"102":1}}],["amostra",{"2":{"100":1}}],["ambientes",{"2":{"35":1}}],["ambiente",{"0":{"41":1,"45":1,"82":1},"1":{"83":1,"84":1,"85":1},"2":{"29":1,"33":2,"38":1,"64":2,"68":2,"69":1,"80":1,"82":2,"84":1,"85":1,"87":1,"98":1,"101":1}}],["amannn",{"2":{"4":1}}],["ampliado",{"2":{"29":1}}],["amp",{"0":{"6":1},"1":{"7":1,"8":1,"9":1,"10":1,"11":1},"2":{"3":1,"15":1,"18":4,"19":23,"50":14}}],["acessá",{"2":{"101":1}}],["acesso",{"2":{"82":1,"94":1,"95":1,"101":2}}],["aceleram",{"2":{"2":1}}],["acabei",{"2":{"74":1}}],["achar",{"2":{"50":1}}],["acustomar",{"2":{"28":1}}],["acordo",{"2":{"19":1,"100":1}}],["acompanhar",{"2":{"14":1}}],["acima",{"2":{"11":1,"41":3}}],["actions",{"0":{"13":1},"2":{"99":2}}],["action",{"0":{"99":1},"2":{"4":2}}],["authorization",{"2":{"101":1}}],["autorização",{"2":{"101":1}}],["autores",{"2":{"96":1}}],["autoload",{"2":{"19":1,"50":1}}],["auto",{"2":{"19":15}}],["automatically",{"2":{"15":1,"99":1}}],["automaticamente",{"2":{"4":1,"19":7,"69":1,"74":1}}],["automatizado",{"2":{"9":1}}],["automatizada",{"2":{"4":1}}],["automated",{"2":{"1":1}}],["auxiliar",{"2":{"46":1,"68":1}}],["aumenta",{"2":{"33":1}}],["aumentar",{"2":{"4":1}}],["aur",{"2":{"18":2,"19":1,"41":1,"49":1}}],["além",{"2":{"96":1,"97":1}}],["altamente",{"2":{"98":1}}],["alta",{"2":{"76":1}}],["alternativa",{"2":{"64":1,"83":1}}],["alterações",{"2":{"2":2,"9":1}}],["always",{"2":{"40":1}}],["algo",{"2":{"35":1,"83":1,"98":1,"101":2}}],["alguma",{"2":{"36":1,"50":1}}],["algumas",{"2":{"5":1,"21":2,"47":1,"71":1}}],["algum",{"2":{"30":1,"41":1,"69":1,"94":1}}],["alguns",{"2":{"10":1,"12":1,"21":1,"25":1,"72":1,"80":1}}],["alpine",{"2":{"5":1}}],["all",{"0":{"37":1,"83":1},"2":{"2":1,"23":2,"37":9,"40":1,"54":1,"55":1,"57":1,"62":4,"80":1,"81":1,"82":1,"83":1,"101":2}}],["analisar",{"2":{"93":1}}],["analisador",{"2":{"1":1}}],["an",{"2":{"37":2}}],["anterior",{"2":{"85":1}}],["antes",{"2":{"2":2,"3":1,"8":1,"41":1,"95":1}}],["antiga",{"2":{"29":1}}],["anexar",{"2":{"2":1}}],["análise",{"2":{"1":1}}],["and",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"19":1,"29":1,"37":10,"38":1,"42":1,"51":1,"58":1,"79":1}}],["a",{"0":{"66":1},"2":{"1":2,"2":2,"3":5,"4":8,"7":1,"8":1,"10":6,"11":1,"12":3,"14":2,"15":1,"19":17,"21":1,"23":3,"24":4,"25":1,"27":3,"28":1,"29":2,"32":1,"33":2,"34":2,"35":1,"36":3,"37":16,"38":1,"39":4,"40":3,"41":1,"42":1,"44":1,"47":4,"51":1,"54":1,"57":1,"60":1,"64":6,"65":1,"68":3,"70":2,"72":1,"73":1,"74":3,"80":1,"81":2,"82":1,"83":3,"84":1,"85":7,"87":7,"88":3,"90":1,"92":2,"93":1,"96":2,"98":3,"100":1}}],["adaptar",{"2":{"87":2}}],["adaptados",{"2":{"87":1}}],["adaptadas",{"2":{"87":1}}],["adequadamente",{"2":{"19":1}}],["adequada",{"2":{"19":1,"36":1}}],["adeque",{"2":{"19":1}}],["adição",{"2":{"19":3}}],["adicionado",{"2":{"94":1}}],["adicionais",{"2":{"82":2,"92":1}}],["adicionando",{"0":{"19":1}}],["adicionar",{"0":{"52":1},"2":{"14":1,"19":2,"72":1,"102":1}}],["adicione",{"2":{"1":1,"2":1,"7":1,"19":23,"27":1,"40":1,"52":1,"101":2}}],["add",{"0":{"94":1},"2":{"1":3,"7":1,"22":1,"37":3,"40":1,"52":4,"57":1,"94":4,"102":2}}],["added",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"29":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["aspectos",{"2":{"72":1}}],["assumirá",{"2":{"84":1}}],["associado",{"2":{"12":1}}],["assim",{"2":{"11":1,"25":1,"26":1,"39":1,"40":1}}],["as",{"0":{"15":1,"62":1},"2":{"1":3,"7":2,"10":1,"11":1,"14":1,"19":8,"21":1,"29":2,"35":1,"37":1,"38":1,"39":4,"40":2,"46":1,"49":1,"50":15,"56":1,"57":1,"61":1,"62":1,"70":1,"73":1,"81":1,"83":5,"87":4,"96":6,"102":1}}],["asdfrc",{"0":{"40":1},"2":{"27":1,"38":1,"40":1,"41":1,"50":14,"57":1,"92":1}}],["asdf~",{"2":{"19":6,"50":6}}],["asdf",{"0":{"0":1,"16":1,"36":1,"69":1,"96":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"17":1,"18":1},"2":{"0":1,"1":13,"2":1,"4":1,"5":3,"7":8,"8":1,"9":1,"12":7,"13":1,"14":3,"15":1,"17":3,"18":3,"19":109,"20":1,"21":1,"22":2,"23":3,"24":3,"25":2,"27":3,"28":5,"29":2,"30":2,"32":2,"33":3,"34":1,"35":2,"36":3,"37":43,"38":1,"39":6,"40":8,"41":14,"42":1,"46":1,"47":1,"48":3,"49":6,"50":118,"51":1,"52":3,"53":5,"55":1,"56":1,"57":3,"59":1,"60":2,"61":2,"62":2,"63":2,"64":8,"65":2,"66":3,"67":1,"68":12,"69":2,"70":7,"71":1,"72":1,"74":3,"75":2,"82":7,"84":5,"85":9,"87":6,"88":2,"90":2,"93":2,"94":7,"95":6,"96":11,"97":2,"98":6,"99":3,"100":7,"102":5}}],["atalhos",{"2":{"68":1}}],["atalho",{"2":{"56":1}}],["ativar",{"2":{"27":1}}],["ativado",{"2":{"8":1}}],["até",{"2":{"24":1,"76":1,"96":1}}],["atualmente",{"2":{"73":1}}],["atualize",{"2":{"40":1}}],["atualizações",{"2":{"55":1}}],["atualização",{"2":{"40":1,"49":1,"55":1}}],["atualiza",{"2":{"39":1}}],["atualizar",{"0":{"49":1,"55":1},"2":{"19":1,"40":1,"55":1}}],["atualizará",{"2":{"19":6,"40":1}}],["atualizado",{"2":{"19":3,"57":1}}],["atual",{"0":{"64":1,"66":1},"2":{"23":1,"24":2,"26":1,"33":1,"44":1,"47":1,"64":2,"65":1,"68":1,"73":1,"87":2}}],["através",{"2":{"14":2,"19":16,"20":1,"23":1,"24":1,"25":1,"28":1,"29":1,"35":2,"36":1,"41":1}}],["at",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"29":1,"37":2,"38":1,"42":1,"51":1,"58":1,"79":1}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/@localSearchIndexroot.C13dwPVu.js b/assets/chunks/@localSearchIndexroot.C13dwPVu.js new file mode 100644 index 00000000..2b97693e --- /dev/null +++ b/assets/chunks/@localSearchIndexroot.C13dwPVu.js @@ -0,0 +1 @@ +const e='{"documentCount":131,"nextId":131,"documentIds":{"0":"/contribute/core.html#asdf","1":"/contribute/core.html#initial-setup","2":"/contribute/core.html#development","3":"/contribute/core.html#gitignore","4":"/contribute/core.html#git-blame-ignore-revs","5":"/contribute/core.html#bats-testing","6":"/contribute/core.html#bats-tips","7":"/contribute/core.html#pull-requests-releases-conventional-commits","8":"/contribute/core.html#docker-images","9":"/contribute/documentation.html#docs-site","10":"/contribute/documentation.html#initial-setup","11":"/contribute/documentation.html#development","12":"/contribute/documentation.html#pull-requests-releases-conventional-commits","13":"/contribute/documentation.html#vitepress","14":"/contribute/documentation.html#i18n","15":"/contribute/first-party-plugins.html#first-party-plugins","16":"/contribute/github-actions.html#github-actions","17":"/guide/getting-started.html#getting-started","18":"/guide/getting-started.html#_1-install-dependencies","19":"/guide/getting-started.html#_2-download-asdf","20":"/guide/getting-started.html#official-download","21":"/guide/getting-started.html#community-supported-download-methods","22":"/guide/getting-started.html#_3-install-asdf","23":"/guide/getting-started.html#core-installation-complete","24":"/guide/getting-started.html#_4-install-a-plugin","25":"/guide/getting-started.html#plugin-dependencies","26":"/guide/getting-started.html#install-the-plugin","27":"/guide/getting-started.html#_5-install-a-version","28":"/guide/getting-started.html#_6-set-a-version","29":"/guide/getting-started.html#global","30":"/guide/getting-started.html#local","31":"/guide/getting-started.html#using-existing-tool-version-files","32":"/guide/getting-started.html#guide-complete","33":"/guide/introduction.html#introduction","34":"/guide/introduction.html#how-it-works","35":"/guide/introduction.html#related-projects","36":"/guide/introduction.html#nvm-n-rbenv-etc","37":"/guide/introduction.html#direnv","38":"/guide/introduction.html#homebrew","39":"/guide/introduction.html#nixos","40":"/guide/introduction.html#why-use-asdf","41":"/manage/commands.html#all-commands","42":"/manage/configuration.html#configuration","43":"/manage/configuration.html#tool-versions","44":"/manage/configuration.html#asdfrc","45":"/manage/configuration.html#legacy-version-file","46":"/manage/configuration.html#use-release-candidates","47":"/manage/configuration.html#always-keep-download","48":"/manage/configuration.html#plugin-repository-last-check-duration","49":"/manage/configuration.html#disable-plugin-short-name-repository","50":"/manage/configuration.html#concurrency","51":"/manage/configuration.html#plugin-hooks","52":"/manage/configuration.html#environment-variables","53":"/manage/configuration.html#asdf-config-file","54":"/manage/configuration.html#asdf-default-tool-versions-filename","55":"/manage/configuration.html#asdf-dir","56":"/manage/configuration.html#asdf-data-dir","57":"/manage/configuration.html#asdf-concurrency","58":"/manage/configuration.html#asdf-force-prepend","59":"/manage/configuration.html#full-configuration-example","60":"/manage/configuration.html#internal-configuration","61":"/manage/core.html#core","62":"/manage/core.html#installation-setup","63":"/manage/core.html#exec","64":"/manage/core.html#env","65":"/manage/core.html#info","66":"/manage/core.html#reshim","67":"/manage/core.html#shim-versions","68":"/manage/core.html#update","69":"/manage/core.html#uninstall","70":"/manage/plugins.html#plugins","71":"/manage/plugins.html#add","72":"/manage/plugins.html#list-installed","73":"/manage/plugins.html#list-all-in-short-name-repository","74":"/manage/plugins.html#update","75":"/manage/plugins.html#remove","76":"/manage/plugins.html#syncing-the-asdf-short-name-repository","77":"/manage/versions.html#versions","78":"/manage/versions.html#install-version","79":"/manage/versions.html#install-latest-stable-version","80":"/manage/versions.html#list-installed-versions","81":"/manage/versions.html#list-all-available-versions","82":"/manage/versions.html#show-latest-stable-version","83":"/manage/versions.html#set-current-version","84":"/manage/versions.html#fallback-to-system-version","85":"/manage/versions.html#view-current-version","86":"/manage/versions.html#uninstall-version","87":"/manage/versions.html#shims","88":"/manage/versions.html#by-passing-asdf-shims","89":"/more/community-projects.html#community-projects","90":"/more/faq.html#faq","91":"/more/faq.html#wsl1-support","92":"/more/faq.html#wsl2-support","93":"/more/faq.html#newly-installed-executable-not-running","94":"/more/faq.html#shell-not-detecting-newly-installed-shims","95":"/more/thanks.html#thanks","96":"/more/thanks.html#credits","97":"/more/thanks.html#maintainers","98":"/more/thanks.html#contributors","99":"/plugins/create.html#create-a-plugin","100":"/plugins/create.html#quickstart","101":"/plugins/create.html#golden-rules-for-plugin-scripts","102":"/plugins/create.html#scripts-overview","103":"/plugins/create.html#environment-variables-overview","104":"/plugins/create.html#required-scripts","105":"/plugins/create.html#bin-list-all","106":"/plugins/create.html#bin-download","107":"/plugins/create.html#bin-install","108":"/plugins/create.html#optional-scripts","109":"/plugins/create.html#bin-latest-stable","110":"/plugins/create.html#bin-help-overview","111":"/plugins/create.html#bin-help-deps","112":"/plugins/create.html#bin-help-config","113":"/plugins/create.html#bin-help-links","114":"/plugins/create.html#bin-list-bin-paths","115":"/plugins/create.html#bin-exec-env","116":"/plugins/create.html#bin-exec-path","117":"/plugins/create.html#bin-uninstall","118":"/plugins/create.html#bin-list-legacy-filenames","119":"/plugins/create.html#bin-parse-legacy-file","120":"/plugins/create.html#bin-post-plugin-add","121":"/plugins/create.html#bin-post-plugin-update","122":"/plugins/create.html#bin-pre-plugin-remove","123":"/plugins/create.html#extension-commands-for-asdf-cli","124":"/plugins/create.html#custom-shim-templates","125":"/plugins/create.html#testing","126":"/plugins/create.html#github-action","127":"/plugins/create.html#travisci-config","128":"/plugins/create.html#api-rate-limiting","129":"/plugins/create.html#github-api-token","130":"/plugins/create.html#plugin-shortname-index"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,5],"1":[2,1,94],"2":[1,1,86],"3":[1,2,40],"4":[5,2,60],"5":[2,1,21],"6":[2,3,54],"7":[6,1,102],"8":[2,1,33],"9":[3,1,6],"10":[2,3,59],"11":[1,3,83],"12":[6,3,39],"13":[1,3,61],"14":[1,3,97],"15":[3,1,61],"16":[2,1,18],"17":[2,1,29],"18":[3,2,59],"19":[3,2,1],"20":[2,5,14],"21":[4,5,32],"22":[3,2,257],"23":[4,2,30],"24":[4,2,16],"25":[2,6,48],"26":[3,6,11],"27":[4,2,47],"28":[4,2,48],"29":[1,6,54],"30":[1,6,36],"31":[5,6,51],"32":[3,2,51],"33":[1,1,75],"34":[3,1,48],"35":[2,1,1],"36":[4,3,55],"37":[1,3,38],"38":[1,3,41],"39":[1,3,60],"40":[4,1,57],"41":[2,1,147],"42":[1,1,21],"43":[3,1,125],"44":[2,1,55],"45":[3,2,35],"46":[3,2,21],"47":[3,2,23],"48":[5,2,80],"49":[5,2,75],"50":[1,2,41],"51":[2,2,73],"52":[2,1,44],"53":[3,3,31],"54":[5,3,38],"55":[2,3,33],"56":[3,3,41],"57":[2,3,28],"58":[3,3,46],"59":[3,1,84],"60":[2,1,51],"61":[1,1,14],"62":[3,1,7],"63":[1,1,13],"64":[1,1,6],"65":[1,1,22],"66":[1,1,62],"67":[2,1,45],"68":[1,1,53],"69":[1,1,141],"70":[1,1,25],"71":[1,1,39],"72":[2,1,14],"73":[6,1,16],"74":[1,1,40],"75":[1,1,30],"76":[6,1,70],"77":[1,1,1],"78":[2,1,44],"79":[4,1,19],"80":[3,1,19],"81":[4,1,20],"82":[4,1,18],"83":[3,1,78],"84":[4,1,38],"85":[3,1,20],"86":[2,1,10],"87":[1,1,112],"88":[4,2,36],"89":[2,1,49],"90":[1,1,8],"91":[3,1,25],"92":[3,1,54],"93":[6,1,50],"94":[7,1,47],"95":[1,1,10],"96":[1,1,16],"97":[1,1,6],"98":[1,1,9],"99":[3,1,35],"100":[1,3,49],"101":[5,4,30],"102":[2,3,99],"103":[3,3,87],"104":[2,3,1],"105":[3,5,127],"106":[2,5,125],"107":[2,5,148],"108":[2,3,1],"109":[3,5,137],"110":[3,5,110],"111":[3,5,93],"112":[3,5,100],"113":[3,5,102],"114":[3,5,94],"115":[3,5,73],"116":[3,5,105],"117":[2,5,73],"118":[4,5,84],"119":[4,5,104],"120":[4,5,56],"121":[4,5,54],"122":[4,5,46],"123":[5,3,122],"124":[3,3,64],"125":[1,3,88],"126":[2,4,51],"127":[2,4,54],"128":[3,3,56],"129":[3,6,34],"130":[3,3,47]},"averageFieldLength":[2.633587786259542,2.4122137404580157,52.70992366412214],"storedFields":{"0":{"title":"asdf","titles":[]},"1":{"title":"Initial Setup","titles":["asdf"]},"2":{"title":"Development","titles":["asdf"]},"3":{"title":"Gitignore","titles":["asdf","Development"]},"4":{"title":".git-blame-ignore-revs","titles":["asdf","Development"]},"5":{"title":"Bats Testing","titles":["asdf"]},"6":{"title":"Bats Tips","titles":["asdf","Bats Testing"]},"7":{"title":"Pull Requests, Releases & Conventional Commits","titles":["asdf"]},"8":{"title":"Docker Images","titles":["asdf"]},"9":{"title":"Docs & Site","titles":[]},"10":{"title":"Initial Setup","titles":["Docs & Site"]},"11":{"title":"Development","titles":["Docs & Site"]},"12":{"title":"Pull Requests, Releases & Conventional Commits","titles":["Docs & Site"]},"13":{"title":"Vitepress","titles":["Docs & Site"]},"14":{"title":"I18n","titles":["Docs & Site"]},"15":{"title":"First-Party Plugins","titles":[]},"16":{"title":"GitHub Actions","titles":[]},"17":{"title":"Getting Started","titles":[]},"18":{"title":"1. Install Dependencies","titles":["Getting Started"]},"19":{"title":"2. Download asdf","titles":["Getting Started"]},"20":{"title":"Official Download","titles":["Getting Started","2. Download asdf"]},"21":{"title":"Community Supported Download Methods","titles":["Getting Started","2. Download asdf"]},"22":{"title":"3. Install asdf","titles":["Getting Started"]},"23":{"title":"Core Installation Complete!","titles":["Getting Started"]},"24":{"title":"4. Install a Plugin","titles":["Getting Started"]},"25":{"title":"Plugin Dependencies","titles":["Getting Started","4. Install a Plugin"]},"26":{"title":"Install the Plugin","titles":["Getting Started","4. Install a Plugin"]},"27":{"title":"5. Install a Version","titles":["Getting Started"]},"28":{"title":"6. Set a Version","titles":["Getting Started"]},"29":{"title":"Global","titles":["Getting Started","6. Set a Version"]},"30":{"title":"Local","titles":["Getting Started","6. Set a Version"]},"31":{"title":"Using Existing Tool Version Files","titles":["Getting Started","6. Set a Version"]},"32":{"title":"Guide Complete!","titles":["Getting Started"]},"33":{"title":"Introduction","titles":[]},"34":{"title":"How It Works","titles":["Introduction"]},"35":{"title":"Related Projects","titles":["Introduction"]},"36":{"title":"nvm / n / rbenv etc","titles":["Introduction","Related Projects"]},"37":{"title":"direnv","titles":["Introduction","Related Projects"]},"38":{"title":"Homebrew","titles":["Introduction","Related Projects"]},"39":{"title":"NixOS","titles":["Introduction","Related Projects"]},"40":{"title":"Why use asdf?","titles":["Introduction"]},"41":{"title":"All Commands","titles":[]},"42":{"title":"Configuration","titles":[]},"43":{"title":".tool-versions","titles":["Configuration"]},"44":{"title":".asdfrc","titles":["Configuration"]},"45":{"title":"legacy_version_file","titles":["Configuration",".asdfrc"]},"46":{"title":"use_release_candidates","titles":["Configuration",".asdfrc"]},"47":{"title":"always_keep_download","titles":["Configuration",".asdfrc"]},"48":{"title":"plugin_repository_last_check_duration","titles":["Configuration",".asdfrc"]},"49":{"title":"disable_plugin_short_name_repository","titles":["Configuration",".asdfrc"]},"50":{"title":"concurrency","titles":["Configuration",".asdfrc"]},"51":{"title":"Plugin Hooks","titles":["Configuration",".asdfrc"]},"52":{"title":"Environment Variables","titles":["Configuration"]},"53":{"title":"ASDF_CONFIG_FILE","titles":["Configuration","Environment Variables"]},"54":{"title":"ASDF_DEFAULT_TOOL_VERSIONS_FILENAME","titles":["Configuration","Environment Variables"]},"55":{"title":"ASDF_DIR","titles":["Configuration","Environment Variables"]},"56":{"title":"ASDF_DATA_DIR","titles":["Configuration","Environment Variables"]},"57":{"title":"ASDF_CONCURRENCY","titles":["Configuration","Environment Variables"]},"58":{"title":"ASDF_FORCE_PREPEND","titles":["Configuration","Environment Variables"]},"59":{"title":"Full Configuration Example","titles":["Configuration"]},"60":{"title":"Internal Configuration","titles":["Configuration"]},"61":{"title":"Core","titles":[]},"62":{"title":"Installation & Setup","titles":["Core"]},"63":{"title":"Exec","titles":["Core"]},"64":{"title":"Env","titles":["Core"]},"65":{"title":"Info","titles":["Core"]},"66":{"title":"Reshim","titles":["Core"]},"67":{"title":"Shim-versions","titles":["Core"]},"68":{"title":"Update","titles":["Core"]},"69":{"title":"Uninstall","titles":["Core"]},"70":{"title":"Plugins","titles":[]},"71":{"title":"Add","titles":["Plugins"]},"72":{"title":"List Installed","titles":["Plugins"]},"73":{"title":"List All in Short-name Repository","titles":["Plugins"]},"74":{"title":"Update","titles":["Plugins"]},"75":{"title":"Remove","titles":["Plugins"]},"76":{"title":"Syncing the asdf Short-name Repository","titles":["Plugins"]},"77":{"title":"Versions","titles":[]},"78":{"title":"Install Version","titles":["Versions"]},"79":{"title":"Install Latest Stable Version","titles":["Versions"]},"80":{"title":"List Installed Versions","titles":["Versions"]},"81":{"title":"List All Available Versions","titles":["Versions"]},"82":{"title":"Show Latest Stable Version","titles":["Versions"]},"83":{"title":"Set Current Version","titles":["Versions"]},"84":{"title":"Fallback to System Version","titles":["Versions"]},"85":{"title":"View Current Version","titles":["Versions"]},"86":{"title":"Uninstall Version","titles":["Versions"]},"87":{"title":"Shims","titles":["Versions"]},"88":{"title":"By-passing asdf shims","titles":["Versions","Shims"]},"89":{"title":"Community Projects","titles":[]},"90":{"title":"FAQ","titles":[]},"91":{"title":"WSL1 support?","titles":["FAQ"]},"92":{"title":"WSL2 support?","titles":["FAQ"]},"93":{"title":"Newly installed executable not running?","titles":["FAQ"]},"94":{"title":"Shell not detecting newly installed shims?","titles":["FAQ"]},"95":{"title":"Thanks","titles":[]},"96":{"title":"Credits","titles":["Thanks"]},"97":{"title":"Maintainers","titles":["Thanks"]},"98":{"title":"Contributors","titles":["Thanks"]},"99":{"title":"Create a Plugin","titles":[]},"100":{"title":"Quickstart","titles":["Create a Plugin"]},"101":{"title":"Golden Rules for Plugin Scripts","titles":["Create a Plugin","Quickstart"]},"102":{"title":"Scripts Overview","titles":["Create a Plugin"]},"103":{"title":"Environment Variables Overview","titles":["Create a Plugin"]},"104":{"title":"Required Scripts","titles":["Create a Plugin"]},"105":{"title":"bin/list-all","titles":["Create a Plugin","Required Scripts"]},"106":{"title":"bin/download","titles":["Create a Plugin","Required Scripts"]},"107":{"title":"bin/install","titles":["Create a Plugin","Required Scripts"]},"108":{"title":"Optional Scripts","titles":["Create a Plugin"]},"109":{"title":"bin/latest-stable","titles":["Create a Plugin","Optional Scripts"]},"110":{"title":"bin/help.overview","titles":["Create a Plugin","Optional Scripts"]},"111":{"title":"bin/help.deps","titles":["Create a Plugin","Optional Scripts"]},"112":{"title":"bin/help.config","titles":["Create a Plugin","Optional Scripts"]},"113":{"title":"bin/help.links","titles":["Create a Plugin","Optional Scripts"]},"114":{"title":"bin/list-bin-paths","titles":["Create a Plugin","Optional Scripts"]},"115":{"title":"bin/exec-env","titles":["Create a Plugin","Optional Scripts"]},"116":{"title":"bin/exec-path","titles":["Create a Plugin","Optional Scripts"]},"117":{"title":"bin/uninstall","titles":["Create a Plugin","Optional Scripts"]},"118":{"title":"bin/list-legacy-filenames","titles":["Create a Plugin","Optional Scripts"]},"119":{"title":"bin/parse-legacy-file","titles":["Create a Plugin","Optional Scripts"]},"120":{"title":"bin/post-plugin-add","titles":["Create a Plugin","Optional Scripts"]},"121":{"title":"bin/post-plugin-update","titles":["Create a Plugin","Optional Scripts"]},"122":{"title":"bin/pre-plugin-remove","titles":["Create a Plugin","Optional Scripts"]},"123":{"title":"Extension Commands for asdf CLI","titles":["Create a Plugin"]},"124":{"title":"Custom Shim Templates","titles":["Create a Plugin"]},"125":{"title":"Testing","titles":["Create a Plugin"]},"126":{"title":"GitHub Action","titles":["Create a Plugin","Testing"]},"127":{"title":"TravisCI Config","titles":["Create a Plugin","Testing"]},"128":{"title":"API Rate Limiting","titles":["Create a Plugin"]},"129":{"title":"GITHUB_API_TOKEN","titles":["Create a Plugin","API Rate Limiting"]},"130":{"title":"Plugin Shortname Index","titles":["Create a Plugin"]}},"dirtCount":0,"index":[["\\thttps",{"2":{"113":2}}],["🙏",{"2":{"98":1}}],["916",{"2":{"74":1}}],["999999999",{"2":{"48":1}}],["kim",{"2":{"85":3}}],["knows",{"2":{"70":1}}],["keep",{"0":{"47":1},"2":{"38":1,"44":1,"47":2,"59":1,"101":1}}],["keyword",{"2":{"43":1}}],["keys",{"2":{"14":1}}],["keyrings",{"2":{"3":1}}],["8",{"2":{"67":2,"107":1,"109":1}}],["8837",{"2":{"22":2}}],["query",{"2":{"109":2}}],["questions",{"2":{"90":1}}],["quickstart",{"0":{"100":1},"1":{"101":1}}],["quicly",{"2":{"11":1}}],["quality",{"2":{"89":1}}],["quot",{"2":{"58":2,"106":2,"114":8,"118":2}}],["7",{"2":{"43":4,"107":1,"109":1}}],["`$asdf",{"2":{"123":5}}],["`env`",{"2":{"41":1}}],["`asdf",{"2":{"41":1}}],["000",{"2":{"39":1}}],["0",{"2":{"29":1,"30":1,"43":4,"48":1,"67":4,"83":2,"105":4,"106":5,"107":7,"109":1,"110":1,"111":1,"112":1,"113":1,"116":1,"117":2}}],["60",{"2":{"39":1,"44":1,"48":1,"59":1,"76":1}}],["6",{"0":{"28":1},"1":{"29":1,"30":1,"31":1},"2":{"85":1}}],["4",{"0":{"24":1},"1":{"25":1,"26":1},"2":{"83":3,"105":1}}],["🎉",{"2":{"23":1,"32":1,"69":1}}],["+",{"2":{"22":2}}],["|",{"2":{"22":11}}],["yml",{"2":{"127":1}}],["yamllanguage",{"2":{"127":1}}],["yamlname",{"2":{"126":1}}],["yaml",{"2":{"126":1}}],["yarn",{"2":{"66":3,"93":3}}],["yes",{"2":{"31":1,"45":1,"46":1,"47":1,"49":1,"58":3,"76":1}}],["yet",{"2":{"22":2,"66":1}}],["yum",{"2":{"25":1}}],["you",{"2":{"1":2,"2":5,"6":1,"8":1,"17":1,"22":6,"23":1,"28":3,"29":2,"32":2,"33":1,"34":1,"40":2,"43":1,"54":2,"68":2,"69":1,"74":1,"78":2,"83":2,"84":1,"88":1,"92":1,"93":1,"94":2,"95":1,"127":1,"130":1}}],["your",{"2":{"1":3,"2":4,"3":2,"7":1,"8":2,"10":1,"16":1,"18":2,"21":1,"22":21,"28":1,"30":2,"31":1,"32":2,"33":2,"34":1,"36":1,"38":1,"40":1,"52":2,"68":1,"69":24,"76":2,"88":2,"94":4,"100":2,"101":1,"123":2,"125":2,"126":1,"127":1,"129":3,"130":1}}],["=s",{"2":{"69":2}}],["=",{"2":{"22":9,"31":1,"44":6,"51":1,"69":6,"105":1}}],["$releases",{"2":{"128":1}}],["$relative",{"2":{"116":1}}],["$github",{"2":{"128":2}}],["$travis",{"2":{"127":1}}],["$file",{"2":{"119":1}}],["$fpath",{"2":{"22":1,"69":1}}],["$cmd",{"2":{"116":1,"128":2}}],["$install",{"2":{"116":1}}],["$query",{"2":{"109":1}}],["$e",{"2":{"69":4}}],["$env",{"2":{"22":2}}],["$1",{"2":{"51":2}}],["$pwd",{"2":{"30":2,"83":1}}],["$path",{"2":{"22":1,"33":1,"87":1,"94":1}}],["$nu",{"2":{"22":3}}],["$",{"2":{"22":16,"41":1,"44":1,"51":1,"69":17,"83":2,"87":4,"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":5,"115":1,"116":1,"117":1,"118":2,"119":1,"120":3,"121":3,"122":3,"123":4,"126":1}}],["$home",{"2":{"22":8,"28":1,"29":2,"31":1,"43":1,"53":1,"56":1,"59":7,"69":49,"83":1}}],["$asdf",{"2":{"2":1,"49":1,"60":1,"69":2,"87":1,"107":1,"123":1}}],["~",{"2":{"20":1,"22":49,"43":1,"69":23,"87":1,"116":2}}],["22",{"2":{"109":1}}],["2014",{"2":{"96":1}}],["2",{"0":{"19":1},"1":{"20":1,"21":1},"2":{"43":7,"83":1,"92":1,"105":1,"109":4,"119":1}}],["zero",{"2":{"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1}}],["zdotdir",{"2":{"22":1}}],["zshrc",{"2":{"22":5,"69":4,"94":1}}],["zsh",{"2":{"22":25,"69":6,"94":1}}],["zypper",{"2":{"18":2}}],["zh",{"2":{"14":4}}],["18",{"2":{"105":3,"106":2,"107":2,"117":2}}],["11",{"2":{"85":1}}],["17",{"2":{"67":2,"78":1,"79":1,"80":1,"81":1,"82":1,"85":2,"86":1}}],["15",{"2":{"43":5,"117":2}}],["10",{"2":{"43":3}}],["16",{"2":{"29":1,"30":1,"67":2}}],["14",{"2":{"20":1,"27":1,"67":4}}],["1",{"0":{"18":1},"2":{"20":1,"48":1,"50":1,"83":2,"91":1,"105":4,"109":1,"116":1}}],["└─",{"2":{"14":4}}],["│",{"2":{"14":1}}],["├─",{"2":{"14":5}}],["简体中文",{"2":{"14":1}}],["5",{"0":{"27":1},"2":{"11":1,"29":1,"30":1,"43":2,"67":2,"85":1}}],["jruby",{"2":{"109":1}}],["j",{"2":{"103":1,"107":1}}],["jthegedus",{"2":{"97":1}}],["java",{"2":{"72":3}}],["javascript",{"2":{"10":2,"11":1,"119":1}}],["jobs",{"2":{"126":1}}],["john",{"2":{"53":1,"55":1,"56":1}}],["join",{"2":{"22":4,"69":2}}],["just",{"2":{"27":1,"28":1,"40":1,"74":1,"83":1,"93":1,"113":1,"123":1}}],["js",{"2":{"10":2,"11":1,"13":5,"14":3,"15":1,"24":1,"27":1,"67":1,"70":1,"106":1,"107":1}}],["json",{"2":{"4":2,"10":1,"11":2,"119":1}}],[">>",{"2":{"22":15}}],[">",{"2":{"6":1,"7":1,"109":3}}],["39cb398vb39",{"2":{"43":1}}],["3",{"0":{"22":1},"2":{"6":2,"11":1,"43":4,"67":2,"78":1,"85":2,"86":1,"105":1,"109":2,"119":1}}],["empty",{"2":{"59":5}}],["earlier",{"2":{"107":1}}],["early",{"2":{"49":1,"76":1}}],["each",{"2":{"14":1,"15":1,"17":1,"25":1,"32":1,"33":1,"34":1,"39":1,"48":1,"102":1,"103":1,"105":3}}],["even",{"2":{"123":1}}],["eventually",{"2":{"106":1}}],["event",{"2":{"48":2}}],["events",{"2":{"48":2,"49":3,"76":1}}],["everyone",{"2":{"33":1}}],["every",{"2":{"4":1,"87":1}}],["eg",{"2":{"31":1}}],["error",{"2":{"28":1}}],["erlang",{"2":{"15":1,"71":1,"74":1,"75":1,"78":1,"79":2,"80":2,"81":2,"82":2,"85":3,"86":1}}],["effect",{"2":{"22":1}}],["effort",{"2":{"8":1}}],["either",{"2":{"22":2,"84":1,"105":1,"113":1}}],["edit",{"2":{"22":3,"43":1,"69":3}}],["echo",{"2":{"22":7,"51":1}}],["elm",{"2":{"71":2}}],["else",{"2":{"50":1,"56":1,"69":2,"107":1}}],["elapsed",{"2":{"48":1}}],["elv",{"2":{"22":18,"69":6}}],["elvish",{"2":{"22":18,"52":1,"69":9}}],["elixir",{"2":{"15":1,"43":1,"70":1,"83":4,"124":2}}],["etc",{"0":{"36":1},"2":{"22":3,"33":1,"52":1,"69":2,"70":1,"87":1,"94":2,"99":1}}],["e",{"2":{"22":9,"33":1}}],["encompasses",{"2":{"42":1}}],["env",{"0":{"64":1,"115":1},"2":{"41":1,"64":1,"87":1,"102":1,"103":1,"115":3,"116":2}}],["environments",{"2":{"39":1,"125":1}}],["environment",{"0":{"52":1,"103":1},"1":{"53":1,"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"33":1,"37":2,"41":1,"42":1,"44":1,"50":1,"52":2,"59":1,"83":2,"87":2,"88":1,"102":1,"103":3,"105":2,"106":1,"107":2,"109":1,"110":2,"111":2,"112":3,"113":2,"114":1,"115":3,"116":2,"117":2,"118":1,"119":2,"120":1,"121":1,"122":1,"128":1,"129":1}}],["entering",{"2":{"88":1}}],["entire",{"2":{"39":1,"73":1}}],["entries",{"2":{"22":1}}],["entry",{"2":{"22":1}}],["ensuring",{"2":{"33":1}}],["ensures",{"2":{"40":1}}],["ensure",{"2":{"22":2,"60":1,"107":1,"128":1}}],["enforces",{"2":{"27":1}}],["enforced",{"2":{"7":1}}],["end",{"2":{"22":1,"96":1}}],["en",{"2":{"14":3}}],["english",{"2":{"14":1}}],["engine",{"2":{"10":1}}],["enabled",{"2":{"11":1,"118":1}}],["enable",{"2":{"6":1,"31":1}}],["exists",{"2":{"56":1,"59":1,"66":1}}],["existing",{"0":{"31":1},"2":{"5":2,"16":1,"31":1,"37":1}}],["exit",{"2":{"49":1,"106":2,"107":2,"109":2,"110":2,"111":2,"112":2,"113":2}}],["exceeded",{"2":{"48":1}}],["exec",{"0":{"63":1,"115":1,"116":1},"2":{"41":1,"63":1,"87":6,"102":2,"115":2,"116":4}}],["executing",{"2":{"51":1,"83":1,"115":1}}],["execution",{"2":{"6":1,"27":1,"28":1,"41":1,"115":1,"116":1,"117":1,"123":1}}],["executable",{"0":{"93":1},"2":{"41":1,"51":1,"55":1,"66":1,"87":4,"99":1,"102":1,"115":1,"116":8,"123":3,"124":3}}],["executables",{"2":{"34":2,"36":1,"66":2,"67":1,"93":2,"114":2,"123":2}}],["executed",{"2":{"48":1,"49":1,"51":1,"87":1,"123":1}}],["executes",{"2":{"41":1,"63":1,"87":1,"115":1,"116":1}}],["execute",{"2":{"5":1,"28":2,"30":1,"34":1,"51":2,"87":1,"93":1,"102":3,"120":1,"121":1,"122":1,"123":1,"125":1}}],["external",{"2":{"128":1}}],["extensions",{"2":{"123":1}}],["extension",{"0":{"123":1},"2":{"123":1}}],["extended",{"2":{"33":1}}],["extract",{"2":{"119":1}}],["extracted",{"2":{"13":1}}],["exact",{"2":{"27":1,"33":1,"39":1,"40":1,"119":1,"130":1}}],["examples",{"2":{"7":1}}],["example",{"0":{"59":1},"2":{"4":1,"6":1,"29":1,"43":1,"45":1,"51":1,"66":1,"67":1,"83":1,"101":1,"105":1,"112":1,"114":1,"116":1,"123":2,"125":1,"128":1}}],["experience",{"2":{"128":1}}],["expect",{"2":{"123":1}}],["expected",{"2":{"92":1}}],["expand",{"2":{"22":1}}],["export",{"2":{"14":1,"53":1,"54":1,"55":1,"56":1,"57":1}}],["exported",{"2":{"14":1}}],["exhaustive",{"2":{"18":1}}],["mod",{"2":{"119":1}}],["module",{"2":{"69":6}}],["most",{"2":{"58":1,"94":1}}],["more",{"2":{"3":1,"4":1,"14":1,"31":1,"32":1,"37":1,"38":1,"39":1,"48":1,"70":1,"76":2,"88":1}}],["multiple",{"2":{"33":1,"43":1}}],["must",{"2":{"7":1,"14":1,"22":4,"53":1,"55":1,"56":1,"105":1,"106":2,"110":1,"113":1,"114":1,"116":2,"124":1}}],["my",{"2":{"22":5,"94":1,"126":1,"127":2}}],["mitigate",{"2":{"128":1}}],["mit",{"2":{"96":1}}],["mix",{"2":{"83":1}}],["missing",{"2":{"38":1}}],["migration",{"2":{"31":1}}],["might",{"2":{"18":1}}],["minutes",{"2":{"48":2,"76":1}}],["minimal",{"2":{"11":1}}],["minor",{"2":{"7":1}}],["md",{"2":{"14":6}}],["me",{"2":{"96":1}}],["meant",{"2":{"87":1}}],["means",{"2":{"87":1}}],["mean",{"2":{"40":1}}],["method",{"2":{"21":2,"52":1,"60":1,"68":4,"71":1,"76":1,"105":1,"130":1}}],["methods",{"0":{"21":1},"2":{"22":1}}],["menu",{"2":{"14":1}}],["message",{"2":{"7":2}}],["messages",{"2":{"7":1}}],["matrix",{"2":{"126":2}}],["matching",{"2":{"105":1}}],["matches",{"2":{"22":1}}],["marked",{"2":{"106":1}}],["markdown",{"2":{"11":1,"14":2}}],["main",{"2":{"87":1,"126":1}}],["maintainers",{"0":{"97":1}}],["maintaining",{"2":{"15":1}}],["maintenance",{"2":{"15":1,"89":1}}],["made",{"2":{"75":1,"87":1}}],["master",{"2":{"41":1,"68":1}}],["macos",{"2":{"18":2,"22":7,"25":1,"38":1,"58":1,"69":3,"125":1,"126":1}}],["machine",{"2":{"1":1,"44":1,"76":1,"119":1}}],["makes",{"2":{"124":1}}],["makepkg",{"2":{"21":1}}],["make",{"2":{"12":1,"103":1,"107":1}}],["making",{"2":{"2":1,"65":1}}],["major",{"2":{"7":1}}],["man",{"2":{"123":3}}],["manipulated",{"2":{"87":1}}],["manipulation",{"2":{"33":1}}],["managing",{"2":{"39":1}}],["management",{"2":{"29":1,"36":1,"39":1}}],["manages",{"2":{"28":1,"38":1}}],["managers",{"2":{"31":1,"33":1,"45":1,"60":2}}],["manager",{"2":{"18":2,"33":1,"36":2,"38":2,"39":1,"40":2,"69":9}}],["managed",{"2":{"10":1,"29":2,"43":1,"49":1,"84":1,"89":1,"93":1,"109":1,"110":1}}],["manage",{"2":{"1":2,"17":1,"23":1,"32":1,"34":1,"37":1,"38":1,"39":1,"40":1,"41":1,"93":1}}],["manpath",{"2":{"22":1}}],["many",{"2":{"22":1,"32":1,"39":1,"40":1,"61":1,"67":1,"75":1,"109":1}}],["manually",{"2":{"4":1,"22":2}}],["may",{"2":{"1":2,"18":1,"22":2,"69":3,"91":1,"109":1,"110":1,"119":1,"127":1,"128":1}}],["x",{"2":{"76":2}}],["x26",{"2":{"2":1,"6":1,"22":2,"69":2}}],["x3c",{"2":{"1":1,"7":3,"10":1,"41":38,"63":1,"64":1,"66":2,"67":1,"71":3,"74":1,"75":1,"78":2,"79":3,"80":3,"81":3,"82":3,"83":13,"84":1,"85":1,"86":2,"116":3,"125":6,"126":1,"127":5,"130":2}}],["piping",{"2":{"105":1}}],["pipeline",{"2":{"12":1,"129":1}}],["pkgbuild",{"2":{"68":1}}],["python",{"2":{"29":1,"43":4,"84":1}}],["ps1",{"2":{"22":7}}],["p",{"2":{"22":4}}],["personal",{"2":{"129":1}}],["periodically",{"2":{"76":1}}],["per",{"2":{"22":3,"31":1,"36":2,"69":2,"102":1,"111":1,"113":2}}],["performs",{"2":{"28":1}}],["perf",{"2":{"7":1}}],["potentially",{"2":{"105":1}}],["portable",{"2":{"101":1,"105":1}}],["portuguese",{"2":{"14":1}}],["powershell",{"2":{"22":7}}],["popular",{"2":{"15":1}}],["post",{"0":{"120":1,"121":1},"2":{"25":1,"51":3,"102":2,"103":1,"120":3,"121":4,"122":2}}],["possible",{"2":{"4":1,"11":1,"51":1,"123":1,"124":1}}],["posix",{"2":{"1":1,"22":3}}],["pt",{"2":{"14":6}}],["pruning",{"2":{"75":1}}],["presence",{"2":{"107":1}}],["present",{"2":{"43":1,"60":1,"106":1,"114":1,"119":1}}],["predate",{"2":{"106":1}}],["previous",{"2":{"121":1}}],["previously",{"2":{"49":1}}],["prevous",{"2":{"103":1}}],["prev",{"2":{"103":1,"121":1}}],["prepare",{"2":{"102":1,"115":1}}],["prepend=no",{"2":{"58":1}}],["prepend",{"0":{"58":1},"2":{"2":1,"22":1,"58":1}}],["pre",{"0":{"122":1},"2":{"51":5,"102":1,"120":2,"121":2,"122":3}}],["precedence",{"2":{"50":1,"57":1}}],["prefer",{"2":{"71":1}}],["preferred",{"2":{"21":1,"68":1}}],["prefix",{"2":{"22":12,"69":6}}],["priority",{"2":{"22":1,"58":1}}],["primarily",{"2":{"18":1}}],["printing",{"2":{"6":1}}],["printed",{"2":{"6":2,"110":1}}],["printf",{"2":{"6":2}}],["print",{"2":{"6":1,"41":2,"65":1,"105":2,"109":1,"110":1,"116":2}}],["pr",{"2":{"12":3,"14":1}}],["providing",{"2":{"123":1}}],["providers",{"2":{"109":1}}],["provider",{"2":{"109":2}}],["provided",{"2":{"41":2,"87":1,"105":3,"106":1,"107":1,"109":2,"117":3,"118":1,"120":1,"121":1,"122":1,"130":1}}],["provides",{"2":{"33":1,"51":1,"123":1,"126":1,"128":1}}],["provide",{"2":{"8":1,"41":1,"67":1,"123":1}}],["programs",{"2":{"87":1}}],["program",{"2":{"87":2}}],["programming",{"2":{"39":1}}],["proc",{"2":{"50":1}}],["properly",{"2":{"22":2,"91":1,"92":1}}],["profile",{"2":{"22":14,"69":3,"94":1}}],["production",{"2":{"8":1}}],["projects",{"0":{"35":1,"89":1},"1":{"36":1,"37":1,"38":1,"39":1},"2":{"8":1,"89":2}}],["project",{"2":{"3":1,"15":1,"17":1,"30":1,"32":2,"33":1,"83":1,"85":1,"88":1,"89":1}}],["publish",{"2":{"129":1}}],["public",{"2":{"129":1}}],["purposes",{"2":{"24":1}}],["pulled",{"2":{"105":1}}],["pull",{"0":{"7":1,"12":1},"2":{"2":1,"7":4,"125":1,"126":1}}],["pushing",{"2":{"105":1}}],["push",{"2":{"2":1,"126":1}}],["places",{"2":{"106":1,"107":1}}],["placed",{"2":{"22":1,"106":2}}],["please",{"2":{"2":1,"5":1,"7":1,"12":1,"16":1,"69":1,"124":1}}],["plugin",{"0":{"24":1,"25":1,"26":1,"48":1,"49":1,"51":1,"99":1,"101":1,"120":1,"121":1,"122":1,"130":1},"1":{"25":1,"26":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1},"2":{"1":3,"10":1,"15":1,"17":1,"22":7,"23":1,"24":1,"25":2,"26":1,"27":1,"31":1,"33":1,"34":1,"36":1,"37":1,"40":2,"41":12,"44":2,"45":1,"48":7,"49":12,"51":11,"59":2,"66":1,"69":1,"70":1,"71":4,"72":4,"73":1,"74":4,"75":4,"76":4,"78":1,"87":5,"88":1,"99":1,"100":3,"102":9,"103":8,"105":1,"106":1,"107":1,"109":3,"110":4,"111":2,"112":3,"113":3,"114":1,"115":1,"116":3,"117":1,"118":1,"119":1,"120":14,"121":16,"122":12,"123":4,"124":2,"125":18,"126":4,"127":3,"130":4}}],["plugins",{"0":{"15":1,"70":1},"1":{"71":1,"72":1,"73":1,"74":1,"75":1,"76":1},"2":{"1":1,"3":1,"10":1,"15":6,"25":1,"32":1,"34":1,"41":6,"43":1,"45":1,"49":2,"56":1,"66":1,"67":1,"70":2,"71":2,"73":2,"74":1,"89":1,"93":1,"106":5,"107":1,"116":1,"123":8,"126":1}}],["page",{"2":{"31":1,"95":1,"105":1}}],["passing",{"0":{"88":1},"2":{"87":1}}],["passthrough",{"2":{"43":1}}],["pass",{"2":{"29":1,"88":1,"127":1}}],["pacman",{"2":{"18":2,"21":1,"22":7,"60":1,"68":1,"69":4}}],["packages",{"2":{"38":1,"39":2,"41":3}}],["package",{"2":{"10":1,"11":1,"18":2,"22":1,"38":2,"39":3,"40":1,"41":15,"60":2,"66":1,"69":9,"74":1,"87":8,"119":1}}],["parsing",{"2":{"119":1}}],["parse",{"0":{"119":1},"2":{"102":1,"119":2}}],["parser",{"2":{"1":1,"102":1}}],["parameter",{"2":{"125":1}}],["parameters",{"2":{"105":1,"106":1,"107":1,"117":1,"118":1,"120":1,"121":1,"122":1}}],["paragraph",{"2":{"110":1}}],["parent",{"2":{"55":1,"59":1}}],["part",{"2":{"58":1}}],["particular",{"2":{"34":1,"41":1,"60":1,"83":1}}],["party",{"0":{"15":1},"2":{"124":1}}],["patterns",{"2":{"51":1}}],["patch",{"2":{"7":1}}],["path>",{"2":{"116":2,"127":1}}],["paths",{"0":{"114":1},"2":{"2":1,"102":2,"107":1,"114":3}}],["path",{"0":{"116":1},"2":{"2":2,"22":13,"41":2,"43":2,"53":2,"55":1,"56":1,"58":5,"87":6,"102":2,"103":7,"105":1,"106":9,"107":11,"109":3,"110":3,"111":3,"112":3,"113":3,"114":8,"115":4,"116":17,"117":1,"118":3,"119":3,"120":4,"121":3,"122":3,"123":1,"127":1,"128":2}}],["utilise",{"2":{"129":1}}],["utilities",{"2":{"123":1}}],["utility",{"2":{"22":1}}],["util",{"2":{"41":2,"64":1,"115":2,"116":2}}],["utils",{"2":{"41":1}}],["uz",{"2":{"22":1,"69":1}}],["undesirable",{"2":{"109":1}}],["under",{"2":{"14":2,"83":1}}],["unavoidable",{"2":{"105":1}}],["unused",{"2":{"75":1}}],["unset",{"2":{"53":1,"54":1,"55":1,"56":1,"57":1,"58":1}}],["unix",{"2":{"92":1}}],["uninstalls",{"2":{"117":1}}],["uninstalling",{"2":{"78":1}}],["uninstalled",{"2":{"51":1}}],["uninstall",{"0":{"69":1,"86":1,"117":1},"2":{"41":1,"51":1,"69":18,"86":2,"102":2,"117":3}}],["unique",{"2":{"39":1}}],["unit",{"2":{"1":1}}],["unload",{"2":{"37":1}}],["unless",{"2":{"22":2,"54":1}}],["urls",{"2":{"41":3,"72":1}}],["url>",{"2":{"41":1,"71":1,"125":2,"130":1}}],["url",{"2":{"14":1,"41":1,"48":1,"49":1,"71":2,"103":2,"120":2,"125":1,"130":3}}],["ubuntu",{"2":{"8":1,"126":1}}],["usage",{"2":{"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1}}],["usually",{"2":{"22":1,"30":1}}],["us",{"2":{"14":1}}],["using",{"0":{"31":1},"2":{"4":1,"6":1,"7":1,"12":1,"21":1,"22":6,"33":1,"40":1,"50":1,"68":1,"69":1,"92":1,"99":1,"105":1,"110":1,"111":1,"112":1,"113":1,"123":2,"124":1,"127":1}}],["user",{"2":{"38":1,"42":1,"44":1,"109":1,"117":1}}],["users",{"2":{"11":1,"22":1,"60":1,"85":3,"118":1,"123":1}}],["user>",{"2":{"1":1,"10":1}}],["used",{"2":{"5":1,"13":1,"15":1,"41":3,"43":1,"44":1,"45":1,"46":2,"51":1,"53":1,"54":1,"55":1,"57":1,"60":2,"69":1,"70":1,"75":1,"103":1,"109":2,"115":1,"116":1,"124":1}}],["uses",{"2":{"4":1,"87":1,"93":1,"123":1,"126":1}}],["use",{"0":{"40":1,"46":1},"2":{"1":1,"2":1,"4":3,"7":1,"8":1,"11":1,"21":1,"22":8,"43":4,"44":1,"45":2,"50":2,"52":1,"57":1,"59":10,"68":1,"69":3,"78":1,"84":1,"87":1,"100":1,"103":1,"107":2,"123":1,"124":3,"130":2}}],["useful",{"2":{"1":1,"23":1,"60":1,"103":1,"107":1,"119":1,"125":1}}],["upgrade",{"2":{"46":1,"68":2}}],["upon",{"2":{"38":1,"52":1,"88":1}}],["upstream",{"2":{"38":2,"39":1}}],["updates",{"2":{"43":1,"60":2,"74":1}}],["updated",{"2":{"22":4,"51":1,"102":1,"103":1,"121":1}}],["update",{"0":{"68":1,"74":1,"121":1},"2":{"7":1,"41":8,"46":1,"49":1,"51":2,"60":2,"68":3,"74":5,"100":1,"102":1,"121":7}}],["up",{"2":{"2":1,"28":1,"34":1,"39":1}}],["rvmrc",{"2":{"118":1}}],["rbx",{"2":{"109":1}}],["rbenv",{"0":{"36":1},"2":{"31":1,"36":1,"45":1}}],["rs",{"2":{"69":4}}],["rf",{"2":{"69":26}}],["rm",{"2":{"49":1,"69":4}}],["rate",{"0":{"128":1},"1":{"129":1},"2":{"128":1}}],["rather",{"2":{"61":1}}],["ran",{"2":{"51":1}}],["range",{"2":{"48":1}}],["raw",{"2":{"1":1}}],["rocky",{"2":{"25":1}}],["root",{"2":{"13":2,"14":3}}],["rc",{"2":{"22":9,"69":3}}],["rules",{"0":{"101":1}}],["ruby",{"2":{"15":1,"31":1,"43":2,"45":3,"70":1,"102":1,"109":6,"118":1}}],["runner",{"2":{"92":1}}],["running",{"0":{"93":1},"2":{"4":1,"8":1,"32":1,"102":1,"123":5}}],["runshell",{"2":{"125":1}}],["runs",{"2":{"41":1,"83":1,"106":1,"115":1,"116":1,"126":1}}],["run",{"2":{"11":2,"18":1,"34":2,"43":2,"69":14,"92":1,"99":1,"100":1}}],["runtimes",{"2":{"33":1}}],["runtime",{"2":{"10":1,"17":2,"36":2}}],["regardless",{"2":{"119":1}}],["regarding",{"2":{"90":1}}],["registered",{"2":{"41":1}}],["rebuild",{"2":{"68":1}}],["returns",{"2":{"87":2}}],["returning",{"2":{"87":1}}],["return",{"2":{"67":1,"116":2,"119":1}}],["returned",{"2":{"41":1,"105":2}}],["recalculation",{"2":{"66":1}}],["recursive",{"2":{"49":1}}],["recreates",{"2":{"66":1}}],["recreate",{"2":{"41":1,"114":1}}],["recommendation",{"2":{"71":1}}],["recommended",{"2":{"68":1,"105":1,"130":1}}],["recommend",{"2":{"21":1,"125":1}}],["removing",{"2":{"49":1,"75":1,"117":1}}],["removed",{"2":{"49":1,"102":1,"106":1,"122":1}}],["remove",{"0":{"75":1,"122":1},"2":{"41":3,"49":5,"51":2,"69":40,"75":3,"102":1,"122":6}}],["removes",{"2":{"36":1}}],["remote",{"2":{"2":1}}],["responsible",{"2":{"89":1}}],["result",{"2":{"48":1,"59":1}}],["resources",{"2":{"41":1}}],["resolving",{"2":{"94":1}}],["resolves",{"2":{"103":1,"123":1}}],["resolve",{"2":{"27":1}}],["resolution",{"2":{"28":1}}],["reshimed",{"2":{"51":1}}],["reshim",{"0":{"66":1},"2":{"41":1,"51":2,"66":2,"93":1,"94":1,"114":1}}],["restart",{"2":{"22":1}}],["reason",{"2":{"88":1}}],["really",{"2":{"87":1}}],["rearrange",{"2":{"22":1}}],["reads",{"2":{"118":1,"119":1}}],["readme",{"2":{"14":4,"88":1,"123":1}}],["reading",{"2":{"7":1,"119":1}}],["read",{"2":{"5":1,"13":1,"22":1,"45":2,"117":1,"124":1}}],["refreshed",{"2":{"76":1}}],["ref>",{"2":{"41":1,"125":1}}],["ref",{"2":{"41":2,"43":2,"78":1,"103":6,"106":2,"107":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"118":2,"121":5,"125":1}}],["refs",{"2":{"41":1}}],["references",{"2":{"14":1}}],["reference",{"2":{"13":1,"29":1,"31":1,"78":1}}],["refactor",{"2":{"7":1}}],["relative",{"2":{"102":1,"114":1,"116":2,"123":1,"127":1}}],["relate",{"2":{"89":1}}],["related",{"0":{"35":1},"1":{"36":1,"37":1,"38":1,"39":1},"2":{"89":1,"120":1,"121":1,"122":1,"123":1}}],["rely",{"2":{"59":1}}],["relevant",{"2":{"15":1,"113":1}}],["release",{"0":{"46":1},"2":{"7":3,"12":1,"41":1,"44":1,"46":2,"59":1,"68":1,"109":1}}],["releases",{"0":{"7":1,"12":1},"2":{"105":1}}],["relies",{"2":{"12":1,"68":1}}],["replacing",{"2":{"123":1}}],["replace",{"2":{"11":1}}],["reproducible",{"2":{"39":1}}],["representing",{"2":{"13":1}}],["represent",{"2":{"13":1}}],["report",{"2":{"65":1}}],["repository",{"0":{"48":1,"49":1,"73":1,"76":1},"2":{"2":1,"3":2,"30":1,"33":1,"41":1,"44":2,"48":3,"49":8,"59":2,"71":1,"74":1,"76":2,"100":1,"113":1,"125":1,"129":1,"130":1}}],["repo",{"2":{"1":1,"15":2,"16":1,"25":1,"36":1,"41":3,"49":1,"71":1,"76":1,"99":1,"100":3,"103":2,"126":1,"129":1,"130":1}}],["reduce",{"2":{"4":1}}],["reverse",{"2":{"105":1}}],["revert",{"2":{"7":1}}],["revs",{"0":{"4":1},"2":{"4":6}}],["review",{"2":{"2":1}}],["requires",{"2":{"18":1,"105":2,"111":1,"112":1,"113":1}}],["require",{"2":{"14":1,"22":1,"93":1}}],["required",{"0":{"104":1},"1":{"105":1,"106":1,"107":1},"2":{"2":1,"11":1,"18":1,"33":1,"44":1,"100":1,"106":1,"110":1,"112":1,"124":1,"125":1}}],["requests",{"0":{"7":1,"12":1}}],["request",{"2":{"2":1,"7":4,"125":1,"126":1}}],["h",{"2":{"128":1}}],["hw",{"2":{"50":1}}],["hook",{"2":{"102":3}}],["hooks",{"0":{"51":1},"2":{"25":1,"51":2,"120":1,"121":1,"122":1}}],["hosted",{"2":{"126":1}}],["host",{"2":{"92":1}}],["however",{"2":{"37":1}}],["how",{"0":{"34":1},"2":{"23":1,"70":1,"87":1}}],["home",{"2":{"22":2,"44":1,"53":1,"55":1,"56":1,"118":1}}],["homebrew",{"0":{"38":1},"2":{"18":1,"21":1,"22":12,"38":2,"52":1,"60":1,"68":1,"69":7}}],["high",{"2":{"96":1}}],["highest",{"2":{"22":1,"58":1}}],["highly",{"2":{"21":1}}],["history",{"2":{"7":1}}],["headings",{"2":{"110":1}}],["heading",{"2":{"110":1}}],["head",{"2":{"41":1,"68":2}}],["helpful",{"2":{"88":1}}],["helper",{"2":{"21":1,"22":3,"27":1,"65":1,"68":1,"87":2}}],["help",{"0":{"110":1,"111":1,"112":1,"113":1},"2":{"15":1,"32":1,"41":2,"87":1,"102":4,"110":3,"111":3,"112":3,"113":3,"123":3,"125":1}}],["here",{"2":{"1":1,"3":1,"18":1,"22":1,"89":2,"90":1}}],["haxe",{"2":{"123":3}}],["halcyon",{"2":{"72":1}}],["handle",{"2":{"70":1}}],["handled",{"2":{"22":1}}],["hans",{"2":{"14":4}}],["hashnuke",{"2":{"96":1,"97":1}}],["has",{"2":{"14":1,"15":1,"22":2,"25":1,"32":1,"48":2,"49":1,"68":1,"69":1,"76":1,"102":2,"103":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1,"120":1,"121":1,"122":1,"123":1}}],["have",{"2":{"11":1,"13":1,"22":2,"25":1,"27":1,"29":1,"34":1,"69":2,"93":1,"94":2,"118":1}}],["html",{"2":{"11":1}}],["https",{"2":{"1":5,"10":3,"20":1,"21":1,"26":1,"41":2,"71":1,"72":2,"125":1,"127":1,"130":1}}],["wsl",{"2":{"92":1}}],["wsl2",{"0":{"92":1},"2":{"92":3}}],["wsl1",{"0":{"91":1},"2":{"91":2}}],["wrapper",{"2":{"87":1}}],["wrappers",{"2":{"87":1}}],["wrapping",{"2":{"87":1}}],["written",{"2":{"36":1}}],["writing",{"2":{"5":1,"11":1,"105":1}}],["writes",{"2":{"83":2}}],["write",{"2":{"4":1}}],["way",{"2":{"33":1}}],["warning",{"2":{"22":3,"28":1,"124":1,"129":1}}],["was",{"2":{"11":2,"36":1,"66":1,"103":2,"106":1,"107":1,"120":1,"121":1,"122":1}}],["want",{"2":{"2":1,"54":1,"74":1,"83":1,"88":2}}],["worry",{"2":{"60":1}}],["workflow",{"2":{"126":1}}],["workflows",{"2":{"3":1,"33":1,"61":1,"126":1}}],["works",{"0":{"34":1},"2":{"125":1}}],["working",{"2":{"28":1,"30":1,"33":1,"92":1}}],["workaround",{"2":{"22":1}}],["work",{"2":{"15":1,"22":1,"91":1,"92":2}}],["would",{"2":{"1":1,"11":1,"59":1,"114":1}}],["well",{"2":{"42":1}}],["welcome",{"2":{"15":1}}],["website",{"2":{"7":2,"105":1}}],["we",{"2":{"3":1,"11":2,"21":1,"24":1,"25":2,"27":4,"38":1,"91":1,"92":1,"105":1,"125":2}}],["who",{"2":{"118":1}}],["what",{"2":{"43":1,"51":2,"69":2,"93":1,"119":1}}],["why",{"0":{"40":1}}],["whether",{"2":{"58":1,"109":1,"119":1}}],["whenever",{"2":{"43":1}}],["when",{"2":{"4":2,"11":1,"12":1,"28":1,"30":1,"34":2,"48":1,"49":1,"50":1,"57":1,"60":1,"65":1,"67":1,"78":1,"87":1,"92":2,"103":1,"107":1,"119":1,"127":1}}],["whereas",{"2":{"93":1}}],["where",{"2":{"2":1,"25":1,"41":1,"56":1,"78":1,"87":2,"103":2,"106":2,"107":2,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1,"120":1,"121":1,"122":1,"123":1}}],["which",{"2":{"1":1,"7":1,"12":1,"22":3,"27":1,"28":1,"33":1,"34":1,"36":2,"41":1,"43":1,"68":1,"69":1,"87":2,"102":2,"103":1,"106":1,"109":1,"115":1,"116":1,"118":1,"119":1,"123":1,"128":1}}],["wisely",{"2":{"124":1}}],["wish",{"2":{"1":1,"17":1}}],["windows",{"2":{"91":1,"92":2}}],["will",{"2":{"6":3,"7":3,"14":1,"22":6,"24":1,"27":2,"28":3,"29":2,"30":2,"43":3,"49":2,"53":1,"54":1,"56":1,"66":1,"74":1,"75":1,"76":1,"93":1,"105":1,"106":3,"107":1,"109":1,"110":1,"114":2,"119":1,"123":2,"124":1,"125":1,"130":1}}],["within",{"2":{"13":1,"33":1}}],["without",{"2":{"2":1,"4":1,"28":1}}],["with",{"2":{"1":3,"4":2,"5":1,"6":2,"7":2,"10":3,"11":3,"12":1,"13":2,"14":2,"22":19,"27":2,"29":1,"32":1,"33":2,"34":1,"37":2,"39":1,"40":2,"41":3,"42":1,"43":2,"44":2,"45":1,"49":2,"51":1,"52":1,"59":1,"67":2,"69":13,"75":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"87":1,"99":1,"100":2,"102":1,"105":3,"106":2,"107":4,"109":2,"110":2,"111":2,"112":2,"113":2,"116":2,"117":1,"119":1,"120":1,"121":1,"122":1,"125":1,"126":1,"129":1}}],["f",{"2":{"69":3}}],["far",{"2":{"124":1}}],["faq",{"0":{"90":1},"1":{"91":1,"92":1,"93":1,"94":1}}],["facilitate",{"2":{"61":1}}],["factor",{"2":{"36":1}}],["familiarity",{"2":{"40":1}}],["familiar",{"2":{"32":1}}],["failure",{"2":{"106":2,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1}}],["fail",{"2":{"28":1}}],["fall",{"2":{"14":1}}],["fallback",{"0":{"84":1},"2":{"11":1,"43":1,"45":1}}],["fpath=",{"2":{"22":1,"69":1}}],["fpath",{"2":{"22":3}}],["free",{"2":{"110":1,"112":1}}],["front",{"2":{"22":1,"58":3}}],["from",{"2":{"10":1,"28":2,"31":2,"41":1,"43":1,"48":1,"49":1,"59":1,"78":1,"102":1,"105":2,"106":1,"107":1,"109":3,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":2,"120":1,"121":1,"122":1}}],["framework",{"2":{"22":9,"69":1,"94":1}}],["friendly",{"2":{"22":2}}],["fever",{"2":{"96":1}}],["fetch",{"2":{"68":1,"74":1}}],["few",{"2":{"13":1}}],["feature",{"2":{"7":2,"11":1,"37":1,"123":2,"124":1}}],["features",{"2":{"2":1,"99":1}}],["feat",{"2":{"7":4}}],["full",{"0":{"59":1},"2":{"7":1,"51":1,"102":1,"103":3,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1,"123":1}}],["further",{"2":{"6":1}}],["functionality",{"2":{"1":1}}],["flags",{"2":{"101":1,"107":1,"112":1}}],["flag",{"2":{"6":1}}],["fi",{"2":{"128":1}}],["final",{"2":{"87":1}}],["finally",{"2":{"43":1,"87":1}}],["find",{"2":{"69":3,"123":1}}],["filter",{"2":{"41":2,"80":1,"81":1,"105":1,"109":6}}],["filenames",{"0":{"118":1},"2":{"102":2,"118":3}}],["filename=tool",{"2":{"54":1}}],["filename",{"0":{"54":1},"2":{"54":2,"59":2}}],["file=",{"2":{"53":1}}],["files",{"0":{"31":1},"2":{"3":2,"11":1,"13":1,"14":2,"17":1,"28":1,"31":2,"33":1,"36":1,"42":1,"45":2,"54":1,"69":14,"102":2,"106":1,"107":2,"114":1,"119":1}}],["file",{"0":{"45":1,"53":1,"119":1},"2":{"3":1,"4":5,"6":1,"13":1,"30":1,"31":2,"33":2,"41":2,"43":9,"44":4,"53":1,"54":1,"59":4,"60":1,"83":2,"87":1,"94":1,"102":1,"103":2,"118":1,"119":6,"123":2,"124":3,"127":1}}],["fish",{"2":{"22":19,"52":1,"69":17,"87":1,"94":2}}],["first",{"0":{"15":1},"2":{"14":1,"25":1,"51":1,"109":1,"124":1}}],["fixes",{"2":{"2":1}}],["fix",{"2":{"2":2,"7":4,"123":1}}],["foox",{"2":{"116":1}}],["foo",{"2":{"14":2,"51":2,"78":2,"116":4,"123":11,"124":2}}],["folder",{"2":{"14":1}}],["follow",{"2":{"7":1,"22":2,"32":1,"68":1,"69":4}}],["follows",{"2":{"7":1,"76":1}}],["following",{"2":{"2":1,"3":1,"4":1,"22":17,"31":1,"43":2,"48":1,"49":1,"51":2,"52":1,"59":2,"83":1,"130":1}}],["found",{"2":{"12":1,"119":1}}],["focus",{"2":{"11":1}}],["form",{"2":{"110":1,"112":1}}],["formats",{"2":{"119":1}}],["format",{"2":{"2":2,"7":5,"11":2,"12":1,"43":1,"44":1,"83":1,"105":1,"113":1,"117":1}}],["formatter",{"2":{"1":1}}],["force",{"0":{"58":1},"2":{"22":1,"58":3,"66":1,"69":5}}],["forcily",{"2":{"22":1}}],["for",{"0":{"101":1,"123":1},"2":{"1":3,"2":2,"3":1,"4":2,"7":2,"8":2,"10":1,"11":1,"12":1,"13":3,"14":3,"15":3,"16":2,"17":1,"18":1,"22":6,"24":1,"25":1,"27":1,"28":1,"30":1,"31":2,"32":3,"34":1,"36":3,"37":1,"38":2,"39":1,"40":3,"41":7,"43":2,"45":1,"48":1,"51":2,"52":1,"60":2,"63":1,"66":5,"67":1,"68":1,"70":1,"73":1,"75":1,"76":2,"83":4,"84":1,"87":1,"88":2,"89":2,"91":2,"92":2,"93":1,"101":1,"102":6,"103":2,"105":1,"106":5,"107":4,"109":3,"110":3,"111":2,"112":4,"113":2,"114":6,"115":4,"116":4,"117":1,"118":2,"119":1,"123":2,"124":1,"125":2,"126":1,"128":1,"130":1}}],["fork",{"2":{"1":2,"10":2}}],["npm",{"2":{"66":2,"67":2,"93":1,"117":1}}],["nproc",{"2":{"50":1}}],["ncpu",{"2":{"50":1}}],["nix",{"2":{"39":1}}],["nixos",{"0":{"39":1},"2":{"39":3}}],["nvm",{"0":{"36":1},"2":{"36":1}}],["nvmrc",{"2":{"31":1}}],["n$env",{"2":{"22":3}}],["numbers",{"2":{"119":1}}],["number",{"2":{"27":1,"50":3,"57":1,"103":2,"106":1,"107":2,"109":2,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["nu",{"2":{"22":9}}],["nushell",{"2":{"22":6}}],["nsource",{"2":{"22":1}}],["nav",{"2":{"14":3}}],["navbars",{"2":{"13":1,"14":3}}],["navbar",{"2":{"13":1,"14":2}}],["named",{"2":{"83":1,"100":1}}],["names",{"2":{"54":1}}],["name>",{"2":{"41":19,"66":1,"71":2,"74":1,"75":1,"78":1,"79":2,"80":2,"81":2,"82":2,"83":5,"84":1,"85":1,"86":1,"125":2,"127":1,"130":1}}],["name",{"0":{"49":1,"73":1,"76":1},"2":{"14":1,"15":1,"41":1,"43":1,"44":1,"48":3,"49":8,"51":5,"59":1,"71":2,"73":1,"76":3,"78":1,"84":1,"87":1,"99":2,"100":2,"105":1,"109":1,"110":1,"111":1,"112":1,"113":1,"117":1,"120":2,"121":2,"122":2,"123":1,"125":2,"126":2}}],["n",{"0":{"36":1},"2":{"6":2,"22":16,"36":1,"128":1}}],["no",{"2":{"43":1,"44":4,"45":1,"46":1,"47":1,"49":1,"58":1,"59":11,"66":1,"105":2,"106":2,"107":1,"110":1,"117":3,"118":1,"119":1,"120":1,"121":1,"122":1}}],["now",{"2":{"27":1,"32":1,"123":1}}],["non",{"2":{"18":1,"101":1,"106":1,"107":1,"109":2,"110":1,"111":1,"112":1,"113":1}}],["node",{"2":{"10":2,"15":1,"24":1,"27":1,"31":1,"67":3,"70":1,"85":1,"106":1,"107":1,"125":1}}],["nodejs",{"2":{"10":2,"24":1,"25":1,"26":2,"27":3,"29":2,"30":2,"31":1,"32":1,"43":2,"66":2,"67":7,"72":3,"85":1,"105":2,"106":1,"107":1,"117":2,"125":3,"130":2}}],["noise",{"2":{"4":1}}],["notify",{"2":{"93":1}}],["note",{"2":{"18":1,"27":1,"40":1,"43":1,"48":1,"49":1,"50":1,"87":1,"89":1,"103":1,"125":1,"127":1}}],["not",{"0":{"93":1,"94":1},"2":{"1":1,"6":1,"11":2,"29":1,"37":1,"38":2,"39":3,"40":2,"43":1,"48":2,"49":3,"54":1,"58":2,"60":1,"66":1,"76":1,"89":2,"91":3,"92":2,"94":2,"101":1,"103":1,"105":1,"110":1,"114":1,"119":2,"123":1,"124":1,"130":1}}],["neko",{"2":{"123":1}}],["never",{"2":{"48":3,"129":1}}],["nexport",{"2":{"22":1}}],["nested",{"2":{"14":2}}],["newest",{"2":{"105":1}}],["newer",{"2":{"22":2,"69":1,"107":1}}],["newly",{"0":{"93":1,"94":1}}],["new",{"2":{"2":2,"7":4,"22":3,"37":1,"48":1,"66":1,"68":1,"123":2,"129":1}}],["needed",{"2":{"83":1,"112":1}}],["needs",{"2":{"22":1,"94":1,"127":1}}],["need",{"2":{"1":1,"22":6,"25":1,"29":1,"36":1,"78":1,"87":1,"93":1,"127":1}}],["ll",{"2":{"78":1}}],["leave",{"2":{"105":1}}],["learn",{"2":{"23":1}}],["legacy",{"0":{"45":1,"118":1,"119":1},"2":{"31":1,"45":1,"59":1,"102":4,"106":3,"107":1,"118":3,"119":7}}],["ln",{"2":{"22":4}}],["load",{"2":{"37":1}}],["looks",{"2":{"43":1}}],["look",{"2":{"29":1,"30":1,"114":1}}],["lookup",{"2":{"15":1,"28":2}}],["longer",{"2":{"71":1}}],["long",{"2":{"15":1,"89":1}}],["locations",{"2":{"52":1}}],["location",{"2":{"22":1,"44":1,"52":1,"53":1,"55":2,"56":2,"59":2,"106":1,"107":1,"127":1}}],["located",{"2":{"14":1}}],["locales",{"2":{"14":3}}],["locale",{"2":{"13":1,"14":2}}],["locally",{"2":{"2":1,"5":1}}],["local",{"0":{"30":1},"2":{"1":1,"11":1,"30":2,"41":4,"43":1,"76":1,"83":3,"84":3,"87":1,"109":2,"120":1}}],["latest",{"0":{"79":1,"82":1,"109":1},"2":{"27":3,"29":1,"30":1,"41":15,"46":2,"68":2,"74":1,"79":5,"82":5,"83":3,"102":2,"106":1,"107":1,"109":16,"125":1,"126":2,"128":1}}],["later",{"2":{"18":1}}],["language",{"2":{"39":1,"43":1,"99":1}}],["lang",{"2":{"14":3,"41":1}}],["label",{"2":{"14":3}}],["larger",{"2":{"13":1}}],["largely",{"2":{"11":1}}],["last",{"0":{"48":1},"2":{"7":1,"44":1,"48":2,"59":1,"76":2,"105":1}}],["lt",{"2":{"7":2,"12":1,"43":1,"48":3,"49":4,"51":5,"58":1,"66":2,"76":1,"84":1,"99":3,"100":2,"105":1,"106":2,"107":3,"109":5,"110":2,"111":2,"112":2,"113":5,"114":3,"115":3,"116":3,"117":2,"120":1,"121":2,"122":1,"125":7}}],["limiting",{"0":{"128":1},"1":{"129":1},"2":{"128":1}}],["license",{"2":{"96":1}}],["libraries",{"2":{"123":1}}],["lib",{"2":{"22":6,"69":3,"123":7}}],["libexec",{"2":{"22":10,"69":4}}],["link",{"2":{"113":4,"123":1}}],["links",{"0":{"113":1},"2":{"102":2,"113":2}}],["linked",{"2":{"15":1}}],["lines",{"2":{"69":14}}],["line",{"2":{"43":1,"105":3,"111":1,"113":2,"119":1,"123":1}}],["linux",{"2":{"18":4,"25":1,"38":1,"91":1,"92":1,"125":1,"127":1}}],["lint",{"2":{"2":4}}],["lifecycle",{"2":{"66":1}}],["life",{"2":{"15":1}}],["living",{"2":{"13":1}}],["likely",{"2":{"94":1}}],["like",{"2":{"4":1,"11":1,"14":1,"22":2,"29":1,"30":1,"36":1,"43":1,"60":1,"66":2,"70":1,"83":1,"107":1,"119":1,"128":1}}],["lists",{"2":{"67":1,"105":2,"109":1}}],["listed",{"2":{"25":1,"28":1,"41":1,"89":1,"100":1}}],["list",{"0":{"72":1,"73":1,"80":1,"81":1,"105":1,"114":1,"118":1},"2":{"1":1,"2":1,"7":1,"15":1,"18":1,"27":2,"38":1,"41":11,"48":1,"49":1,"61":1,"72":4,"73":2,"76":1,"80":4,"81":4,"98":1,"99":1,"101":2,"102":9,"103":1,"105":6,"107":1,"109":2,"111":1,"113":1,"114":3,"117":1,"118":3,"123":1,"128":1}}],["luizm",{"2":{"1":2}}],["dynamic",{"2":{"123":1}}],["dylibs",{"2":{"123":1}}],["due",{"2":{"94":1}}],["duration",{"0":{"48":1},"2":{"44":1,"48":4,"59":1,"76":1}}],["during",{"2":{"1":1,"6":3,"50":1,"66":1,"128":1}}],["danhper",{"2":{"97":1}}],["data",{"0":{"56":1},"2":{"49":1,"56":1,"59":2,"69":11,"87":1,"123":5}}],["daily",{"2":{"15":1}}],["d",{"2":{"22":2,"69":2}}],["dnf",{"2":{"18":2}}],["drive",{"2":{"92":2}}],["driven",{"2":{"15":1,"89":1}}],["dropdown",{"2":{"14":1}}],["distro",{"2":{"92":1}}],["distinct",{"2":{"33":1}}],["disabling",{"2":{"49":2}}],["disabled",{"2":{"49":1,"60":2}}],["disable",{"0":{"49":1},"2":{"44":1,"48":1,"49":2,"59":1,"76":1}}],["displayed",{"2":{"110":1}}],["display",{"2":{"41":4,"115":1,"116":1}}],["differentiating",{"2":{"36":1}}],["different",{"2":{"22":1,"36":2,"68":1,"70":1}}],["difficult",{"2":{"6":1}}],["direct",{"2":{"130":1}}],["directories",{"2":{"58":3,"102":1,"114":1}}],["directory",{"2":{"2":2,"28":3,"30":2,"37":1,"43":4,"55":1,"58":1,"87":4,"88":1,"92":1,"106":3,"107":1,"114":1,"120":1,"123":1}}],["directly",{"2":{"43":1,"87":1}}],["direnv",{"0":{"37":1},"2":{"37":3,"88":1}}],["dirmngr",{"2":{"25":1}}],["dir=",{"2":{"22":3,"55":1,"56":1}}],["dir",{"0":{"55":1,"56":1},"2":{"2":1,"22":4,"49":1,"56":1,"59":5,"60":1,"69":21,"87":1,"123":5,"127":1}}],["doe",{"2":{"53":1,"55":1,"56":1}}],["does",{"2":{"37":1,"38":1,"39":3,"40":1,"48":2,"49":3,"92":1}}],["downloaded",{"2":{"103":1,"106":1,"107":2,"121":1}}],["download",{"0":{"19":1,"20":1,"21":1,"47":1,"106":1},"1":{"20":1,"21":1},"2":{"43":2,"44":1,"51":1,"59":1,"68":1,"102":2,"103":2,"106":9,"107":6}}],["downloading",{"2":{"17":1,"43":1,"78":1}}],["downloads",{"2":{"3":1,"47":1,"106":1}}],["do",{"2":{"11":1,"22":1,"23":1,"39":1,"58":1,"89":1,"91":1}}],["dockerized",{"2":{"8":1}}],["docker",{"0":{"8":1},"2":{"8":1}}],["docsify",{"2":{"11":2}}],["docs",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1},"2":{"7":3,"10":3,"12":2,"13":3,"14":3,"37":1,"38":1,"39":1,"41":1,"76":2,"93":1}}],["documented",{"2":{"6":1}}],["documentation",{"2":{"2":1,"4":1,"5":1,"7":1,"9":1,"11":1,"12":2,"13":2,"14":1,"41":1,"100":1,"102":1,"103":1,"110":2,"111":1,"112":1,"113":2}}],["deemed",{"2":{"107":1}}],["decompressed",{"2":{"106":1}}],["declares",{"2":{"43":1}}],["deps",{"0":{"111":1},"2":{"102":1,"111":1}}],["depends",{"2":{"128":1}}],["depend",{"2":{"52":1}}],["dependency",{"2":{"25":1,"38":1,"39":1,"92":1,"101":1,"111":1}}],["dependencies",{"0":{"18":1,"25":1},"2":{"10":1,"17":1,"25":2,"38":2,"39":1,"102":1,"111":1}}],["depending",{"2":{"18":1,"37":1,"52":1,"103":1}}],["delete",{"2":{"47":2}}],["describes",{"2":{"60":1}}],["describe",{"2":{"52":1,"112":1}}],["description",{"2":{"12":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"102":2,"103":1,"105":1,"106":1,"107":1,"109":1,"110":2,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["description>",{"2":{"7":1}}],["descriptor",{"2":{"6":1}}],["desired",{"2":{"30":1}}],["debug",{"2":{"41":1,"65":1}}],["debugging",{"2":{"6":2}}],["debian",{"2":{"25":1}}],["demonstration",{"2":{"24":1}}],["definitions",{"2":{"33":1}}],["defined",{"2":{"30":1,"43":2}}],["defineconfig",{"2":{"14":1}}],["defines",{"2":{"14":1,"44":1}}],["define",{"2":{"7":1,"123":1}}],["defaults",{"2":{"22":1,"29":1,"43":1,"58":2,"76":1,"125":2}}],["default",{"0":{"54":1},"2":{"1":1,"7":1,"10":1,"13":1,"14":1,"22":2,"41":3,"44":2,"50":1,"52":1,"54":1,"59":8,"66":1,"69":1,"74":1,"87":1,"100":1,"107":1,"115":1,"116":3,"125":1}}],["deterministic",{"2":{"119":1}}],["determining",{"2":{"118":1}}],["determines",{"2":{"87":1}}],["determine",{"2":{"76":1,"109":1,"119":2,"130":1}}],["determined",{"2":{"7":1}}],["detecting",{"0":{"94":1}}],["detail",{"2":{"14":1}}],["detailed",{"2":{"12":1,"102":1}}],["details",{"2":{"3":1,"83":1,"88":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"116":1,"118":1,"119":1}}],["dev",{"2":{"1":1,"11":1,"89":2}}],["developed",{"2":{"74":1}}],["developers",{"2":{"43":1}}],["develop",{"2":{"1":1}}],["development",{"0":{"2":1,"11":1},"1":{"3":1,"4":1},"2":{"1":2,"8":1,"10":1,"11":2,"33":1}}],["bit",{"2":{"123":2}}],["binary",{"2":{"47":3,"102":1,"103":1,"106":5,"107":1}}],["binaries",{"2":{"43":2,"102":2,"114":3,"115":1}}],["bin",{"0":{"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":2,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1},"2":{"2":1,"55":1,"59":1,"87":1,"102":18,"103":1,"105":1,"106":3,"107":7,"109":2,"110":1,"111":2,"112":2,"113":2,"114":4,"115":1,"116":5,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"128":2}}],["bottom",{"2":{"94":1}}],["both",{"2":{"13":1,"31":1,"42":1,"125":1}}],["bound",{"2":{"92":1}}],["by",{"0":{"88":1},"2":{"7":1,"13":1,"14":1,"15":1,"22":6,"29":1,"32":1,"34":1,"36":1,"39":1,"41":1,"43":3,"44":1,"45":1,"59":1,"60":1,"66":2,"76":1,"83":1,"87":6,"88":1,"93":1,"99":1,"103":1,"105":2,"106":1,"107":1,"109":3,"116":2,"117":1,"119":1,"123":2,"130":1}}],["burden",{"2":{"38":1}}],["but",{"2":{"22":1,"58":1,"61":1,"76":1,"93":1,"110":1}}],["built",{"2":{"10":1,"36":1,"68":1}}],["build",{"2":{"7":1,"11":1,"39":1,"107":1,"127":1}}],["bump",{"2":{"7":1}}],["bug",{"2":{"2":1,"65":1}}],["blame",{"0":{"4":1},"2":{"4":11}}],["baz`",{"2":{"123":1}}],["baz",{"2":{"123":1}}],["bat",{"2":{"123":6}}],["bats",{"0":{"5":1,"6":1},"1":{"6":1},"2":{"1":3,"2":2,"4":1,"5":2,"6":7}}],["banned",{"2":{"101":1}}],["bar`",{"2":{"123":1}}],["bar",{"2":{"51":2,"123":1}}],["back",{"2":{"22":2,"29":1}}],["basis",{"2":{"31":1}}],["based",{"2":{"109":1}}],["base",{"2":{"8":1}}],["bash`",{"2":{"123":3}}],["bash1",{"2":{"119":1}}],["bashbin",{"2":{"114":1}}],["bashgit",{"2":{"111":1,"113":1}}],["bashasdf",{"2":{"75":1}}],["bashrc",{"2":{"22":6,"69":3}}],["bash",{"2":{"1":3,"2":4,"5":2,"22":20,"52":1,"59":1,"69":14,"94":1,"100":1,"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":2,"119":1,"120":1,"121":1,"122":1,"123":8,"124":1}}],["broken",{"2":{"32":1}}],["brew",{"2":{"18":1,"21":1,"22":12,"25":1,"68":2,"69":7}}],["breaking",{"2":{"7":2}}],["break",{"2":{"1":2}}],["brazilian",{"2":{"14":1}}],["branches",{"2":{"126":1}}],["branch",{"2":{"1":1,"7":1,"10":1,"20":1,"41":3,"43":1,"74":1,"78":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1,"125":2}}],["br",{"2":{"14":7}}],["beginning",{"2":{"105":1}}],["begin",{"2":{"80":1,"81":1}}],["begins",{"2":{"41":1,"79":1,"82":1}}],["between",{"2":{"48":1}}],["because",{"2":{"40":1,"87":1,"124":1}}],["become",{"2":{"32":1}}],["becomes",{"2":{"7":1}}],["being",{"2":{"40":1,"41":2,"48":1,"74":1,"87":1,"94":1,"103":1,"105":1,"110":2,"111":1,"112":1,"113":1,"123":1,"124":1}}],["behaviour",{"2":{"37":1,"48":1,"107":1}}],["behavior",{"2":{"22":1}}],["below",{"2":{"15":1,"22":3,"23":1,"44":1,"100":1,"103":1}}],["been",{"2":{"13":1,"48":1,"69":2,"76":1,"102":2,"103":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1,"120":1}}],["before",{"2":{"2":2,"5":1,"11":1,"51":3,"52":1,"102":1,"115":1,"119":1,"122":1,"127":1}}],["best",{"2":{"2":1,"22":1,"40":1}}],["be",{"2":{"1":1,"3":1,"6":3,"18":1,"22":14,"25":1,"30":1,"33":1,"40":1,"43":6,"44":1,"49":1,"51":1,"52":1,"53":3,"54":2,"55":2,"56":2,"69":1,"75":1,"76":1,"87":3,"88":2,"92":1,"94":1,"105":1,"106":4,"107":3,"109":5,"110":5,"111":3,"112":4,"113":4,"114":3,"115":1,"116":1,"117":1,"118":1,"119":2,"120":1,"123":2,"124":1,"125":1}}],["io",{"2":{"113":1}}],["i",{"2":{"93":1,"117":1}}],["irrelevant",{"2":{"60":1}}],["ideally",{"2":{"110":1}}],["identify",{"2":{"34":1}}],["ides",{"2":{"4":1}}],["implement",{"2":{"100":1}}],["implemented",{"2":{"100":1}}],["implementation",{"2":{"33":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"116":1,"118":1,"119":1}}],["importantly",{"2":{"92":1}}],["improving",{"2":{"15":1}}],["images",{"0":{"8":1},"2":{"8":2}}],["i18n",{"0":{"14":1},"2":{"14":1}}],["ignorerevsfile",{"2":{"4":1}}],["ignored",{"2":{"3":1}}],["ignore",{"0":{"4":1},"2":{"3":1,"4":6,"54":1}}],["issue",{"2":{"94":1,"123":1}}],["issues",{"2":{"16":1,"107":1}}],["is",{"2":{"2":1,"3":1,"4":1,"6":1,"7":3,"11":2,"12":1,"13":1,"14":1,"15":1,"18":1,"22":5,"23":1,"27":1,"29":1,"31":1,"33":2,"34":4,"36":2,"37":1,"38":2,"39":2,"40":3,"41":1,"43":5,"44":1,"46":2,"48":1,"49":1,"51":4,"55":1,"57":1,"59":5,"60":3,"61":1,"71":1,"76":4,"78":1,"83":1,"87":2,"91":1,"92":3,"94":2,"99":1,"102":1,"105":2,"106":4,"107":2,"109":1,"110":2,"114":1,"117":1,"119":3,"123":4,"124":4,"125":5,"128":1,"130":2}}],["its",{"2":{"22":1,"23":1,"36":1,"39":1,"40":1,"88":1,"105":1,"106":1,"111":1,"112":1,"113":1,"119":1,"124":1}}],["itself",{"2":{"1":1,"123":1,"125":1}}],["items",{"2":{"22":1}}],["it",{"0":{"34":1},"2":{"1":1,"2":1,"4":2,"11":1,"13":1,"22":1,"38":1,"40":1,"43":2,"47":1,"49":1,"51":1,"56":1,"60":1,"66":1,"69":2,"71":1,"83":1,"87":4,"94":2,"103":1,"105":1,"106":2,"123":2,"124":1,"127":1,"128":1}}],["if",{"2":{"1":1,"2":1,"22":6,"41":1,"45":1,"48":2,"49":2,"50":1,"51":1,"53":1,"54":1,"55":1,"56":2,"57":2,"58":3,"68":1,"69":3,"74":1,"76":2,"78":1,"83":2,"88":1,"94":2,"105":3,"106":3,"107":4,"109":3,"110":2,"111":2,"112":2,"113":2,"114":3,"115":2,"116":2,"118":2,"119":1,"123":2,"124":2,"125":2,"128":2,"130":1}}],["index",{"0":{"130":1},"2":{"73":1,"130":2}}],["independent",{"2":{"71":1}}],["individually",{"2":{"14":1}}],["indicates",{"2":{"7":1}}],["info",{"0":{"65":1},"2":{"41":1,"65":1}}],["information",{"2":{"4":1,"7":1,"41":1,"65":1,"102":1,"110":1}}],["inside",{"2":{"41":1,"115":1,"116":1}}],["instruct",{"2":{"114":1}}],["instructions",{"2":{"22":5,"69":3,"92":1,"130":1}}],["instance",{"2":{"93":1,"109":1}}],["installable",{"2":{"102":1,"105":1}}],["installations",{"2":{"75":1}}],["installation",{"0":{"23":1,"62":1},"2":{"17":1,"22":2,"23":1,"25":1,"52":1,"59":1,"60":1,"66":2,"68":1,"87":2,"107":1,"130":2}}],["installing",{"2":{"17":4,"66":1,"93":1}}],["installs",{"2":{"3":1,"87":1,"102":1,"107":1,"109":1,"116":1}}],["installed",{"0":{"72":1,"80":1,"93":1,"94":1},"2":{"2":1,"22":1,"29":1,"34":3,"36":1,"41":5,"43":1,"49":2,"51":2,"59":1,"66":1,"67":1,"68":1,"87":3,"93":1,"103":2,"106":1,"107":1,"109":2,"110":2,"111":2,"112":2,"113":2,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"125":2}}],["install",{"0":{"18":1,"22":1,"24":1,"26":1,"27":1,"78":1,"79":1,"107":1},"1":{"25":1,"26":1},"2":{"1":2,"4":1,"10":4,"18":6,"21":1,"23":2,"24":1,"25":5,"27":3,"41":10,"43":4,"47":3,"51":1,"56":1,"66":1,"78":2,"79":5,"93":1,"99":1,"102":1,"103":4,"106":11,"107":19,"109":6,"110":7,"111":7,"112":8,"113":7,"114":11,"115":5,"116":6,"118":5}}],["instead",{"2":{"34":1,"46":1,"84":1,"87":2,"124":1}}],["including",{"2":{"117":1}}],["include",{"2":{"40":1,"43":1,"106":1}}],["includes",{"2":{"1":1}}],["inconsistent",{"2":{"22":1}}],["invoke",{"2":{"102":1,"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1}}],["involves",{"2":{"17":1}}],["invocation",{"2":{"4":1}}],["intend",{"2":{"91":1,"92":1}}],["intended",{"2":{"40":1}}],["integrators",{"2":{"60":1}}],["integrate",{"2":{"37":1}}],["integer",{"2":{"48":1,"50":1}}],["interactively",{"2":{"100":1}}],["internal",{"0":{"60":1},"2":{"60":1}}],["internationalization",{"2":{"14":1}}],["interface",{"2":{"33":2,"123":1}}],["interest",{"2":{"16":1}}],["interpreter",{"2":{"1":1}}],["introduction",{"0":{"33":1},"1":{"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1},"2":{"106":1}}],["into",{"2":{"14":1,"22":2,"32":1}}],["in",{"0":{"73":1},"2":{"1":1,"3":2,"5":2,"6":1,"10":1,"12":3,"13":2,"14":3,"15":1,"18":1,"22":3,"28":2,"29":1,"30":2,"32":1,"33":1,"34":1,"36":2,"40":1,"41":4,"43":9,"45":1,"48":5,"59":1,"62":1,"68":1,"69":17,"71":1,"76":2,"83":1,"84":1,"87":10,"89":1,"93":1,"100":1,"103":1,"105":3,"106":3,"107":5,"110":1,"114":2,"117":1,"118":1,"123":1,"124":4,"125":1,"129":1,"130":1}}],["initially",{"2":{"48":1,"114":1}}],["initialise",{"2":{"22":1}}],["initial",{"0":{"1":1,"10":1}}],["veggies",{"2":{"114":2}}],["very",{"2":{"36":1}}],["versioning",{"2":{"99":1}}],["version=1",{"2":{"83":1}}],["versioned",{"2":{"74":1}}],["version`",{"2":{"41":1}}],["version>",{"2":{"41":13,"66":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":8,"86":1,"125":1}}],["version",{"0":{"27":1,"28":1,"31":1,"45":1,"78":1,"79":1,"82":1,"83":1,"84":1,"85":1,"86":1},"1":{"29":1,"30":1,"31":1},"2":{"7":1,"10":1,"17":1,"27":3,"28":3,"29":1,"31":5,"33":3,"34":2,"36":2,"40":1,"41":23,"43":4,"44":1,"45":4,"46":2,"51":1,"59":1,"63":1,"66":3,"79":1,"82":1,"83":9,"84":4,"87":2,"99":1,"102":8,"103":3,"105":4,"106":8,"107":10,"109":14,"110":6,"111":6,"112":6,"113":6,"114":6,"115":4,"116":6,"117":3,"118":7,"119":7,"125":6,"126":1,"127":2}}],["versions",{"0":{"43":1,"54":1,"67":1,"77":1,"80":1,"81":1},"1":{"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1},"2":{"1":2,"10":1,"17":2,"23":1,"27":3,"28":1,"29":3,"30":3,"32":2,"33":2,"34":1,"39":1,"40":2,"41":10,"42":1,"43":12,"45":3,"49":1,"54":5,"56":1,"59":4,"67":6,"69":14,"75":1,"80":1,"81":1,"83":4,"85":3,"87":1,"102":1,"105":7,"107":1,"109":3}}],["vlang",{"2":{"113":2}}],["v",{"2":{"101":1,"105":1,"113":1}}],["v1",{"2":{"43":1}}],["v0",{"2":{"20":1}}],["view",{"0":{"85":1}}],["vic",{"2":{"71":1,"97":1}}],["via",{"2":{"17":1,"22":2,"24":1,"31":1,"33":1,"40":1,"59":1,"60":1,"66":2,"68":1,"71":2,"76":1,"87":1,"93":1,"128":1,"130":1}}],["vitepress",{"0":{"13":1},"2":{"11":2,"13":4,"14":4}}],["vuepress",{"2":{"11":2}}],["v2",{"2":{"11":1,"105":1,"126":1}}],["v8",{"2":{"10":1}}],["vscode",{"2":{"4":2}}],["validate",{"2":{"125":1}}],["valid",{"2":{"54":1,"119":1}}],["value",{"2":{"48":1,"54":1,"56":1,"57":3,"59":2}}],["values",{"2":{"44":1}}],["vars",{"2":{"103":1}}],["varies",{"2":{"52":1}}],["variables",{"0":{"52":1,"103":1},"1":{"53":1,"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"33":1,"37":2,"42":1,"52":2,"59":1,"88":1,"103":3,"105":2,"106":1,"107":1,"109":1,"110":2,"111":2,"112":3,"113":2,"114":1,"115":1,"116":1,"117":2,"118":1,"119":2,"120":1,"121":1,"122":1,"129":1}}],["variable",{"2":{"2":1,"22":1,"44":1,"50":1,"83":2,"107":1,"128":1}}],["var",{"2":{"22":3,"69":3}}],["vagrant",{"2":{"3":1}}],["vm",{"2":{"1":1,"3":1,"10":2,"20":1,"21":2,"22":9,"26":1,"41":2,"69":7,"72":1,"100":1,"110":1,"125":1,"126":2,"127":1,"130":1}}],["two",{"2":{"67":1,"87":1,"100":1}}],["typically",{"2":{"54":1,"125":1}}],["type=ref",{"2":{"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["type=version",{"2":{"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["type",{"2":{"7":1,"12":1,"32":1,"103":2,"106":1,"107":1,"109":1,"110":2,"111":2,"112":2,"113":2,"114":1,"115":1,"116":1,"118":1}}],["typescript",{"2":{"13":1}}],["types",{"2":{"7":1}}],["type>",{"2":{"7":1}}],["txt1",{"2":{"105":1}}],["txtlegacy",{"2":{"44":1}}],["txtmanage",{"2":{"41":1}}],["tailored",{"2":{"110":1,"111":2,"112":1,"113":1}}],["tail",{"2":{"109":1}}],["tac",{"2":{"105":1}}],["tag",{"2":{"43":1,"78":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1,"125":1}}],["tab",{"2":{"22":1}}],["takes",{"2":{"39":1,"57":1}}],["take",{"2":{"22":1,"50":1}}],["taking",{"2":{"22":1}}],["tap",{"2":{"6":1}}],["travis",{"2":{"127":1}}],["travisci",{"0":{"127":1}}],["trash",{"2":{"49":1}}],["truffleruby+graalvm",{"2":{"109":1}}],["truffleruby",{"2":{"109":2}}],["truly",{"2":{"39":1}}],["triggered",{"2":{"76":1}}],["trigger",{"2":{"48":4,"49":1}}],["trim",{"2":{"22":2}}],["tree",{"2":{"39":1}}],["try",{"2":{"2":1,"34":1,"38":1}}],["t",{"2":{"6":2,"69":1}}],["tmp",{"2":{"3":1}}],["titles",{"2":{"12":1}}],["title",{"2":{"7":3,"12":1,"14":1,"113":1}}],["time",{"2":{"27":1,"28":1,"48":1,"96":1,"107":2}}],["times",{"2":{"6":1}}],["timgluz",{"2":{"1":1}}],["tips",{"0":{"6":1}}],["tip",{"2":{"2":1,"7":1,"43":1,"130":1}}],["templates",{"0":{"124":1},"2":{"124":1}}],["template",{"2":{"100":2,"124":1}}],["temporarily",{"2":{"2":1}}],["textpre",{"2":{"51":1}}],["text",{"2":{"41":1,"110":1,"112":1}}],["tell",{"2":{"29":1}}],["term",{"2":{"15":1,"89":1}}],["terminal",{"2":{"6":1,"22":1}}],["teams",{"2":{"40":1}}],["team",{"2":{"15":1,"33":1,"89":1,"124":1}}],["tests",{"2":{"2":3,"5":3,"6":3,"83":1}}],["test",{"2":{"2":5,"4":1,"5":3,"6":4,"7":1,"83":1,"92":1,"125":9,"126":6,"127":2}}],["testing",{"0":{"5":1,"125":1},"1":{"6":1,"126":1,"127":1},"2":{"1":2,"125":2,"126":1,"128":1}}],["tokens",{"2":{"129":1}}],["token",{"0":{"129":1},"2":{"128":4,"129":2}}],["toctou",{"2":{"107":1}}],["too",{"2":{"78":1}}],["tool>",{"2":{"126":1,"127":2}}],["tooling",{"2":{"1":1}}],["tool",{"0":{"31":1,"43":1,"54":1},"2":{"1":2,"7":1,"10":2,"17":3,"23":1,"27":1,"28":6,"29":2,"30":2,"32":1,"33":3,"34":3,"36":2,"39":2,"40":3,"41":4,"42":1,"43":14,"45":1,"49":1,"54":4,"56":1,"59":4,"66":1,"69":14,"75":2,"83":7,"84":2,"85":3,"87":1,"93":1,"99":1,"100":2,"102":6,"103":1,"106":4,"107":6,"109":13,"110":4,"111":3,"112":5,"113":4,"114":4,"115":2,"116":3,"117":1,"118":3,"119":2,"120":1,"121":1,"122":1,"125":6,"127":2}}],["tools",{"2":{"1":3,"3":1,"8":1,"10":1,"18":1,"22":1,"28":1,"29":1,"32":1,"33":2,"34":1,"36":2,"39":1,"40":2,"43":1,"66":1,"67":1,"70":2,"89":1,"101":2,"109":1,"114":2,"123":1}}],["topic",{"2":{"15":1}}],["to",{"0":{"84":1},"2":{"1":5,"2":6,"3":1,"4":5,"6":2,"7":1,"8":1,"11":4,"13":2,"15":2,"17":1,"18":1,"22":47,"23":2,"25":1,"27":1,"28":2,"29":3,"31":2,"32":1,"33":4,"34":2,"36":1,"37":1,"39":2,"40":1,"41":8,"43":11,"45":2,"46":2,"47":1,"48":2,"50":2,"51":2,"53":2,"54":1,"55":1,"56":1,"57":1,"58":8,"60":2,"65":1,"68":1,"69":20,"70":2,"74":1,"76":4,"78":1,"80":1,"81":1,"83":4,"84":2,"87":9,"88":2,"89":2,"91":1,"92":3,"93":4,"94":2,"95":1,"96":1,"99":2,"100":3,"102":6,"103":7,"105":3,"106":6,"107":7,"109":8,"110":4,"111":5,"112":5,"113":5,"114":4,"115":3,"116":4,"117":3,"118":2,"119":5,"120":2,"121":1,"122":1,"123":8,"124":2,"125":6,"127":3,"128":1,"129":2,"130":3}}],["those",{"2":{"80":1,"81":1,"89":1,"93":1,"114":1,"117":1}}],["though",{"2":{"38":1,"106":1}}],["through",{"2":{"105":1}}],["throughout",{"2":{"27":1,"103":1}}],["three",{"2":{"32":1}}],["that",{"2":{"14":1,"22":3,"27":1,"28":1,"29":1,"32":1,"34":2,"37":1,"38":1,"39":1,"40":2,"41":2,"43":3,"48":1,"67":1,"68":1,"69":15,"79":1,"80":1,"81":1,"82":1,"87":4,"105":1,"106":2,"107":1,"109":3,"110":2,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"123":2,"124":1,"125":2,"130":1}}],["thank",{"2":{"95":1}}],["thanks",{"0":{"95":1},"1":{"96":1,"97":1,"98":1},"2":{"16":1}}],["than",{"2":{"11":1,"48":1,"58":1,"107":2}}],["this",{"2":{"1":1,"4":1,"6":1,"7":4,"11":2,"22":5,"23":2,"30":1,"31":3,"36":1,"39":1,"41":1,"43":4,"44":1,"49":1,"54":1,"57":1,"60":3,"65":1,"66":2,"69":18,"74":1,"75":1,"76":1,"87":4,"92":1,"93":1,"105":4,"106":4,"107":3,"109":2,"110":2,"111":2,"112":2,"113":2,"114":3,"115":1,"116":2,"117":2,"118":1,"119":2,"120":1,"121":1,"122":1,"123":2,"124":4,"125":1,"128":1,"129":1}}],["themselves",{"2":{"87":1}}],["them",{"2":{"32":1,"34":1,"43":1,"105":1}}],["themeconfig",{"2":{"14":3}}],["theme",{"2":{"13":1}}],["there",{"2":{"22":1,"37":1,"76":1,"100":1,"124":1,"128":1}}],["their",{"2":{"13":1,"14":1,"15":1,"16":1,"33":1,"38":1,"69":2,"71":1,"89":1,"118":1,"123":1}}],["they",{"2":{"13":1,"25":2,"41":1,"89":1,"105":2,"109":1}}],["these",{"2":{"8":1,"13":1,"15":1,"18":1,"34":1,"36":1,"69":1,"89":1,"99":1}}],["then",{"2":{"1":1,"29":1,"30":1,"50":2,"51":1,"76":2,"94":1,"106":1,"124":1,"128":1,"129":1}}],["the",{"0":{"26":1,"76":1},"2":{"1":6,"2":7,"3":3,"4":4,"6":3,"7":11,"8":1,"10":5,"11":8,"12":4,"13":10,"14":11,"15":2,"16":1,"17":1,"21":1,"22":38,"23":3,"24":1,"25":1,"27":4,"28":5,"29":4,"30":2,"31":4,"32":3,"33":2,"34":3,"36":3,"37":1,"38":3,"39":1,"40":3,"41":30,"42":1,"43":18,"44":7,"45":2,"46":3,"47":2,"48":7,"49":10,"50":4,"51":2,"52":1,"53":1,"54":3,"55":3,"56":2,"57":3,"58":7,"59":7,"60":3,"61":1,"62":1,"63":2,"65":1,"66":4,"67":2,"68":1,"69":37,"70":1,"71":4,"73":1,"74":4,"75":2,"76":6,"78":1,"83":11,"84":3,"87":26,"88":1,"89":1,"92":3,"93":2,"94":2,"95":1,"96":1,"98":1,"100":6,"102":11,"103":16,"105":4,"106":15,"107":22,"109":26,"110":8,"111":6,"112":6,"113":5,"114":6,"115":9,"116":20,"117":4,"118":5,"119":13,"120":4,"121":5,"122":3,"123":11,"124":4,"125":8,"126":1,"127":1,"129":1,"130":6}}],["sysctl",{"2":{"50":1}}],["systems",{"2":{"58":1}}],["system",{"0":{"84":1},"2":{"1":1,"18":1,"22":1,"29":2,"36":1,"39":1,"40":2,"43":4,"52":1,"84":5,"87":1,"102":1,"110":1,"111":2,"112":1,"113":1}}],["syncing",{"0":{"76":1}}],["synchronization",{"2":{"49":1,"76":1}}],["synced",{"2":{"48":1,"49":1,"76":1}}],["sync",{"2":{"48":8,"49":4,"76":4}}],["syncs",{"2":{"48":1}}],["src",{"2":{"43":1}}],["small",{"2":{"38":1,"61":1,"101":1}}],["sample",{"2":{"126":1,"127":1}}],["same",{"2":{"11":1,"14":2,"33":1,"40":1,"78":1,"83":1,"119":2,"123":5}}],["say",{"2":{"74":1}}],["save",{"2":{"22":3}}],["space",{"2":{"36":1,"43":1,"105":1,"114":1,"118":1}}],["spack",{"2":{"18":2}}],["spec",{"2":{"13":1}}],["specify",{"2":{"78":1}}],["specifying",{"2":{"41":1}}],["specified",{"2":{"41":1,"43":1,"48":1,"87":1,"102":3,"106":2,"107":3,"114":1,"116":6,"118":1,"125":2}}],["specifically",{"2":{"119":1}}],["specifics",{"2":{"51":1}}],["specific",{"2":{"2":1,"3":2,"22":1,"40":1,"41":2,"42":1,"44":1,"74":1,"78":1,"99":1,"102":1,"106":1,"107":1,"125":1}}],["special",{"2":{"6":1}}],["speed",{"2":{"2":1}}],["suitable",{"2":{"119":1}}],["suite",{"2":{"92":1}}],["suggest",{"2":{"105":1}}],["suffice",{"2":{"105":1}}],["success",{"2":{"106":1,"107":2,"109":1,"110":1,"111":1,"112":1,"113":1}}],["successful",{"2":{"47":1}}],["such",{"2":{"43":1,"99":1}}],["subcommand",{"2":{"123":1}}],["subsystem",{"2":{"91":1,"92":1}}],["subsequent",{"2":{"117":1}}],["subsequently",{"2":{"11":1}}],["subset",{"2":{"27":1}}],["subdirectories",{"2":{"43":1}}],["sure",{"2":{"22":1,"88":1,"123":1}}],["sudo",{"2":{"18":1}}],["suppose",{"2":{"123":1}}],["supporting",{"2":{"89":1}}],["supports",{"2":{"31":2,"78":1}}],["supported",{"0":{"21":1},"2":{"14":1,"31":1,"51":1,"83":1,"91":1}}],["support",{"0":{"91":1,"92":1},"2":{"1":1,"11":1,"14":1,"40":1,"43":1,"45":1,"70":1,"91":1,"92":1,"99":2,"106":1}}],["supplanted",{"2":{"11":1}}],["supplying",{"2":{"4":1}}],["ssg",{"2":{"11":1}}],["stderr",{"2":{"117":1}}],["stdout",{"2":{"109":1,"117":1}}],["storing",{"2":{"54":1}}],["stop",{"2":{"48":1}}],["strategy",{"2":{"126":1}}],["stratus3d",{"2":{"97":1}}],["string",{"2":{"22":2,"41":1,"58":1,"69":2,"79":1,"80":1,"81":1,"82":1,"105":1,"116":2}}],["str",{"2":{"22":2}}],["steps",{"2":{"18":1,"32":1,"68":1,"69":1,"126":1}}],["standard",{"2":{"124":2}}],["status",{"2":{"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1}}],["static",{"2":{"1":1,"11":1}}],["stable",{"0":{"79":1,"82":1,"109":1},"2":{"41":5,"68":1,"79":1,"82":1,"102":2,"109":6,"128":1}}],["starting",{"2":{"22":1}}],["started",{"0":{"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1},"2":{"32":1,"62":1,"100":1}}],["start",{"2":{"11":1,"100":1}}],["style",{"2":{"7":1}}],["script",{"2":{"22":2,"40":1,"87":3,"100":1,"102":2,"103":1,"105":5,"106":8,"107":9,"109":5,"110":3,"111":3,"112":3,"113":3,"114":3,"115":2,"116":2,"117":3,"118":2,"119":4,"120":2,"121":2,"122":2,"123":1,"127":2}}],["scripts",{"0":{"101":1,"102":1,"104":1,"108":1},"1":{"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1},"2":{"1":2,"2":4,"5":2,"11":1,"22":1,"36":1,"55":1,"87":1,"99":2,"100":2,"101":1,"102":2,"103":2,"123":3}}],["scope",{"2":{"7":1}}],["silent",{"2":{"128":1}}],["signature",{"2":{"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["single",{"2":{"33":1,"40":1,"43":1,"109":1,"119":2}}],["since",{"2":{"7":1,"48":2,"66":1}}],["simply",{"2":{"119":1}}],["simplicity",{"2":{"40":1}}],["simplify",{"2":{"13":1,"33":1}}],["simplifying",{"2":{"6":1}}],["simple",{"2":{"33":1,"59":1,"87":1}}],["similar",{"2":{"32":1,"36":1}}],["si",{"2":{"21":1}}],["sidebars",{"2":{"13":1,"14":3}}],["sidebar",{"2":{"13":1,"14":5}}],["site",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1},"2":{"9":1,"10":1,"11":2,"13":2}}],["sorting",{"2":{"105":2}}],["sort",{"2":{"101":1,"105":4}}],["sourcing",{"2":{"22":2,"52":1,"94":1}}],["sourced",{"2":{"22":2,"87":1,"94":2,"103":1,"123":1}}],["source",{"2":{"22":5,"47":3,"49":1,"50":1,"57":1,"69":11,"78":1,"87":2,"102":1,"103":4,"106":5,"107":3,"120":2,"123":1}}],["something",{"2":{"39":1}}],["some",{"2":{"6":3,"7":3,"8":1,"15":1,"18":1,"25":1,"29":1,"66":1,"88":1,"89":1,"90":1,"91":1,"99":1,"105":1,"119":1}}],["so",{"2":{"4":1,"14":1,"22":1,"25":1,"28":1,"59":10,"69":2,"74":1,"105":1}}],["sent",{"2":{"117":1}}],["sed",{"2":{"105":1,"111":1}}],["security",{"2":{"89":1}}],["section",{"2":{"22":1,"29":1,"60":1,"83":1,"84":1}}],["selected",{"2":{"87":1}}],["selection",{"2":{"14":1,"22":1}}],["session",{"2":{"83":2}}],["separating",{"2":{"43":1}}],["separated",{"2":{"13":1,"14":1,"105":1,"114":1,"118":1}}],["search",{"2":{"15":1}}],["server",{"2":{"11":1}}],["servers",{"2":{"8":1}}],["semantic",{"2":{"7":1,"46":2}}],["semver",{"2":{"7":4,"109":1}}],["see",{"2":{"2":1,"3":1,"4":1,"13":1,"15":2,"16":1,"22":2,"27":1,"31":1,"32":1,"37":1,"38":1,"39":1,"48":1,"51":1,"70":1,"73":1,"76":2,"83":1,"93":1,"98":1,"101":1,"102":2,"103":1,"120":1,"121":1,"122":1}}],["setting",{"2":{"17":1,"48":1,"52":1,"103":1,"107":1}}],["settings",{"2":{"4":1,"5":1}}],["set",{"0":{"28":1,"83":1},"1":{"29":1,"30":1,"31":1},"2":{"2":1,"11":1,"14":1,"22":4,"24":1,"29":1,"34":2,"41":7,"43":2,"44":1,"50":1,"52":2,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"69":3,"76":1,"83":3,"84":3,"88":1,"94":1,"107":1,"109":2,"110":1,"111":1,"112":1,"113":1,"119":1,"123":2}}],["setup",{"0":{"1":1,"10":1,"62":1},"2":{"22":4,"59":1,"92":1,"100":1}}],["ships",{"2":{"67":1}}],["shim",{"0":{"67":1,"124":1},"2":{"34":1,"41":3,"63":1,"66":1,"67":4,"87":2,"93":1,"115":2,"116":6,"124":3}}],["shims",{"0":{"87":1,"88":1,"94":1},"1":{"88":1},"2":{"2":1,"3":1,"33":1,"34":1,"36":1,"41":1,"56":1,"58":1,"66":3,"67":1,"87":4,"88":1,"93":3,"102":1,"107":1,"114":4,"115":1,"117":1,"124":1}}],["sharable",{"2":{"42":1}}],["share",{"2":{"33":1,"65":1}}],["sh",{"2":{"22":18,"52":1,"58":1,"69":16,"87":3,"94":1,"127":1}}],["shows",{"2":{"44":1}}],["show",{"0":{"82":1},"2":{"28":1,"41":3,"82":1}}],["shorthand",{"2":{"75":1}}],["short",{"0":{"49":1,"73":1,"76":1},"2":{"15":1,"44":1,"48":1,"49":5,"59":1,"71":2,"73":1,"76":2,"110":1}}],["shortname",{"0":{"130":1},"2":{"15":1,"73":1,"130":2}}],["should",{"2":{"3":1,"25":2,"52":1,"54":1,"60":1,"68":1,"92":1,"101":1,"103":1,"105":2,"106":5,"107":5,"109":7,"110":5,"111":4,"112":4,"113":4,"114":1,"115":1,"116":1,"117":1,"118":1,"119":2}}],["shgit",{"2":{"4":2}}],["shfmt",{"2":{"1":4}}],["shellcmd=",{"2":{"128":1}}],["shellcheck",{"2":{"1":3}}],["shell$",{"2":{"123":1}}],["shellfoo",{"2":{"123":1}}],["shellusage",{"2":{"116":1}}],["shelluse",{"2":{"69":3}}],["shellif",{"2":{"69":2}}],["shellpacman",{"2":{"69":4}}],["shellbrew",{"2":{"69":5}}],["shellrm",{"2":{"69":25}}],["shell➜",{"2":{"67":2}}],["shellexport",{"2":{"22":2}}],["shellecho",{"2":{"22":8}}],["shellmkdir",{"2":{"22":4}}],["shellsource",{"2":{"22":2,"69":3}}],["shells",{"2":{"22":1,"37":1}}],["shellgit",{"2":{"20":1}}],["shelldocs",{"2":{"14":1}}],["shellnpm",{"2":{"10":1,"11":2}}],["shellasdf",{"2":{"1":2,"10":2,"26":1,"27":1,"29":1,"30":1,"63":1,"64":1,"65":1,"66":1,"67":1,"71":2,"72":2,"73":1,"74":2,"78":1,"79":2,"80":2,"81":2,"82":2,"83":2,"84":1,"85":1,"86":1,"125":1,"127":1}}],["shell",{"0":{"94":1},"2":{"1":3,"2":1,"5":1,"6":1,"10":1,"22":21,"34":1,"36":1,"40":2,"41":3,"52":2,"59":1,"65":1,"69":9,"83":4,"84":1,"87":2,"94":1,"101":1,"130":1}}],["s",{"2":{"1":2,"6":2,"10":2,"13":1,"18":1,"22":8,"33":1,"44":1,"45":1,"69":3,"88":1,"105":1,"116":2,"119":1,"121":2,"123":1,"124":1,"125":2}}],["c",{"2":{"127":1}}],["cmd=",{"2":{"128":2}}],["cmd",{"2":{"103":1,"123":1}}],["credits",{"0":{"96":1}}],["creating",{"2":{"12":1,"70":1,"83":1,"100":1}}],["creates",{"2":{"87":1}}],["created",{"2":{"34":1,"66":1,"93":1,"107":1}}],["create",{"0":{"99":1},"1":{"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1},"2":{"2":1,"7":3,"36":1,"40":1,"51":1,"93":2,"102":1,"114":3,"123":1,"129":1}}],["cpuinfo",{"2":{"50":1}}],["centos",{"2":{"25":1}}],["cd",{"2":{"21":1}}],["currently",{"2":{"41":1,"74":1,"92":1}}],["current",{"0":{"83":1,"85":1},"2":{"28":3,"30":1,"37":1,"41":7,"63":1,"66":1,"83":2,"84":1,"85":4,"87":1,"92":1,"115":1,"116":1}}],["curl",{"2":{"18":7,"25":2,"111":1,"128":1}}],["customize",{"2":{"127":1}}],["customised",{"2":{"107":1}}],["customisations",{"2":{"42":1}}],["custom",{"0":{"124":1},"2":{"22":2,"43":1,"51":2,"59":6,"102":1,"105":1,"124":1}}],["customarguments",{"2":{"4":1}}],["cleaning",{"2":{"75":1}}],["cli",{"0":{"123":1},"2":{"33":1,"39":1,"66":1}}],["class",{"2":{"14":1}}],["cloned",{"2":{"2":1}}],["clone",{"2":{"1":5,"10":5,"20":1,"21":1,"49":1,"52":1,"100":1,"127":1}}],["ci",{"2":{"7":1,"125":2,"127":1,"129":1}}],["capability",{"2":{"105":1}}],["captured",{"2":{"14":1}}],["calculated",{"2":{"59":1}}],["calculate",{"2":{"50":1}}],["callable",{"2":{"102":1,"123":1}}],["call",{"2":{"101":1,"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":2,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["callback",{"2":{"87":1,"120":1,"121":1,"122":1}}],["calls",{"2":{"22":1,"87":1}}],["called",{"2":{"7":1,"22":1,"51":1,"100":1,"119":1,"124":1}}],["causes",{"2":{"43":1}}],["causing",{"2":{"22":1}}],["cat",{"2":{"119":1}}],["categories",{"2":{"32":1}}],["catalina",{"2":{"22":2,"69":1}}],["case",{"2":{"31":1,"45":1,"69":1,"92":1}}],["cannot",{"2":{"93":1}}],["candidate",{"2":{"46":2,"109":1}}],["candidates",{"0":{"46":1},"2":{"44":1,"59":1}}],["can",{"2":{"2":1,"6":1,"8":1,"22":1,"27":2,"28":1,"32":2,"33":2,"37":1,"40":1,"43":5,"44":1,"45":1,"49":1,"51":1,"53":1,"54":1,"55":1,"56":1,"61":1,"67":1,"69":1,"75":1,"76":1,"78":1,"83":1,"84":1,"87":2,"88":1,"107":1,"112":1,"120":1,"123":2,"130":1}}],["changing",{"2":{"22":2}}],["changed",{"2":{"22":2,"69":1}}],["changelog",{"2":{"7":1}}],["change",{"2":{"2":1,"7":3}}],["changes",{"2":{"2":1,"12":1,"22":1}}],["chosen",{"2":{"11":1,"92":1}}],["chore",{"2":{"7":1}}],["chrome",{"2":{"10":1}}],["checked",{"2":{"125":1}}],["check",{"0":{"48":1},"2":{"2":1,"25":1,"33":1,"44":1,"48":1,"59":1,"76":1,"88":1,"103":1,"107":2}}],["copy",{"2":{"124":1}}],["copyright",{"2":{"96":1}}],["could",{"2":{"109":1,"125":1}}],["cough",{"2":{"96":1}}],["course",{"2":{"40":1}}],["cold",{"2":{"96":1}}],["collection",{"2":{"39":1}}],["collaborative",{"2":{"15":1,"89":1}}],["cool",{"2":{"85":1}}],["correctly",{"2":{"125":1}}],["correct",{"2":{"60":1,"105":1}}],["cores",{"2":{"50":3,"57":1,"103":1,"107":1}}],["coreutils",{"2":{"18":2}}],["core",{"0":{"23":1,"61":1},"1":{"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1},"2":{"0":1,"1":2,"2":1,"5":1,"6":1,"12":1,"15":2,"17":1,"22":3,"23":1,"32":2,"34":1,"55":1,"61":1,"89":2,"101":1,"105":2,"106":1,"107":2,"109":2,"110":3,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":2,"118":1,"119":1,"120":1,"121":1,"122":1,"124":1}}],["conditionally",{"2":{"116":2}}],["considered",{"2":{"111":1,"112":1,"113":1}}],["concurrency=32",{"2":{"57":1}}],["concurrency",{"0":{"50":1,"57":1},"2":{"44":1,"50":1,"57":2,"59":3,"103":1,"107":1}}],["conversations",{"2":{"16":1}}],["conventional",{"0":{"7":1,"12":1},"2":{"7":3,"12":2}}],["continue",{"2":{"23":1}}],["contributors",{"0":{"98":1},"2":{"95":1,"98":1}}],["contributing",{"2":{"16":1}}],["contribution",{"2":{"0":1,"9":1,"12":1}}],["controllable",{"2":{"22":1}}],["contents",{"2":{"119":1}}],["content",{"2":{"14":1,"60":1}}],["container",{"2":{"89":2}}],["contained",{"2":{"13":1,"33":1}}],["containing",{"2":{"43":2,"114":2}}],["contains",{"2":{"11":1,"125":1}}],["configs",{"2":{"13":1,"14":2}}],["config",{"0":{"53":1,"112":1,"127":1},"2":{"4":1,"13":4,"14":5,"17":1,"22":38,"31":1,"40":1,"44":1,"53":2,"55":1,"57":2,"59":2,"69":28,"76":2,"94":2,"102":1,"112":1}}],["configured",{"2":{"22":16,"69":2,"76":1}}],["configure",{"2":{"4":2,"46":1,"47":1,"48":1}}],["configurations",{"2":{"33":1}}],["configuration",{"0":{"42":1,"59":1,"60":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1},"2":{"3":1,"11":1,"13":2,"18":1,"22":1,"31":2,"33":1,"34":1,"39":1,"42":1,"44":1,"53":1,"59":7,"60":1,"76":1,"83":1,"102":1,"112":1,"118":1}}],["covered",{"2":{"62":1,"110":1}}],["cover",{"2":{"2":1}}],["codespaces",{"2":{"89":1}}],["code",{"2":{"2":2,"11":2,"47":3,"50":1,"51":2,"57":1,"89":1,"102":1,"103":2,"106":4,"107":3,"128":1,"129":1}}],["compatibility",{"2":{"107":1}}],["compiling",{"2":{"50":1,"57":1,"78":1,"103":1,"107":1}}],["compilation",{"2":{"50":1}}],["compiled",{"2":{"43":1}}],["compile",{"2":{"43":1,"112":1}}],["compinit",{"2":{"22":7,"69":2}}],["compete",{"2":{"36":1}}],["completes",{"2":{"23":1,"32":1}}],["complete",{"0":{"23":1,"32":1},"2":{"119":1}}],["completer~",{"2":{"22":3,"69":3}}],["completer",{"2":{"22":3,"69":3}}],["completion",{"2":{"22":6,"69":5}}],["completions",{"2":{"22":29,"69":13}}],["compliant",{"2":{"1":1}}],["combinations",{"2":{"22":1}}],["comment",{"2":{"43":2}}],["comments",{"2":{"43":1}}],["common",{"2":{"29":1,"90":1}}],["community",{"0":{"21":1,"89":1},"2":{"15":3,"89":3}}],["command>",{"2":{"41":4,"63":1,"64":1,"67":1,"116":1,"127":1}}],["command",{"2":{"2":1,"4":1,"18":1,"21":1,"22":1,"41":4,"46":1,"47":1,"51":3,"60":1,"61":1,"63":1,"65":1,"67":1,"68":1,"69":18,"83":1,"93":1,"101":1,"115":5,"116":5,"118":1,"119":1,"120":1,"121":1,"122":1,"123":12,"125":5,"126":1,"128":1}}],["commands",{"0":{"41":1,"123":1},"2":{"2":2,"18":1,"32":2,"36":1,"41":1,"48":1,"49":1,"51":1,"76":1,"87":1,"99":1,"101":3,"102":1,"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"123":9}}],["committing",{"2":{"11":1}}],["commits",{"0":{"7":1,"12":1},"2":{"12":1}}],["commit",{"2":{"2":1,"7":5,"12":1,"41":2,"43":1,"68":1,"74":1,"78":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1,"125":1}}],["com",{"2":{"1":5,"10":3,"20":1,"26":1,"41":2,"71":1,"72":2,"113":1,"125":1,"127":1,"130":1}}],["omitted",{"2":{"109":1}}],["our",{"2":{"68":1,"101":1}}],["outlined",{"2":{"84":1}}],["outcomes",{"2":{"59":1}}],["outputs",{"2":{"6":1,"109":2}}],["output",{"2":{"6":1,"41":1,"102":6,"105":1,"109":3,"110":5,"111":3,"112":4,"113":3,"114":2,"116":1,"117":3,"118":1,"119":1}}],["out",{"2":{"2":1,"69":2,"92":1,"125":1}}],["occur",{"2":{"48":1,"49":1,"76":1}}],["occurs",{"2":{"28":1,"48":1}}],["override",{"2":{"116":2}}],["overview",{"0":{"102":1,"103":1,"110":1},"2":{"102":1,"110":1,"111":1,"112":1,"113":1}}],["over",{"2":{"39":1,"57":1}}],["own",{"2":{"39":1,"89":1,"100":2,"105":1}}],["old",{"2":{"33":1}}],["observe",{"2":{"28":1}}],["objects",{"2":{"13":2}}],["operating",{"2":{"102":1,"110":1,"111":2,"112":1,"113":1}}],["opening",{"2":{"22":1}}],["option",{"2":{"76":2,"118":1}}],["options",{"2":{"31":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"100":1}}],["optional",{"0":{"108":1},"1":{"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1},"2":{"7":2,"41":1,"106":1,"107":1,"109":1,"112":1,"125":3}}],["optionally",{"2":{"4":1,"41":3,"110":1,"111":1,"112":1,"113":1}}],["opt",{"2":{"22":9,"69":3}}],["ohmyzsh",{"2":{"22":4}}],["oh",{"2":{"22":5,"94":1}}],["otherwise",{"2":{"116":2}}],["others",{"2":{"109":1}}],["other",{"2":{"11":1,"31":1,"43":1,"45":1,"58":2,"101":1,"112":1}}],["osx",{"2":{"127":1}}],["oss",{"2":{"22":1,"29":1}}],["os",{"2":{"3":1,"18":1,"25":1,"41":1,"65":1,"126":2,"127":1}}],["often",{"2":{"105":1}}],["offscreen",{"2":{"105":1}}],["officially",{"2":{"91":1}}],["official",{"0":{"20":1},"2":{"13":1,"14":1,"21":1,"91":1}}],["of",{"2":{"1":1,"2":2,"4":1,"7":2,"8":1,"13":1,"14":1,"15":1,"17":1,"18":1,"22":5,"23":1,"27":3,"28":3,"31":1,"32":3,"33":2,"34":3,"36":1,"39":3,"40":3,"41":10,"42":1,"43":2,"45":1,"46":1,"48":1,"49":2,"50":3,"54":1,"55":2,"56":1,"57":1,"58":3,"59":2,"66":5,"67":1,"71":1,"73":1,"74":2,"75":2,"84":2,"87":5,"89":1,"91":1,"93":1,"94":2,"96":1,"98":1,"101":2,"102":7,"103":6,"105":1,"106":1,"107":7,"109":9,"110":1,"111":2,"112":1,"113":2,"114":2,"116":2,"117":2,"118":2,"119":2,"120":1,"123":3,"124":1,"125":1}}],["order",{"2":{"105":3}}],["ordering",{"2":{"22":1}}],["origin",{"2":{"74":1}}],["org",{"2":{"21":1}}],["organisation",{"2":{"15":1}}],["or",{"2":{"1":3,"2":1,"3":1,"8":1,"10":2,"11":1,"21":1,"22":9,"27":1,"28":1,"32":1,"38":1,"41":6,"43":3,"47":4,"49":1,"50":1,"51":4,"56":1,"58":1,"60":1,"68":1,"69":2,"71":1,"78":1,"83":1,"84":1,"87":1,"88":1,"89":2,"94":1,"101":1,"102":3,"103":4,"106":7,"107":3,"109":5,"110":2,"111":2,"112":5,"113":3,"114":2,"115":2,"116":2,"117":1,"118":2,"119":3,"123":2,"125":1,"128":1}}],["one",{"2":{"33":1,"34":1,"41":1,"105":2,"110":1,"111":1,"113":2}}],["once",{"2":{"23":1,"34":1,"100":1,"107":1}}],["only",{"2":{"11":1,"23":1,"83":2,"92":1,"106":1,"107":1,"110":1,"118":1,"124":2,"129":1}}],["ongoing",{"2":{"8":1}}],["on",{"2":{"1":2,"4":1,"7":1,"10":2,"11":1,"12":1,"18":1,"22":3,"31":1,"37":1,"41":4,"43":1,"48":2,"49":1,"51":1,"52":1,"58":2,"59":1,"68":2,"74":1,"83":1,"87":1,"92":2,"98":1,"103":1,"105":4,"106":1,"109":1,"119":1,"125":1,"126":3,"128":1}}],["aware",{"2":{"124":1}}],["awk",{"2":{"105":1}}],["avoid",{"2":{"101":1,"107":1}}],["available",{"0":{"81":1},"2":{"11":1,"27":2,"41":1,"45":1,"87":1,"92":1,"103":2,"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["access",{"2":{"129":1}}],["accessing",{"2":{"128":1}}],["accessed",{"2":{"87":1}}],["accept",{"2":{"109":1,"119":1}}],["actual",{"2":{"27":1,"43":1}}],["actions",{"0":{"16":1},"2":{"16":1,"92":1,"126":3}}],["action",{"0":{"126":1},"2":{"7":2,"40":1,"126":1}}],["again",{"2":{"39":1}}],["aims",{"2":{"39":1}}],["absent",{"2":{"106":1,"107":1,"109":1}}],["absence",{"2":{"28":1}}],["absolutely",{"2":{"124":1}}],["absolute",{"2":{"53":1,"55":1,"56":1}}],["aborted",{"2":{"76":1}}],["above",{"2":{"52":1,"84":1}}],["about",{"2":{"22":1,"60":1,"102":1,"110":1}}],["after",{"2":{"22":2,"47":2,"51":3,"94":2,"102":2,"120":1,"121":1}}],["affect",{"2":{"22":1}}],["aforementioned",{"2":{"14":1}}],["argument",{"2":{"109":2,"119":1}}],["arguments",{"2":{"43":1}}],["args",{"2":{"41":1,"51":1,"63":1,"115":1,"116":1}}],["arg",{"2":{"22":6,"69":6}}],["archlinux",{"2":{"21":1}}],["are",{"2":{"1":1,"2":1,"7":1,"8":1,"10":1,"13":1,"14":1,"22":16,"25":1,"27":1,"29":2,"30":1,"32":1,"33":1,"34":2,"36":1,"40":1,"41":1,"48":1,"49":1,"51":2,"60":1,"66":1,"67":1,"70":1,"74":1,"76":1,"87":3,"89":2,"90":1,"99":1,"100":1,"103":2,"105":4,"109":1,"117":1,"123":1,"125":1}}],["augments",{"2":{"37":1}}],["aur",{"2":{"21":2,"22":1,"52":1,"68":1}}],["authentication",{"2":{"128":1,"129":1}}],["authorization",{"2":{"128":1}}],["authors",{"2":{"95":1,"123":1}}],["authored",{"2":{"15":1}}],["autoremove",{"2":{"69":1}}],["auto",{"2":{"44":1,"50":1,"59":1}}],["autocompletions",{"2":{"22":1}}],["autoload",{"2":{"22":1,"69":1}}],["automatically",{"2":{"7":1,"18":1,"22":8,"88":1,"93":1}}],["automated",{"2":{"1":1,"7":1,"12":1,"128":1}}],["api",{"0":{"128":1,"129":1},"1":{"129":1},"2":{"33":1,"70":1,"128":3,"129":1}}],["applies",{"2":{"118":1}}],["applied",{"2":{"105":1}}],["appropriate",{"2":{"117":1}}],["approach",{"2":{"39":1}}],["appear",{"2":{"92":1}}],["append",{"2":{"22":4}}],["apps",{"2":{"8":1}}],["apt",{"2":{"18":1,"25":1}}],["aptitude",{"2":{"18":1}}],["alternatively",{"2":{"83":1}}],["also",{"2":{"43":1,"87":1,"120":1,"121":1,"122":1,"124":1}}],["already",{"2":{"29":1,"49":1,"105":1,"107":1,"110":1}}],["almalinux",{"2":{"25":1}}],["always",{"0":{"47":1},"2":{"15":1,"44":1,"59":1,"119":1}}],["alpine",{"2":{"8":1}}],["allows",{"2":{"116":1,"124":1}}],["allow",{"2":{"66":1}}],["allowing",{"2":{"34":1}}],["all",{"0":{"41":1,"73":1,"81":1,"105":1},"2":{"2":1,"22":1,"27":2,"28":1,"32":1,"33":2,"36":1,"41":10,"43":1,"48":1,"49":2,"69":14,"73":1,"74":1,"75":1,"76":1,"81":4,"99":1,"102":2,"103":3,"105":7,"106":2,"109":4,"117":2,"128":1}}],["amongst",{"2":{"109":1}}],["amannn",{"2":{"7":1}}],["amp",{"0":{"7":1,"9":1,"12":1,"62":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1},"2":{"6":1,"9":1,"11":1,"18":1,"21":4,"22":24,"24":1,"28":1,"68":1,"69":14,"78":1,"92":1,"95":1,"102":1,"105":1,"109":1,"114":1,"125":2}}],["at",{"2":{"6":1,"22":1,"27":1,"41":1,"43":1,"94":1,"125":1}}],["advanced",{"2":{"4":1}}],["addition",{"2":{"124":1}}],["adding",{"2":{"22":3}}],["added",{"2":{"43":1,"102":1,"120":1}}],["add",{"0":{"71":1,"120":1},"2":{"1":4,"2":1,"10":2,"22":23,"26":1,"31":1,"41":3,"48":2,"49":2,"51":2,"71":5,"76":1,"91":1,"102":1,"120":6,"129":1,"130":3}}],["a",{"0":{"24":1,"27":1,"28":1,"99":1},"1":{"25":1,"26":1,"29":1,"30":1,"31":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1},"2":{"1":1,"2":1,"4":2,"7":5,"12":1,"13":1,"14":1,"15":1,"17":2,"18":1,"22":13,"23":2,"27":4,"28":5,"29":2,"30":1,"31":1,"33":3,"34":2,"36":1,"37":2,"38":1,"39":4,"40":5,"41":15,"43":10,"48":3,"49":2,"51":5,"52":1,"59":2,"65":2,"66":2,"67":1,"68":3,"69":1,"74":1,"75":3,"76":2,"78":2,"79":1,"80":1,"81":1,"82":1,"83":3,"87":3,"89":2,"92":2,"93":1,"99":3,"100":1,"102":10,"105":5,"106":4,"107":5,"109":8,"110":2,"111":1,"112":1,"113":2,"114":1,"116":2,"117":1,"118":2,"119":3,"120":1,"123":4,"124":1,"125":1,"126":2,"127":2,"128":2,"129":1,"130":1}}],["another",{"2":{"43":1,"127":1}}],["any",{"2":{"40":1,"43":1,"53":1,"54":1,"55":1,"56":1,"58":1,"66":1,"69":1,"87":1,"94":1,"105":1,"107":1,"110":2,"112":2,"118":1,"119":1}}],["an",{"2":{"6":1,"7":1,"8":1,"11":1,"12":1,"41":2,"43":1,"53":1,"55":1,"56":1,"59":1,"67":1,"83":3,"84":1,"93":1,"115":1,"116":1,"123":1,"124":4,"128":3}}],["analysis",{"2":{"1":1}}],["and",{"2":{"1":2,"2":4,"7":1,"8":1,"10":1,"11":1,"13":2,"14":2,"15":1,"16":1,"17":1,"22":5,"23":1,"29":1,"31":1,"33":4,"34":2,"36":3,"37":1,"38":2,"39":3,"40":3,"41":9,"42":1,"43":4,"51":1,"52":2,"54":1,"56":1,"58":1,"60":1,"65":1,"67":2,"69":10,"74":1,"76":1,"78":1,"87":4,"92":1,"94":1,"100":2,"106":3,"107":3,"109":2,"110":4,"111":3,"112":4,"113":4,"119":1}}],["assume",{"2":{"106":1,"107":1}}],["association",{"2":{"71":1}}],["associated",{"2":{"15":1,"22":2}}],["aspects",{"2":{"91":1}}],["as",{"2":{"1":1,"6":1,"8":1,"11":1,"14":1,"22":3,"25":1,"36":1,"41":1,"42":2,"59":1,"60":1,"67":1,"69":2,"71":1,"75":1,"76":1,"84":1,"87":1,"89":1,"99":1,"100":1,"105":3,"106":2,"109":1,"110":1,"117":1,"123":7,"124":3}}],["asdfrc",{"0":{"44":1},"1":{"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1},"2":{"31":1,"42":1,"44":2,"53":3,"59":8,"69":14,"76":1,"118":1}}],["asdf~",{"2":{"22":6,"69":6}}],["asdf",{"0":{"0":1,"19":1,"22":1,"40":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"76":1,"88":1,"123":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"20":1,"21":1},"2":{"0":1,"1":13,"2":1,"3":2,"4":1,"7":1,"8":3,"10":8,"11":1,"12":1,"15":7,"16":1,"17":3,"18":1,"20":3,"21":3,"22":112,"23":2,"24":1,"25":1,"26":2,"27":4,"28":3,"29":2,"31":3,"32":5,"33":2,"34":2,"36":2,"37":3,"38":1,"39":2,"40":3,"41":43,"42":1,"43":6,"44":2,"46":1,"47":1,"48":4,"49":6,"50":1,"51":4,"52":3,"53":2,"54":1,"55":4,"56":5,"57":3,"58":6,"59":13,"60":3,"61":1,"65":1,"66":1,"67":3,"68":6,"69":118,"70":1,"71":3,"72":5,"74":1,"75":1,"76":4,"78":1,"79":2,"80":2,"81":2,"82":2,"83":8,"84":2,"85":3,"86":1,"87":11,"88":2,"89":7,"90":1,"91":1,"93":4,"94":3,"95":1,"99":3,"100":4,"101":2,"102":1,"103":11,"105":5,"106":15,"107":18,"109":17,"110":11,"111":9,"112":9,"113":9,"114":15,"115":9,"116":11,"117":3,"118":6,"119":3,"120":9,"121":10,"122":8,"123":12,"124":3,"125":10,"126":4,"127":6,"130":5}}],["great",{"2":{"123":1}}],["go",{"2":{"119":1}}],["golangs",{"2":{"119":1}}],["golden",{"0":{"101":1}}],["goes",{"2":{"14":1}}],["gives",{"2":{"93":1}}],["given",{"2":{"41":1,"79":1,"80":1,"81":1,"82":1}}],["gitref",{"2":{"125":2}}],["gitlens",{"2":{"4":2}}],["gitignore",{"0":{"3":1},"2":{"3":3}}],["git",{"0":{"4":1},"2":{"1":8,"4":6,"10":5,"18":7,"20":1,"21":3,"22":8,"26":1,"30":1,"33":1,"41":6,"48":1,"49":1,"52":1,"59":1,"68":2,"69":5,"71":3,"72":2,"99":1,"103":3,"105":2,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1,"121":3,"125":3,"127":2,"130":3}}],["github",{"0":{"16":1,"126":1,"129":1},"2":{"1":7,"7":1,"10":5,"15":1,"20":1,"26":1,"41":2,"43":1,"71":1,"72":2,"89":2,"92":1,"98":1,"113":1,"125":1,"126":3,"127":1,"129":1,"130":1}}],["g",{"2":{"33":1,"66":1,"93":1,"117":1}}],["gnupg2",{"2":{"25":1}}],["gawk",{"2":{"25":3}}],["gpg",{"2":{"25":2}}],["general",{"2":{"102":1,"110":1}}],["generally",{"2":{"52":1}}],["generator",{"2":{"11":1}}],["generated",{"2":{"100":1}}],["generate",{"2":{"7":1,"100":1}}],["get",{"2":{"25":1,"100":1,"116":2}}],["getting",{"0":{"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1},"2":{"32":1,"62":1}}],["gt",{"2":{"6":1,"7":2,"12":1,"43":1,"48":3,"49":4,"51":5,"58":1,"66":2,"76":1,"84":1,"99":3,"100":2,"105":2,"106":2,"107":3,"109":5,"110":2,"111":2,"112":2,"113":5,"114":3,"115":3,"116":3,"117":2,"120":1,"121":2,"122":1,"125":7}}],["global",{"0":{"29":1},"2":{"3":1,"17":1,"29":3,"41":4,"43":2,"66":1,"83":5,"84":1,"87":1,"109":2,"117":1}}],["guidelines",{"2":{"16":1}}],["guide",{"0":{"32":1},"2":{"0":1,"9":1,"12":1,"23":1,"29":1,"32":1,"62":1,"69":2}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/@localSearchIndexzh-hans.BveK1egn.js b/assets/chunks/@localSearchIndexzh-hans.BveK1egn.js new file mode 100644 index 00000000..a9a59937 --- /dev/null +++ b/assets/chunks/@localSearchIndexzh-hans.BveK1egn.js @@ -0,0 +1 @@ +const t='{"documentCount":112,"nextId":112,"documentIds":{"0":"/zh-hans/contribute/core.html#asdf","1":"/zh-hans/contribute/core.html#初始化安装","2":"/zh-hans/contribute/core.html#开发","3":"/zh-hans/contribute/core.html#bats-测试","4":"/zh-hans/contribute/core.html#拉取请求、发布以及约定式提交","5":"/zh-hans/contribute/core.html#docker-镜像","6":"/zh-hans/contribute/documentation.html#文档-网站","7":"/zh-hans/contribute/documentation.html#初始化设置","8":"/zh-hans/contribute/documentation.html#开发","9":"/zh-hans/contribute/documentation.html#拉取请求、发布以及约定式提交","10":"/zh-hans/contribute/documentation.html#vuepress","11":"/zh-hans/contribute/documentation.html#i18n-国际化","12":"/zh-hans/contribute/first-party-plugins.html#官方插件","13":"/zh-hans/contribute/github-actions.html#github-actions","14":"/zh-hans/guide/getting-started.html#快速入门","15":"/zh-hans/guide/getting-started.html#_1-安装依赖","16":"/zh-hans/guide/getting-started.html#_2-下载-asdf","17":"/zh-hans/guide/getting-started.html#official-download","18":"/zh-hans/guide/getting-started.html#community-supported-download-methods","19":"/zh-hans/guide/getting-started.html#_3-安装-asdf","20":"/zh-hans/guide/getting-started.html#核心安装完成","21":"/zh-hans/guide/getting-started.html#_4-安装插件","22":"/zh-hans/guide/getting-started.html#插件依赖","23":"/zh-hans/guide/getting-started.html#安装插件","24":"/zh-hans/guide/getting-started.html#_5-安装指定版本","25":"/zh-hans/guide/getting-started.html#_6-设置默认版本","26":"/zh-hans/guide/getting-started.html#全局","27":"/zh-hans/guide/getting-started.html#本地","28":"/zh-hans/guide/getting-started.html#使用现有工具版本文件","29":"/zh-hans/guide/getting-started.html#完成指南","30":"/zh-hans/guide/introduction.html#项目简介","31":"/zh-hans/guide/introduction.html#它是如何工作的","32":"/zh-hans/guide/introduction.html#相关项目","33":"/zh-hans/guide/introduction.html#nvm-n-rbenv-等","34":"/zh-hans/guide/introduction.html#direnv","35":"/zh-hans/guide/introduction.html#homebrew","36":"/zh-hans/guide/introduction.html#nixos","37":"/zh-hans/guide/introduction.html#为什么使用-asdf","38":"/zh-hans/manage/commands.html#所有命令","39":"/zh-hans/manage/configuration.html#配置","40":"/zh-hans/manage/configuration.html#tool-versions","41":"/zh-hans/manage/configuration.html#home-asdfrc","42":"/zh-hans/manage/configuration.html#legacy-version-file","43":"/zh-hans/manage/configuration.html#use-release-candidates","44":"/zh-hans/manage/configuration.html#always-keep-download","45":"/zh-hans/manage/configuration.html#plugin-repository-last-check-duration","46":"/zh-hans/manage/configuration.html#环境变量","47":"/zh-hans/manage/configuration.html#内部配置","48":"/zh-hans/manage/core.html#核心","49":"/zh-hans/manage/core.html#安装和配置","50":"/zh-hans/manage/core.html#exec","51":"/zh-hans/manage/core.html#env","52":"/zh-hans/manage/core.html#info","53":"/zh-hans/manage/core.html#reshim","54":"/zh-hans/manage/core.html#shim-versions","55":"/zh-hans/manage/core.html#更新","56":"/zh-hans/manage/core.html#卸载","57":"/zh-hans/manage/plugins.html#插件","58":"/zh-hans/manage/plugins.html#添加","59":"/zh-hans/manage/plugins.html#列举已安装","60":"/zh-hans/manage/plugins.html#列举缩写存储库中的所有插件","61":"/zh-hans/manage/plugins.html#更新","62":"/zh-hans/manage/plugins.html#移除","63":"/zh-hans/manage/plugins.html#同步缩写存储库","64":"/zh-hans/manage/versions.html#版本","65":"/zh-hans/manage/versions.html#安装版本","66":"/zh-hans/manage/versions.html#安装最新稳定版本","67":"/zh-hans/manage/versions.html#列举已安装版本","68":"/zh-hans/manage/versions.html#列举所有可用版本","69":"/zh-hans/manage/versions.html#显示最新稳定版本","70":"/zh-hans/manage/versions.html#设置当前版本","71":"/zh-hans/manage/versions.html#回退到系统版本","72":"/zh-hans/manage/versions.html#显示当前版本","73":"/zh-hans/manage/versions.html#卸载版本","74":"/zh-hans/manage/versions.html#垫片-shims","75":"/zh-hans/manage/versions.html#绕过-asdf-垫片","76":"/zh-hans/more/community-projects.html#community-projects","77":"/zh-hans/more/faq.html#faq","78":"/zh-hans/more/faq.html#支持-wsl1-吗","79":"/zh-hans/more/faq.html#支持-wsl2-吗","80":"/zh-hans/more/faq.html#新安装的可执行程序无法运行","81":"/zh-hans/more/faq.html#shell-没有检测到新安装的垫片","82":"/zh-hans/plugins/create.html#创建插件","83":"/zh-hans/plugins/create.html#插件里有什么","84":"/zh-hans/plugins/create.html#必要的脚本","85":"/zh-hans/plugins/create.html#环境变量","86":"/zh-hans/plugins/create.html#bin-list-all","87":"/zh-hans/plugins/create.html#bin-download","88":"/zh-hans/plugins/create.html#bin-install","89":"/zh-hans/plugins/create.html#可选脚本","90":"/zh-hans/plugins/create.html#bin-help-脚本","91":"/zh-hans/plugins/create.html#bin-latest-stable","92":"/zh-hans/plugins/create.html#bin-list-bin-paths","93":"/zh-hans/plugins/create.html#bin-exec-env","94":"/zh-hans/plugins/create.html#bin-exec-path","95":"/zh-hans/plugins/create.html#bin-uninstall","96":"/zh-hans/plugins/create.html#bin-list-legacy-filenames","97":"/zh-hans/plugins/create.html#bin-parse-legacy-file","98":"/zh-hans/plugins/create.html#bin-post-plugin-add","99":"/zh-hans/plugins/create.html#bin-post-plugin-update","100":"/zh-hans/plugins/create.html#bin-pre-plugin-remove","101":"/zh-hans/plugins/create.html#asdf-命令行的扩展命令","102":"/zh-hans/plugins/create.html#自定义垫片模板","103":"/zh-hans/plugins/create.html#测试插件","104":"/zh-hans/plugins/create.html#github-action-示例","105":"/zh-hans/plugins/create.html#travisci-配置示例","106":"/zh-hans/plugins/create.html#github-api-频率限制","107":"/zh-hans/plugins/create.html#向官方插件存储库提交插件","108":"/zh-hans/more/thanks.html#致谢","109":"/zh-hans/more/thanks.html#作者","110":"/zh-hans/more/thanks.html#维护者","111":"/zh-hans/more/thanks.html#贡献者"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,3],"1":[1,1,59],"2":[1,1,42],"3":[2,1,39],"4":[2,1,69],"5":[2,1,9],"6":[3,1,4],"7":[1,3,50],"8":[1,3,33],"9":[2,3,17],"10":[1,3,27],"11":[2,3,50],"12":[1,1,24],"13":[2,1,8],"14":[1,1,15],"15":[2,1,59],"16":[3,1,1],"17":[2,4,14],"18":[4,4,32],"19":[3,1,177],"20":[2,1,8],"21":[2,1,8],"22":[1,3,25],"23":[1,3,11],"24":[2,1,23],"25":[2,1,17],"26":[1,3,24],"27":[1,3,20],"28":[1,3,29],"29":[2,1,19],"30":[1,1,22],"31":[1,1,17],"32":[1,1,1],"33":[4,2,18],"34":[1,2,13],"35":[1,2,15],"36":[1,2,19],"37":[3,1,15],"38":[1,1,144],"39":[1,1,9],"40":[3,1,74],"41":[2,1,30],"42":[3,3,21],"43":[3,3,12],"44":[3,3,11],"45":[5,3,31],"46":[1,1,48],"47":[1,1,20],"48":[1,1,5],"49":[1,1,4],"50":[1,1,7],"51":[1,1,6],"52":[1,1,11],"53":[1,1,31],"54":[2,1,29],"55":[1,1,26],"56":[1,1,110],"57":[1,1,14],"58":[1,1,25],"59":[1,1,14],"60":[1,1,8],"61":[1,1,18],"62":[1,1,11],"63":[1,1,31],"64":[1,1,1],"65":[1,1,19],"66":[1,1,11],"67":[1,1,10],"68":[1,1,11],"69":[1,1,10],"70":[1,1,48],"71":[1,1,23],"72":[1,1,22],"73":[1,1,10],"74":[3,1,66],"75":[3,4,12],"76":[2,1,48],"77":[1,1,4],"78":[4,1,12],"79":[4,1,25],"80":[2,1,25],"81":[3,1,26],"82":[1,1,1],"83":[1,1,14],"84":[1,1,9],"85":[1,1,41],"86":[3,2,36],"87":[2,2,28],"88":[2,2,51],"89":[1,1,1],"90":[3,2,65],"91":[3,2,36],"92":[3,2,21],"93":[3,2,2],"94":[3,2,25],"95":[2,2,2],"96":[4,2,15],"97":[4,2,11],"98":[4,2,19],"99":[4,2,22],"100":[4,2,15],"101":[2,1,64],"102":[1,1,24],"103":[1,1,58],"104":[3,2,28],"105":[2,2,37],"106":[3,1,46],"107":[1,1,21],"108":[1,1,3],"109":[1,1,11],"110":[1,1,6],"111":[1,1,7]},"averageFieldLength":[1.8125,1.5089285714285716,25.785714285714285],"storedFields":{"0":{"title":"asdf","titles":[]},"1":{"title":"初始化安装","titles":["asdf"]},"2":{"title":"开发","titles":["asdf"]},"3":{"title":"Bats 测试","titles":["asdf"]},"4":{"title":"拉取请求、发布以及约定式提交","titles":["asdf"]},"5":{"title":"Docker 镜像","titles":["asdf"]},"6":{"title":"文档 & 网站","titles":[]},"7":{"title":"初始化设置","titles":["文档 & 网站"]},"8":{"title":"开发","titles":["文档 & 网站"]},"9":{"title":"拉取请求、发布以及约定式提交","titles":["文档 & 网站"]},"10":{"title":"Vuepress","titles":["文档 & 网站"]},"11":{"title":"I18n 国际化","titles":["文档 & 网站"]},"12":{"title":"官方插件","titles":[]},"13":{"title":"GitHub Actions","titles":[]},"14":{"title":"快速入门","titles":[]},"15":{"title":"1. 安装依赖","titles":["快速入门"]},"16":{"title":"2. 下载 asdf","titles":["快速入门"]},"17":{"title":"Official Download","titles":["快速入门","2. 下载 asdf"]},"18":{"title":"Community Supported Download Methods","titles":["快速入门","2. 下载 asdf"]},"19":{"title":"3. 安装 asdf","titles":["快速入门"]},"20":{"title":"核心安装完成!","titles":["快速入门"]},"21":{"title":"4. 安装插件","titles":["快速入门"]},"22":{"title":"插件依赖","titles":["快速入门","4. 安装插件"]},"23":{"title":"安装插件","titles":["快速入门","4. 安装插件"]},"24":{"title":"5. 安装指定版本","titles":["快速入门"]},"25":{"title":"6. 设置默认版本","titles":["快速入门"]},"26":{"title":"全局","titles":["快速入门","6. 设置默认版本"]},"27":{"title":"本地","titles":["快速入门","6. 设置默认版本"]},"28":{"title":"使用现有工具版本文件","titles":["快速入门","6. 设置默认版本"]},"29":{"title":"完成指南!","titles":["快速入门"]},"30":{"title":"项目简介","titles":[]},"31":{"title":"它是如何工作的","titles":["项目简介"]},"32":{"title":"相关项目","titles":["项目简介"]},"33":{"title":"nvm / n / rbenv 等","titles":["项目简介","相关项目"]},"34":{"title":"direnv","titles":["项目简介","相关项目"]},"35":{"title":"Homebrew","titles":["项目简介","相关项目"]},"36":{"title":"NixOS","titles":["项目简介","相关项目"]},"37":{"title":"为什么使用 asdf?","titles":["项目简介"]},"38":{"title":"所有命令","titles":[]},"39":{"title":"配置","titles":[]},"40":{"title":".tool-versions","titles":["配置"]},"41":{"title":"$HOME/.asdfrc","titles":["配置"]},"42":{"title":"legacy_version_file","titles":["配置","$HOME/.asdfrc"]},"43":{"title":"use_release_candidates","titles":["配置","$HOME/.asdfrc"]},"44":{"title":"always_keep_download","titles":["配置","$HOME/.asdfrc"]},"45":{"title":"plugin_repository_last_check_duration","titles":["配置","$HOME/.asdfrc"]},"46":{"title":"环境变量","titles":["配置"]},"47":{"title":"内部配置","titles":["配置"]},"48":{"title":"核心","titles":[]},"49":{"title":"安装和配置","titles":["核心"]},"50":{"title":"Exec","titles":["核心"]},"51":{"title":"Env","titles":["核心"]},"52":{"title":"Info","titles":["核心"]},"53":{"title":"Reshim","titles":["核心"]},"54":{"title":"Shim-versions","titles":["核心"]},"55":{"title":"更新","titles":["核心"]},"56":{"title":"卸载","titles":["核心"]},"57":{"title":"插件","titles":[]},"58":{"title":"添加","titles":["插件"]},"59":{"title":"列举已安装","titles":["插件"]},"60":{"title":"列举缩写存储库中的所有插件","titles":["插件"]},"61":{"title":"更新","titles":["插件"]},"62":{"title":"移除","titles":["插件"]},"63":{"title":"同步缩写存储库","titles":["插件"]},"64":{"title":"版本","titles":[]},"65":{"title":"安装版本","titles":["版本"]},"66":{"title":"安装最新稳定版本","titles":["版本"]},"67":{"title":"列举已安装版本","titles":["版本"]},"68":{"title":"列举所有可用版本","titles":["版本"]},"69":{"title":"显示最新稳定版本","titles":["版本"]},"70":{"title":"设置当前版本","titles":["版本"]},"71":{"title":"回退到系统版本","titles":["版本"]},"72":{"title":"显示当前版本","titles":["版本"]},"73":{"title":"卸载版本","titles":["版本"]},"74":{"title":"垫片(Shims)","titles":["版本"]},"75":{"title":"绕过 asdf 垫片","titles":["版本","垫片(Shims)"]},"76":{"title":"Community Projects","titles":[]},"77":{"title":"FAQ","titles":[]},"78":{"title":"支持 WSL1 吗?","titles":["FAQ"]},"79":{"title":"支持 WSL2 吗?","titles":["FAQ"]},"80":{"title":"新安装的可执行程序无法运行?","titles":["FAQ"]},"81":{"title":"Shell 没有检测到新安装的垫片?","titles":["FAQ"]},"82":{"title":"创建插件","titles":[]},"83":{"title":"插件里有什么","titles":["创建插件"]},"84":{"title":"必要的脚本","titles":["创建插件"]},"85":{"title":"环境变量","titles":["创建插件"]},"86":{"title":"bin/list-all","titles":["创建插件","环境变量"]},"87":{"title":"bin/download","titles":["创建插件","环境变量"]},"88":{"title":"bin/install","titles":["创建插件","环境变量"]},"89":{"title":"可选脚本","titles":["创建插件"]},"90":{"title":"bin/help 脚本","titles":["创建插件","可选脚本"]},"91":{"title":"bin/latest-stable","titles":["创建插件","可选脚本"]},"92":{"title":"bin/list-bin-paths","titles":["创建插件","可选脚本"]},"93":{"title":"bin/exec-env","titles":["创建插件","可选脚本"]},"94":{"title":"bin/exec-path","titles":["创建插件","可选脚本"]},"95":{"title":"bin/uninstall","titles":["创建插件","可选脚本"]},"96":{"title":"bin/list-legacy-filenames","titles":["创建插件","可选脚本"]},"97":{"title":"bin/parse-legacy-file","titles":["创建插件","可选脚本"]},"98":{"title":"bin/post-plugin-add","titles":["创建插件","可选脚本"]},"99":{"title":"bin/post-plugin-update","titles":["创建插件","可选脚本"]},"100":{"title":"bin/pre-plugin-remove","titles":["创建插件","可选脚本"]},"101":{"title":"asdf 命令行的扩展命令","titles":["创建插件"]},"102":{"title":"自定义垫片模板","titles":["创建插件"]},"103":{"title":"测试插件","titles":["创建插件"]},"104":{"title":"GitHub Action 示例","titles":["创建插件","测试插件"]},"105":{"title":"TravisCI 配置示例","titles":["创建插件","测试插件"]},"106":{"title":"GitHub API 频率限制","titles":["创建插件"]},"107":{"title":"向官方插件存储库提交插件","titles":["创建插件"]},"108":{"title":"致谢","titles":[]},"109":{"title":"作者","titles":["致谢"]},"110":{"title":"维护者","titles":["致谢"]},"111":{"title":"贡献者","titles":["致谢"]}},"dirtCount":0,"index":[["🙏",{"2":{"111":1}}],["贡献者名单",{"2":{"111":1}}],["贡献者",{"0":{"111":1}}],["维护者",{"0":{"110":1}}],["直到时间尽头",{"2":{"109":1}}],["版权",{"2":{"109":1}}],["版本已经按照正确的顺序排列",{"2":{"86":1}}],["版本格式与",{"2":{"70":1}}],["版本化的插件和更新正在开发中",{"2":{"61":1}}],["版本下的",{"2":{"53":1}}],["版本号可以有如下格式",{"2":{"40":1}}],["版本文件",{"2":{"33":1}}],["版本了",{"2":{"29":1}}],["版本参考部分",{"2":{"26":1}}],["版本",{"0":{"64":1},"1":{"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1},"2":{"24":1,"29":1,"91":1}}],["版本并生成",{"2":{"4":1}}],["咳嗽",{"2":{"109":1}}],["感冒",{"2":{"109":1}}],["感谢你的关注",{"2":{"13":1}}],["高烧",{"2":{"109":1}}],["作者",{"0":{"109":1}}],["作者和贡献者的感谢页",{"2":{"108":1}}],["致谢",{"0":{"108":1},"1":{"109":1,"110":1,"111":1}}],["轻松安装插件",{"2":{"107":1}}],["向官方插件存储库提交插件",{"0":{"107":1}}],["向其传递插件的名称和垫片正在包装的已安装包中的可执行程序的路径",{"2":{"74":1}}],["绝对不要",{"2":{"106":1}}],["安全",{"2":{"106":1}}],["安装或编译该工具所需的任何环境变量或其他标志",{"2":{"90":1}}],["安装脚本应以",{"2":{"88":1}}],["安装成功时",{"2":{"88":1}}],["安装到的目录",{"2":{"85":2}}],["安装到了其他目录",{"2":{"46":1}}],["安装一个包时",{"2":{"74":1}}],["安装给定字符串开头的最新稳定版本",{"2":{"66":1}}],["安装最新稳定版本",{"0":{"66":1}}],["安装版本",{"0":{"65":1}}],["安装和配置",{"0":{"49":1}}],["安装和管理的工具了",{"2":{"26":1}}],["安装的可执行程序会为每个可执行程序创建",{"2":{"31":1}}],["安装指定版本",{"0":{"24":1},"2":{"84":1}}],["安装插件",{"0":{"21":1,"23":1},"1":{"22":1,"23":1},"2":{"46":1}}],["安装工具",{"2":{"14":1}}],["安装",{"0":{"19":1},"2":{"14":1}}],["安装依赖",{"0":{"15":1},"2":{"14":1,"22":1}}],["安装过程包括",{"2":{"14":1}}],["构建设置中添加一个名为",{"2":{"106":1}}],["然后",{"2":{"106":1}}],["权限的",{"2":{"106":1}}],["频率限制",{"0":{"106":1}}],["示例文件",{"2":{"105":1}}],["示例",{"0":{"104":1}}],["示例输出如下所示",{"2":{"86":1,"92":1}}],["环境中测试你的插件",{"2":{"103":1}}],["环境变量包含的路径",{"2":{"87":1}}],["环境变量",{"0":{"46":1,"85":1},"1":{"86":1,"87":1,"88":1},"2":{"88":1,"106":1}}],["环境变量等等",{"2":{"30":1}}],["要测试",{"2":{"103":1}}],["要使用工具",{"2":{"71":1}}],["要使用的工具的自定义编译版本的路径",{"2":{"40":1}}],["剩下的参数被视为要执行的命令",{"2":{"103":1}}],["只有前两个参数是必须的",{"2":{"103":1}}],["只有当前工作目录是",{"2":{"79":1}}],["还被读作为",{"2":{"102":1}}],["还有更多命令需要熟悉",{"2":{"29":1}}],["允许自定义垫片模板",{"2":{"102":1}}],["允许全局安装可执行程序",{"2":{"53":1}}],["解析所获取文件的完整路径",{"2":{"101":1}}],["解析器",{"2":{"1":1}}],["且具有来自",{"2":{"101":1}}],["假设一个",{"2":{"101":1}}],["其他请参考相关钩子",{"2":{"98":1,"99":1,"100":1}}],["其中包含用于演示的默认值",{"2":{"41":1}}],["其中",{"2":{"10":1,"65":1}}],["该脚本可以访问安装插件的路径",{"2":{"100":1}}],["该脚本可以访问插件的安装路径",{"2":{"98":1,"99":1}}],["该标题成为默认分支上的提交消息格式",{"2":{"4":1}}],["后运行任何安装后操作",{"2":{"98":1}}],["未实现",{"2":{"97":1}}],["找到的传统文件",{"2":{"97":1}}],["获取工具的指定版本的可执行程序路径",{"2":{"94":1}}],["路径必须相对于传递的安装路径",{"2":{"92":1}}],["字符串调用",{"2":{"91":1}}],["过滤器",{"2":{"91":1}}],["帮助回调脚本不得输出核心",{"2":{"90":1}}],["行的格式可以是",{"2":{"90":1}}],["尽可能针对当前操作系统量身定制",{"2":{"90":1}}],["尽可能针对用户的操作系统",{"2":{"90":1}}],["尽管我们试图保持依赖关系列表很小",{"2":{"35":1}}],["输出",{"2":{"94":1}}],["输出可以是自由格式的文本",{"2":{"90":2}}],["输出将使你能够在测试执行期间打印带有特殊文件描述符",{"2":{"3":1}}],["及更高版本",{"2":{"88":1}}],["及更早版本和",{"2":{"88":1}}],["即使它还未完全安装",{"2":{"88":1}}],["扩展命令",{"2":{"101":1}}],["扩展",{"2":{"88":1}}],["检查",{"2":{"88":1}}],["检查和测试你的代码",{"2":{"2":1}}],["才将文件放在",{"2":{"88":1}}],["才能",{"2":{"79":1}}],["本身的新命令扩展的插件",{"2":{"101":1}}],["本脚本应在",{"2":{"88":1}}],["本地版本被定义在",{"2":{"27":1}}],["本地",{"0":{"27":1}}],["状态退出",{"2":{"87":1,"88":1}}],["此外",{"2":{"101":1}}],["此回调使用单个",{"2":{"91":1}}],["此脚本应该打印对插件和工具可能有用的任何必需或可选配置",{"2":{"90":1}}],["此脚本应该输出为操作系统量身定制的依赖项列表",{"2":{"90":1}}],["此脚本应该输出有关插件和所管理工具的一般描述",{"2":{"90":1}}],["此脚本必须下载源代码或者二进制文件到",{"2":{"87":1}}],["此关键字会导致",{"2":{"40":1}}],["非常有用",{"2":{"85":1}}],["非常相似",{"2":{"33":1}}],["编译源代码时使用的内核数",{"2":{"85":1}}],["应该",{"2":{"85":1}}],["应该作为你选择的",{"2":{"79":1}}],["必须明智地使用这一点",{"2":{"102":1}}],["必须打印具有相对可执行程序路径的字符串",{"2":{"94":1}}],["必须打印一个带有空格分隔的文件名列表的字符串",{"2":{"96":1}}],["必须打印一个带有空格分隔的包含可执行文件的目录路径列表的字符串",{"2":{"92":1}}],["必须打印一个带有空格分隔的版本列表的字符串",{"2":{"86":1}}],["必须使用自动补全完成配置",{"2":{"19":1}}],["必要的脚本",{"0":{"84":1}}],["那么",{"2":{"102":1}}],["那么早期版本可能会不在屏幕上",{"2":{"86":1}}],["那么这将是版本号",{"2":{"85":1}}],["那么很有可能是在",{"2":{"81":1}}],["那样配置了",{"2":{"56":2}}],["没有解决你的问题",{"2":{"81":1}}],["没有检测到新安装的垫片",{"0":{"81":1}}],["创建一个仅具有",{"2":{"106":1}}],["创建一个垫片即可",{"2":{"80":1}}],["创建垫片的需要",{"2":{"80":1}}],["创建插件",{"0":{"82":1},"1":{"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1},"2":{"57":1}}],["我",{"2":{"109":1}}],["我执行了",{"2":{"80":1}}],["我们强烈建议你在",{"2":{"103":1}}],["我们可以运行",{"2":{"103":1}}],["我们打算在",{"2":{"79":1}}],["我们不打算添加对",{"2":{"78":1}}],["我们推荐的安装方法",{"2":{"55":1}}],["我们将只安装最新可用的",{"2":{"24":1}}],["我们将通过",{"2":{"21":1}}],["我们通过",{"2":{"24":1}}],["我们应该提前安装这些依赖",{"2":{"22":1}}],["新个人令牌",{"2":{"106":1}}],["新安装的可执行程序无法运行",{"0":{"80":1}}],["新特性需要进行测试",{"2":{"2":1}}],["驱动器时",{"2":{"79":1}}],["驱动器而不是绑定的",{"2":{"79":1}}],["重要的是",{"2":{"79":1}}],["重点是",{"2":{"8":1}}],["发行版来使用本设置和依赖说明",{"2":{"79":1}}],["发布以及约定式提交",{"0":{"4":1,"9":1}}],["不得出现一般的",{"2":{"90":1}}],["不应该打印任何标题",{"2":{"90":1}}],["不受官方支持",{"2":{"78":1}}],["不管理上游依赖",{"2":{"35":1,"36":1}}],["不管理环境变量",{"2":{"34":1}}],["吗",{"0":{"78":1,"79":1}}],["quality",{"2":{"76":1}}],["绕过",{"0":{"75":1}}],["返回软件包安装目录的路径",{"2":{"74":1}}],["返回当前版本中主要可执行程序的路径",{"2":{"74":1}}],["两个",{"2":{"74":1}}],["两者特性集合大致相同",{"2":{"8":1}}],["生效而不是执行的脚本都需要直接访问",{"2":{"74":1}}],["生效位置的下方",{"2":{"19":1}}],["调用时",{"2":{"101":1}}],["调用",{"2":{"74":1}}],["调试信息的辅助命令",{"2":{"52":1}}],["调试有时可能很困难",{"2":{"3":1}}],["回调打印的是",{"2":{"91":1}}],["回调打印的最新版本",{"2":{"91":1}}],["回调打印同一工具的不同变体并且最新版本不是你希望默认使用的变体的最新稳定版本时",{"2":{"91":1}}],["回调来操作",{"2":{"74":1}}],["回退到系统版本",{"0":{"71":1}}],["回退到",{"2":{"40":1}}],["软件包安装目录中的可执行程序的最终路径",{"2":{"74":1}}],["辅助程序确定要使用的软件包版本",{"2":{"74":1}}],["kim",{"2":{"72":3}}],["keep",{"0":{"44":1},"2":{"41":1}}],["会话或者在特定工具版本下执行一条命令",{"2":{"70":1}}],["会话将版本设置为一个名为",{"2":{"70":1}}],["可执行文件期望找到相对于可执行目录的动态链接库的问题",{"2":{"101":1}}],["可能指向存储库的一个标签",{"2":{"85":1}}],["可选脚本",{"0":{"89":1},"1":{"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["可选",{"2":{"70":1}}],["可以通过指定插件存储库",{"2":{"107":1}}],["可以通过可选的",{"2":{"88":1}}],["可以通过返回已安装软件包的路径来帮助解决这个问题",{"2":{"74":1}}],["可以被设置在上一节提到的生效",{"2":{"46":1}}],["可以被设置在任何位置",{"2":{"46":1}}],["可以是任何有效的文件名",{"2":{"46":1}}],["可以直接编辑这个文件或者使用",{"2":{"40":1}}],["可以用来集成",{"2":{"34":1}}],["可以用最少的配置编写",{"2":{"8":1}}],["可以看到所有可用的版本或者通过",{"2":{"24":1}}],["可以使用以下脚本",{"2":{"2":1}}],["可以将以下行的内容添加到",{"2":{"40":1}}],["可以将",{"2":{"2":1}}],["设置环境变量以运行包中的二进制文件",{"2":{"93":1}}],["设置变量时",{"2":{"90":1}}],["设置系统",{"2":{"71":1}}],["设置当前版本",{"0":{"70":1},"2":{"71":1}}],["设置默认版本",{"0":{"25":1},"1":{"26":1,"27":1,"28":1}}],["显示当前版本",{"0":{"72":1}}],["显示以给定字符串开头的最新稳定版本",{"2":{"69":1}}],["显示最新稳定版本",{"0":{"69":1}}],["筛选出以给定字符串开头的版本",{"2":{"67":1,"68":1}}],["分钟内没有同步",{"2":{"63":1}}],["分支",{"2":{"85":1,"103":1}}],["分支上的最新提交",{"2":{"55":1}}],["分支从",{"2":{"40":1}}],["同步缩写存储库",{"0":{"63":1}}],["同样",{"2":{"36":1,"90":1}}],["修剪工具的许多未使用版本的简单方法",{"2":{"62":1}}],["916",{"2":{"61":1}}],["999999999",{"2":{"45":1}}],["源代码或二进制文件应该下载到的路径",{"2":{"85":1}}],["源代码",{"2":{"61":1}}],["列举指定工具版本的可执行程序",{"2":{"92":1}}],["列举所有可安装的版本",{"2":{"84":1}}],["列举所有可用版本",{"0":{"68":1}}],["列举缩写存储库中的所有插件",{"0":{"60":1}}],["列举已安装版本",{"0":{"67":1}}],["列举已安装",{"0":{"59":1}}],["列举为命令提供垫片的插件和版本",{"2":{"54":1}}],["推荐独立于缩写存储库的",{"2":{"58":1}}],["建议尽可能不对版本进行排序",{"2":{"86":1}}],["建议",{"2":{"58":1}}],["地址添加插件",{"2":{"58":1}}],["添加如下内容到",{"2":{"106":1}}],["添加",{"0":{"58":1}}],["模块",{"2":{"56":3}}],["模块的行",{"2":{"56":3}}],["指南进行操作",{"2":{"56":1}}],["指定标签",{"2":{"40":1}}],["已经",{"2":{"85":1}}],["已经变成了",{"2":{"56":1}}],["已经被修改为",{"2":{"19":2}}],["因此请按照他们的指南找出要删除的内容",{"2":{"56":2}}],["因为一个可执行程序除了是可执行程序文件之外",{"2":{"102":1}}],["因为它是唯一的参数",{"2":{"91":1}}],["因为它描述了对包管理器和集成者有用的",{"2":{"47":1}}],["因为必须存在才能为脚本显示任何帮助输出",{"2":{"90":1}}],["因为",{"2":{"86":2,"90":1}}],["因为此系统使用",{"2":{"74":1}}],["因为这个可执行程序不是通过插件生命周期安装的",{"2":{"53":1}}],["因为有些插件有",{"2":{"22":1}}],["因为我们希望在用户没有可用或未启用",{"2":{"8":1}}],["因为你可能需要打破某些可能会影响到你的开发工具链的功能",{"2":{"1":1}}],["移除一个插件将会移除该插件安装的所有工具",{"2":{"62":1}}],["移除",{"0":{"62":1},"2":{"56":9}}],["卸载某个工具的指定版本",{"2":{"95":1}}],["卸载版本",{"0":{"73":1}}],["卸载该版本时",{"2":{"65":1}}],["卸载",{"0":{"56":1}}],["方法",{"2":{"55":1,"58":1}}],["8",{"2":{"54":2,"88":1}}],["8837",{"2":{"19":2}}],["执行",{"2":{"74":1,"101":1}}],["执行以下命令移除",{"2":{"56":14}}],["执行shim",{"2":{"54":1}}],["执行当前版本的命令垫片",{"2":{"50":1}}],["附带了两个可执行程序",{"2":{"54":1}}],["类似",{"2":{"53":1}}],["时",{"2":{"105":1}}],["时需要共享这些信息",{"2":{"52":1}}],["时支持仅依靠",{"2":{"8":1}}],["快速上手",{"2":{"49":1}}],["快速入门",{"0":{"14":1},"1":{"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1}}],["但最后",{"2":{"91":1}}],["但理想情况下只有一个短段落",{"2":{"90":1}}],["但可以通过在",{"2":{"63":1}}],["但可以促进很多工作流",{"2":{"48":1}}],["但是之后不能运行",{"2":{"80":1}}],["但是有一个插件",{"2":{"34":1}}],["但是",{"2":{"19":1}}],["像",{"2":{"47":1,"86":1}}],["用户现在可以执行",{"2":{"101":1}}],["用户可以选择传入",{"2":{"91":1}}],["用户不必担心本节",{"2":{"47":1}}],["用包管理器卸载",{"2":{"56":9}}],["用于支持对某种语言或工具进行版本控制",{"2":{"83":1}}],["用于打印操作系统",{"2":{"52":1}}],["用于单元测试",{"2":{"1":1}}],["内容无关",{"2":{"47":1}}],["内容必须位于与根配置文件中",{"2":{"11":1}}],["内部配置",{"0":{"47":1}}],["之外对以下环境变量有权限进行操作",{"2":{"85":1}}],["之间的任何位置",{"2":{"46":1}}],["之后推断出最新版本",{"2":{"91":1}}],["之后再生效",{"2":{"81":1}}],["之后和生效你的框架",{"2":{"81":1}}],["之后和已经生效的框架",{"2":{"19":1}}],["之后的位置生效",{"2":{"19":1}}],["否则你的测试可能会因频率限制而失败",{"2":{"106":1}}],["否则返回垫片指定的默认路径",{"2":{"94":1}}],["否则它将传递为",{"2":{"85":1}}],["否则不应该覆盖默认值",{"2":{"46":1}}],["否则请遵循",{"2":{"19":2}}],["忽略",{"2":{"46":1}}],["存储工具名称和版本的文件名",{"2":{"46":1}}],["存储库为托管在",{"2":{"104":1}}],["存储库中以便于和团队其他成员共享",{"2":{"30":1}}],["存储库",{"2":{"27":1,"83":1}}],["触发器事件发生时同步",{"2":{"45":1}}],["到",{"2":{"45":1}}],["则插件将检查提交",{"2":{"103":1}}],["则该工具将随指定版本一起安装",{"2":{"103":1}}],["则只是执行它们并替换",{"2":{"101":1}}],["则只有未压缩的源代码或二进制文件会放置在",{"2":{"87":1}}],["则它们将作为",{"2":{"101":1}}],["则必须存在此脚本",{"2":{"90":1}}],["则假设",{"2":{"88":1}}],["则在安装过程中在其他终端中运行的其他",{"2":{"88":1}}],["则不应将任何文件放在目录中",{"2":{"87":1}}],["则不能依赖",{"2":{"86":1}}],["则",{"2":{"75":1}}],["则可能位于",{"2":{"56":1}}],["则应按照该方法的步骤操作",{"2":{"55":1}}],["则应设置该变量为",{"2":{"46":1}}],["则进行同步",{"2":{"45":1,"63":1}}],["则会出现错误",{"2":{"25":1}}],["候选版本被使用",{"2":{"43":1}}],["语义版本被使用",{"2":{"43":1}}],["而是一组回调脚本",{"2":{"90":1}}],["而通过",{"2":{"80":1}}],["而不是尝试自行判断",{"2":{"91":1}}],["而不是通过垫片包装器进行访问",{"2":{"74":1}}],["而不是最新的语义版本",{"2":{"43":1}}],["而且每个管理器都有其不同的",{"2":{"30":1}}],["从不同步",{"2":{"45":1}}],["从传统版本文件读取版本",{"2":{"42":1}}],["从",{"2":{"42":1,"45":1}}],["从而允许",{"2":{"31":1}}],["从而确保每个人都使用完全相同的工具版本",{"2":{"30":1}}],["从而简化调试",{"2":{"3":1}}],["描述",{"2":{"42":1,"43":1,"44":1,"45":1}}],["选项的用户",{"2":{"96":1}}],["选项来进行配置",{"2":{"63":1}}],["选项",{"2":{"42":1,"43":1,"44":1,"45":1}}],["读取其他版本管理器使用的版本文件",{"2":{"42":1}}],["下面列出了可能的回调脚本",{"2":{"90":1}}],["下面的示例在版本为",{"2":{"70":1}}],["下面的文件展示了所需的格式",{"2":{"41":1}}],["下载更新的插件后运行任何插件更新后操作",{"2":{"99":1}}],["下载成功后脚本必须以",{"2":{"87":1}}],["下载指定版本的源代码或二进制文件",{"2":{"84":1}}],["下载一个新的",{"2":{"55":1}}],["下载并编译",{"2":{"40":1}}],["下载",{"0":{"16":1},"1":{"17":1,"18":1},"2":{"14":1}}],["给你的家目录添加一个",{"2":{"41":1}}],["最终将删除对传统插件的支持",{"2":{"87":1}}],["最后",{"2":{"106":1}}],["最后完成执行",{"2":{"74":1}}],["最后回退到",{"2":{"40":1}}],["最新的稳定版本应该是",{"2":{"91":1}}],["最新版本应列在最后",{"2":{"86":1}}],["最新提交",{"2":{"61":1}}],["最新稳定版本",{"2":{"55":1}}],["最好在提交或推送到远程之前",{"2":{"2":1}}],["7",{"2":{"40":4,"88":1}}],["多版本可以通过空格将它们分隔开来",{"2":{"40":1}}],["传递系统上未由",{"2":{"40":1}}],["传统工作方式需要多个命令行版本管理器",{"2":{"30":1}}],["实际的版本号",{"2":{"40":1}}],["出现在目录中",{"2":{"40":1}}],["出于演示目的",{"2":{"21":1}}],["无论何时",{"2":{"40":1}}],["无法做到的",{"2":{"36":1}}],["无法做到这一点",{"2":{"8":1}}],["也由插件",{"2":{"74":1}}],["也包括用户特定的自定义",{"2":{"39":1}}],["也就是",{"2":{"11":1}}],["`$asdf",{"2":{"101":5}}],["`env`",{"2":{"38":1}}],["`asdf",{"2":{"38":1}}],["仅在没有此脚本的情况下才能支持传统插件",{"2":{"87":1}}],["仅在你安装插件",{"2":{"20":1}}],["仅为当前",{"2":{"70":1}}],["仅仅因为你可以为任何工具创建插件并使用",{"2":{"37":1}}],["简单性和熟悉性",{"2":{"37":1}}],["确保团队可以使用完全相同的工具版本",{"2":{"37":1}}],["个包的包集合来实现这一点",{"2":{"36":1}}],["许多命令行工具和超过",{"2":{"36":1}}],["旨在通过管理每个工具的整个依赖关系树中软件包的确切版本来构建真正可重复的环境",{"2":{"36":1}}],["管理工具安装过的可执行程序则需要通知",{"2":{"80":1}}],["管理版本",{"2":{"71":1}}],["管理的工具版本",{"2":{"40":1}}],["管理的工具时实时发生",{"2":{"25":1}}],["管理其版本",{"2":{"37":1}}],["管理你的软件包及其上游依赖",{"2":{"35":1}}],["目前还未提供",{"2":{"79":1}}],["目的是在工具",{"2":{"33":1}}],["目录并为这些脚本创建垫片",{"2":{"92":1}}],["目录的",{"2":{"88":1}}],["目录的所有",{"2":{"25":1}}],["目录中的任意文件创建垫片",{"2":{"88":1}}],["目录中",{"2":{"87":1,"88":1}}],["目录",{"2":{"56":9,"74":1,"88":1}}],["目录下",{"2":{"11":1}}],["目录添加到你的路径中",{"2":{"2":1}}],["等同于运行",{"2":{"101":5}}],["等包管理器使用它来确保个性化安装的正确的更新方法",{"2":{"47":1}}],["等工具都是用",{"2":{"33":1}}],["等",{"0":{"33":1},"2":{"57":1}}],["等等实现",{"2":{"74":1}}],["等等",{"2":{"19":1,"81":2}}],["相关的一些常见问题",{"2":{"77":1}}],["相关项目",{"0":{"32":1},"1":{"33":1,"34":1,"35":1,"36":1}}],["相应的配置也会不同",{"2":{"19":1}}],["识别",{"2":{"31":1}}],["一种可以替代的排序功能是",{"2":{"86":1}}],["一些工具像",{"2":{"53":1}}],["一个辅助程序",{"2":{"74":1}}],["一个",{"2":{"40":1}}],["一个用于长期维护",{"2":{"12":1}}],["一旦",{"2":{"31":1}}],["提交",{"2":{"40":1,"85":1}}],["提供单个交互方式和配置文件来简化开发工作流程",{"2":{"30":1}}],["提示",{"2":{"2":1,"4":1,"40":1}}],["垫片本身是非常简单的包装器",{"2":{"74":1}}],["垫片是在某个工具安装的过程中由插件创建",{"2":{"53":1}}],["垫片和安装器的位置",{"2":{"46":1}}],["垫片",{"0":{"74":1,"75":1},"1":{"75":1},"2":{"30":1,"31":1,"75":1,"80":1,"102":1}}],["操作",{"2":{"30":1}}],["操作系统不支持",{"2":{"86":1}}],["操作系统",{"2":{"22":1}}],["操作系统和安装方法的组合不同",{"2":{"19":1}}],["项目上运行测试",{"2":{"70":1}}],["项目简介",{"0":{"30":1},"1":{"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1}}],["项目正在努力提供一些",{"2":{"5":1}}],["恭喜你完成了",{"2":{"29":1,"56":1}}],["完成指南",{"0":{"29":1}}],["完成配置",{"2":{"19":1}}],["参考页面可以了解更多配置选项",{"2":{"28":1}}],["yml",{"2":{"105":1}}],["yamllanguage",{"2":{"105":1}}],["yamlsteps",{"2":{"104":1}}],["yarn",{"2":{"53":3,"80":3}}],["yes",{"2":{"28":1,"42":1,"43":1,"44":1}}],["your",{"2":{"15":2,"18":1}}],["中的说明了解更多",{"2":{"107":1}}],["中的文件创建垫片",{"2":{"92":1}}],["中删除插件之前运行任何预删除操作",{"2":{"100":1}}],["中安装版本",{"2":{"88":1}}],["中为该包中的每个可执行程序创建垫片",{"2":{"74":1}}],["中所有可用命令的列表",{"2":{"38":1}}],["中",{"2":{"30":1,"34":1,"40":1,"56":1,"74":1,"87":1}}],["中加入以下内容",{"2":{"28":1}}],["中使用",{"2":{"7":1}}],["当你的插件的",{"2":{"91":1}}],["当你尝试运行其中一个可执行程序时",{"2":{"31":1}}],["当",{"2":{"74":1,"79":1}}],["当使用其他",{"2":{"105":1}}],["当使用",{"2":{"54":1}}],["当此文件存在时",{"2":{"47":1}}],["当通过插件安装工具时",{"2":{"31":1}}],["当在你想要的目录执行",{"2":{"27":1}}],["当前工作目录",{"2":{"27":1}}],["当为文档更改创建",{"2":{"9":1}}],["你还可以选择将相对路径传递给",{"2":{"105":1}}],["你将需要确认哪些变量映射到存储库路径",{"2":{"105":1}}],["你希望绕过",{"2":{"75":1}}],["你也需要使用相同的名称和引用",{"2":{"65":1}}],["你也可以包含注释在里面",{"2":{"40":1}}],["你可以像下面这样使用它",{"2":{"103":1}}],["你可以设定或取消设定环境变量",{"2":{"83":1}}],["你可以设置一个类似",{"2":{"70":1}}],["你可以将插件添加到官方插件存储库中",{"2":{"107":1}}],["你可以将工具的版本设置为",{"2":{"71":1}}],["你可以将配置文件放在项目的",{"2":{"30":1}}],["你可以指定",{"2":{"65":1}}],["你可以安装插件来管理特定的工具",{"2":{"31":1}}],["你可以通过运行",{"2":{"29":1}}],["你可以使用这些容器镜像作为开发服务器的基础镜像",{"2":{"5":1}}],["你现在可以管理你的项目的",{"2":{"29":1}}],["你需要告诉",{"2":{"26":1}}],["就是一个常见的例子",{"2":{"26":1}}],["某些操作系统已经有一些由系统而非",{"2":{"26":1}}],["000",{"2":{"36":1}}],["0",{"2":{"26":1,"27":1,"40":4,"45":1,"54":4,"70":2,"86":3,"87":1,"88":3,"94":1}}],["全局默认配置将设置在文件$home",{"2":{"40":1}}],["全局默认配置在",{"2":{"26":1}}],["全局",{"0":{"26":1}}],["查找在执行",{"2":{"25":1}}],["查看版本子集",{"2":{"24":1}}],["查看",{"2":{"2":1}}],["60",{"2":{"36":1,"41":1,"45":1,"63":1}}],["6",{"0":{"25":1},"1":{"26":1,"27":1,"28":1},"2":{"72":1}}],["是",{"2":{"85":1}}],["是特定的分支",{"2":{"65":1}}],["是一种特殊情况",{"2":{"90":1}}],["是一种采用独特方法进行软件包管理和系统配置的工具",{"2":{"36":1}}],["是一个工具版本管理器",{"2":{"30":1}}],["是一个通过",{"2":{"24":1}}],["是我们用来构建",{"2":{"8":1}}],["注意",{"2":{"24":1,"37":1,"40":1,"74":1,"96":1,"105":1}}],["现在我们已经有了",{"2":{"24":1}}],["钩子",{"2":{"22":1}}],["来测试插件的可能",{"2":{"104":1}}],["来修复",{"2":{"101":1}}],["来管理可执行程序",{"2":{"80":1}}],["来管理工具",{"2":{"1":1}}],["来更新工具版本",{"2":{"40":1}}],["来查看它们",{"2":{"29":1}}],["来解析到执行时刻的实际版本号的辅助工具",{"2":{"24":1}}],["来说",{"2":{"22":1}}],["所以软件包中的任何脚本如果要由",{"2":{"74":1}}],["所以还没有对应的垫片存在",{"2":{"53":1}}],["所以我们可以开始安装某个版本了",{"2":{"24":1}}],["所以我们需要确认应该列举了这些依赖的插件源码",{"2":{"22":1}}],["所有其他的帮助回调脚本都是可选的",{"2":{"90":1}}],["所有插件都必须包含此脚本",{"2":{"87":1}}],["所有脚本除了",{"2":{"85":1}}],["所有配置文件",{"2":{"56":14}}],["所有命令",{"0":{"38":1}}],["所有的工具版本定义都包含在一个文件",{"2":{"30":1}}],["所有案例",{"2":{"2":1}}],["每行一个链接",{"2":{"90":1}}],["每行一个依赖项",{"2":{"90":1}}],["每个脚本将打印不同的文档到",{"2":{"90":1}}],["每个触发器事件发生时同步",{"2":{"45":1}}],["每个管理工具的不同命令以及存储库中不同的",{"2":{"33":1}}],["每个插件都有依赖",{"2":{"22":1}}],["每种语言的",{"2":{"11":1}}],["4",{"0":{"21":1},"1":{"22":1,"23":1},"2":{"70":3,"86":1}}],["工具的",{"2":{"29":1}}],["工具的容器化镜像",{"2":{"5":1}}],["工具和管理它们的版本时才开始真正发挥作用",{"2":{"20":1}}],["🎉",{"2":{"20":1,"29":1,"56":1}}],["更好的选择",{"2":{"86":1}}],["更长的",{"2":{"58":1}}],["更新前的",{"2":{"99":1}}],["更新",{"0":{"55":1,"61":1}}],["更改即时生效",{"2":{"19":1}}],["更大的",{"2":{"10":1}}],["让",{"2":{"19":1}}],["通常情况下",{"2":{"103":1}}],["通常",{"2":{"27":1,"46":1,"86":1}}],["通常打开一个新的终端标签页来重启你的",{"2":{"19":1}}],["通过查看由",{"2":{"91":1}}],["通过插件系统支持很多工具",{"2":{"37":1}}],["通过",{"2":{"14":1,"47":1,"58":1,"74":2}}],["+",{"2":{"19":2}}],["|",{"2":{"19":11}}],["正常工作",{"2":{"79":1}}],["正确地使用最新的",{"2":{"19":2}}],["正在使用依赖",{"2":{"9":1}}],["正在使用一个名为",{"2":{"4":1}}],["有一个依赖于",{"2":{"55":1}}],["有一流的国际化支持",{"2":{"11":1}}],["有些是",{"2":{"36":1}}],["有关的",{"2":{"19":2}}],["警告",{"2":{"19":1,"25":1}}],["插件中",{"2":{"102":1}}],["插件作者可以使用此功能来提供与其工具相关的实用命令",{"2":{"101":1}}],["插件有以下文件",{"2":{"101":1}}],["插件可以通过提供",{"2":{"101":1}}],["插件可能会有所帮助",{"2":{"75":1}}],["插件是一个包含几个可执行脚本的",{"2":{"83":1}}],["插件里有什么",{"0":{"83":1}}],["插件所安装的那些命令会自动创建垫片",{"2":{"80":1}}],["插件缩写索引",{"2":{"60":1}}],["插件告诉",{"2":{"57":1}}],["插件存储库同步到下一次存储库同步的持续时间",{"2":{"45":1}}],["插件",{"0":{"57":1},"1":{"58":1,"59":1,"60":1,"61":1,"62":1,"63":1},"2":{"24":1,"29":1,"42":1,"103":1}}],["插件依赖",{"0":{"22":1}}],["插件来安装和设置",{"2":{"21":1}}],["插件还在更新中",{"2":{"19":2}}],["插件或许需要更新才能通过",{"2":{"19":2}}],["插件或者通过在",{"2":{"19":1}}],["插件的缩写列表",{"2":{"12":1}}],["插件的协作",{"2":{"12":1}}],["框架",{"2":{"19":5}}],["框架插件",{"2":{"19":2,"56":1}}],["比如在",{"2":{"74":1}}],["比如使用",{"2":{"53":1}}],["比如",{"2":{"19":3,"28":1,"30":1,"40":1,"42":1,"46":1,"107":2}}],["=s",{"2":{"56":2}}],["=",{"2":{"19":9,"28":1,"41":6,"56":6}}],["包",{"2":{"90":1}}],["包管理器自动配置完成",{"2":{"19":1}}],["包含了开发所需的脚本",{"2":{"8":1}}],["包含",{"2":{"1":1,"103":1}}],["很友好的位置",{"2":{"19":1}}],["很友好",{"2":{"19":1}}],["处理",{"2":{"19":1}}],["按照",{"2":{"19":3}}],["按语言类型分隔开并单独导出",{"2":{"11":1}}],["加入到",{"2":{"19":12}}],["除非你知道你希望",{"2":{"46":1}}],["除非修改回",{"2":{"19":2}}],["除此之外",{"2":{"8":1}}],["zdotdir",{"2":{"19":1}}],["zshrc",{"2":{"19":5,"56":4,"81":1}}],["zsh",{"2":{"19":24,"56":6,"81":1}}],["zypper",{"2":{"15":2}}],["默认值是插件仓库的默认分支",{"2":{"103":1}}],["默认返回为",{"2":{"103":1}}],["默认是",{"2":{"63":1}}],["默认分支",{"2":{"61":1}}],["默认情况下",{"2":{"53":1,"88":1}}],["默认为",{"2":{"46":3,"74":1}}],["默认的",{"2":{"19":2,"56":1}}],["默认主题参考",{"2":{"10":1}}],["补全功能可能已经如",{"2":{"56":2}}],["补全功能可以被",{"2":{"19":1}}],["补全功能",{"2":{"19":2}}],["补全功能会被放在一个对",{"2":{"19":1}}],["补全功能会被",{"2":{"19":1}}],["补全功能将会自动配置",{"2":{"19":6}}],["补全功能将会在安装过程中由",{"2":{"19":1}}],["补全功能将需要",{"2":{"19":2}}],["补全功能必须按照以下命令手动配置完成",{"2":{"19":1}}],["补全功能必须在",{"2":{"19":2}}],["补丁",{"2":{"4":1}}],["$releases",{"2":{"106":1}}],["$cmd",{"2":{"106":2}}],["$github",{"2":{"106":2}}],["$travis",{"2":{"105":1}}],["$e",{"2":{"56":4}}],["$env",{"2":{"19":2}}],["$pwd",{"2":{"27":2,"70":1}}],["$path",{"2":{"19":1,"30":1,"74":1,"81":1}}],["$nu",{"2":{"19":3}}],["$fpath",{"2":{"19":1,"56":1}}],["$",{"2":{"19":16,"38":1,"56":17,"70":2,"74":6,"98":4,"99":5,"100":3,"101":4,"104":1}}],["$home",{"0":{"41":1},"1":{"42":1,"43":1,"44":1,"45":1},"2":{"19":8,"25":1,"26":2,"28":1,"56":49,"70":1}}],["$asdf",{"2":{"2":1,"47":1,"56":2,"74":1,"88":1,"101":2}}],["展开以下与你的系统最匹配的选项",{"2":{"19":1}}],["~",{"2":{"17":1,"19":49,"40":1,"46":3,"56":23,"74":1,"94":2,"96":1}}],["2014",{"2":{"109":1}}],["2",{"0":{"16":1},"1":{"17":1,"18":1},"2":{"40":7,"70":1,"79":1,"86":1}}],["overview",{"2":{"90":2}}],["own",{"2":{"76":1}}],["output",{"2":{"38":1}}],["ohmyzsh",{"2":{"19":4}}],["oh",{"2":{"19":5,"81":1}}],["opt",{"2":{"19":9,"46":1,"56":3}}],["optionally",{"2":{"38":3}}],["optional",{"2":{"4":2,"38":1}}],["or",{"2":{"18":1,"38":6,"76":2}}],["org",{"2":{"18":1}}],["one",{"2":{"38":1}}],["on",{"2":{"15":1,"38":4}}],["osx",{"2":{"86":1,"103":1,"105":1}}],["os",{"2":{"15":1,"38":1,"105":1}}],["official",{"0":{"17":1},"2":{"18":1}}],["of",{"2":{"15":1,"38":9,"76":1}}],["h",{"2":{"106":1}}],["hashnuke",{"2":{"109":1,"110":1}}],["haxe",{"2":{"101":3}}],["halcyon",{"2":{"59":1}}],["home",{"2":{"19":2}}],["homebrew",{"0":{"35":1},"2":{"15":1,"18":1,"19":12,"35":2,"47":1,"55":1,"56":7}}],["head",{"2":{"38":1,"55":2}}],["help",{"0":{"90":1},"2":{"29":1,"38":2,"90":5,"101":3,"103":1}}],["helper",{"2":{"18":1,"55":1}}],["here",{"2":{"15":1,"76":2}}],["highly",{"2":{"18":1}}],["html",{"2":{"8":1}}],["https",{"2":{"1":5,"7":3,"17":1,"18":1,"23":1,"38":2,"58":1,"59":2,"103":1,"105":1,"107":1}}],["11",{"2":{"72":1}}],["17",{"2":{"54":2,"65":1,"66":1,"67":1,"68":1,"69":1,"72":2,"73":1}}],["15",{"2":{"40":5}}],["10",{"2":{"40":3}}],["16",{"2":{"26":1,"27":1,"54":2}}],["14",{"2":{"17":1,"24":1,"54":4}}],["1",{"0":{"15":1},"2":{"17":1,"45":1,"70":2,"78":1,"86":4,"94":1}}],["配置示例",{"0":{"105":1}}],["配置部分",{"2":{"70":1}}],["配置文档",{"2":{"63":1}}],["配置文件中启用了",{"2":{"96":1}}],["配置文件中移除使用",{"2":{"56":3}}],["配置文件中移除生效",{"2":{"56":11}}],["配置文件和实现方式",{"2":{"30":1}}],["配置文件",{"2":{"28":1,"81":1}}],["配置文件设置全局和项目版本",{"2":{"14":1}}],["配置自上次",{"2":{"45":1}}],["配置既包括可共享的",{"2":{"39":1}}],["配置中包含的单个",{"2":{"37":1}}],["配置中设置好之后",{"2":{"31":1}}],["配置和",{"2":{"19":1}}],["配置",{"0":{"39":1},"1":{"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1},"2":{"19":1,"28":1,"43":1,"44":1}}],["配置已经被提取并按照语言类型分隔开来",{"2":{"10":1}}],["为此",{"2":{"106":1}}],["为此插件注册其他设置器文件",{"2":{"96":1}}],["为你的插件提供帮助信息",{"2":{"90":1}}],["为",{"2":{"45":1,"80":1,"92":1}}],["为什么使用",{"0":{"37":1}}],["为了使你的用户更轻松",{"2":{"107":1}}],["为了安装",{"2":{"40":2}}],["为了启用此功能",{"2":{"28":1}}],["为了让补全功能正常工作需要安装",{"2":{"19":1}}],["为了简化根配置文件",{"2":{"10":1}}],["为每一个你想要管理的工具",{"2":{"14":1}}],["了解插件的完整缩写列表",{"2":{"60":1}}],["了解用于支持更多工具的插件",{"2":{"57":1}}],["了解现有的问题",{"2":{"13":1}}],["了解更多详情",{"2":{"10":1,"11":1,"49":1}}],["了解更多",{"2":{"2":1,"19":2,"34":1,"35":1,"36":1,"63":1,"80":1,"111":1}}],["主题搜索",{"2":{"12":1}}],["缩写存储库将同步到你的本地计算机并定期刷新",{"2":{"63":1}}],["缩写存储库",{"2":{"12":1}}],["社区驱动的项目",{"2":{"12":1}}],["组织",{"2":{"12":1}}],["execution",{"2":{"38":1}}],["executes",{"2":{"38":1}}],["executable",{"2":{"38":1,"94":1}}],["exec",{"0":{"50":1,"93":1,"94":1},"2":{"38":1,"50":1,"74":6,"94":2}}],["exhaustive",{"2":{"15":1}}],["edit",{"2":{"19":3,"56":3}}],["echo",{"2":{"19":7}}],["elm",{"2":{"58":2}}],["else",{"2":{"56":2}}],["elv",{"2":{"19":18,"56":6}}],["elvish",{"2":{"19":18,"46":1,"56":9}}],["elixir",{"2":{"12":1,"40":1,"57":1,"70":4,"102":2}}],["etc",{"2":{"19":2,"56":2}}],["e",{"2":{"19":9}}],["erlang",{"2":{"12":1,"58":1,"61":1,"62":1,"65":1,"66":2,"67":2,"68":2,"69":2,"72":2,"73":1}}],["environment",{"2":{"38":1}}],["env",{"0":{"51":1,"93":1},"2":{"38":1,"51":1,"74":1,"104":1}}],["en",{"2":{"11":2}}],["english",{"2":{"11":1}}],["随时欢迎大家维护和改进这些插件",{"2":{"12":1}}],["官方插件",{"0":{"12":1}}],["└─",{"2":{"11":4}}],["│",{"2":{"11":1}}],["├─",{"2":{"11":5}}],["如发布候选版本",{"2":{"91":1}}],["如上面的",{"2":{"71":1}}],["如上所述默认为",{"2":{"46":1}}],["如",{"2":{"57":1}}],["如何处理不同的工具",{"2":{"57":1}}],["如果指定了",{"2":{"103":2}}],["如果扩展命令未设置其可执行位",{"2":{"101":1}}],["如果未指定此脚本",{"2":{"92":1}}],["如果未设置",{"2":{"88":1}}],["如果实现了此回调",{"2":{"91":1}}],["如果设置了可执行位",{"2":{"101":1}}],["如果设置",{"2":{"88":1}}],["如果在存储库目录中运行测试脚本",{"2":{"105":1}}],["如果在安装过程开始时填充了",{"2":{"88":1}}],["如果在过去的",{"2":{"63":1}}],["如果安装失败",{"2":{"88":1}}],["如果此脚本不存在",{"2":{"87":1}}],["如果可能",{"2":{"87":1,"88":1}}],["如果可行的话",{"2":{"42":1}}],["如果下载失败",{"2":{"87":2}}],["如果下载的源代码或者二进制文件是压缩的",{"2":{"87":1}}],["如果必须手动对版本进行排序",{"2":{"86":1}}],["如果从网站上的发布页面拉取版本",{"2":{"86":1}}],["如果有一个",{"2":{"102":1}}],["如果有很多版本",{"2":{"86":1}}],["如果有的话",{"2":{"81":1,"98":1}}],["如果有需要也会创建此文件",{"2":{"70":1}}],["如果",{"2":{"81":1,"85":1,"97":1}}],["如果由于某种原因",{"2":{"75":1}}],["如果一个插件支持从源代码下载和编译",{"2":{"65":1}}],["如果用了的话",{"2":{"56":1}}],["如果通过",{"2":{"46":1}}],["如果已过自上次同步的持续时间",{"2":{"45":1}}],["如果持续时间已过",{"2":{"45":1}}],["如果没有为工具找到指定的版本",{"2":{"25":1}}],["如果你的插件的",{"2":{"106":1}}],["如果你的插件提供了",{"2":{"101":1}}],["如果你希望",{"2":{"90":1}}],["如果你希望你的插件使用",{"2":{"88":1}}],["如果你只是想为当前",{"2":{"70":1}}],["如果你在",{"2":{"56":1}}],["如果你使用了其他方法安装",{"2":{"55":1}}],["如果你把",{"2":{"46":1}}],["如果你正在使用自定义的",{"2":{"19":2}}],["如果你正在使用",{"2":{"19":4,"56":1}}],["如果你想要更新特定的包",{"2":{"61":1}}],["如果你想要在不更改已安装的",{"2":{"2":1}}],["如果你想要使用",{"2":{"1":1}}],["如下所示",{"2":{"11":1,"61":1}}],["将复制这个文件替代使用标准垫片模板",{"2":{"102":1}}],["将在安装中查找",{"2":{"92":1}}],["将使用它来确定工具的最新稳定版本",{"2":{"91":1}}],["将打印标题",{"2":{"90":1}}],["将为",{"2":{"88":1}}],["将下载并安装该版本",{"2":{"87":1}}],["将假设存在",{"2":{"87":1}}],["将版本写到",{"2":{"70":2}}],["将运行垫片",{"2":{"31":1}}],["将管理权还给系统",{"2":{"26":1}}],["将显示当前目录中的工具和版本解析结果",{"2":{"25":1}}],["将会简单读取文件来确定版本",{"2":{"97":1}}],["将会触发同步",{"2":{"63":1}}],["将会触发持续时间的检查",{"2":{"45":1}}],["将会被禁用",{"2":{"47":1}}],["将会使用这个文件所指定的配置",{"2":{"41":1}}],["将会使脚本生效并安装补全功能",{"2":{"19":2}}],["将会引导你",{"2":{"26":1}}],["将会创建一个新的",{"2":{"4":3}}],["将要求",{"2":{"11":1}}],["键同名的目录位置",{"2":{"11":1}}],["侧边栏配置在上述配置文件中捕获",{"2":{"11":1}}],["侧边栏配置引用",{"2":{"11":1}}],["导航栏",{"2":{"11":1}}],["导航栏和侧边栏",{"2":{"10":1}}],["定义了支持的语言类型及其",{"2":{"11":1}}],["定义了拉取请求标题的格式",{"2":{"4":1}}],["根配置文件",{"2":{"11":1}}],["根据以下步骤卸载",{"2":{"56":1}}],["根据",{"2":{"7":1,"19":1}}],["国际化官方文档",{"2":{"11":1}}],["国际化",{"0":{"11":1}}],["if",{"2":{"38":1,"106":1}}],["information",{"2":{"38":1}}],["info",{"0":{"52":1},"2":{"38":1,"52":1}}],["inside",{"2":{"38":1}}],["installs",{"2":{"94":1}}],["installed",{"2":{"38":5}}],["install",{"0":{"88":1},"2":{"1":1,"7":2,"15":6,"18":1,"22":3,"24":1,"38":10,"40":2,"44":1,"53":1,"65":2,"66":4,"80":1,"83":1,"84":1,"85":6,"87":1,"88":6,"90":2,"92":3,"94":1}}],["into",{"2":{"19":2}}],["initialise",{"2":{"19":1}}],["in",{"2":{"15":1,"38":3,"76":1}}],["is",{"2":{"15":1}}],["i18n",{"0":{"11":1},"2":{"11":1}}],["它需要带",{"2":{"103":1}}],["它仅仅被使用在了",{"2":{"102":1}}],["它提供了",{"2":{"101":1}}],["它",{"2":{"74":1}}],["它会在",{"2":{"74":1}}],["它所声明的工具版本将会被用于该目录和任意子目录",{"2":{"40":1}}],["它是一个工具版本管理器",{"2":{"37":1}}],["它是如何工作的",{"0":{"31":1}}],["它不是包管理器",{"2":{"35":1}}],["它消除了每个工具",{"2":{"33":1}}],["它们是可选的",{"2":{"90":1}}],["它们是",{"2":{"10":1,"22":1}}],["它被选中来取代",{"2":{"8":1}}],["对于目前的",{"2":{"102":1}}],["对于名为",{"2":{"102":1}}],["对于配置",{"2":{"85":1}}],["对于项目中的其他工具类型可以执行类似步骤即可",{"2":{"29":1}}],["对于",{"2":{"22":1,"46":1,"91":1}}],["对于社区插件",{"2":{"12":1}}],["对话和贡献指南",{"2":{"13":1}}],["对象表示",{"2":{"10":1}}],["对象用于表示配置",{"2":{"10":1}}],["对你有帮助",{"2":{"1":1}}],["以列出你的插件并使用较短的命令轻松安装",{"2":{"107":1}}],["以确保安装的工具正常工作",{"2":{"103":1}}],["以确认是否安装了该工具版本",{"2":{"88":1}}],["以选择",{"2":{"91":1}}],["以便它看起来更接近用户的提示",{"2":{"86":1}}],["以便你可以观察哪些工具将无法执行",{"2":{"25":1}}],["以下是",{"2":{"77":1}}],["以下是所需工具的原始列表",{"2":{"1":1}}],["以及要在其中执行的环境",{"2":{"74":1}}],["以及使用以下命令卸载",{"2":{"56":3}}],["以及使用以下命令移除补全功能",{"2":{"56":1}}],["以及更新版本",{"2":{"56":1}}],["以及作为",{"2":{"37":1}}],["以及",{"2":{"9":1}}],["具体的文档可以查看",{"2":{"9":1}}],["标签",{"2":{"103":1}}],["标签或者提交",{"2":{"65":1}}],["标题使用了约定式提交类型",{"2":{"9":1}}],["标题中的约定式提交的自动化发布流水线",{"2":{"9":1}}],["标识的",{"2":{"3":1}}],["rvmrc",{"2":{"96":1}}],["rm",{"2":{"56":4}}],["rs",{"2":{"56":4}}],["rf",{"2":{"56":26}}],["rbenv",{"0":{"33":1},"2":{"28":1,"33":1,"42":1}}],["rc",{"2":{"19":9,"56":3}}],["ruby",{"2":{"12":1,"28":1,"40":2,"42":3,"57":1,"91":3,"96":1}}],["runs",{"2":{"38":1}}],["run",{"2":{"8":2,"15":1}}],["relate",{"2":{"76":1}}],["related",{"2":{"76":1}}],["release",{"0":{"43":1},"2":{"4":1,"38":1,"41":1}}],["responsible",{"2":{"76":1}}],["resources",{"2":{"38":1}}],["reshim",{"0":{"53":1},"2":{"38":1,"53":2,"80":1,"81":1}}],["recreate",{"2":{"38":1}}],["recommend",{"2":{"18":1}}],["returned",{"2":{"38":1}}],["remove",{"0":{"100":1},"2":{"38":3,"62":2,"100":4}}],["registered",{"2":{"38":1}}],["ref>",{"2":{"38":1,"103":1}}],["ref",{"2":{"38":2,"40":2,"65":1,"85":2,"99":4,"103":1}}],["refs",{"2":{"38":1}}],["refactor",{"2":{"4":1}}],["required",{"2":{"15":1}}],["requires",{"2":{"15":1}}],["request",{"2":{"4":1}}],["repository",{"0":{"45":1},"2":{"38":1,"41":2,"63":1}}],["repo",{"2":{"13":1,"38":3,"106":1}}],["readme",{"2":{"11":4,"75":1,"101":1}}],["revert",{"2":{"4":1}}],["启动本地开发服务器",{"2":{"8":1}}],["5",{"0":{"24":1},"2":{"8":1,"26":1,"27":1,"40":2,"54":2,"72":1}}],["依赖于访问",{"2":{"106":1}}],["依赖脚本可以将依赖项输出为必须安装的",{"2":{"90":1}}],["依赖",{"2":{"7":1}}],["运行环境对管理工具的需求",{"2":{"33":1}}],["运行环境版本管理领域竞争",{"2":{"33":1}}],["运行环境的一个版本",{"2":{"14":1}}],["运行环境安装插件",{"2":{"14":1}}],["运行环境",{"2":{"7":1}}],["jthegedus",{"2":{"110":1}}],["jruby",{"2":{"91":2}}],["j",{"2":{"85":1}}],["java",{"2":{"59":3}}],["javascript",{"2":{"7":1,"8":1,"10":1}}],["join",{"2":{"19":4,"56":2}}],["json",{"2":{"7":1,"8":2}}],["js",{"2":{"7":2,"8":1,"10":5,"11":2,"12":1,"21":1,"24":1,"54":1,"57":1}}],["引擎的",{"2":{"7":1}}],["基于",{"2":{"7":1}}],["进行安装",{"2":{"46":1}}],["进行管理",{"2":{"7":1}}],["进一步相关文档请查看",{"2":{"3":1}}],["初始化设置",{"0":{"7":1}}],["初始化安装",{"0":{"1":1}}],["网站的根配置文件",{"2":{"10":1}}],["网站的配置包含在几个",{"2":{"10":1}}],["网站贡献指南",{"2":{"6":1}}],["网站",{"0":{"6":1},"1":{"7":1,"8":1,"9":1,"10":1,"11":1}}],["镜像",{"0":{"5":1}}],["大版本",{"2":{"4":1}}],["mri",{"2":{"91":1}}],["my",{"2":{"19":5,"81":1,"104":1,"107":3}}],["method",{"2":{"18":2}}],["methods",{"0":{"18":1}}],["mit",{"2":{"109":1}}],["mix",{"2":{"70":1}}],["might",{"2":{"15":1}}],["minor",{"2":{"4":1}}],["md",{"2":{"11":6}}],["man",{"2":{"101":3}}],["managed",{"2":{"76":1}}],["manage",{"2":{"38":1}}],["manager",{"2":{"15":2}}],["make",{"2":{"85":1}}],["makepkg",{"2":{"18":1}}],["maintenance",{"2":{"76":1}}],["master",{"2":{"38":1,"55":1}}],["may",{"2":{"15":1}}],["macos",{"2":{"15":2,"19":4,"22":1,"35":1,"56":3}}],["markdown",{"2":{"8":1,"11":2}}],["major",{"2":{"4":1}}],["小版本",{"2":{"4":1}}],["表示重大更改",{"2":{"4":1}}],["wsl",{"2":{"79":1}}],["wsl2",{"0":{"79":1},"2":{"79":4}}],["wsl1",{"0":{"78":1},"2":{"78":2}}],["which",{"2":{"38":1,"74":2}}],["where",{"2":{"38":1,"74":2}}],["we",{"2":{"18":1}}],["website",{"2":{"4":2}}],["windows",{"2":{"78":1,"79":2}}],["with",{"2":{"4":1,"19":1,"38":3,"104":1}}],["will",{"2":{"3":2}}],["unix",{"2":{"79":1}}],["uninstall",{"0":{"95":1},"2":{"38":1,"56":5,"73":2,"83":1}}],["upgrade",{"2":{"55":2}}],["updates",{"2":{"47":1}}],["update",{"0":{"99":1},"2":{"4":1,"38":8,"43":1,"47":1,"55":2,"61":3,"99":4}}],["util",{"2":{"38":2,"51":1}}],["utils",{"2":{"38":1,"101":1}}],["uz",{"2":{"19":1,"56":1}}],["uses",{"2":{"104":1}}],["user",{"2":{"107":1}}],["users",{"2":{"72":3}}],["user>",{"2":{"1":1,"7":1}}],["used",{"2":{"38":3}}],["use",{"0":{"43":1},"2":{"18":1,"19":3,"41":1,"46":1}}],["using",{"2":{"18":1}}],["us",{"2":{"11":1}}],["urls",{"2":{"38":3,"59":1}}],["url>",{"2":{"38":1,"58":1,"103":1}}],["url",{"2":{"11":1,"38":1,"58":2,"98":2,"107":1}}],["ubuntu",{"2":{"5":1,"90":1}}],["faq",{"0":{"77":1},"1":{"78":1,"79":1,"80":1,"81":1}}],["f",{"2":{"56":3}}],["fetch",{"2":{"55":1}}],["feature",{"2":{"4":2}}],["feat",{"2":{"4":4}}],["from",{"2":{"38":1}}],["fpath=",{"2":{"19":1,"56":1}}],["fpath",{"2":{"19":3}}],["fi",{"2":{"106":1}}],["filter",{"2":{"38":2}}],["filenames",{"0":{"96":1}}],["filename",{"2":{"46":1}}],["file",{"0":{"42":1,"97":1},"2":{"28":1,"38":2,"41":1,"46":1,"96":1,"97":1,"101":1}}],["fish",{"2":{"19":19,"46":1,"56":17,"74":1,"81":2}}],["fix",{"2":{"4":4}}],["foox",{"2":{"94":1}}],["foo",{"2":{"11":2,"65":2,"94":4,"101":11,"102":2}}],["force",{"2":{"56":5}}],["format",{"2":{"8":1}}],["for",{"2":{"4":1,"15":1,"19":2,"38":7,"76":2,"78":1,"79":1}}],["fork",{"2":{"1":2,"7":2}}],["例子调用",{"2":{"94":1}}],["例子",{"2":{"4":1}}],["例如对于",{"2":{"91":1}}],["例如",{"2":{"3":1,"54":1,"90":1,"91":1,"101":1,"103":1,"105":1}}],["强制使用准确的版本",{"2":{"24":1}}],["强制执行的",{"2":{"4":1}}],["强烈建议在编写测试之前检查现有的测试套件和",{"2":{"3":1}}],["这对于在该插件的",{"2":{"103":1}}],["这使得无法使用标准的",{"2":{"102":1}}],["这可用于在从",{"2":{"100":1}}],["这可用于在",{"2":{"99":1}}],["这可用于在插件添加到",{"2":{"98":1}}],["这可用于进一步解析",{"2":{"97":1}}],["这可以在插件中通过",{"2":{"74":1}}],["这可以当作是清理",{"2":{"62":1}}],["这可以设置在",{"2":{"46":1}}],["这仅适用于在",{"2":{"96":1}}],["这允许插件有条件地覆盖垫片指定的可执行程序路径",{"2":{"94":1}}],["这应该用于过滤所有最新稳定版本",{"2":{"91":1}}],["这应该是与插件和工具相关的链接列表",{"2":{"90":1}}],["这不是一个回调脚本",{"2":{"90":1}}],["这样的插件",{"2":{"101":1}}],["这样的东西就足够了",{"2":{"86":1}}],["这样就完成了",{"2":{"20":1}}],["这很有帮助",{"2":{"86":1}}],["这需要你在设置你的",{"2":{"81":1}}],["这种默认行为是不可取的",{"2":{"91":1}}],["这种更新方式将会获取插件存储库的",{"2":{"61":1}}],["这种方式供语言开发者等使用",{"2":{"40":1}}],["这将指示",{"2":{"92":1}}],["这将为某个包的当前版本重新创建垫片",{"2":{"53":1}}],["这将会是一个项目的",{"2":{"27":1}}],["这是一个",{"2":{"105":1}}],["这是一个注释",{"2":{"40":1}}],["这是为什么",{"2":{"80":1}}],["这是另一个注释",{"2":{"40":1}}],["这是通过",{"2":{"4":1}}],["这个功能的一个很好的例子是像",{"2":{"101":1}}],["这个位于",{"2":{"74":1}}],["这个周期由以下方法确定",{"2":{"63":1}}],["这个工具将会安装",{"2":{"40":1}}],["这个列表就是",{"2":{"38":1}}],["这个责任取决于用户",{"2":{"35":1}}],["这个信息是通过读取自上次发布以来的提交历史记录来确定的",{"2":{"4":1}}],["这在每个插件中都原生支持",{"2":{"28":1}}],["这些附加的环境变量将可用于",{"2":{"85":2}}],["这些脚本或可执行程序将使用插件名称作为",{"2":{"101":1}}],["这些脚本的每一个都应根据当前操作系统调整其输出",{"2":{"90":1}}],["这些脚本在执行",{"2":{"83":1}}],["这些脚本能为工具安装的可执行程序创建垫片",{"2":{"33":1}}],["这些插件所对应的存储库链接如下所示",{"2":{"12":1}}],["这些配置的官方文档位于",{"2":{"10":1}}],["约定式提交遵循以下格式",{"2":{"4":1}}],["约定式提交",{"2":{"4":1}}],["变更日志",{"2":{"4":1}}],["变量设置为克隆存储库的路径",{"2":{"2":1}}],["拉取请求标题必须遵循这种格式",{"2":{"4":1}}],["拉取请求",{"0":{"4":1,"9":1}}],["部分所述",{"2":{"71":1}}],["部分",{"2":{"3":1}}],["x",{"2":{"63":2}}],["x26",{"2":{"3":1,"19":2,"56":2}}],["x3c",{"2":{"1":1,"4":3,"7":1,"38":38,"50":1,"51":1,"53":2,"54":1,"58":3,"61":1,"62":1,"65":2,"66":3,"67":3,"68":3,"69":3,"70":13,"71":1,"72":1,"73":2,"94":3,"103":4}}],[">>",{"2":{"19":15}}],[">",{"2":{"3":1,"4":1}}],["danhper",{"2":{"110":1}}],["data",{"2":{"46":1,"56":11,"74":1,"101":5}}],["dylibs",{"2":{"101":1}}],["driven",{"2":{"76":1}}],["duration",{"0":{"45":1},"2":{"41":1,"63":1}}],["during",{"2":{"3":2}}],["disabled",{"2":{"47":1}}],["disable",{"2":{"41":1}}],["display",{"2":{"38":4}}],["direnv",{"0":{"34":1},"2":{"34":3,"75":1}}],["dirmngr",{"2":{"22":1}}],["dir=",{"2":{"19":3}}],["dir",{"2":{"2":1,"19":4,"46":2,"47":1,"56":12,"74":1,"101":6,"105":1}}],["d",{"2":{"19":2,"56":2}}],["downlaod",{"2":{"88":1}}],["download",{"0":{"17":1,"18":1,"44":1,"87":1},"2":{"41":1,"84":1,"85":4,"87":3,"88":1}}],["do",{"2":{"76":1}}],["docker",{"0":{"5":1}}],["documentation",{"2":{"4":1,"38":1}}],["docsify",{"2":{"8":2}}],["docs",{"2":{"4":3,"7":2,"9":2,"10":3,"11":2,"38":1}}],["dnf",{"2":{"15":2}}],["deps",{"2":{"90":1}}],["depending",{"2":{"15":1}}],["debug",{"2":{"38":1}}],["debian",{"2":{"22":1}}],["default",{"2":{"38":3,"46":1}}],["description",{"2":{"9":1}}],["description>",{"2":{"4":1}}],["dev",{"2":{"8":1,"76":2}}],["npm",{"2":{"53":2,"54":2,"80":1}}],["name",{"2":{"38":1,"40":1,"41":1,"45":1,"63":1,"71":1,"98":2,"99":2,"100":2,"103":1,"104":1}}],["name>",{"2":{"38":19,"53":1,"58":2,"61":1,"62":1,"65":1,"66":2,"67":2,"68":2,"69":2,"70":5,"71":1,"72":1,"73":1,"103":1}}],["navbar",{"2":{"10":1,"11":4}}],["nix",{"2":{"36":1}}],["nixos",{"0":{"36":1},"2":{"36":3}}],["nvm",{"0":{"33":1},"2":{"33":1}}],["nvmrc",{"2":{"28":1}}],["n$env",{"2":{"19":3}}],["nu",{"2":{"19":9}}],["nushell",{"2":{"19":6}}],["nsource",{"2":{"19":1}}],["neko",{"2":{"101":1}}],["never",{"2":{"45":1}}],["nexport",{"2":{"19":1}}],["nested",{"2":{"11":2}}],["new",{"2":{"4":1}}],["no",{"2":{"41":4,"42":1,"43":1,"44":1}}],["non",{"2":{"15":1}}],["node",{"2":{"7":2,"12":1,"21":1,"24":1,"28":1,"54":3,"57":1,"72":1,"103":1,"105":2}}],["nodejs插件安装了这些工具的很多版本时",{"2":{"54":1}}],["nodejs",{"2":{"7":2,"21":1,"22":1,"23":2,"24":3,"26":2,"27":2,"28":1,"29":1,"40":2,"53":2,"54":6,"59":3,"72":1,"103":3,"105":2}}],["note",{"2":{"15":1,"76":1}}],["not",{"2":{"3":1,"76":2}}],["n",{"0":{"33":1},"2":{"3":2,"19":16,"33":1,"106":1}}],["39cb398vb39",{"2":{"40":1}}],["3",{"0":{"19":1},"2":{"3":2,"8":1,"40":4,"54":2,"65":1,"72":2,"73":1,"86":1}}],["g",{"2":{"53":1,"80":1}}],["given",{"2":{"38":1}}],["gitref",{"2":{"103":1}}],["git",{"2":{"1":8,"7":5,"15":7,"17":1,"18":3,"19":8,"23":1,"27":1,"30":1,"38":6,"55":2,"56":5,"58":3,"59":2,"83":1,"85":1,"99":2,"103":3,"105":2,"107":1}}],["github",{"0":{"13":1,"104":1,"106":1},"2":{"1":7,"4":1,"7":5,"12":1,"17":1,"23":1,"38":2,"40":1,"58":1,"59":2,"76":2,"79":2,"103":1,"104":4,"105":1,"106":2,"107":1,"111":1}}],["global",{"2":{"26":1,"38":4,"40":1,"70":5,"71":1,"74":1}}],["gawk",{"2":{"22":2}}],["gpg",{"2":{"22":2}}],["get",{"2":{"22":1,"90":1}}],["gt",{"2":{"3":1,"4":2,"9":1,"40":1,"45":1,"53":1,"63":1,"71":1,"90":3,"92":3,"103":1}}],["使用信息",{"2":{"90":1}}],["使用自己的编程语言",{"2":{"36":1}}],["使用可以根据当前目录加载和卸载环境变量的新功能增强现有",{"2":{"34":1}}],["使用现有工具版本文件",{"0":{"28":1}}],["使用",{"2":{"19":2,"40":1,"71":1,"80":1}}],["使用以下命令可以设置一个全局版本",{"2":{"26":1}}],["使用以下命令将",{"2":{"19":12}}],["使用以下命令安装工具版本",{"2":{"7":1}}],["使用以下命令安装这些版本来开发",{"2":{"1":1}}],["使用以下命令添加插件",{"2":{"7":1}}],["使用带有",{"2":{"3":1}}],["文件支持的版本格式相同",{"2":{"70":1}}],["文件了解更多详情",{"2":{"70":1,"75":1}}],["文件读取版本",{"2":{"42":1}}],["文件然后",{"2":{"41":1}}],["文件所指定的版本",{"2":{"40":1}}],["文件的目录中运行",{"2":{"40":1}}],["文件的目录中不带其他参数执行",{"2":{"40":1}}],["文件的同一集合位于",{"2":{"11":1}}],["文件示例如下所示",{"2":{"40":1}}],["文件进行迁移",{"2":{"28":1}}],["文件内容将会如下所示",{"2":{"26":1,"27":1}}],["文件",{"2":{"8":1,"28":1,"39":1,"42":1,"46":2,"102":1}}],["文件安装",{"2":{"7":1}}],["文件中提及",{"2":{"101":1}}],["文件中指定",{"2":{"74":1}}],["文件中配置",{"2":{"63":1}}],["文件中找不到任何配置",{"2":{"56":1}}],["文件中定义的某个工具",{"2":{"40":1}}],["文件中定义的所有工具",{"2":{"40":1}}],["文件中设置的工具版本并执行该版本",{"2":{"31":1}}],["文件中进行管理",{"2":{"26":1}}],["文件中进行工具的版本查找",{"2":{"25":1}}],["文件中使用以下内容手动配置完成",{"2":{"19":1}}],["文件中加入以下内容自动配置",{"2":{"19":1}}],["文件中加入以下内容来配置完成",{"2":{"19":1}}],["文件中加入以下内容",{"2":{"19":11}}],["文件中",{"2":{"1":1,"10":1,"19":12,"27":1,"40":1,"70":2}}],["文档中已涵盖的任何信息",{"2":{"90":1}}],["文档网站的静态站点生成器",{"2":{"8":1}}],["文档网站开发所需的工具都在文件",{"2":{"7":1}}],["文档",{"0":{"6":1},"1":{"7":1,"8":1,"9":1,"10":1,"11":1},"2":{"2":1,"3":1,"6":1,"10":1,"34":1,"35":1,"36":1}}],["请根据你的需要进行自定义",{"2":{"105":1}}],["请仅在真的需要时才使用此功能",{"2":{"102":1}}],["请务必在插件的",{"2":{"101":1}}],["请务必查看其",{"2":{"75":1}}],["请检查是否存在",{"2":{"88":1}}],["请注意",{"2":{"86":1,"90":1}}],["请按照",{"2":{"56":1}}],["请设置该变量到那个目录",{"2":{"46":1}}],["请在",{"2":{"28":1,"88":1}}],["请在创建拉取请求之前覆盖新的代码路径",{"2":{"2":1}}],["请继续阅读下面的指南来了解这些是如何做到的",{"2":{"20":1}}],["请参考",{"2":{"12":1,"13":1,"57":1,"60":1}}],["请参考以下文件",{"2":{"10":1}}],["请查看插件存储库",{"2":{"107":1}}],["请查看",{"2":{"10":1,"11":1,"19":2,"28":1,"34":1,"35":1,"36":1,"49":1,"63":1,"70":1,"80":1,"111":1}}],["请确保在访问时提供授权令牌",{"2":{"106":1}}],["请确保",{"2":{"9":1,"19":2}}],["请求时",{"2":{"9":1}}],["请使用约定式提交信息格式作为拉取请求标题",{"2":{"4":1}}],["请使用以下命令添加这些插件",{"2":{"1":1}}],["增加测试",{"2":{"2":1}}],["特定命令",{"2":{"2":1}}],["测试插件",{"0":{"103":1},"1":{"104":1,"105":1}}],["测试",{"0":{"3":1},"2":{"2":2}}],["格式化",{"2":{"2":1}}],["格式化器和解释器",{"2":{"1":1}}],["src",{"2":{"40":1}}],["specific",{"2":{"38":2}}],["specified",{"2":{"38":1}}],["specifying",{"2":{"38":1}}],["spack",{"2":{"15":2}}],["save",{"2":{"19":3}}],["sort",{"2":{"86":1}}],["source",{"2":{"19":3,"74":2,"98":1}}],["some",{"2":{"3":3,"4":3,"15":1,"76":1}}],["si",{"2":{"18":1}}],["sidebar",{"2":{"10":1,"11":4}}],["subsystem",{"2":{"78":1,"79":1}}],["supporting",{"2":{"76":1}}],["supported",{"0":{"18":1}}],["sudo",{"2":{"15":1}}],["system",{"2":{"15":1,"40":3,"71":3}}],["stdout",{"2":{"90":1}}],["stable",{"0":{"91":1},"2":{"38":5}}],["stratus3d",{"2":{"110":1}}],["string",{"2":{"19":2,"38":1,"56":2}}],["str",{"2":{"19":2}}],["steps",{"2":{"15":1}}],["style",{"2":{"4":1}}],["secrets",{"2":{"104":1}}],["security",{"2":{"76":1}}],["set",{"2":{"19":3,"38":7,"56":3,"72":3}}],["selectlanguagename",{"2":{"11":2}}],["semantic",{"2":{"4":1}}],["semver",{"2":{"4":4}}],["ssg",{"2":{"8":1}}],["script",{"2":{"74":2,"105":2}}],["scripts",{"2":{"2":2}}],["scope",{"2":{"4":1}}],["s",{"2":{"3":2,"15":1,"19":5,"106":1}}],["short",{"2":{"41":1}}],["show",{"2":{"38":3}}],["shim",{"0":{"54":1},"2":{"38":3,"54":3}}],["shims",{"0":{"74":1},"1":{"75":1},"2":{"2":1,"38":1,"74":2,"102":1}}],["sh",{"2":{"19":17,"46":1,"56":16,"74":3,"81":1,"105":1}}],["shfmt",{"2":{"1":4,"2":1}}],["shellcmd=",{"2":{"106":1}}],["shellcheck",{"2":{"1":3,"2":1}}],["shell$",{"2":{"101":1}}],["shellfoo",{"2":{"101":1}}],["shell用法",{"2":{"94":1}}],["shellbin",{"2":{"92":1}}],["shellbrew",{"2":{"56":5}}],["shell1",{"2":{"86":1}}],["shellif",{"2":{"56":2}}],["shelluse",{"2":{"56":3}}],["shellpacman",{"2":{"56":4}}],["shellrm",{"2":{"56":25}}],["shell➜",{"2":{"54":2}}],["shellexport",{"2":{"19":2}}],["shellecho",{"2":{"19":8}}],["shellmkdir",{"2":{"19":4}}],["shellsource",{"2":{"19":2,"56":3}}],["shellgit",{"2":{"17":1}}],["shelldocs",{"2":{"11":1}}],["shellnpm",{"2":{"7":1,"8":2}}],["shellasdf",{"2":{"1":2,"7":2,"23":1,"24":1,"26":1,"27":1,"50":1,"51":1,"52":1,"53":1,"54":1,"58":2,"59":2,"60":1,"61":2,"65":1,"66":2,"67":2,"68":2,"69":2,"70":2,"71":1,"72":1,"73":1,"103":2}}],["shell",{"0":{"81":1},"2":{"1":3,"2":1,"3":1,"7":1,"19":21,"31":1,"33":1,"34":1,"37":2,"38":3,"52":1,"56":9,"70":4,"71":1,"74":2,"81":1,"96":1}}],["脚本获取",{"2":{"101":1}}],["脚本或者可执行程序来定义新的",{"2":{"101":1}}],["脚本将传递文件路径作为其第一个参数",{"2":{"97":1}}],["脚本还应该根据设置变量",{"2":{"90":1}}],["脚本已经下载源代码",{"2":{"88":1}}],["脚本回调时下载源代码",{"2":{"88":1}}],["脚本应仅在安装脚本认为工具的生成和安装成功后",{"2":{"88":1}}],["脚本应以任何非零退出状态退出",{"2":{"88":1}}],["脚本应该仅将文件放在",{"2":{"87":1}}],["脚本自定义",{"2":{"88":1}}],["脚本必须以任何非零退出状态退出",{"2":{"87":1}}],["脚本下载源代码或二进制文件的路径",{"2":{"85":1}}],["脚本执行情况下",{"2":{"85":1}}],["脚本提供",{"2":{"74":1}}],["脚本的位置",{"2":{"46":1}}],["脚本的",{"2":{"37":1}}],["脚本的静态分析工具",{"2":{"1":1}}],["脚本写的",{"2":{"33":1}}],["脚本需要在设置好的",{"2":{"19":1}}],["脚本",{"0":{"90":1},"2":{"19":1,"85":2,"87":1}}],["脚本检查",{"2":{"2":1}}],["命令用于测试插件",{"2":{"103":1}}],["命令的子命令进行调用",{"2":{"101":1}}],["命令的打印内容",{"2":{"38":1}}],["命令可能会认为该工具版本已经安装",{"2":{"88":1}}],["命令会在自己的行打印每个版本",{"2":{"86":1}}],["命令会返回",{"2":{"54":1}}],["命令时被执行",{"2":{"83":1}}],["命令文档",{"2":{"80":1}}],["命令选择",{"2":{"74":1}}],["命令将会强制重新计算任何新可执行程序的垫片",{"2":{"53":1}}],["命令安装",{"2":{"53":1}}],["命令行的扩展命令",{"0":{"101":1}}],["命令行",{"2":{"53":1}}],["命令列表很小",{"2":{"48":1}}],["命令进行的更新",{"2":{"47":1}}],["命令以保留或删除下载的源代码或二进制文件",{"2":{"44":1}}],["命令以升级到最新的候选版本",{"2":{"43":1}}],["命令主要分为三类",{"2":{"29":1}}],["命令",{"2":{"2":1,"40":2,"45":1,"63":1,"74":1,"80":2,"101":1}}],["long",{"2":{"76":1}}],["local",{"2":{"27":1,"38":4,"40":1,"70":3,"71":3,"74":1}}],["locales",{"2":{"11":1}}],["locale",{"2":{"11":1}}],["last",{"0":{"45":1},"2":{"41":1,"63":1}}],["lang",{"2":{"38":1,"70":1}}],["latest",{"0":{"91":1},"2":{"24":3,"26":1,"27":1,"38":15,"66":4,"69":4,"70":3,"91":1,"103":1}}],["later",{"2":{"15":1}}],["legacy",{"0":{"42":1,"96":1,"97":1},"2":{"28":1,"96":1,"97":1}}],["ln",{"2":{"19":4}}],["lt",{"2":{"4":2,"9":1,"40":1,"45":1,"53":1,"63":1,"71":1,"90":3,"92":3,"103":1}}],["license",{"2":{"109":1}}],["lib",{"2":{"19":6,"56":3,"101":8}}],["libexec",{"2":{"19":10,"56":4}}],["link",{"2":{"90":2,"101":1}}],["links",{"2":{"90":1}}],["linux",{"2":{"15":4,"22":1,"35":1,"78":1,"79":1,"103":1,"105":1}}],["lint",{"2":{"2":1}}],["listed",{"2":{"38":1,"76":1}}],["list",{"0":{"86":1,"92":1,"96":1},"2":{"2":1,"15":1,"24":2,"38":9,"45":1,"59":4,"60":1,"63":1,"67":4,"68":4,"83":1,"84":1,"85":1,"86":1,"88":1,"91":3,"106":2}}],["luizm",{"2":{"1":2}}],["和更新后的",{"2":{"99":1}}],["和源",{"2":{"98":1}}],["和补全功能的行",{"2":{"56":6}}],["和环境变量",{"2":{"39":1}}],["和",{"2":{"2":1,"5":1,"28":1,"33":1,"52":1,"54":1,"74":1,"90":1,"92":1,"103":1}}],["bug",{"2":{"52":1}}],["build",{"2":{"4":1,"105":1}}],["by",{"2":{"38":1,"72":3}}],["branch",{"2":{"17":1,"38":3}}],["brazilian",{"2":{"11":1}}],["brew",{"2":{"15":1,"18":1,"19":12,"22":1,"55":2,"56":7}}],["breaking",{"2":{"4":1}}],["br",{"2":{"11":6}}],["before",{"2":{"105":1}}],["begins",{"2":{"38":1}}],["being",{"2":{"38":2}}],["be",{"2":{"3":2,"15":1}}],["bin",{"0":{"86":1,"87":1,"88":1,"90":1,"91":1,"92":2,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1},"2":{"2":1,"74":1,"84":3,"85":5,"87":1,"88":5,"90":5,"92":2,"94":4,"106":1}}],["baz`",{"2":{"101":1}}],["baz",{"2":{"101":1}}],["bar`",{"2":{"101":1}}],["bar",{"2":{"101":1}}],["bat",{"2":{"101":6}}],["bats",{"0":{"3":1},"2":{"1":3,"2":3,"3":8}}],["bash`",{"2":{"101":3}}],["bashasdf",{"2":{"62":1}}],["bashrc",{"2":{"19":6,"56":3}}],["bash",{"2":{"1":3,"2":3,"19":19,"56":14,"81":1,"101":9,"102":1}}],["并确保它可以在",{"2":{"103":1}}],["并执行设置工具环境所需的任何操作",{"2":{"83":1}}],["并不总是被设置",{"2":{"90":1}}],["并不意味着这是这个特定工具的最佳实践方案",{"2":{"37":1}}],["并不打算成为一个系统包管理器",{"2":{"37":1}}],["并可通过简单的插件接口扩展到所有工具和运行环境",{"2":{"30":1}}],["并加快错误修复的审查速度",{"2":{"2":1}}],["并临时将目录的",{"2":{"2":1}}],["并且重新编译",{"2":{"55":1}}],["并且它不是一个包管理器",{"2":{"36":1}}],["并且",{"2":{"1":1,"7":1,"106":1}}],["开发",{"0":{"2":1,"8":1}}],["支持下载二进制文件的插件将会下载二进制文件",{"2":{"40":1}}],["支持从",{"2":{"28":1}}],["支持从其他版本管理器的现有版本文件中迁移过来",{"2":{"28":1}}],["支持",{"0":{"78":1,"79":1},"2":{"1":1,"42":1,"79":1}}],["兼容脚本",{"2":{"1":1}}],["public",{"2":{"106":1}}],["pull",{"2":{"4":1}}],["pkgbuild",{"2":{"55":1}}],["python",{"2":{"26":1,"40":4,"71":1}}],["ps1",{"2":{"19":8}}],["p",{"2":{"19":4}}],["post",{"0":{"98":1,"99":1},"2":{"22":1,"98":2,"99":3,"100":2}}],["posix",{"2":{"1":1,"19":3}}],["powershell",{"2":{"19":7}}],["portuguese",{"2":{"11":1}}],["pt",{"2":{"11":6}}],["prev",{"2":{"99":1}}],["pre",{"0":{"100":1},"2":{"98":2,"99":2,"100":2}}],["prefix",{"2":{"19":12,"56":6}}],["preferred",{"2":{"18":1}}],["projects",{"0":{"76":1},"2":{"76":2}}],["project",{"2":{"72":1,"76":1}}],["provide",{"2":{"38":1}}],["provided",{"2":{"38":2}}],["profile",{"2":{"19":14,"56":3,"81":1}}],["primarily",{"2":{"15":1}}],["print",{"2":{"38":2}}],["printing",{"2":{"3":1}}],["printed",{"2":{"3":2}}],["printf",{"2":{"3":2}}],["pr",{"2":{"9":3}}],["parse",{"0":{"97":1},"2":{"97":1}}],["particular",{"2":{"38":1}}],["path>",{"2":{"94":2}}],["paths",{"0":{"92":1},"2":{"88":1}}],["path",{"0":{"94":1},"2":{"19":8,"38":2,"40":1,"74":1,"85":3,"87":3,"88":6,"92":3,"94":2,"98":1,"99":1,"100":1,"106":1}}],["patch",{"2":{"4":1}}],["pacman",{"2":{"15":2,"18":1,"19":7,"47":1,"55":1,"56":4}}],["packages",{"2":{"38":3}}],["package",{"2":{"7":1,"8":1,"15":2,"38":15}}],["perf",{"2":{"4":1}}],["please",{"2":{"4":1}}],["plugins",{"2":{"12":1,"38":6,"76":1,"94":1,"101":5,"107":1}}],["plugin",{"0":{"45":1,"98":1,"99":1,"100":1},"2":{"1":3,"7":1,"12":1,"23":1,"38":12,"41":2,"45":2,"58":4,"59":4,"60":1,"61":3,"62":2,"63":3,"74":3,"94":1,"98":8,"99":9,"100":7,"103":7,"104":2,"105":3,"107":5}}],["自动提供",{"2":{"104":1}}],["自动化测试系统",{"2":{"1":1}}],["自定义垫片模板",{"0":{"102":1}}],["自身来管理它",{"2":{"1":1}}],["或只是",{"2":{"90":1}}],["或",{"2":{"1":1,"85":1}}],["或许",{"2":{"1":1}}],["或者可以创建",{"2":{"101":1}}],["或者以相反的顺序排列",{"2":{"86":1}}],["或者希望在进入项目目录时自动设置环境变量",{"2":{"75":1}}],["或者通过插件存储库中的缩写添加插件",{"2":{"58":1}}],["或者不存在",{"2":{"25":1}}],["或者",{"2":{"19":3,"29":1,"35":1,"40":2,"45":1,"46":1,"47":1,"56":1,"63":1,"71":1,"74":1,"81":1,"83":1,"85":1,"103":1}}],["或者执行以下命令",{"2":{"19":2}}],["或者更新的版本",{"2":{"19":2}}],["或者运行生产应用",{"2":{"5":1}}],["或者直接克隆",{"2":{"1":1,"7":1}}],["或者使用你习惯的",{"2":{"55":1}}],["或者使用",{"2":{"1":1,"7":1}}],["travis",{"2":{"105":1,"106":1}}],["travisci",{"0":{"105":1}}],["truffleruby",{"2":{"91":1}}],["trim",{"2":{"19":2}}],["title",{"2":{"90":1}}],["timgluz",{"2":{"1":1}}],["tac",{"2":{"86":1}}],["tap",{"2":{"3":1}}],["txtlegacy",{"2":{"41":1}}],["txtmanage",{"2":{"38":1}}],["those",{"2":{"76":1}}],["that",{"2":{"38":2}}],["then",{"2":{"106":1}}],["their",{"2":{"76":1}}],["they",{"2":{"38":1,"76":1}}],["these",{"2":{"15":1,"76":1}}],["themeconfig",{"2":{"11":1}}],["the",{"2":{"3":1,"4":1,"18":1,"38":28,"76":1}}],["type",{"2":{"4":1,"85":2,"90":1}}],["types",{"2":{"4":1}}],["type>",{"2":{"4":1}}],["term",{"2":{"76":1}}],["terminal",{"2":{"3":1}}],["tests",{"2":{"3":3}}],["test",{"2":{"2":2,"3":3,"4":1,"70":1,"103":4,"104":2,"105":3}}],["token",{"2":{"104":2,"106":5}}],["to",{"2":{"3":1,"15":1,"19":1,"38":8,"76":2}}],["tools",{"2":{"15":1,"76":1,"92":2}}],["tool",{"0":{"40":1},"2":{"1":1,"7":1,"14":1,"25":1,"26":2,"27":2,"30":1,"31":1,"38":4,"39":1,"40":9,"42":1,"46":3,"56":14,"70":5,"72":3,"74":1,"103":1,"104":1}}],["t",{"2":{"3":2}}],["afaik",{"2":{"102":1}}],["an",{"2":{"38":2}}],["and",{"2":{"19":1,"38":9}}],["at",{"2":{"38":1}}],["as",{"2":{"38":1,"76":1}}],["asdfrc",{"0":{"41":1},"1":{"42":1,"43":1,"44":1,"45":1},"2":{"28":1,"39":1,"41":1,"46":1,"56":14,"63":1,"96":1}}],["asdf~",{"2":{"19":6,"56":6}}],["asdf",{"0":{"0":1,"16":1,"19":1,"37":1,"75":1,"101":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"17":1,"18":1},"2":{"0":1,"1":14,"2":1,"4":1,"5":3,"7":9,"8":1,"9":1,"12":7,"13":1,"14":3,"15":1,"17":3,"18":3,"19":110,"20":2,"21":1,"22":1,"23":2,"24":4,"25":3,"26":2,"28":3,"29":5,"30":2,"31":2,"33":2,"34":3,"35":1,"36":2,"37":3,"38":43,"39":1,"40":6,"41":1,"43":1,"44":1,"45":3,"46":14,"47":3,"48":1,"52":1,"53":1,"54":3,"55":6,"56":118,"57":1,"58":3,"59":5,"61":1,"62":1,"63":3,"65":1,"66":2,"67":2,"68":2,"69":2,"70":8,"71":2,"72":3,"73":1,"74":12,"75":2,"76":7,"77":1,"78":1,"80":4,"81":3,"85":7,"87":5,"88":9,"90":6,"91":2,"92":2,"94":2,"97":2,"98":7,"99":8,"100":6,"101":11,"102":2,"103":6,"104":3,"105":7,"107":5,"108":1}}],["always",{"0":{"44":1},"2":{"41":1}}],["all",{"0":{"86":1},"2":{"24":2,"38":9,"45":1,"60":1,"61":1,"63":1,"68":4,"83":1,"84":1,"85":1,"86":1,"91":3,"106":2}}],["alpine",{"2":{"5":1}}],["api",{"0":{"106":1},"2":{"30":1,"57":1,"104":1,"106":4}}],["append",{"2":{"19":4}}],["apt",{"2":{"15":1,"22":1,"90":1}}],["aptitude",{"2":{"15":1}}],["are",{"2":{"38":1,"76":2}}],["args",{"2":{"38":1,"50":1}}],["arg",{"2":{"19":6,"56":6}}],["archlinux",{"2":{"18":1}}],["authorization",{"2":{"106":1}}],["autoremove",{"2":{"56":1}}],["auto",{"2":{"41":1}}],["autoload",{"2":{"19":1,"56":1}}],["automatically",{"2":{"15":1}}],["aur",{"2":{"18":2,"19":1,"46":1,"55":1}}],["a",{"2":{"4":1,"15":1,"38":15,"40":1,"76":2}}],["amannn",{"2":{"4":1}}],["amp",{"0":{"6":1},"1":{"7":1,"8":1,"9":1,"10":1,"11":1},"2":{"3":1,"6":1,"15":1,"18":4,"19":23,"56":14}}],["actions",{"0":{"13":1},"2":{"13":1,"79":2,"104":2}}],["action",{"0":{"104":1},"2":{"4":2,"104":1}}],["add",{"0":{"98":1},"2":{"1":3,"7":1,"23":1,"38":3,"45":1,"58":4,"63":1,"98":4,"107":2}}],["veggies",{"2":{"92":2}}],["version=1",{"2":{"70":1}}],["version`",{"2":{"38":1}}],["version>",{"2":{"38":13,"53":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":8,"73":1,"103":1}}],["version",{"0":{"42":1},"2":{"28":3,"38":23,"41":1,"42":1,"53":1,"70":2,"85":3,"90":1,"96":2,"103":4,"104":1,"105":2}}],["versions`",{"2":{"54":1}}],["versions",{"0":{"40":1,"54":1},"2":{"1":1,"7":1,"14":1,"25":1,"26":2,"27":2,"30":1,"31":1,"38":10,"39":1,"40":9,"42":2,"46":3,"53":1,"54":3,"56":14,"70":4,"72":3,"74":1}}],["v",{"2":{"86":1}}],["vic",{"2":{"58":1,"110":1}}],["v1",{"2":{"40":1,"104":1}}],["var",{"2":{"19":3,"56":3}}],["v0",{"2":{"17":1}}],["v2",{"2":{"8":1}}],["vuepress",{"0":{"10":1},"2":{"8":2,"10":4,"11":3}}],["v8",{"2":{"7":1}}],["vm",{"2":{"1":1,"7":2,"17":1,"18":2,"19":9,"23":1,"38":2,"46":1,"56":7,"59":1,"90":1,"103":1,"104":2,"105":1,"107":1}}],["核心在",{"2":{"31":1}}],["核心的安装",{"2":{"20":1}}],["核心安装完成",{"0":{"20":1}}],["核心",{"0":{"48":1},"1":{"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1},"2":{"14":1,"29":1,"48":1}}],["核心用于查找流行的",{"2":{"12":1}}],["核心团队已经开发了一些与他们日常工作相关的插件",{"2":{"12":1}}],["核心开发所需的工具都列举在这个存储库的",{"2":{"1":1}}],["核心贡献指南",{"2":{"0":1,"9":1}}],["c",{"2":{"105":1}}],["cmd=",{"2":{"106":2}}],["cmd",{"2":{"101":1}}],["candidates",{"0":{"43":1},"2":{"41":1}}],["catalina",{"2":{"19":2,"56":1}}],["currently",{"2":{"38":1}}],["current",{"2":{"25":1,"38":7,"72":4,"74":1}}],["curl",{"2":{"15":7,"22":1,"106":1}}],["cd",{"2":{"18":1}}],["check",{"0":{"45":1},"2":{"41":1,"63":1}}],["chrome",{"2":{"7":1}}],["chore",{"2":{"4":1}}],["change",{"2":{"4":2}}],["ci",{"2":{"4":1,"103":2,"105":1,"106":1}}],["collaborative",{"2":{"76":1}}],["cool",{"2":{"72":1}}],["container",{"2":{"76":2}}],["concurrency",{"2":{"41":1,"85":1}}],["configuration",{"2":{"15":1}}],["config",{"2":{"10":1,"11":1,"19":38,"46":1,"56":13,"81":1,"90":1}}],["codespaces",{"2":{"76":1}}],["code",{"2":{"8":1,"76":1}}],["coreutils",{"2":{"15":2}}],["core",{"2":{"1":1,"2":1,"3":2,"19":3,"76":2}}],["compinit",{"2":{"19":7,"56":2}}],["completer~",{"2":{"19":3,"56":3}}],["completer",{"2":{"19":3,"56":3}}],["completion",{"2":{"19":6,"56":5}}],["completions",{"2":{"19":8,"56":4}}],["commit",{"2":{"38":2}}],["command>",{"2":{"38":4,"50":1,"51":1,"54":1,"94":1}}],["command",{"2":{"15":1,"18":1,"38":3,"101":10,"103":1,"104":1}}],["commands",{"2":{"2":1,"15":1,"101":7}}],["community",{"0":{"18":1,"76":1},"2":{"12":1,"76":3}}],["com",{"2":{"1":5,"7":3,"17":1,"23":1,"38":2,"58":1,"59":2,"103":1,"105":1,"107":1}}],["clone",{"2":{"1":2,"7":2,"17":1,"18":1,"105":1}}],["的项目提供了使用",{"2":{"104":1}}],["的文件在插件中",{"2":{"102":1}}],["的可执行程序",{"2":{"102":1}}],["的所有可用功能",{"2":{"101":1}}],["的所有类型包含",{"2":{"4":1}}],["的最新稳定版本",{"2":{"91":1}}],["的常规实现",{"2":{"91":1}}],["的值",{"2":{"90":1}}],["的下方",{"2":{"81":1}}],["的生效不在你的",{"2":{"81":1}}],["的官方支持",{"2":{"78":1}}],["的某些方面可能无法正常工作",{"2":{"78":1}}],["的目录是已安装程序在环境中可用的方式",{"2":{"74":1}}],["的系统版本而非",{"2":{"71":1}}],["的环境变量",{"2":{"70":2}}],["的行",{"2":{"56":5}}],["的指南",{"2":{"56":2}}],["的指引",{"2":{"19":1}}],["的内置命令用于更新",{"2":{"55":1}}],["的内部配置",{"2":{"47":1}}],["的数字",{"2":{"45":1}}],["的特性到",{"2":{"34":1}}],["的区别之处在于它的插件系统",{"2":{"33":1}}],["的快速上手",{"2":{"29":1}}],["的补全功能可以交给",{"2":{"19":1}}],["的说明完成配置",{"2":{"19":2}}],["的说明",{"2":{"19":2}}],["的格式",{"2":{"9":1}}],["的自动发布工具来自动碰撞",{"2":{"4":1}}],["的输出",{"2":{"3":1}}],["的情况下尝试应用你的更改",{"2":{"2":1}}],["的",{"2":{"1":2,"3":1,"7":2,"28":1,"42":2,"53":1,"61":2,"70":2,"85":1,"106":1}}],["克隆你",{"2":{"1":1,"7":1}}],["克隆默认分支",{"2":{"1":1,"7":1}}],["上的",{"2":{"111":1}}],["上运行",{"2":{"103":1}}],["上运行测试套件",{"2":{"79":1}}],["上测试拉取请求非常有用",{"2":{"103":1}}],["上提供主机运行器支持时",{"2":{"79":1}}],["上面",{"2":{"46":1}}],["上缺失包的管理器",{"2":{"35":1}}],["上",{"2":{"1":1,"7":1,"90":1}}],["在你的代码中公布你的",{"2":{"106":1}}],["在从输出中排除了几种类型的版本",{"2":{"91":1}}],["在从当前工作目录一直到",{"2":{"25":1}}],["在这个例子中",{"2":{"80":1}}],["在这种情况下",{"2":{"56":1,"86":1}}],["在报告",{"2":{"52":1}}],["在成功安装后保留源代码或二进制文件",{"2":{"44":1}}],["在成功安装后删除源代码或二进制文件",{"2":{"44":1}}],["在包含",{"2":{"40":2}}],["在框架生效位置的下方",{"2":{"19":1}}],["在选择下拉菜单中的标题以及导航栏",{"2":{"11":1}}],["在提交之前格式化代码",{"2":{"8":1}}],["在本地做好格式化",{"2":{"2":1}}],["在本地机器的开发过程中不使用",{"2":{"1":1}}],["在",{"2":{"1":1,"7":1,"19":12,"56":14,"90":1,"106":1}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/VPLocalSearchBox.DzFCX21k.js b/assets/chunks/VPLocalSearchBox.DzFCX21k.js new file mode 100644 index 00000000..6d400b1d --- /dev/null +++ b/assets/chunks/VPLocalSearchBox.DzFCX21k.js @@ -0,0 +1,7 @@ +var Ft=Object.defineProperty;var Ot=(a,e,t)=>e in a?Ft(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Ce=(a,e,t)=>Ot(a,typeof e!="symbol"?e+"":e,t);import{V as ye,p as se,h as pe,ah as et,ai as Rt,aj as Ct,q as Ve,ak as Mt,d as At,D as we,al as tt,am as Lt,an as Dt,s as Pt,ao as zt,v as Me,P as ue,O as xe,ap as jt,aq as Vt,W as $t,R as Bt,$ as Wt,o as q,b as Kt,j as _,a0 as Jt,k as D,ar as Ut,as as qt,at as Gt,c as Y,n as st,e as _e,C as nt,F as it,a as de,t as he,au as Ht,av as rt,aw as Qt,a6 as Yt,ac as Zt,ax as Xt,_ as es}from"./framework.C9NVOr0y.js";import{u as ts,c as ss}from"./theme.BQKOjM6g.js";const ns={root:()=>ye(()=>import("./@localSearchIndexroot.C13dwPVu.js"),[]),"ja-jp":()=>ye(()=>import("./@localSearchIndexja-jp.CBrievQI.js"),[]),"pt-br":()=>ye(()=>import("./@localSearchIndexpt-br.DTBAfdU-.js"),[]),"zh-hans":()=>ye(()=>import("./@localSearchIndexzh-hans.BveK1egn.js"),[])};/*! +* tabbable 6.2.0 +* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE +*/var mt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],ke=mt.join(","),gt=typeof Element>"u",ie=gt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Ne=!gt&&Element.prototype.getRootNode?function(a){var e;return a==null||(e=a.getRootNode)===null||e===void 0?void 0:e.call(a)}:function(a){return a==null?void 0:a.ownerDocument},Fe=function a(e,t){var s;t===void 0&&(t=!0);var n=e==null||(s=e.getAttribute)===null||s===void 0?void 0:s.call(e,"inert"),r=n===""||n==="true",i=r||t&&e&&a(e.parentNode);return i},is=function(e){var t,s=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return s===""||s==="true"},bt=function(e,t,s){if(Fe(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(ke));return t&&ie.call(e,ke)&&n.unshift(e),n=n.filter(s),n},yt=function a(e,t,s){for(var n=[],r=Array.from(e);r.length;){var i=r.shift();if(!Fe(i,!1))if(i.tagName==="SLOT"){var o=i.assignedElements(),l=o.length?o:i.children,c=a(l,!0,s);s.flatten?n.push.apply(n,c):n.push({scopeParent:i,candidates:c})}else{var h=ie.call(i,ke);h&&s.filter(i)&&(t||!e.includes(i))&&n.push(i);var v=i.shadowRoot||typeof s.getShadowRoot=="function"&&s.getShadowRoot(i),p=!Fe(v,!1)&&(!s.shadowRootFilter||s.shadowRootFilter(i));if(v&&p){var b=a(v===!0?i.children:v.children,!0,s);s.flatten?n.push.apply(n,b):n.push({scopeParent:i,candidates:b})}else r.unshift.apply(r,i.children)}}return n},wt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},ne=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||is(e))&&!wt(e)?0:e.tabIndex},rs=function(e,t){var s=ne(e);return s<0&&t&&!wt(e)?0:s},as=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},xt=function(e){return e.tagName==="INPUT"},os=function(e){return xt(e)&&e.type==="hidden"},ls=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(s){return s.tagName==="SUMMARY"});return t},cs=function(e,t){for(var s=0;ssummary:first-of-type"),i=r?e.parentElement:e;if(ie.call(i,"details:not([open]) *"))return!0;if(!s||s==="full"||s==="legacy-full"){if(typeof n=="function"){for(var o=e;e;){var l=e.parentElement,c=Ne(e);if(l&&!l.shadowRoot&&n(l)===!0)return at(e);e.assignedSlot?e=e.assignedSlot:!l&&c!==e.ownerDocument?e=c.host:e=l}e=o}if(fs(e))return!e.getClientRects().length;if(s!=="legacy-full")return!0}else if(s==="non-zero-area")return at(e);return!1},vs=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var s=0;s=0)},gs=function a(e){var t=[],s=[];return e.forEach(function(n,r){var i=!!n.scopeParent,o=i?n.scopeParent:n,l=rs(o,i),c=i?a(n.candidates):o;l===0?i?t.push.apply(t,c):t.push(o):s.push({documentOrder:r,tabIndex:l,item:n,isScope:i,content:c})}),s.sort(as).reduce(function(n,r){return r.isScope?n.push.apply(n,r.content):n.push(r.content),n},[]).concat(t)},bs=function(e,t){t=t||{};var s;return t.getShadowRoot?s=yt([e],t.includeContainer,{filter:$e.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:ms}):s=bt(e,t.includeContainer,$e.bind(null,t)),gs(s)},ys=function(e,t){t=t||{};var s;return t.getShadowRoot?s=yt([e],t.includeContainer,{filter:Oe.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):s=bt(e,t.includeContainer,Oe.bind(null,t)),s},re=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ie.call(e,ke)===!1?!1:$e(t,e)},ws=mt.concat("iframe").join(","),Ae=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ie.call(e,ws)===!1?!1:Oe(t,e)};/*! +* focus-trap 7.6.0 +* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE +*/function xs(a,e,t){return(e=Ss(e))in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function ot(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(a);e&&(s=s.filter(function(n){return Object.getOwnPropertyDescriptor(a,n).enumerable})),t.push.apply(t,s)}return t}function lt(a){for(var e=1;e0){var s=e[e.length-1];s!==t&&s.pause()}var n=e.indexOf(t);n===-1||e.splice(n,1),e.push(t)},deactivateTrap:function(e,t){var s=e.indexOf(t);s!==-1&&e.splice(s,1),e.length>0&&e[e.length-1].unpause()}},Es=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},Ts=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},ve=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Is=function(e){return ve(e)&&!e.shiftKey},ks=function(e){return ve(e)&&e.shiftKey},ut=function(e){return setTimeout(e,0)},dt=function(e,t){var s=-1;return e.every(function(n,r){return t(n)?(s=r,!1):!0}),s},fe=function(e){for(var t=arguments.length,s=new Array(t>1?t-1:0),n=1;n1?g-1:0),E=1;E=0)d=s.activeElement;else{var u=i.tabbableGroups[0],g=u&&u.firstTabbableNode;d=g||h("fallbackFocus")}if(!d)throw new Error("Your focus-trap needs to have at least one focusable element");return d},p=function(){if(i.containerGroups=i.containers.map(function(d){var u=bs(d,r.tabbableOptions),g=ys(d,r.tabbableOptions),S=u.length>0?u[0]:void 0,E=u.length>0?u[u.length-1]:void 0,N=g.find(function(f){return re(f)}),F=g.slice().reverse().find(function(f){return re(f)}),m=!!u.find(function(f){return ne(f)>0});return{container:d,tabbableNodes:u,focusableNodes:g,posTabIndexesFound:m,firstTabbableNode:S,lastTabbableNode:E,firstDomTabbableNode:N,lastDomTabbableNode:F,nextTabbableNode:function(T){var A=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,C=u.indexOf(T);return C<0?A?g.slice(g.indexOf(T)+1).find(function(M){return re(M)}):g.slice(0,g.indexOf(T)).reverse().find(function(M){return re(M)}):u[C+(A?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(d){return d.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!h("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(d){return d.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},b=function(d){var u=d.activeElement;if(u)return u.shadowRoot&&u.shadowRoot.activeElement!==null?b(u.shadowRoot):u},y=function(d){if(d!==!1&&d!==b(document)){if(!d||!d.focus){y(v());return}d.focus({preventScroll:!!r.preventScroll}),i.mostRecentlyFocusedNode=d,Es(d)&&d.select()}},x=function(d){var u=h("setReturnFocus",d);return u||(u===!1?!1:d)},w=function(d){var u=d.target,g=d.event,S=d.isBackward,E=S===void 0?!1:S;u=u||Se(g),p();var N=null;if(i.tabbableGroups.length>0){var F=c(u,g),m=F>=0?i.containerGroups[F]:void 0;if(F<0)E?N=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:N=i.tabbableGroups[0].firstTabbableNode;else if(E){var f=dt(i.tabbableGroups,function(L){var j=L.firstTabbableNode;return u===j});if(f<0&&(m.container===u||Ae(u,r.tabbableOptions)&&!re(u,r.tabbableOptions)&&!m.nextTabbableNode(u,!1))&&(f=F),f>=0){var T=f===0?i.tabbableGroups.length-1:f-1,A=i.tabbableGroups[T];N=ne(u)>=0?A.lastTabbableNode:A.lastDomTabbableNode}else ve(g)||(N=m.nextTabbableNode(u,!1))}else{var C=dt(i.tabbableGroups,function(L){var j=L.lastTabbableNode;return u===j});if(C<0&&(m.container===u||Ae(u,r.tabbableOptions)&&!re(u,r.tabbableOptions)&&!m.nextTabbableNode(u))&&(C=F),C>=0){var M=C===i.tabbableGroups.length-1?0:C+1,I=i.tabbableGroups[M];N=ne(u)>=0?I.firstTabbableNode:I.firstDomTabbableNode}else ve(g)||(N=m.nextTabbableNode(u))}}else N=h("fallbackFocus");return N},O=function(d){var u=Se(d);if(!(c(u,d)>=0)){if(fe(r.clickOutsideDeactivates,d)){o.deactivate({returnFocus:r.returnFocusOnDeactivate});return}fe(r.allowOutsideClick,d)||d.preventDefault()}},R=function(d){var u=Se(d),g=c(u,d)>=0;if(g||u instanceof Document)g&&(i.mostRecentlyFocusedNode=u);else{d.stopImmediatePropagation();var S,E=!0;if(i.mostRecentlyFocusedNode)if(ne(i.mostRecentlyFocusedNode)>0){var N=c(i.mostRecentlyFocusedNode),F=i.containerGroups[N].tabbableNodes;if(F.length>0){var m=F.findIndex(function(f){return f===i.mostRecentlyFocusedNode});m>=0&&(r.isKeyForward(i.recentNavEvent)?m+1=0&&(S=F[m-1],E=!1))}}else i.containerGroups.some(function(f){return f.tabbableNodes.some(function(T){return ne(T)>0})})||(E=!1);else E=!1;E&&(S=w({target:i.mostRecentlyFocusedNode,isBackward:r.isKeyBackward(i.recentNavEvent)})),y(S||i.mostRecentlyFocusedNode||v())}i.recentNavEvent=void 0},K=function(d){var u=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=d;var g=w({event:d,isBackward:u});g&&(ve(d)&&d.preventDefault(),y(g))},G=function(d){(r.isKeyForward(d)||r.isKeyBackward(d))&&K(d,r.isKeyBackward(d))},W=function(d){Ts(d)&&fe(r.escapeDeactivates,d)!==!1&&(d.preventDefault(),o.deactivate())},V=function(d){var u=Se(d);c(u,d)>=0||fe(r.clickOutsideDeactivates,d)||fe(r.allowOutsideClick,d)||(d.preventDefault(),d.stopImmediatePropagation())},$=function(){if(i.active)return ct.activateTrap(n,o),i.delayInitialFocusTimer=r.delayInitialFocus?ut(function(){y(v())}):y(v()),s.addEventListener("focusin",R,!0),s.addEventListener("mousedown",O,{capture:!0,passive:!1}),s.addEventListener("touchstart",O,{capture:!0,passive:!1}),s.addEventListener("click",V,{capture:!0,passive:!1}),s.addEventListener("keydown",G,{capture:!0,passive:!1}),s.addEventListener("keydown",W),o},me=function(){if(i.active)return s.removeEventListener("focusin",R,!0),s.removeEventListener("mousedown",O,!0),s.removeEventListener("touchstart",O,!0),s.removeEventListener("click",V,!0),s.removeEventListener("keydown",G,!0),s.removeEventListener("keydown",W),o},z=function(d){var u=d.some(function(g){var S=Array.from(g.removedNodes);return S.some(function(E){return E===i.mostRecentlyFocusedNode})});u&&y(v())},H=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(z):void 0,J=function(){H&&(H.disconnect(),i.active&&!i.paused&&i.containers.map(function(d){H.observe(d,{subtree:!0,childList:!0})}))};return o={get active(){return i.active},get paused(){return i.paused},activate:function(d){if(i.active)return this;var u=l(d,"onActivate"),g=l(d,"onPostActivate"),S=l(d,"checkCanFocusTrap");S||p(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=s.activeElement,u==null||u();var E=function(){S&&p(),$(),J(),g==null||g()};return S?(S(i.containers.concat()).then(E,E),this):(E(),this)},deactivate:function(d){if(!i.active)return this;var u=lt({onDeactivate:r.onDeactivate,onPostDeactivate:r.onPostDeactivate,checkCanReturnFocus:r.checkCanReturnFocus},d);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,me(),i.active=!1,i.paused=!1,J(),ct.deactivateTrap(n,o);var g=l(u,"onDeactivate"),S=l(u,"onPostDeactivate"),E=l(u,"checkCanReturnFocus"),N=l(u,"returnFocus","returnFocusOnDeactivate");g==null||g();var F=function(){ut(function(){N&&y(x(i.nodeFocusedBeforeActivation)),S==null||S()})};return N&&E?(E(x(i.nodeFocusedBeforeActivation)).then(F,F),this):(F(),this)},pause:function(d){if(i.paused||!i.active)return this;var u=l(d,"onPause"),g=l(d,"onPostPause");return i.paused=!0,u==null||u(),me(),J(),g==null||g(),this},unpause:function(d){if(!i.paused||!i.active)return this;var u=l(d,"onUnpause"),g=l(d,"onPostUnpause");return i.paused=!1,u==null||u(),p(),$(),J(),g==null||g(),this},updateContainerElements:function(d){var u=[].concat(d).filter(Boolean);return i.containers=u.map(function(g){return typeof g=="string"?s.querySelector(g):g}),i.active&&p(),J(),this}},o.updateContainerElements(e),o};function Os(a,e={}){let t;const{immediate:s,...n}=e,r=se(!1),i=se(!1),o=p=>t&&t.activate(p),l=p=>t&&t.deactivate(p),c=()=>{t&&(t.pause(),i.value=!0)},h=()=>{t&&(t.unpause(),i.value=!1)},v=pe(()=>{const p=et(a);return(Array.isArray(p)?p:[p]).map(b=>{const y=et(b);return typeof y=="string"?y:Rt(y)}).filter(Ct)});return Ve(v,p=>{p.length&&(t=Fs(p,{...n,onActivate(){r.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){r.value=!1,e.onDeactivate&&e.onDeactivate()}}),s&&o())},{flush:"post"}),Mt(()=>l()),{hasFocus:r,isPaused:i,activate:o,deactivate:l,pause:c,unpause:h}}class oe{constructor(e,t=!0,s=[],n=5e3){this.ctx=e,this.iframes=t,this.exclude=s,this.iframesTimeout=n}static matches(e,t){const s=typeof t=="string"?[t]:t,n=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(n){let r=!1;return s.every(i=>n.call(e,i)?(r=!0,!1):!0),r}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(s=>{const n=t.filter(r=>r.contains(s)).length>0;t.indexOf(s)===-1&&!n&&t.push(s)}),t}getIframeContents(e,t,s=()=>{}){let n;try{const r=e.contentWindow;if(n=r.document,!r||!n)throw new Error("iframe inaccessible")}catch{s()}n&&t(n)}isIframeBlank(e){const t="about:blank",s=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&s!==t&&s}observeIframeLoad(e,t,s){let n=!1,r=null;const i=()=>{if(!n){n=!0,clearTimeout(r);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,s))}catch{s()}}};e.addEventListener("load",i),r=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,s){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,s):this.getIframeContents(e,t,s):this.observeIframeLoad(e,t,s)}catch{s()}}waitForIframes(e,t){let s=0;this.forEachIframe(e,()=>!0,n=>{s++,this.waitForIframes(n.querySelector("html"),()=>{--s||t()})},n=>{n||t()})}forEachIframe(e,t,s,n=()=>{}){let r=e.querySelectorAll("iframe"),i=r.length,o=0;r=Array.prototype.slice.call(r);const l=()=>{--i<=0&&n(o)};i||l(),r.forEach(c=>{oe.matches(c,this.exclude)?l():this.onIframeReady(c,h=>{t(c)&&(o++,s(h)),l()},l)})}createIterator(e,t,s){return document.createNodeIterator(e,t,s,!1)}createInstanceOnIframe(e){return new oe(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,s){const n=e.compareDocumentPosition(s),r=Node.DOCUMENT_POSITION_PRECEDING;if(n&r)if(t!==null){const i=t.compareDocumentPosition(s),o=Node.DOCUMENT_POSITION_FOLLOWING;if(i&o)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let s;return t===null?s=e.nextNode():s=e.nextNode()&&e.nextNode(),{prevNode:t,node:s}}checkIframeFilter(e,t,s,n){let r=!1,i=!1;return n.forEach((o,l)=>{o.val===s&&(r=l,i=o.handled)}),this.compareNodeIframe(e,t,s)?(r===!1&&!i?n.push({val:s,handled:!0}):r!==!1&&!i&&(n[r].handled=!0),!0):(r===!1&&n.push({val:s,handled:!1}),!1)}handleOpenIframes(e,t,s,n){e.forEach(r=>{r.handled||this.getIframeContents(r.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,s,n)})})}iterateThroughNodes(e,t,s,n,r){const i=this.createIterator(t,e,n);let o=[],l=[],c,h,v=()=>({prevNode:h,node:c}=this.getIteratorNode(i),c);for(;v();)this.iframes&&this.forEachIframe(t,p=>this.checkIframeFilter(c,h,p,o),p=>{this.createInstanceOnIframe(p).forEachNode(e,b=>l.push(b),n)}),l.push(c);l.forEach(p=>{s(p)}),this.iframes&&this.handleOpenIframes(o,e,s,n),r()}forEachNode(e,t,s,n=()=>{}){const r=this.getContexts();let i=r.length;i||n(),r.forEach(o=>{const l=()=>{this.iterateThroughNodes(e,o,t,s,()=>{--i<=0&&n()})};this.iframes?this.waitForIframes(o,l):l()})}}let Rs=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new oe(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const s=this.opt.log;this.opt.debug&&typeof s=="object"&&typeof s[t]=="function"&&s[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,s=this.opt.caseSensitive?"":"i",n=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let r in t)if(t.hasOwnProperty(r)){const i=t[r],o=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(r):this.escapeStr(r),l=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);o!==""&&l!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(o)}|${this.escapeStr(l)})`,`gm${s}`),n+`(${this.processSynomyms(o)}|${this.processSynomyms(l)})`+n))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,s,n)=>{let r=n.charAt(s+1);return/[(|)\\]/.test(r)||r===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const s=this.opt.ignorePunctuation;return Array.isArray(s)&&s.length&&t.push(this.escapeStr(s.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",s=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let n=[];return e.split("").forEach(r=>{s.every(i=>{if(i.indexOf(r)!==-1){if(n.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),n.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let s=this.opt.accuracy,n=typeof s=="string"?s:s.value,r=typeof s=="string"?[]:s.limiters,i="";switch(r.forEach(o=>{i+=`|${this.escapeStr(o)}`}),n){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(s=>{this.opt.separateWordSearch?s.split(" ").forEach(n=>{n.trim()&&t.indexOf(n)===-1&&t.push(n)}):s.trim()&&t.indexOf(s)===-1&&t.push(s)}),{keywords:t.sort((s,n)=>n.length-s.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let s=0;return e.sort((n,r)=>n.start-r.start).forEach(n=>{let{start:r,end:i,valid:o}=this.callNoMatchOnInvalidRanges(n,s);o&&(n.start=r,n.length=i-r,t.push(n),s=i)}),t}callNoMatchOnInvalidRanges(e,t){let s,n,r=!1;return e&&typeof e.start<"u"?(s=parseInt(e.start,10),n=s+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&n-t>0&&n-s>0?r=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:s,end:n,valid:r}}checkWhitespaceRanges(e,t,s){let n,r=!0,i=s.length,o=t-i,l=parseInt(e.start,10)-o;return l=l>i?i:l,n=l+parseInt(e.length,10),n>i&&(n=i,this.log(`End range automatically set to the max value of ${i}`)),l<0||n-l<0||l>i||n>i?(r=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):s.substring(l,n).replace(/\s+/g,"")===""&&(r=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:l,end:n,valid:r}}getTextNodes(e){let t="",s=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,n=>{s.push({start:t.length,end:(t+=n.textContent).length,node:n})},n=>this.matchesExclude(n.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:s})})}matchesExclude(e){return oe.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,s){const n=this.opt.element?this.opt.element:"mark",r=e.splitText(t),i=r.splitText(s-t);let o=document.createElement(n);return o.setAttribute("data-markjs","true"),this.opt.className&&o.setAttribute("class",this.opt.className),o.textContent=r.textContent,r.parentNode.replaceChild(o,r),i}wrapRangeInMappedTextNode(e,t,s,n,r){e.nodes.every((i,o)=>{const l=e.nodes[o+1];if(typeof l>"u"||l.start>t){if(!n(i.node))return!1;const c=t-i.start,h=(s>i.end?i.end:s)-i.start,v=e.value.substr(0,i.start),p=e.value.substr(h+i.start);if(i.node=this.wrapRangeInTextNode(i.node,c,h),e.value=v+p,e.nodes.forEach((b,y)=>{y>=o&&(e.nodes[y].start>0&&y!==o&&(e.nodes[y].start-=h),e.nodes[y].end-=h)}),s-=h,r(i.node.previousSibling,i.start),s>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,s,n,r){const i=t===0?0:t+1;this.getTextNodes(o=>{o.nodes.forEach(l=>{l=l.node;let c;for(;(c=e.exec(l.textContent))!==null&&c[i]!=="";){if(!s(c[i],l))continue;let h=c.index;if(i!==0)for(let v=1;v{let l;for(;(l=e.exec(o.value))!==null&&l[i]!=="";){let c=l.index;if(i!==0)for(let v=1;vs(l[i],v),(v,p)=>{e.lastIndex=p,n(v)})}r()})}wrapRangeFromIndex(e,t,s,n){this.getTextNodes(r=>{const i=r.value.length;e.forEach((o,l)=>{let{start:c,end:h,valid:v}=this.checkWhitespaceRanges(o,i,r.value);v&&this.wrapRangeInMappedTextNode(r,c,h,p=>t(p,o,r.value.substring(c,h),l),p=>{s(p,o)})}),n()})}unwrapMatches(e){const t=e.parentNode;let s=document.createDocumentFragment();for(;e.firstChild;)s.appendChild(e.removeChild(e.firstChild));t.replaceChild(s,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let s=0,n="wrapMatches";const r=i=>{s++,this.opt.each(i)};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),this[n](e,this.opt.ignoreGroups,(i,o)=>this.opt.filter(o,i,s),r,()=>{s===0&&this.opt.noMatch(e),this.opt.done(s)})}mark(e,t){this.opt=t;let s=0,n="wrapMatches";const{keywords:r,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),o=this.opt.caseSensitive?"":"i",l=c=>{let h=new RegExp(this.createRegExp(c),`gm${o}`),v=0;this.log(`Searching with expression "${h}"`),this[n](h,1,(p,b)=>this.opt.filter(b,c,s,v),p=>{v++,s++,this.opt.each(p)},()=>{v===0&&this.opt.noMatch(c),r[i-1]===c?this.opt.done(s):l(r[r.indexOf(c)+1])})};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),i===0?this.opt.done(s):l(r[0])}markRanges(e,t){this.opt=t;let s=0,n=this.checkRanges(e);n&&n.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(n)),this.wrapRangeFromIndex(n,(r,i,o,l)=>this.opt.filter(r,i,o,l),(r,i)=>{s++,this.opt.each(r,i)},()=>{this.opt.done(s)})):this.opt.done(s)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,s=>{this.unwrapMatches(s)},s=>{const n=oe.matches(s,t),r=this.matchesExclude(s);return!n||r?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function Cs(a){const e=new Rs(a);return this.mark=(t,s)=>(e.mark(t,s),this),this.markRegExp=(t,s)=>(e.markRegExp(t,s),this),this.markRanges=(t,s)=>(e.markRanges(t,s),this),this.unmark=t=>(e.unmark(t),this),this}function Ie(a,e,t,s){function n(r){return r instanceof t?r:new t(function(i){i(r)})}return new(t||(t=Promise))(function(r,i){function o(h){try{c(s.next(h))}catch(v){i(v)}}function l(h){try{c(s.throw(h))}catch(v){i(v)}}function c(h){h.done?r(h.value):n(h.value).then(o,l)}c((s=s.apply(a,[])).next())})}const Ms="ENTRIES",_t="KEYS",St="VALUES",P="";class Le{constructor(e,t){const s=e._tree,n=Array.from(s.keys());this.set=e,this._type=t,this._path=n.length>0?[{node:s,keys:n}]:[]}next(){const e=this.dive();return this.backtrack(),e}dive(){if(this._path.length===0)return{done:!0,value:void 0};const{node:e,keys:t}=ae(this._path);if(ae(t)===P)return{done:!1,value:this.result()};const s=e.get(ae(t));return this._path.push({node:s,keys:Array.from(s.keys())}),this.dive()}backtrack(){if(this._path.length===0)return;const e=ae(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}key(){return this.set._prefix+this._path.map(({keys:e})=>ae(e)).filter(e=>e!==P).join("")}value(){return ae(this._path).node.get(P)}result(){switch(this._type){case St:return this.value();case _t:return this.key();default:return[this.key(),this.value()]}}[Symbol.iterator](){return this}}const ae=a=>a[a.length-1],As=(a,e,t)=>{const s=new Map;if(e===void 0)return s;const n=e.length+1,r=n+t,i=new Uint8Array(r*n).fill(t+1);for(let o=0;o{const l=r*i;e:for(const c of a.keys())if(c===P){const h=n[l-1];h<=t&&s.set(o,[a.get(c),h])}else{let h=r;for(let v=0;vt)continue e}Et(a.get(c),e,t,s,n,h,i,o+c)}};class Z{constructor(e=new Map,t=""){this._size=void 0,this._tree=e,this._prefix=t}atPrefix(e){if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");const[t,s]=Re(this._tree,e.slice(this._prefix.length));if(t===void 0){const[n,r]=Je(s);for(const i of n.keys())if(i!==P&&i.startsWith(r)){const o=new Map;return o.set(i.slice(r.length),n.get(i)),new Z(o,e)}}return new Z(t,e)}clear(){this._size=void 0,this._tree.clear()}delete(e){return this._size=void 0,Ls(this._tree,e)}entries(){return new Le(this,Ms)}forEach(e){for(const[t,s]of this)e(t,s,this)}fuzzyGet(e,t){return As(this._tree,e,t)}get(e){const t=Be(this._tree,e);return t!==void 0?t.get(P):void 0}has(e){const t=Be(this._tree,e);return t!==void 0&&t.has(P)}keys(){return new Le(this,_t)}set(e,t){if(typeof e!="string")throw new Error("key must be a string");return this._size=void 0,De(this._tree,e).set(P,t),this}get size(){if(this._size)return this._size;this._size=0;const e=this.entries();for(;!e.next().done;)this._size+=1;return this._size}update(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const s=De(this._tree,e);return s.set(P,t(s.get(P))),this}fetch(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const s=De(this._tree,e);let n=s.get(P);return n===void 0&&s.set(P,n=t()),n}values(){return new Le(this,St)}[Symbol.iterator](){return this.entries()}static from(e){const t=new Z;for(const[s,n]of e)t.set(s,n);return t}static fromObject(e){return Z.from(Object.entries(e))}}const Re=(a,e,t=[])=>{if(e.length===0||a==null)return[a,t];for(const s of a.keys())if(s!==P&&e.startsWith(s))return t.push([a,s]),Re(a.get(s),e.slice(s.length),t);return t.push([a,e]),Re(void 0,"",t)},Be=(a,e)=>{if(e.length===0||a==null)return a;for(const t of a.keys())if(t!==P&&e.startsWith(t))return Be(a.get(t),e.slice(t.length))},De=(a,e)=>{const t=e.length;e:for(let s=0;a&&s{const[t,s]=Re(a,e);if(t!==void 0){if(t.delete(P),t.size===0)Tt(s);else if(t.size===1){const[n,r]=t.entries().next().value;It(s,n,r)}}},Tt=a=>{if(a.length===0)return;const[e,t]=Je(a);if(e.delete(t),e.size===0)Tt(a.slice(0,-1));else if(e.size===1){const[s,n]=e.entries().next().value;s!==P&&It(a.slice(0,-1),s,n)}},It=(a,e,t)=>{if(a.length===0)return;const[s,n]=Je(a);s.set(n+e,t),s.delete(n)},Je=a=>a[a.length-1],Ue="or",kt="and",Ds="and_not";class le{constructor(e){if((e==null?void 0:e.fields)==null)throw new Error('MiniSearch: option "fields" must be provided');const t=e.autoVacuum==null||e.autoVacuum===!0?je:e.autoVacuum;this._options=Object.assign(Object.assign(Object.assign({},ze),e),{autoVacuum:t,searchOptions:Object.assign(Object.assign({},ht),e.searchOptions||{}),autoSuggestOptions:Object.assign(Object.assign({},$s),e.autoSuggestOptions||{})}),this._index=new Z,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldIds={},this._fieldLength=new Map,this._avgFieldLength=[],this._nextId=0,this._storedFields=new Map,this._dirtCount=0,this._currentVacuum=null,this._enqueuedVacuum=null,this._enqueuedVacuumConditions=Ke,this.addFields(this._options.fields)}add(e){const{extractField:t,tokenize:s,processTerm:n,fields:r,idField:i}=this._options,o=t(e,i);if(o==null)throw new Error(`MiniSearch: document does not have ID field "${i}"`);if(this._idToShortId.has(o))throw new Error(`MiniSearch: duplicate ID ${o}`);const l=this.addDocumentId(o);this.saveStoredFields(l,e);for(const c of r){const h=t(e,c);if(h==null)continue;const v=s(h.toString(),c),p=this._fieldIds[c],b=new Set(v).size;this.addFieldLength(l,p,this._documentCount-1,b);for(const y of v){const x=n(y,c);if(Array.isArray(x))for(const w of x)this.addTerm(p,l,w);else x&&this.addTerm(p,l,x)}}}addAll(e){for(const t of e)this.add(t)}addAllAsync(e,t={}){const{chunkSize:s=10}=t,n={chunk:[],promise:Promise.resolve()},{chunk:r,promise:i}=e.reduce(({chunk:o,promise:l},c,h)=>(o.push(c),(h+1)%s===0?{chunk:[],promise:l.then(()=>new Promise(v=>setTimeout(v,0))).then(()=>this.addAll(o))}:{chunk:o,promise:l}),n);return i.then(()=>this.addAll(r))}remove(e){const{tokenize:t,processTerm:s,extractField:n,fields:r,idField:i}=this._options,o=n(e,i);if(o==null)throw new Error(`MiniSearch: document does not have ID field "${i}"`);const l=this._idToShortId.get(o);if(l==null)throw new Error(`MiniSearch: cannot remove document with ID ${o}: it is not in the index`);for(const c of r){const h=n(e,c);if(h==null)continue;const v=t(h.toString(),c),p=this._fieldIds[c],b=new Set(v).size;this.removeFieldLength(l,p,this._documentCount,b);for(const y of v){const x=s(y,c);if(Array.isArray(x))for(const w of x)this.removeTerm(p,l,w);else x&&this.removeTerm(p,l,x)}}this._storedFields.delete(l),this._documentIds.delete(l),this._idToShortId.delete(o),this._fieldLength.delete(l),this._documentCount-=1}removeAll(e){if(e)for(const t of e)this.remove(t);else{if(arguments.length>0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new Z,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}}discard(e){const t=this._idToShortId.get(e);if(t==null)throw new Error(`MiniSearch: cannot discard document with ID ${e}: it is not in the index`);this._idToShortId.delete(e),this._documentIds.delete(t),this._storedFields.delete(t),(this._fieldLength.get(t)||[]).forEach((s,n)=>{this.removeFieldLength(t,n,this._documentCount,s)}),this._fieldLength.delete(t),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()}maybeAutoVacuum(){if(this._options.autoVacuum===!1)return;const{minDirtFactor:e,minDirtCount:t,batchSize:s,batchWait:n}=this._options.autoVacuum;this.conditionalVacuum({batchSize:s,batchWait:n},{minDirtCount:t,minDirtFactor:e})}discardAll(e){const t=this._options.autoVacuum;try{this._options.autoVacuum=!1;for(const s of e)this.discard(s)}finally{this._options.autoVacuum=t}this.maybeAutoVacuum()}replace(e){const{idField:t,extractField:s}=this._options,n=s(e,t);this.discard(n),this.add(e)}vacuum(e={}){return this.conditionalVacuum(e)}conditionalVacuum(e,t){return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(()=>{const s=this._enqueuedVacuumConditions;return this._enqueuedVacuumConditions=Ke,this.performVacuuming(e,s)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)}performVacuuming(e,t){return Ie(this,void 0,void 0,function*(){const s=this._dirtCount;if(this.vacuumConditionsMet(t)){const n=e.batchSize||We.batchSize,r=e.batchWait||We.batchWait;let i=1;for(const[o,l]of this._index){for(const[c,h]of l)for(const[v]of h)this._documentIds.has(v)||(h.size<=1?l.delete(c):h.delete(v));this._index.get(o).size===0&&this._index.delete(o),i%n===0&&(yield new Promise(c=>setTimeout(c,r))),i+=1}this._dirtCount-=s}yield null,this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null})}vacuumConditionsMet(e){if(e==null)return!0;let{minDirtCount:t,minDirtFactor:s}=e;return t=t||je.minDirtCount,s=s||je.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=s}get isVacuuming(){return this._currentVacuum!=null}get dirtCount(){return this._dirtCount}get dirtFactor(){return this._dirtCount/(1+this._documentCount+this._dirtCount)}has(e){return this._idToShortId.has(e)}getStoredFields(e){const t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)}search(e,t={}){const s=this.executeQuery(e,t),n=[];for(const[r,{score:i,terms:o,match:l}]of s){const c=o.length||1,h={id:this._documentIds.get(r),score:i*c,terms:Object.keys(l),queryTerms:o,match:l};Object.assign(h,this._storedFields.get(r)),(t.filter==null||t.filter(h))&&n.push(h)}return e===le.wildcard&&t.boostDocument==null&&this._options.searchOptions.boostDocument==null||n.sort(pt),n}autoSuggest(e,t={}){t=Object.assign(Object.assign({},this._options.autoSuggestOptions),t);const s=new Map;for(const{score:r,terms:i}of this.search(e,t)){const o=i.join(" "),l=s.get(o);l!=null?(l.score+=r,l.count+=1):s.set(o,{score:r,terms:i,count:1})}const n=[];for(const[r,{score:i,terms:o,count:l}]of s)n.push({suggestion:r,terms:o,score:i/l});return n.sort(pt),n}get documentCount(){return this._documentCount}get termCount(){return this._index.size}static loadJSON(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)}static loadJSONAsync(e,t){return Ie(this,void 0,void 0,function*(){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJSAsync(JSON.parse(e),t)})}static getDefault(e){if(ze.hasOwnProperty(e))return Pe(ze,e);throw new Error(`MiniSearch: unknown option "${e}"`)}static loadJS(e,t){const{index:s,documentIds:n,fieldLength:r,storedFields:i,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=Ee(n),l._fieldLength=Ee(r),l._storedFields=Ee(i);for(const[c,h]of l._documentIds)l._idToShortId.set(h,c);for(const[c,h]of s){const v=new Map;for(const p of Object.keys(h)){let b=h[p];o===1&&(b=b.ds),v.set(parseInt(p,10),Ee(b))}l._index.set(c,v)}return l}static loadJSAsync(e,t){return Ie(this,void 0,void 0,function*(){const{index:s,documentIds:n,fieldLength:r,storedFields:i,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=yield Te(n),l._fieldLength=yield Te(r),l._storedFields=yield Te(i);for(const[h,v]of l._documentIds)l._idToShortId.set(v,h);let c=0;for(const[h,v]of s){const p=new Map;for(const b of Object.keys(v)){let y=v[b];o===1&&(y=y.ds),p.set(parseInt(b,10),yield Te(y))}++c%1e3===0&&(yield Nt(0)),l._index.set(h,p)}return l})}static instantiateMiniSearch(e,t){const{documentCount:s,nextId:n,fieldIds:r,averageFieldLength:i,dirtCount:o,serializationVersion:l}=e;if(l!==1&&l!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");const c=new le(t);return c._documentCount=s,c._nextId=n,c._idToShortId=new Map,c._fieldIds=r,c._avgFieldLength=i,c._dirtCount=o||0,c._index=new Z,c}executeQuery(e,t={}){if(e===le.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){const p=Object.assign(Object.assign(Object.assign({},t),e),{queries:void 0}),b=e.queries.map(y=>this.executeQuery(y,p));return this.combineResults(b,p.combineWith)}const{tokenize:s,processTerm:n,searchOptions:r}=this._options,i=Object.assign(Object.assign({tokenize:s,processTerm:n},r),t),{tokenize:o,processTerm:l}=i,v=o(e).flatMap(p=>l(p)).filter(p=>!!p).map(Vs(i)).map(p=>this.executeQuerySpec(p,i));return this.combineResults(v,i.combineWith)}executeQuerySpec(e,t){const s=Object.assign(Object.assign({},this._options.searchOptions),t),n=(s.fields||this._options.fields).reduce((x,w)=>Object.assign(Object.assign({},x),{[w]:Pe(s.boost,w)||1}),{}),{boostDocument:r,weights:i,maxFuzzy:o,bm25:l}=s,{fuzzy:c,prefix:h}=Object.assign(Object.assign({},ht.weights),i),v=this._index.get(e.term),p=this.termResults(e.term,e.term,1,e.termBoost,v,n,r,l);let b,y;if(e.prefix&&(b=this._index.atPrefix(e.term)),e.fuzzy){const x=e.fuzzy===!0?.2:e.fuzzy,w=x<1?Math.min(o,Math.round(e.term.length*x)):x;w&&(y=this._index.fuzzyGet(e.term,w))}if(b)for(const[x,w]of b){const O=x.length-e.term.length;if(!O)continue;y==null||y.delete(x);const R=h*x.length/(x.length+.3*O);this.termResults(e.term,x,R,e.termBoost,w,n,r,l,p)}if(y)for(const x of y.keys()){const[w,O]=y.get(x);if(!O)continue;const R=c*x.length/(x.length+O);this.termResults(e.term,x,R,e.termBoost,w,n,r,l,p)}return p}executeWildcardQuery(e){const t=new Map,s=Object.assign(Object.assign({},this._options.searchOptions),e);for(const[n,r]of this._documentIds){const i=s.boostDocument?s.boostDocument(r,"",this._storedFields.get(n)):1;t.set(n,{score:i,terms:[],match:{}})}return t}combineResults(e,t=Ue){if(e.length===0)return new Map;const s=t.toLowerCase(),n=Ps[s];if(!n)throw new Error(`Invalid combination operator: ${t}`);return e.reduce(n)||new Map}toJSON(){const e=[];for(const[t,s]of this._index){const n={};for(const[r,i]of s)n[r]=Object.fromEntries(i);e.push([t,n])}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:e,serializationVersion:2}}termResults(e,t,s,n,r,i,o,l,c=new Map){if(r==null)return c;for(const h of Object.keys(i)){const v=i[h],p=this._fieldIds[h],b=r.get(p);if(b==null)continue;let y=b.size;const x=this._avgFieldLength[p];for(const w of b.keys()){if(!this._documentIds.has(w)){this.removeTerm(p,w,t),y-=1;continue}const O=o?o(this._documentIds.get(w),t,this._storedFields.get(w)):1;if(!O)continue;const R=b.get(w),K=this._fieldLength.get(w)[p],G=js(R,y,this._documentCount,K,x,l),W=s*n*v*O*G,V=c.get(w);if(V){V.score+=W,Bs(V.terms,e);const $=Pe(V.match,t);$?$.push(h):V.match[t]=[h]}else c.set(w,{score:W,terms:[e],match:{[t]:[h]}})}}return c}addTerm(e,t,s){const n=this._index.fetch(s,vt);let r=n.get(e);if(r==null)r=new Map,r.set(t,1),n.set(e,r);else{const i=r.get(t);r.set(t,(i||0)+1)}}removeTerm(e,t,s){if(!this._index.has(s)){this.warnDocumentChanged(t,e,s);return}const n=this._index.fetch(s,vt),r=n.get(e);r==null||r.get(t)==null?this.warnDocumentChanged(t,e,s):r.get(t)<=1?r.size<=1?n.delete(e):r.delete(t):r.set(t,r.get(t)-1),this._index.get(s).size===0&&this._index.delete(s)}warnDocumentChanged(e,t,s){for(const n of Object.keys(this._fieldIds))if(this._fieldIds[n]===t){this._options.logger("warn",`MiniSearch: document with ID ${this._documentIds.get(e)} has changed before removal: term "${s}" was not present in field "${n}". Removing a document after it has changed can corrupt the index!`,"version_conflict");return}}addDocumentId(e){const t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t}addFields(e){for(let t=0;tObject.prototype.hasOwnProperty.call(a,e)?a[e]:void 0,Ps={[Ue]:(a,e)=>{for(const t of e.keys()){const s=a.get(t);if(s==null)a.set(t,e.get(t));else{const{score:n,terms:r,match:i}=e.get(t);s.score=s.score+n,s.match=Object.assign(s.match,i),ft(s.terms,r)}}return a},[kt]:(a,e)=>{const t=new Map;for(const s of e.keys()){const n=a.get(s);if(n==null)continue;const{score:r,terms:i,match:o}=e.get(s);ft(n.terms,i),t.set(s,{score:n.score+r,terms:n.terms,match:Object.assign(n.match,o)})}return t},[Ds]:(a,e)=>{for(const t of e.keys())a.delete(t);return a}},zs={k:1.2,b:.7,d:.5},js=(a,e,t,s,n,r)=>{const{k:i,b:o,d:l}=r;return Math.log(1+(t-e+.5)/(e+.5))*(l+a*(i+1)/(a+i*(1-o+o*s/n)))},Vs=a=>(e,t,s)=>{const n=typeof a.fuzzy=="function"?a.fuzzy(e,t,s):a.fuzzy||!1,r=typeof a.prefix=="function"?a.prefix(e,t,s):a.prefix===!0,i=typeof a.boostTerm=="function"?a.boostTerm(e,t,s):1;return{term:e,fuzzy:n,prefix:r,termBoost:i}},ze={idField:"id",extractField:(a,e)=>a[e],tokenize:a=>a.split(Ws),processTerm:a=>a.toLowerCase(),fields:void 0,searchOptions:void 0,storeFields:[],logger:(a,e)=>{typeof(console==null?void 0:console[a])=="function"&&console[a](e)},autoVacuum:!0},ht={combineWith:Ue,prefix:!1,fuzzy:!1,maxFuzzy:6,boost:{},weights:{fuzzy:.45,prefix:.375},bm25:zs},$s={combineWith:kt,prefix:(a,e,t)=>e===t.length-1},We={batchSize:1e3,batchWait:10},Ke={minDirtFactor:.1,minDirtCount:20},je=Object.assign(Object.assign({},We),Ke),Bs=(a,e)=>{a.includes(e)||a.push(e)},ft=(a,e)=>{for(const t of e)a.includes(t)||a.push(t)},pt=({score:a},{score:e})=>e-a,vt=()=>new Map,Ee=a=>{const e=new Map;for(const t of Object.keys(a))e.set(parseInt(t,10),a[t]);return e},Te=a=>Ie(void 0,void 0,void 0,function*(){const e=new Map;let t=0;for(const s of Object.keys(a))e.set(parseInt(s,10),a[s]),++t%1e3===0&&(yield Nt(0));return e}),Nt=a=>new Promise(e=>setTimeout(e,a)),Ws=/[\n\r\p{Z}\p{P}]+/u;class Ks{constructor(e=10){Ce(this,"max");Ce(this,"cache");this.max=e,this.cache=new Map}get(e){let t=this.cache.get(e);return t!==void 0&&(this.cache.delete(e),this.cache.set(e,t)),t}set(e,t){this.cache.has(e)?this.cache.delete(e):this.cache.size===this.max&&this.cache.delete(this.first()),this.cache.set(e,t)}first(){return this.cache.keys().next().value}clear(){this.cache.clear()}}const Js=["aria-owns"],Us={class:"shell"},qs=["title"],Gs={class:"search-actions before"},Hs=["title"],Qs=["placeholder"],Ys={class:"search-actions"},Zs=["title"],Xs=["disabled","title"],en=["id","role","aria-labelledby"],tn=["aria-selected"],sn=["href","aria-label","onMouseenter","onFocusin"],nn={class:"titles"},rn=["innerHTML"],an={class:"title main"},on=["innerHTML"],ln={key:0,class:"excerpt-wrapper"},cn={key:0,class:"excerpt",inert:""},un=["innerHTML"],dn={key:0,class:"no-results"},hn={class:"search-keyboard-shortcuts"},fn=["aria-label"],pn=["aria-label"],vn=["aria-label"],mn=["aria-label"],gn=At({__name:"VPLocalSearchBox",emits:["close"],setup(a,{emit:e}){var N,F;const t=e,s=we(),n=we(),r=we(ns),i=ts(),{activate:o}=Os(s,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:l,theme:c}=i,h=tt(async()=>{var m,f,T,A,C,M,I,L,j;return rt(le.loadJSON((T=await((f=(m=r.value)[l.value])==null?void 0:f.call(m)))==null?void 0:T.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((A=c.value.search)==null?void 0:A.provider)==="local"&&((M=(C=c.value.search.options)==null?void 0:C.miniSearch)==null?void 0:M.searchOptions)},...((I=c.value.search)==null?void 0:I.provider)==="local"&&((j=(L=c.value.search.options)==null?void 0:L.miniSearch)==null?void 0:j.options)}))}),p=pe(()=>{var m,f;return((m=c.value.search)==null?void 0:m.provider)==="local"&&((f=c.value.search.options)==null?void 0:f.disableQueryPersistence)===!0}).value?se(""):Lt("vitepress:local-search-filter",""),b=Dt("vitepress:local-search-detailed-list",((N=c.value.search)==null?void 0:N.provider)==="local"&&((F=c.value.search.options)==null?void 0:F.detailedView)===!0),y=pe(()=>{var m,f,T;return((m=c.value.search)==null?void 0:m.provider)==="local"&&(((f=c.value.search.options)==null?void 0:f.disableDetailedView)===!0||((T=c.value.search.options)==null?void 0:T.detailedView)===!1)}),x=pe(()=>{var f,T,A,C,M,I,L;const m=((f=c.value.search)==null?void 0:f.options)??c.value.algolia;return((M=(C=(A=(T=m==null?void 0:m.locales)==null?void 0:T[l.value])==null?void 0:A.translations)==null?void 0:C.button)==null?void 0:M.buttonText)||((L=(I=m==null?void 0:m.translations)==null?void 0:I.button)==null?void 0:L.buttonText)||"Search"});Pt(()=>{y.value&&(b.value=!1)});const w=we([]),O=se(!1);Ve(p,()=>{O.value=!1});const R=tt(async()=>{if(n.value)return rt(new Cs(n.value))},null),K=new Ks(16);zt(()=>[h.value,p.value,b.value],async([m,f,T],A,C)=>{var ge,qe,Ge,He;(A==null?void 0:A[0])!==m&&K.clear();let M=!1;if(C(()=>{M=!0}),!m)return;w.value=m.search(f).slice(0,16),O.value=!0;const I=T?await Promise.all(w.value.map(B=>G(B.id))):[];if(M)return;for(const{id:B,mod:X}of I){const ee=B.slice(0,B.indexOf("#"));let Q=K.get(ee);if(Q)continue;Q=new Map,K.set(ee,Q);const U=X.default??X;if(U!=null&&U.render||U!=null&&U.setup){const te=Qt(U);te.config.warnHandler=()=>{},te.provide(Yt,i),Object.defineProperties(te.config.globalProperties,{$frontmatter:{get(){return i.frontmatter.value}},$params:{get(){return i.page.value.params}}});const Qe=document.createElement("div");te.mount(Qe),Qe.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(ce=>{var Xe;const be=(Xe=ce.querySelector("a"))==null?void 0:Xe.getAttribute("href"),Ye=(be==null?void 0:be.startsWith("#"))&&be.slice(1);if(!Ye)return;let Ze="";for(;(ce=ce.nextElementSibling)&&!/^h[1-6]$/i.test(ce.tagName);)Ze+=ce.outerHTML;Q.set(Ye,Ze)}),te.unmount()}if(M)return}const L=new Set;if(w.value=w.value.map(B=>{const[X,ee]=B.id.split("#"),Q=K.get(X),U=(Q==null?void 0:Q.get(ee))??"";for(const te in B.match)L.add(te);return{...B,text:U}}),await ue(),M)return;await new Promise(B=>{var X;(X=R.value)==null||X.unmark({done:()=>{var ee;(ee=R.value)==null||ee.markRegExp(E(L),{done:B})}})});const j=((ge=s.value)==null?void 0:ge.querySelectorAll(".result .excerpt"))??[];for(const B of j)(qe=B.querySelector('mark[data-markjs="true"]'))==null||qe.scrollIntoView({block:"center"});(He=(Ge=n.value)==null?void 0:Ge.firstElementChild)==null||He.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function G(m){const f=Zt(m.slice(0,m.indexOf("#")));try{if(!f)throw new Error(`Cannot find file for id: ${m}`);return{id:m,mod:await import(f)}}catch(T){return console.error(T),{id:m,mod:{}}}}const W=se(),V=pe(()=>{var m;return((m=p.value)==null?void 0:m.length)<=0});function $(m=!0){var f,T;(f=W.value)==null||f.focus(),m&&((T=W.value)==null||T.select())}Me(()=>{$()});function me(m){m.pointerType==="mouse"&&$()}const z=se(-1),H=se(!1);Ve(w,m=>{z.value=m.length?0:-1,J()});function J(){ue(()=>{const m=document.querySelector(".result.selected");m==null||m.scrollIntoView({block:"nearest"})})}xe("ArrowUp",m=>{m.preventDefault(),z.value--,z.value<0&&(z.value=w.value.length-1),H.value=!0,J()}),xe("ArrowDown",m=>{m.preventDefault(),z.value++,z.value>=w.value.length&&(z.value=0),H.value=!0,J()});const k=jt();xe("Enter",m=>{if(m.isComposing||m.target instanceof HTMLButtonElement&&m.target.type!=="submit")return;const f=w.value[z.value];if(m.target instanceof HTMLInputElement&&!f){m.preventDefault();return}f&&(k.go(f.id),t("close"))}),xe("Escape",()=>{t("close")});const u=ss({modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}});Me(()=>{window.history.pushState(null,"",null)}),Vt("popstate",m=>{m.preventDefault(),t("close")});const g=$t(Bt?document.body:null);Me(()=>{ue(()=>{g.value=!0,ue().then(()=>o())})}),Wt(()=>{g.value=!1});function S(){p.value="",ue().then(()=>$(!1))}function E(m){return new RegExp([...m].sort((f,T)=>T.length-f.length).map(f=>`(${Xt(f)})`).join("|"),"gi")}return(m,f)=>{var T,A,C,M;return q(),Kt(Ht,{to:"body"},[_("div",{ref_key:"el",ref:s,role:"button","aria-owns":(T=w.value)!=null&&T.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[_("div",{class:"backdrop",onClick:f[0]||(f[0]=I=>m.$emit("close"))}),_("div",Us,[_("form",{class:"search-bar",onPointerup:f[4]||(f[4]=I=>me(I)),onSubmit:f[5]||(f[5]=Jt(()=>{},["prevent"]))},[_("label",{title:x.value,id:"localsearch-label",for:"localsearch-input"},f[8]||(f[8]=[_("span",{"aria-hidden":"true",class:"vpi-search search-icon local-search-icon"},null,-1)]),8,qs),_("div",Gs,[_("button",{class:"back-button",title:D(u)("modal.backButtonTitle"),onClick:f[1]||(f[1]=I=>m.$emit("close"))},f[9]||(f[9]=[_("span",{class:"vpi-arrow-left local-search-icon"},null,-1)]),8,Hs)]),Ut(_("input",{ref_key:"searchInput",ref:W,"onUpdate:modelValue":f[2]||(f[2]=I=>Gt(p)?p.value=I:null),placeholder:x.value,id:"localsearch-input","aria-labelledby":"localsearch-label",class:"search-input"},null,8,Qs),[[qt,D(p)]]),_("div",Ys,[y.value?_e("",!0):(q(),Y("button",{key:0,class:st(["toggle-layout-button",{"detailed-list":D(b)}]),type:"button",title:D(u)("modal.displayDetails"),onClick:f[3]||(f[3]=I=>z.value>-1&&(b.value=!D(b)))},f[10]||(f[10]=[_("span",{class:"vpi-layout-list local-search-icon"},null,-1)]),10,Zs)),_("button",{class:"clear-button",type:"reset",disabled:V.value,title:D(u)("modal.resetButtonTitle"),onClick:S},f[11]||(f[11]=[_("span",{class:"vpi-delete local-search-icon"},null,-1)]),8,Xs)])],32),_("ul",{ref_key:"resultsEl",ref:n,id:(A=w.value)!=null&&A.length?"localsearch-list":void 0,role:(C=w.value)!=null&&C.length?"listbox":void 0,"aria-labelledby":(M=w.value)!=null&&M.length?"localsearch-label":void 0,class:"results",onMousemove:f[7]||(f[7]=I=>H.value=!1)},[(q(!0),Y(it,null,nt(w.value,(I,L)=>(q(),Y("li",{key:I.id,role:"option","aria-selected":z.value===L?"true":"false"},[_("a",{href:I.id,class:st(["result",{selected:z.value===L}]),"aria-label":[...I.titles,I.title].join(" > "),onMouseenter:j=>!H.value&&(z.value=L),onFocusin:j=>z.value=L,onClick:f[6]||(f[6]=j=>m.$emit("close"))},[_("div",null,[_("div",nn,[f[13]||(f[13]=_("span",{class:"title-icon"},"#",-1)),(q(!0),Y(it,null,nt(I.titles,(j,ge)=>(q(),Y("span",{key:ge,class:"title"},[_("span",{class:"text",innerHTML:j},null,8,rn),f[12]||(f[12]=_("span",{class:"vpi-chevron-right local-search-icon"},null,-1))]))),128)),_("span",an,[_("span",{class:"text",innerHTML:I.title},null,8,on)])]),D(b)?(q(),Y("div",ln,[I.text?(q(),Y("div",cn,[_("div",{class:"vp-doc",innerHTML:I.text},null,8,un)])):_e("",!0),f[14]||(f[14]=_("div",{class:"excerpt-gradient-bottom"},null,-1)),f[15]||(f[15]=_("div",{class:"excerpt-gradient-top"},null,-1))])):_e("",!0)])],42,sn)],8,tn))),128)),D(p)&&!w.value.length&&O.value?(q(),Y("li",dn,[de(he(D(u)("modal.noResultsText"))+' "',1),_("strong",null,he(D(p)),1),f[16]||(f[16]=de('" '))])):_e("",!0)],40,en),_("div",hn,[_("span",null,[_("kbd",{"aria-label":D(u)("modal.footer.navigateUpKeyAriaLabel")},f[17]||(f[17]=[_("span",{class:"vpi-arrow-up navigate-icon"},null,-1)]),8,fn),_("kbd",{"aria-label":D(u)("modal.footer.navigateDownKeyAriaLabel")},f[18]||(f[18]=[_("span",{class:"vpi-arrow-down navigate-icon"},null,-1)]),8,pn),de(" "+he(D(u)("modal.footer.navigateText")),1)]),_("span",null,[_("kbd",{"aria-label":D(u)("modal.footer.selectKeyAriaLabel")},f[19]||(f[19]=[_("span",{class:"vpi-corner-down-left navigate-icon"},null,-1)]),8,vn),de(" "+he(D(u)("modal.footer.selectText")),1)]),_("span",null,[_("kbd",{"aria-label":D(u)("modal.footer.closeKeyAriaLabel")},"esc",8,mn),de(" "+he(D(u)("modal.footer.closeText")),1)])])])],8,Js)])}}}),Sn=es(gn,[["__scopeId","data-v-40ea83c9"]]);export{Sn as default}; diff --git a/assets/chunks/framework.C9NVOr0y.js b/assets/chunks/framework.C9NVOr0y.js new file mode 100644 index 00000000..dd799845 --- /dev/null +++ b/assets/chunks/framework.C9NVOr0y.js @@ -0,0 +1,18 @@ +/** +* @vue/shared v3.5.11 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**//*! #__NO_SIDE_EFFECTS__ */function Hr(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const Z={},Tt=[],Ue=()=>{},Jo=()=>!1,Zt=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),$r=e=>e.startsWith("onUpdate:"),fe=Object.assign,Dr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},zo=Object.prototype.hasOwnProperty,z=(e,t)=>zo.call(e,t),K=Array.isArray,Ct=e=>Hn(e)==="[object Map]",fi=e=>Hn(e)==="[object Set]",q=e=>typeof e=="function",se=e=>typeof e=="string",rt=e=>typeof e=="symbol",ne=e=>e!==null&&typeof e=="object",ui=e=>(ne(e)||q(e))&&q(e.then)&&q(e.catch),di=Object.prototype.toString,Hn=e=>di.call(e),Qo=e=>Hn(e).slice(8,-1),hi=e=>Hn(e)==="[object Object]",jr=e=>se(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,At=Hr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),$n=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Zo=/-(\w)/g,Ie=$n(e=>e.replace(Zo,(t,n)=>n?n.toUpperCase():"")),el=/\B([A-Z])/g,st=$n(e=>e.replace(el,"-$1").toLowerCase()),Dn=$n(e=>e.charAt(0).toUpperCase()+e.slice(1)),wn=$n(e=>e?`on${Dn(e)}`:""),tt=(e,t)=>!Object.is(e,t),Sn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},Sr=e=>{const t=parseFloat(e);return isNaN(t)?e:t},tl=e=>{const t=se(e)?Number(e):NaN;return isNaN(t)?e:t};let ds;const gi=()=>ds||(ds=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Vr(e){if(K(e)){const t={};for(let n=0;n{if(n){const r=n.split(rl);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function Ur(e){let t="";if(se(e))t=e;else if(K(e))for(let n=0;n!!(e&&e.__v_isRef===!0),cl=e=>se(e)?e:e==null?"":K(e)||ne(e)&&(e.toString===di||!q(e.toString))?yi(e)?cl(e.value):JSON.stringify(e,vi,2):String(e),vi=(e,t)=>yi(t)?vi(e,t.value):Ct(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s],i)=>(n[er(r,i)+" =>"]=s,n),{})}:fi(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>er(n))}:rt(t)?er(t):ne(t)&&!K(t)&&!hi(t)?String(t):t,er=(e,t="")=>{var n;return rt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.11 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let _e;class al{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=_e,!t&&_e&&(this.index=(_e.scopes||(_e.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0)return;if(jt){let t=jt;for(jt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Dt;){let t=Dt;for(Dt=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function Ei(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function xi(e){let t,n=e.depsTail,r=n;for(;r;){const s=r.prevDep;r.version===-1?(r===n&&(n=s),Wr(r),ul(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=s}e.deps=t,e.depsTail=n}function Er(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ti(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ti(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Kt))return;e.globalVersion=Kt;const t=e.dep;if(e.flags|=2,t.version>0&&!e.isSSR&&e.deps&&!Er(e)){e.flags&=-3;return}const n=te,r=Ne;te=e,Ne=!0;try{Ei(e);const s=e.fn(e._value);(t.version===0||tt(s,e._value))&&(e._value=s,t.version++)}catch(s){throw t.version++,s}finally{te=n,Ne=r,xi(e),e.flags&=-3}}function Wr(e,t=!1){const{dep:n,prevSub:r,nextSub:s}=e;if(r&&(r.nextSub=s,e.prevSub=void 0),s&&(s.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r),!n.subs&&n.computed){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)Wr(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function ul(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let Ne=!0;const Ci=[];function it(){Ci.push(Ne),Ne=!1}function ot(){const e=Ci.pop();Ne=e===void 0?!0:e}function hs(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=te;te=void 0;try{t()}finally{te=n}}}let Kt=0;class dl{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class jn{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(t){if(!te||!Ne||te===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==te)n=this.activeLink=new dl(te,this),te.deps?(n.prevDep=te.depsTail,te.depsTail.nextDep=n,te.depsTail=n):te.deps=te.depsTail=n,Ai(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=te.depsTail,n.nextDep=void 0,te.depsTail.nextDep=n,te.depsTail=n,te.deps===n&&(te.deps=r)}return n}trigger(t){this.version++,Kt++,this.notify(t)}notify(t){Br();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{kr()}}}function Ai(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let r=t.deps;r;r=r.nextDep)Ai(r)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Rn=new WeakMap,ht=Symbol(""),xr=Symbol(""),qt=Symbol("");function ve(e,t,n){if(Ne&&te){let r=Rn.get(e);r||Rn.set(e,r=new Map);let s=r.get(n);s||(r.set(n,s=new jn),s.map=r,s.key=n),s.track()}}function Ge(e,t,n,r,s,i){const o=Rn.get(e);if(!o){Kt++;return}const l=c=>{c&&c.trigger()};if(Br(),t==="clear")o.forEach(l);else{const c=K(e),f=c&&jr(n);if(c&&n==="length"){const a=Number(r);o.forEach((h,g)=>{(g==="length"||g===qt||!rt(g)&&g>=a)&&l(h)})}else switch(n!==void 0&&l(o.get(n)),f&&l(o.get(qt)),t){case"add":c?f&&l(o.get("length")):(l(o.get(ht)),Ct(e)&&l(o.get(xr)));break;case"delete":c||(l(o.get(ht)),Ct(e)&&l(o.get(xr)));break;case"set":Ct(e)&&l(o.get(ht));break}}kr()}function hl(e,t){const n=Rn.get(e);return n&&n.get(t)}function _t(e){const t=J(e);return t===e?t:(ve(t,"iterate",qt),Pe(e)?t:t.map(me))}function Vn(e){return ve(e=J(e),"iterate",qt),e}const pl={__proto__:null,[Symbol.iterator](){return nr(this,Symbol.iterator,me)},concat(...e){return _t(this).concat(...e.map(t=>K(t)?_t(t):t))},entries(){return nr(this,"entries",e=>(e[1]=me(e[1]),e))},every(e,t){return We(this,"every",e,t,void 0,arguments)},filter(e,t){return We(this,"filter",e,t,n=>n.map(me),arguments)},find(e,t){return We(this,"find",e,t,me,arguments)},findIndex(e,t){return We(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return We(this,"findLast",e,t,me,arguments)},findLastIndex(e,t){return We(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return We(this,"forEach",e,t,void 0,arguments)},includes(...e){return rr(this,"includes",e)},indexOf(...e){return rr(this,"indexOf",e)},join(e){return _t(this).join(e)},lastIndexOf(...e){return rr(this,"lastIndexOf",e)},map(e,t){return We(this,"map",e,t,void 0,arguments)},pop(){return Ft(this,"pop")},push(...e){return Ft(this,"push",e)},reduce(e,...t){return ps(this,"reduce",e,t)},reduceRight(e,...t){return ps(this,"reduceRight",e,t)},shift(){return Ft(this,"shift")},some(e,t){return We(this,"some",e,t,void 0,arguments)},splice(...e){return Ft(this,"splice",e)},toReversed(){return _t(this).toReversed()},toSorted(e){return _t(this).toSorted(e)},toSpliced(...e){return _t(this).toSpliced(...e)},unshift(...e){return Ft(this,"unshift",e)},values(){return nr(this,"values",me)}};function nr(e,t,n){const r=Vn(e),s=r[t]();return r!==e&&!Pe(e)&&(s._next=s.next,s.next=()=>{const i=s._next();return i.value&&(i.value=n(i.value)),i}),s}const gl=Array.prototype;function We(e,t,n,r,s,i){const o=Vn(e),l=o!==e&&!Pe(e),c=o[t];if(c!==gl[t]){const h=c.apply(e,i);return l?me(h):h}let f=n;o!==e&&(l?f=function(h,g){return n.call(this,me(h),g,e)}:n.length>2&&(f=function(h,g){return n.call(this,h,g,e)}));const a=c.call(o,f,r);return l&&s?s(a):a}function ps(e,t,n,r){const s=Vn(e);let i=n;return s!==e&&(Pe(e)?n.length>3&&(i=function(o,l,c){return n.call(this,o,l,c,e)}):i=function(o,l,c){return n.call(this,o,me(l),c,e)}),s[t](i,...r)}function rr(e,t,n){const r=J(e);ve(r,"iterate",qt);const s=r[t](...n);return(s===-1||s===!1)&&Yr(n[0])?(n[0]=J(n[0]),r[t](...n)):s}function Ft(e,t,n=[]){it(),Br();const r=J(e)[t].apply(e,n);return kr(),ot(),r}const ml=Hr("__proto__,__v_isRef,__isVue"),Ri=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(rt));function yl(e){rt(e)||(e=String(e));const t=J(this);return ve(t,"has",e),t.hasOwnProperty(e)}class Oi{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){const s=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!s;if(n==="__v_isReadonly")return s;if(n==="__v_isShallow")return i;if(n==="__v_raw")return r===(s?i?Ml:Li:i?Ii:Pi).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const o=K(t);if(!s){let c;if(o&&(c=pl[n]))return c;if(n==="hasOwnProperty")return yl}const l=Reflect.get(t,n,ae(t)?t:r);return(rt(n)?Ri.has(n):ml(n))||(s||ve(t,"get",n),i)?l:ae(l)?o&&jr(n)?l:l.value:ne(l)?s?kn(l):Bn(l):l}}class Mi extends Oi{constructor(t=!1){super(!1,t)}set(t,n,r,s){let i=t[n];if(!this._isShallow){const c=vt(i);if(!Pe(r)&&!vt(r)&&(i=J(i),r=J(r)),!K(t)&&ae(i)&&!ae(r))return c?!1:(i.value=r,!0)}const o=K(t)&&jr(n)?Number(n)e,Un=e=>Reflect.getPrototypeOf(e);function cn(e,t,n=!1,r=!1){e=e.__v_raw;const s=J(e),i=J(t);n||(tt(t,i)&&ve(s,"get",t),ve(s,"get",i));const{has:o}=Un(s),l=r?Kr:n?Xr:me;if(o.call(s,t))return l(e.get(t));if(o.call(s,i))return l(e.get(i));e!==s&&e.get(t)}function an(e,t=!1){const n=this.__v_raw,r=J(n),s=J(e);return t||(tt(e,s)&&ve(r,"has",e),ve(r,"has",s)),e===s?n.has(e):n.has(e)||n.has(s)}function fn(e,t=!1){return e=e.__v_raw,!t&&ve(J(e),"iterate",ht),Reflect.get(e,"size",e)}function gs(e,t=!1){!t&&!Pe(e)&&!vt(e)&&(e=J(e));const n=J(this);return Un(n).has.call(n,e)||(n.add(e),Ge(n,"add",e,e)),this}function ms(e,t,n=!1){!n&&!Pe(t)&&!vt(t)&&(t=J(t));const r=J(this),{has:s,get:i}=Un(r);let o=s.call(r,e);o||(e=J(e),o=s.call(r,e));const l=i.call(r,e);return r.set(e,t),o?tt(t,l)&&Ge(r,"set",e,t):Ge(r,"add",e,t),this}function ys(e){const t=J(this),{has:n,get:r}=Un(t);let s=n.call(t,e);s||(e=J(e),s=n.call(t,e)),r&&r.call(t,e);const i=t.delete(e);return s&&Ge(t,"delete",e,void 0),i}function vs(){const e=J(this),t=e.size!==0,n=e.clear();return t&&Ge(e,"clear",void 0,void 0),n}function un(e,t){return function(r,s){const i=this,o=i.__v_raw,l=J(o),c=t?Kr:e?Xr:me;return!e&&ve(l,"iterate",ht),o.forEach((f,a)=>r.call(s,c(f),c(a),i))}}function dn(e,t,n){return function(...r){const s=this.__v_raw,i=J(s),o=Ct(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,f=s[e](...r),a=n?Kr:t?Xr:me;return!t&&ve(i,"iterate",c?xr:ht),{next(){const{value:h,done:g}=f.next();return g?{value:h,done:g}:{value:l?[a(h[0]),a(h[1])]:a(h),done:g}},[Symbol.iterator](){return this}}}}function Xe(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Sl(){const e={get(i){return cn(this,i)},get size(){return fn(this)},has:an,add:gs,set:ms,delete:ys,clear:vs,forEach:un(!1,!1)},t={get(i){return cn(this,i,!1,!0)},get size(){return fn(this)},has:an,add(i){return gs.call(this,i,!0)},set(i,o){return ms.call(this,i,o,!0)},delete:ys,clear:vs,forEach:un(!1,!0)},n={get(i){return cn(this,i,!0)},get size(){return fn(this,!0)},has(i){return an.call(this,i,!0)},add:Xe("add"),set:Xe("set"),delete:Xe("delete"),clear:Xe("clear"),forEach:un(!0,!1)},r={get(i){return cn(this,i,!0,!0)},get size(){return fn(this,!0)},has(i){return an.call(this,i,!0)},add:Xe("add"),set:Xe("set"),delete:Xe("delete"),clear:Xe("clear"),forEach:un(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=dn(i,!1,!1),n[i]=dn(i,!0,!1),t[i]=dn(i,!1,!0),r[i]=dn(i,!0,!0)}),[e,n,t,r]}const[El,xl,Tl,Cl]=Sl();function qr(e,t){const n=t?e?Cl:Tl:e?xl:El;return(r,s,i)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(z(n,s)&&s in r?n:r,s,i)}const Al={get:qr(!1,!1)},Rl={get:qr(!1,!0)},Ol={get:qr(!0,!1)};const Pi=new WeakMap,Ii=new WeakMap,Li=new WeakMap,Ml=new WeakMap;function Pl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Il(e){return e.__v_skip||!Object.isExtensible(e)?0:Pl(Qo(e))}function Bn(e){return vt(e)?e:Gr(e,!1,bl,Al,Pi)}function Ll(e){return Gr(e,!1,wl,Rl,Ii)}function kn(e){return Gr(e,!0,_l,Ol,Li)}function Gr(e,t,n,r,s){if(!ne(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=s.get(e);if(i)return i;const o=Il(e);if(o===0)return e;const l=new Proxy(e,o===2?r:n);return s.set(e,l),l}function pt(e){return vt(e)?pt(e.__v_raw):!!(e&&e.__v_isReactive)}function vt(e){return!!(e&&e.__v_isReadonly)}function Pe(e){return!!(e&&e.__v_isShallow)}function Yr(e){return e?!!e.__v_raw:!1}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function En(e){return!z(e,"__v_skip")&&Object.isExtensible(e)&&pi(e,"__v_skip",!0),e}const me=e=>ne(e)?Bn(e):e,Xr=e=>ne(e)?kn(e):e;function ae(e){return e?e.__v_isRef===!0:!1}function oe(e){return Ni(e,!1)}function Jr(e){return Ni(e,!0)}function Ni(e,t){return ae(e)?e:new Nl(e,t)}class Nl{constructor(t,n){this.dep=new jn,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:J(t),this._value=n?t:me(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,r=this.__v_isShallow||Pe(t)||vt(t);t=r?t:J(t),tt(t,n)&&(this._rawValue=t,this._value=r?t:me(t),this.dep.trigger())}}function Fi(e){return ae(e)?e.value:e}const Fl={get:(e,t,n)=>t==="__v_raw"?e:Fi(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return ae(s)&&!ae(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function Hi(e){return pt(e)?e:new Proxy(e,Fl)}class Hl{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new jn,{get:r,set:s}=t(n.track.bind(n),n.trigger.bind(n));this._get=r,this._set=s}get value(){return this._value=this._get()}set value(t){this._set(t)}}function $l(e){return new Hl(e)}class Dl{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return hl(J(this._object),this._key)}}class jl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function Vl(e,t,n){return ae(e)?e:q(e)?new jl(e):ne(e)&&arguments.length>1?Ul(e,t,n):oe(e)}function Ul(e,t,n){const r=e[t];return ae(r)?r:new Dl(e,t,n)}class Bl{constructor(t,n,r){this.fn=t,this.setter=n,this._value=void 0,this.dep=new jn(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Kt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=r}notify(){if(this.flags|=16,!(this.flags&8)&&te!==this)return Si(this,!0),!0}get value(){const t=this.dep.track();return Ti(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function kl(e,t,n=!1){let r,s;return q(e)?r=e:(r=e.get,s=e.set),new Bl(r,s,n)}const hn={},On=new WeakMap;let ut;function Wl(e,t=!1,n=ut){if(n){let r=On.get(n);r||On.set(n,r=[]),r.push(e)}}function Kl(e,t,n=Z){const{immediate:r,deep:s,once:i,scheduler:o,augmentJob:l,call:c}=n,f=m=>s?m:Pe(m)||s===!1||s===0?qe(m,1):qe(m);let a,h,g,v,_=!1,S=!1;if(ae(e)?(h=()=>e.value,_=Pe(e)):pt(e)?(h=()=>f(e),_=!0):K(e)?(S=!0,_=e.some(m=>pt(m)||Pe(m)),h=()=>e.map(m=>{if(ae(m))return m.value;if(pt(m))return f(m);if(q(m))return c?c(m,2):m()})):q(e)?t?h=c?()=>c(e,2):e:h=()=>{if(g){it();try{g()}finally{ot()}}const m=ut;ut=a;try{return c?c(e,3,[v]):e(v)}finally{ut=m}}:h=Ue,t&&s){const m=h,M=s===!0?1/0:s;h=()=>qe(m(),M)}const U=bi(),N=()=>{a.stop(),U&&Dr(U.effects,a)};if(i&&t){const m=t;t=(...M)=>{m(...M),N()}}let B=S?new Array(e.length).fill(hn):hn;const p=m=>{if(!(!(a.flags&1)||!a.dirty&&!m))if(t){const M=a.run();if(s||_||(S?M.some((F,$)=>tt(F,B[$])):tt(M,B))){g&&g();const F=ut;ut=a;try{const $=[M,B===hn?void 0:S&&B[0]===hn?[]:B,v];c?c(t,3,$):t(...$),B=M}finally{ut=F}}}else a.run()};return l&&l(p),a=new _i(h),a.scheduler=o?()=>o(p,!1):p,v=m=>Wl(m,!1,a),g=a.onStop=()=>{const m=On.get(a);if(m){if(c)c(m,4);else for(const M of m)M();On.delete(a)}},t?r?p(!0):B=a.run():o?o(p.bind(null,!0),!0):a.run(),N.pause=a.pause.bind(a),N.resume=a.resume.bind(a),N.stop=N,N}function qe(e,t=1/0,n){if(t<=0||!ne(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,ae(e))qe(e.value,t,n);else if(K(e))for(let r=0;r{qe(r,t,n)});else if(hi(e)){for(const r in e)qe(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&qe(e[r],t,n)}return e}/** +* @vue/runtime-core v3.5.11 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function en(e,t,n,r){try{return r?e(...r):e()}catch(s){tn(s,t,n)}}function Fe(e,t,n,r){if(q(e)){const s=en(e,t,n,r);return s&&ui(s)&&s.catch(i=>{tn(i,t,n)}),s}if(K(e)){const s=[];for(let i=0;i>>1,s=we[r],i=Gt(s);i=Gt(n)?we.push(e):we.splice(Gl(t),0,e),e.flags|=1,Di()}}function Di(){Mn||(Mn=$i.then(ji))}function Yl(e){K(e)?Rt.push(...e):Qe&&e.id===-1?Qe.splice(St+1,0,e):e.flags&1||(Rt.push(e),e.flags|=1),Di()}function bs(e,t,n=je+1){for(;nGt(n)-Gt(r));if(Rt.length=0,Qe){Qe.push(...t);return}for(Qe=t,St=0;Ste.id==null?e.flags&2?-1:1/0:e.id;function ji(e){try{for(je=0;je{r._d&&Ls(-1);const i=In(t);let o;try{o=e(...s)}finally{In(i),r._d&&Ls(1)}return o};return r._n=!0,r._c=!0,r._d=!0,r}function Pf(e,t){if(de===null)return e;const n=Jn(de),r=e.dirs||(e.dirs=[]);for(let s=0;se.__isTeleport,Vt=e=>e&&(e.disabled||e.disabled===""),Jl=e=>e&&(e.defer||e.defer===""),_s=e=>typeof SVGElement<"u"&&e instanceof SVGElement,ws=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Tr=(e,t)=>{const n=e&&e.to;return se(n)?t?t(n):null:n},zl={name:"Teleport",__isTeleport:!0,process(e,t,n,r,s,i,o,l,c,f){const{mc:a,pc:h,pbc:g,o:{insert:v,querySelector:_,createText:S,createComment:U}}=f,N=Vt(t.props);let{shapeFlag:B,children:p,dynamicChildren:m}=t;if(e==null){const M=t.el=S(""),F=t.anchor=S("");v(M,n,r),v(F,n,r);const $=(R,b)=>{B&16&&(s&&s.isCE&&(s.ce._teleportTarget=R),a(p,R,b,s,i,o,l,c))},j=()=>{const R=t.target=Tr(t.props,_),b=ki(R,t,S,v);R&&(o!=="svg"&&_s(R)?o="svg":o!=="mathml"&&ws(R)&&(o="mathml"),N||($(R,b),xn(t)))};N&&($(n,F),xn(t)),Jl(t.props)?Ee(j,i):j()}else{t.el=e.el,t.targetStart=e.targetStart;const M=t.anchor=e.anchor,F=t.target=e.target,$=t.targetAnchor=e.targetAnchor,j=Vt(e.props),R=j?n:F,b=j?M:$;if(o==="svg"||_s(F)?o="svg":(o==="mathml"||ws(F))&&(o="mathml"),m?(g(e.dynamicChildren,m,R,s,i,o,l),ns(e,t,!0)):c||h(e,t,R,b,s,i,o,l,!1),N)j?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):pn(t,n,M,f,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const L=t.target=Tr(t.props,_);L&&pn(t,L,null,f,0)}else j&&pn(t,F,$,f,1);xn(t)}},remove(e,t,n,{um:r,o:{remove:s}},i){const{shapeFlag:o,children:l,anchor:c,targetStart:f,targetAnchor:a,target:h,props:g}=e;if(h&&(s(f),s(a)),i&&s(c),o&16){const v=i||!Vt(g);for(let _=0;_{e.isMounted=!0}),Ji(()=>{e.isUnmounting=!0}),e}const Re=[Function,Array],Wi={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Re,onEnter:Re,onAfterEnter:Re,onEnterCancelled:Re,onBeforeLeave:Re,onLeave:Re,onAfterLeave:Re,onLeaveCancelled:Re,onBeforeAppear:Re,onAppear:Re,onAfterAppear:Re,onAppearCancelled:Re},Ki=e=>{const t=e.subTree;return t.component?Ki(t.component):t},ec={name:"BaseTransition",props:Wi,setup(e,{slots:t}){const n=Xn(),r=Zl();return()=>{const s=t.default&&Yi(t.default(),!0);if(!s||!s.length)return;const i=qi(s),o=J(e),{mode:l}=o;if(r.isLeaving)return sr(i);const c=Ss(i);if(!c)return sr(i);let f=Cr(c,o,r,n,g=>f=g);c.type!==ye&&Yt(c,f);const a=n.subTree,h=a&&Ss(a);if(h&&h.type!==ye&&!dt(c,h)&&Ki(n).type!==ye){const g=Cr(h,o,r,n);if(Yt(h,g),l==="out-in"&&c.type!==ye)return r.isLeaving=!0,g.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete g.afterLeave},sr(i);l==="in-out"&&c.type!==ye&&(g.delayLeave=(v,_,S)=>{const U=Gi(r,h);U[String(h.key)]=h,v[Ze]=()=>{_(),v[Ze]=void 0,delete f.delayedLeave},f.delayedLeave=S})}return i}}};function qi(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==ye){t=n;break}}return t}const tc=ec;function Gi(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function Cr(e,t,n,r,s){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:c,onEnter:f,onAfterEnter:a,onEnterCancelled:h,onBeforeLeave:g,onLeave:v,onAfterLeave:_,onLeaveCancelled:S,onBeforeAppear:U,onAppear:N,onAfterAppear:B,onAppearCancelled:p}=t,m=String(e.key),M=Gi(n,e),F=(R,b)=>{R&&Fe(R,r,9,b)},$=(R,b)=>{const L=b[1];F(R,b),K(R)?R.every(x=>x.length<=1)&&L():R.length<=1&&L()},j={mode:o,persisted:l,beforeEnter(R){let b=c;if(!n.isMounted)if(i)b=U||c;else return;R[Ze]&&R[Ze](!0);const L=M[m];L&&dt(e,L)&&L.el[Ze]&&L.el[Ze](),F(b,[R])},enter(R){let b=f,L=a,x=h;if(!n.isMounted)if(i)b=N||f,L=B||a,x=p||h;else return;let W=!1;const re=R[gn]=ce=>{W||(W=!0,ce?F(x,[R]):F(L,[R]),j.delayedLeave&&j.delayedLeave(),R[gn]=void 0)};b?$(b,[R,re]):re()},leave(R,b){const L=String(e.key);if(R[gn]&&R[gn](!0),n.isUnmounting)return b();F(g,[R]);let x=!1;const W=R[Ze]=re=>{x||(x=!0,b(),re?F(S,[R]):F(_,[R]),R[Ze]=void 0,M[L]===e&&delete M[L])};M[L]=e,v?$(v,[R,W]):W()},clone(R){const b=Cr(R,t,n,r,s);return s&&s(b),b}};return j}function sr(e){if(nn(e))return e=nt(e),e.children=null,e}function Ss(e){if(!nn(e))return Bi(e.type)&&e.children?qi(e.children):e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&q(n.default))return n.default()}}function Yt(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Yt(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Yi(e,t=!1,n){let r=[],s=0;for(let i=0;i1)for(let i=0;iLn(_,t&&(K(t)?t[S]:t),n,r,s));return}if(gt(r)&&!s)return;const i=r.shapeFlag&4?Jn(r.component):r.el,o=s?null:i,{i:l,r:c}=e,f=t&&t.r,a=l.refs===Z?l.refs={}:l.refs,h=l.setupState,g=J(h),v=h===Z?()=>!1:_=>z(g,_);if(f!=null&&f!==c&&(se(f)?(a[f]=null,v(f)&&(h[f]=null)):ae(f)&&(f.value=null)),q(c))en(c,l,12,[o,a]);else{const _=se(c),S=ae(c);if(_||S){const U=()=>{if(e.f){const N=_?v(c)?h[c]:a[c]:c.value;s?K(N)&&Dr(N,i):K(N)?N.includes(i)||N.push(i):_?(a[c]=[i],v(c)&&(h[c]=a[c])):(c.value=[i],e.k&&(a[e.k]=c.value))}else _?(a[c]=o,v(c)&&(h[c]=o)):S&&(c.value=o,e.k&&(a[e.k]=o))};o?(U.id=-1,Ee(U,n)):U()}}}let Es=!1;const wt=()=>{Es||(console.error("Hydration completed but contains mismatches."),Es=!0)},nc=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",rc=e=>e.namespaceURI.includes("MathML"),mn=e=>{if(e.nodeType===1){if(nc(e))return"svg";if(rc(e))return"mathml"}},xt=e=>e.nodeType===8;function sc(e){const{mt:t,p:n,o:{patchProp:r,createText:s,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:f}}=e,a=(p,m)=>{if(!m.hasChildNodes()){n(null,p,m),Pn(),m._vnode=p;return}h(m.firstChild,p,null,null,null),Pn(),m._vnode=p},h=(p,m,M,F,$,j=!1)=>{j=j||!!m.dynamicChildren;const R=xt(p)&&p.data==="[",b=()=>S(p,m,M,F,$,R),{type:L,ref:x,shapeFlag:W,patchFlag:re}=m;let ce=p.nodeType;m.el=p,re===-2&&(j=!1,m.dynamicChildren=null);let V=null;switch(L){case mt:ce!==3?m.children===""?(c(m.el=s(""),o(p),p),V=p):V=b():(p.data!==m.children&&(wt(),p.data=m.children),V=i(p));break;case ye:B(p)?(V=i(p),N(m.el=p.content.firstChild,p,M)):ce!==8||R?V=b():V=i(p);break;case Bt:if(R&&(p=i(p),ce=p.nodeType),ce===1||ce===3){V=p;const Y=!m.children.length;for(let D=0;D{j=j||!!m.dynamicChildren;const{type:R,props:b,patchFlag:L,shapeFlag:x,dirs:W,transition:re}=m,ce=R==="input"||R==="option";if(ce||L!==-1){W&&Ve(m,null,M,"created");let V=!1;if(B(p)){V=po(F,re)&&M&&M.vnode.props&&M.vnode.props.appear;const D=p.content.firstChild;V&&re.beforeEnter(D),N(D,p,M),m.el=p=D}if(x&16&&!(b&&(b.innerHTML||b.textContent))){let D=v(p.firstChild,m,p,M,F,$,j);for(;D;){yn(p,1)||wt();const he=D;D=D.nextSibling,l(he)}}else if(x&8){let D=m.children;D[0]===` +`&&(p.tagName==="PRE"||p.tagName==="TEXTAREA")&&(D=D.slice(1)),p.textContent!==D&&(yn(p,0)||wt(),p.textContent=m.children)}if(b){if(ce||!j||L&48){const D=p.tagName.includes("-");for(const he in b)(ce&&(he.endsWith("value")||he==="indeterminate")||Zt(he)&&!At(he)||he[0]==="."||D)&&r(p,he,null,b[he],void 0,M)}else if(b.onClick)r(p,"onClick",null,b.onClick,void 0,M);else if(L&4&&pt(b.style))for(const D in b.style)b.style[D]}let Y;(Y=b&&b.onVnodeBeforeMount)&&Oe(Y,M,m),W&&Ve(m,null,M,"beforeMount"),((Y=b&&b.onVnodeMounted)||W||V)&&bo(()=>{Y&&Oe(Y,M,m),V&&re.enter(p),W&&Ve(m,null,M,"mounted")},F)}return p.nextSibling},v=(p,m,M,F,$,j,R)=>{R=R||!!m.dynamicChildren;const b=m.children,L=b.length;for(let x=0;x{const{slotScopeIds:R}=m;R&&($=$?$.concat(R):R);const b=o(p),L=v(i(p),m,b,M,F,$,j);return L&&xt(L)&&L.data==="]"?i(m.anchor=L):(wt(),c(m.anchor=f("]"),b,L),L)},S=(p,m,M,F,$,j)=>{if(yn(p.parentElement,1)||wt(),m.el=null,j){const L=U(p);for(;;){const x=i(p);if(x&&x!==L)l(x);else break}}const R=i(p),b=o(p);return l(p),n(null,m,b,R,M,F,mn(b),$),R},U=(p,m="[",M="]")=>{let F=0;for(;p;)if(p=i(p),p&&xt(p)&&(p.data===m&&F++,p.data===M)){if(F===0)return i(p);F--}return p},N=(p,m,M)=>{const F=m.parentNode;F&&F.replaceChild(p,m);let $=M;for(;$;)$.vnode.el===m&&($.vnode.el=$.subTree.el=p),$=$.parent},B=p=>p.nodeType===1&&p.tagName==="TEMPLATE";return[a,h]}const xs="data-allow-mismatch",ic={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function yn(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(xs);)e=e.parentElement;const n=e&&e.getAttribute(xs);if(n==null)return!1;if(n==="")return!0;{const r=n.split(",");return t===0&&r.includes("children")?!0:n.split(",").includes(ic[t])}}function oc(e,t){if(xt(e)&&e.data==="["){let n=1,r=e.nextSibling;for(;r;){if(r.nodeType===1){if(t(r)===!1)break}else if(xt(r))if(r.data==="]"){if(--n===0)break}else r.data==="["&&n++;r=r.nextSibling}}else t(e)}const gt=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function Lf(e){q(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:s=200,hydrate:i,timeout:o,suspensible:l=!0,onError:c}=e;let f=null,a,h=0;const g=()=>(h++,f=null,v()),v=()=>{let _;return f||(_=f=t().catch(S=>{if(S=S instanceof Error?S:new Error(String(S)),c)return new Promise((U,N)=>{c(S,()=>U(g()),()=>N(S),h+1)});throw S}).then(S=>_!==f&&f?f:(S&&(S.__esModule||S[Symbol.toStringTag]==="Module")&&(S=S.default),a=S,S)))};return Qr({name:"AsyncComponentWrapper",__asyncLoader:v,__asyncHydrate(_,S,U){const N=i?()=>{const B=i(U,p=>oc(_,p));B&&(S.bum||(S.bum=[])).push(B)}:U;a?N():v().then(()=>!S.isUnmounted&&N())},get __asyncResolved(){return a},setup(){const _=ue;if(Zr(_),a)return()=>ir(a,_);const S=p=>{f=null,tn(p,_,13,!r)};if(l&&_.suspense||sn)return v().then(p=>()=>ir(p,_)).catch(p=>(S(p),()=>r?le(r,{error:p}):null));const U=oe(!1),N=oe(),B=oe(!!s);return s&&setTimeout(()=>{B.value=!1},s),o!=null&&setTimeout(()=>{if(!U.value&&!N.value){const p=new Error(`Async component timed out after ${o}ms.`);S(p),N.value=p}},o),v().then(()=>{U.value=!0,_.parent&&nn(_.parent.vnode)&&_.parent.update()}).catch(p=>{S(p),N.value=p}),()=>{if(U.value&&a)return ir(a,_);if(N.value&&r)return le(r,{error:N.value});if(n&&!B.value)return le(n)}}})}function ir(e,t){const{ref:n,props:r,children:s,ce:i}=t.vnode,o=le(e,r,s);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const nn=e=>e.type.__isKeepAlive;function lc(e,t){Xi(e,"a",t)}function cc(e,t){Xi(e,"da",t)}function Xi(e,t,n=ue){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(Kn(t,r,n),n){let s=n.parent;for(;s&&s.parent;)nn(s.parent.vnode)&&ac(r,t,n,s),s=s.parent}}function ac(e,t,n,r){const s=Kn(t,e,r,!0);qn(()=>{Dr(r[t],s)},n)}function Kn(e,t,n=ue,r=!1){if(n){const s=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{it();const l=rn(n),c=Fe(t,n,e,o);return l(),ot(),c});return r?s.unshift(i):s.push(i),i}}const Ye=e=>(t,n=ue)=>{(!sn||e==="sp")&&Kn(e,(...r)=>t(...r),n)},fc=Ye("bm"),It=Ye("m"),uc=Ye("bu"),dc=Ye("u"),Ji=Ye("bum"),qn=Ye("um"),hc=Ye("sp"),pc=Ye("rtg"),gc=Ye("rtc");function mc(e,t=ue){Kn("ec",e,t)}const zi="components";function Nf(e,t){return Zi(zi,e,!0,t)||e}const Qi=Symbol.for("v-ndc");function Ff(e){return se(e)?Zi(zi,e,!1)||e:e||Qi}function Zi(e,t,n=!0,r=!1){const s=de||ue;if(s){const i=s.type;{const l=ta(i,!1);if(l&&(l===t||l===Ie(t)||l===Dn(Ie(t))))return i}const o=Ts(s[e]||i[e],t)||Ts(s.appContext[e],t);return!o&&r?i:o}}function Ts(e,t){return e&&(e[t]||e[Ie(t)]||e[Dn(Ie(t))])}function Hf(e,t,n,r){let s;const i=n,o=K(e);if(o||se(e)){const l=o&&pt(e);let c=!1;l&&(c=!Pe(e),e=Vn(e)),s=new Array(e.length);for(let f=0,a=e.length;ft(l,c,void 0,i));else{const l=Object.keys(e);s=new Array(l.length);for(let c=0,f=l.length;cJt(t)?!(t.type===ye||t.type===Se&&!eo(t.children)):!0)?e:null}function Df(e,t){const n={};for(const r in e)n[/[A-Z]/.test(r)?`on:${r}`:wn(r)]=e[r];return n}const Ar=e=>e?xo(e)?Jn(e):Ar(e.parent):null,Ut=fe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Ar(e.parent),$root:e=>Ar(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>es(e),$forceUpdate:e=>e.f||(e.f=()=>{zr(e.update)}),$nextTick:e=>e.n||(e.n=Wn.bind(e.proxy)),$watch:e=>Dc.bind(e)}),or=(e,t)=>e!==Z&&!e.__isScriptSetup&&z(e,t),yc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:s,props:i,accessCache:o,type:l,appContext:c}=e;let f;if(t[0]!=="$"){const v=o[t];if(v!==void 0)switch(v){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return i[t]}else{if(or(r,t))return o[t]=1,r[t];if(s!==Z&&z(s,t))return o[t]=2,s[t];if((f=e.propsOptions[0])&&z(f,t))return o[t]=3,i[t];if(n!==Z&&z(n,t))return o[t]=4,n[t];Rr&&(o[t]=0)}}const a=Ut[t];let h,g;if(a)return t==="$attrs"&&ve(e.attrs,"get",""),a(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==Z&&z(n,t))return o[t]=4,n[t];if(g=c.config.globalProperties,z(g,t))return g[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:i}=e;return or(s,t)?(s[t]=n,!0):r!==Z&&z(r,t)?(r[t]=n,!0):z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:i}},o){let l;return!!n[o]||e!==Z&&z(e,o)||or(t,o)||(l=i[0])&&z(l,o)||z(r,o)||z(Ut,o)||z(s.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function jf(){return vc().slots}function vc(){const e=Xn();return e.setupContext||(e.setupContext=Co(e))}function Cs(e){return K(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Rr=!0;function bc(e){const t=es(e),n=e.proxy,r=e.ctx;Rr=!1,t.beforeCreate&&As(t.beforeCreate,e,"bc");const{data:s,computed:i,methods:o,watch:l,provide:c,inject:f,created:a,beforeMount:h,mounted:g,beforeUpdate:v,updated:_,activated:S,deactivated:U,beforeDestroy:N,beforeUnmount:B,destroyed:p,unmounted:m,render:M,renderTracked:F,renderTriggered:$,errorCaptured:j,serverPrefetch:R,expose:b,inheritAttrs:L,components:x,directives:W,filters:re}=t;if(f&&_c(f,r,null),o)for(const Y in o){const D=o[Y];q(D)&&(r[Y]=D.bind(n))}if(s){const Y=s.call(n,n);ne(Y)&&(e.data=Bn(Y))}if(Rr=!0,i)for(const Y in i){const D=i[Y],he=q(D)?D.bind(n,n):q(D.get)?D.get.bind(n,n):Ue,on=!q(D)&&q(D.set)?D.set.bind(n):Ue,lt=ie({get:he,set:on});Object.defineProperty(r,Y,{enumerable:!0,configurable:!0,get:()=>lt.value,set:$e=>lt.value=$e})}if(l)for(const Y in l)to(l[Y],r,n,Y);if(c){const Y=q(c)?c.call(n):c;Reflect.ownKeys(Y).forEach(D=>{Cc(D,Y[D])})}a&&As(a,e,"c");function V(Y,D){K(D)?D.forEach(he=>Y(he.bind(n))):D&&Y(D.bind(n))}if(V(fc,h),V(It,g),V(uc,v),V(dc,_),V(lc,S),V(cc,U),V(mc,j),V(gc,F),V(pc,$),V(Ji,B),V(qn,m),V(hc,R),K(b))if(b.length){const Y=e.exposed||(e.exposed={});b.forEach(D=>{Object.defineProperty(Y,D,{get:()=>n[D],set:he=>n[D]=he})})}else e.exposed||(e.exposed={});M&&e.render===Ue&&(e.render=M),L!=null&&(e.inheritAttrs=L),x&&(e.components=x),W&&(e.directives=W),R&&Zr(e)}function _c(e,t,n=Ue){K(e)&&(e=Or(e));for(const r in e){const s=e[r];let i;ne(s)?"default"in s?i=Mt(s.from||r,s.default,!0):i=Mt(s.from||r):i=Mt(s),ae(i)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[r]=i}}function As(e,t,n){Fe(K(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function to(e,t,n,r){let s=r.includes(".")?mo(n,r):()=>n[r];if(se(e)){const i=t[e];q(i)&&Be(s,i)}else if(q(e))Be(s,e.bind(n));else if(ne(e))if(K(e))e.forEach(i=>to(i,t,n,r));else{const i=q(e.handler)?e.handler.bind(n):t[e.handler];q(i)&&Be(s,i,e)}}function es(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!s.length&&!n&&!r?c=t:(c={},s.length&&s.forEach(f=>Nn(c,f,o,!0)),Nn(c,t,o)),ne(t)&&i.set(t,c),c}function Nn(e,t,n,r=!1){const{mixins:s,extends:i}=t;i&&Nn(e,i,n,!0),s&&s.forEach(o=>Nn(e,o,n,!0));for(const o in t)if(!(r&&o==="expose")){const l=wc[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const wc={data:Rs,props:Os,emits:Os,methods:$t,computed:$t,beforeCreate:be,created:be,beforeMount:be,mounted:be,beforeUpdate:be,updated:be,beforeDestroy:be,beforeUnmount:be,destroyed:be,unmounted:be,activated:be,deactivated:be,errorCaptured:be,serverPrefetch:be,components:$t,directives:$t,watch:Ec,provide:Rs,inject:Sc};function Rs(e,t){return t?e?function(){return fe(q(e)?e.call(this,this):e,q(t)?t.call(this,this):t)}:t:e}function Sc(e,t){return $t(Or(e),Or(t))}function Or(e){if(K(e)){const t={};for(let n=0;n1)return n&&q(t)?t.call(r&&r.proxy):t}}const ro={},so=()=>Object.create(ro),io=e=>Object.getPrototypeOf(e)===ro;function Ac(e,t,n,r=!1){const s={},i=so();e.propsDefaults=Object.create(null),oo(e,t,s,i);for(const o in e.propsOptions[0])o in s||(s[o]=void 0);n?e.props=r?s:Ll(s):e.type.props?e.props=s:e.props=i,e.attrs=i}function Rc(e,t,n,r){const{props:s,attrs:i,vnode:{patchFlag:o}}=e,l=J(s),[c]=e.propsOptions;let f=!1;if((r||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[g,v]=lo(h,t,!0);fe(o,g),v&&l.push(...v)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!c)return ne(e)&&r.set(e,Tt),Tt;if(K(i))for(let a=0;ae[0]==="_"||e==="$stable",ts=e=>K(e)?e.map(Me):[Me(e)],Mc=(e,t,n)=>{if(t._n)return t;const r=Xl((...s)=>ts(t(...s)),n);return r._c=!1,r},ao=(e,t,n)=>{const r=e._ctx;for(const s in e){if(co(s))continue;const i=e[s];if(q(i))t[s]=Mc(s,i,r);else if(i!=null){const o=ts(i);t[s]=()=>o}}},fo=(e,t)=>{const n=ts(t);e.slots.default=()=>n},uo=(e,t,n)=>{for(const r in t)(n||r!=="_")&&(e[r]=t[r])},Pc=(e,t,n)=>{const r=e.slots=so();if(e.vnode.shapeFlag&32){const s=t._;s?(uo(r,t,n),n&&pi(r,"_",s,!0)):ao(t,r)}else t&&fo(e,t)},Ic=(e,t,n)=>{const{vnode:r,slots:s}=e;let i=!0,o=Z;if(r.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:uo(s,t,n):(i=!t.$stable,ao(t,s)),o=t}else t&&(fo(e,t),o={default:1});if(i)for(const l in s)!co(l)&&o[l]==null&&delete s[l]},Ee=bo;function Lc(e){return ho(e)}function Nc(e){return ho(e,sc)}function ho(e,t){const n=gi();n.__VUE__=!0;const{insert:r,remove:s,patchProp:i,createElement:o,createText:l,createComment:c,setText:f,setElementText:a,parentNode:h,nextSibling:g,setScopeId:v=Ue,insertStaticContent:_}=e,S=(u,d,y,T=null,w=null,E=null,P=void 0,O=null,A=!!d.dynamicChildren)=>{if(u===d)return;u&&!dt(u,d)&&(T=ln(u),$e(u,w,E,!0),u=null),d.patchFlag===-2&&(A=!1,d.dynamicChildren=null);const{type:C,ref:k,shapeFlag:I}=d;switch(C){case mt:U(u,d,y,T);break;case ye:N(u,d,y,T);break;case Bt:u==null&&B(d,y,T,P);break;case Se:x(u,d,y,T,w,E,P,O,A);break;default:I&1?M(u,d,y,T,w,E,P,O,A):I&6?W(u,d,y,T,w,E,P,O,A):(I&64||I&128)&&C.process(u,d,y,T,w,E,P,O,A,bt)}k!=null&&w&&Ln(k,u&&u.ref,E,d||u,!d)},U=(u,d,y,T)=>{if(u==null)r(d.el=l(d.children),y,T);else{const w=d.el=u.el;d.children!==u.children&&f(w,d.children)}},N=(u,d,y,T)=>{u==null?r(d.el=c(d.children||""),y,T):d.el=u.el},B=(u,d,y,T)=>{[u.el,u.anchor]=_(u.children,d,y,T,u.el,u.anchor)},p=({el:u,anchor:d},y,T)=>{let w;for(;u&&u!==d;)w=g(u),r(u,y,T),u=w;r(d,y,T)},m=({el:u,anchor:d})=>{let y;for(;u&&u!==d;)y=g(u),s(u),u=y;s(d)},M=(u,d,y,T,w,E,P,O,A)=>{d.type==="svg"?P="svg":d.type==="math"&&(P="mathml"),u==null?F(d,y,T,w,E,P,O,A):R(u,d,w,E,P,O,A)},F=(u,d,y,T,w,E,P,O)=>{let A,C;const{props:k,shapeFlag:I,transition:H,dirs:G}=u;if(A=u.el=o(u.type,E,k&&k.is,k),I&8?a(A,u.children):I&16&&j(u.children,A,null,T,w,lr(u,E),P,O),G&&Ve(u,null,T,"created"),$(A,u,u.scopeId,P,T),k){for(const ee in k)ee!=="value"&&!At(ee)&&i(A,ee,null,k[ee],E,T);"value"in k&&i(A,"value",null,k.value,E),(C=k.onVnodeBeforeMount)&&Oe(C,T,u)}G&&Ve(u,null,T,"beforeMount");const X=po(w,H);X&&H.beforeEnter(A),r(A,d,y),((C=k&&k.onVnodeMounted)||X||G)&&Ee(()=>{C&&Oe(C,T,u),X&&H.enter(A),G&&Ve(u,null,T,"mounted")},w)},$=(u,d,y,T,w)=>{if(y&&v(u,y),T)for(let E=0;E{for(let C=A;C{const O=d.el=u.el;let{patchFlag:A,dynamicChildren:C,dirs:k}=d;A|=u.patchFlag&16;const I=u.props||Z,H=d.props||Z;let G;if(y&&ct(y,!1),(G=H.onVnodeBeforeUpdate)&&Oe(G,y,d,u),k&&Ve(d,u,y,"beforeUpdate"),y&&ct(y,!0),(I.innerHTML&&H.innerHTML==null||I.textContent&&H.textContent==null)&&a(O,""),C?b(u.dynamicChildren,C,O,y,T,lr(d,w),E):P||D(u,d,O,null,y,T,lr(d,w),E,!1),A>0){if(A&16)L(O,I,H,y,w);else if(A&2&&I.class!==H.class&&i(O,"class",null,H.class,w),A&4&&i(O,"style",I.style,H.style,w),A&8){const X=d.dynamicProps;for(let ee=0;ee{G&&Oe(G,y,d,u),k&&Ve(d,u,y,"updated")},T)},b=(u,d,y,T,w,E,P)=>{for(let O=0;O{if(d!==y){if(d!==Z)for(const E in d)!At(E)&&!(E in y)&&i(u,E,d[E],null,w,T);for(const E in y){if(At(E))continue;const P=y[E],O=d[E];P!==O&&E!=="value"&&i(u,E,O,P,w,T)}"value"in y&&i(u,"value",d.value,y.value,w)}},x=(u,d,y,T,w,E,P,O,A)=>{const C=d.el=u?u.el:l(""),k=d.anchor=u?u.anchor:l("");let{patchFlag:I,dynamicChildren:H,slotScopeIds:G}=d;G&&(O=O?O.concat(G):G),u==null?(r(C,y,T),r(k,y,T),j(d.children||[],y,k,w,E,P,O,A)):I>0&&I&64&&H&&u.dynamicChildren?(b(u.dynamicChildren,H,y,w,E,P,O),(d.key!=null||w&&d===w.subTree)&&ns(u,d,!0)):D(u,d,y,k,w,E,P,O,A)},W=(u,d,y,T,w,E,P,O,A)=>{d.slotScopeIds=O,u==null?d.shapeFlag&512?w.ctx.activate(d,y,T,P,A):re(d,y,T,w,E,P,A):ce(u,d,A)},re=(u,d,y,T,w,E,P)=>{const O=u.component=zc(u,T,w);if(nn(u)&&(O.ctx.renderer=bt),Qc(O,!1,P),O.asyncDep){if(w&&w.registerDep(O,V,P),!u.el){const A=O.subTree=le(ye);N(null,A,d,y)}}else V(O,u,d,y,w,E,P)},ce=(u,d,y)=>{const T=d.component=u.component;if(kc(u,d,y))if(T.asyncDep&&!T.asyncResolved){Y(T,d,y);return}else T.next=d,T.update();else d.el=u.el,T.vnode=d},V=(u,d,y,T,w,E,P)=>{const O=()=>{if(u.isMounted){let{next:I,bu:H,u:G,parent:X,vnode:ee}=u;{const Te=go(u);if(Te){I&&(I.el=ee.el,Y(u,I,P)),Te.asyncDep.then(()=>{u.isUnmounted||O()});return}}let Q=I,xe;ct(u,!1),I?(I.el=ee.el,Y(u,I,P)):I=ee,H&&Sn(H),(xe=I.props&&I.props.onVnodeBeforeUpdate)&&Oe(xe,X,I,ee),ct(u,!0);const pe=cr(u),Le=u.subTree;u.subTree=pe,S(Le,pe,h(Le.el),ln(Le),u,w,E),I.el=pe.el,Q===null&&Wc(u,pe.el),G&&Ee(G,w),(xe=I.props&&I.props.onVnodeUpdated)&&Ee(()=>Oe(xe,X,I,ee),w)}else{let I;const{el:H,props:G}=d,{bm:X,m:ee,parent:Q,root:xe,type:pe}=u,Le=gt(d);if(ct(u,!1),X&&Sn(X),!Le&&(I=G&&G.onVnodeBeforeMount)&&Oe(I,Q,d),ct(u,!0),H&&Zn){const Te=()=>{u.subTree=cr(u),Zn(H,u.subTree,u,w,null)};Le&&pe.__asyncHydrate?pe.__asyncHydrate(H,u,Te):Te()}else{xe.ce&&xe.ce._injectChildStyle(pe);const Te=u.subTree=cr(u);S(null,Te,y,T,u,w,E),d.el=Te.el}if(ee&&Ee(ee,w),!Le&&(I=G&&G.onVnodeMounted)){const Te=d;Ee(()=>Oe(I,Q,Te),w)}(d.shapeFlag&256||Q&>(Q.vnode)&&Q.vnode.shapeFlag&256)&&u.a&&Ee(u.a,w),u.isMounted=!0,d=y=T=null}};u.scope.on();const A=u.effect=new _i(O);u.scope.off();const C=u.update=A.run.bind(A),k=u.job=A.runIfDirty.bind(A);k.i=u,k.id=u.uid,A.scheduler=()=>zr(k),ct(u,!0),C()},Y=(u,d,y)=>{d.component=u;const T=u.vnode.props;u.vnode=d,u.next=null,Rc(u,d.props,T,y),Ic(u,d.children,y),it(),bs(u),ot()},D=(u,d,y,T,w,E,P,O,A=!1)=>{const C=u&&u.children,k=u?u.shapeFlag:0,I=d.children,{patchFlag:H,shapeFlag:G}=d;if(H>0){if(H&128){on(C,I,y,T,w,E,P,O,A);return}else if(H&256){he(C,I,y,T,w,E,P,O,A);return}}G&8?(k&16&&Lt(C,w,E),I!==C&&a(y,I)):k&16?G&16?on(C,I,y,T,w,E,P,O,A):Lt(C,w,E,!0):(k&8&&a(y,""),G&16&&j(I,y,T,w,E,P,O,A))},he=(u,d,y,T,w,E,P,O,A)=>{u=u||Tt,d=d||Tt;const C=u.length,k=d.length,I=Math.min(C,k);let H;for(H=0;Hk?Lt(u,w,E,!0,!1,I):j(d,y,T,w,E,P,O,A,I)},on=(u,d,y,T,w,E,P,O,A)=>{let C=0;const k=d.length;let I=u.length-1,H=k-1;for(;C<=I&&C<=H;){const G=u[C],X=d[C]=A?et(d[C]):Me(d[C]);if(dt(G,X))S(G,X,y,null,w,E,P,O,A);else break;C++}for(;C<=I&&C<=H;){const G=u[I],X=d[H]=A?et(d[H]):Me(d[H]);if(dt(G,X))S(G,X,y,null,w,E,P,O,A);else break;I--,H--}if(C>I){if(C<=H){const G=H+1,X=GH)for(;C<=I;)$e(u[C],w,E,!0),C++;else{const G=C,X=C,ee=new Map;for(C=X;C<=H;C++){const Ce=d[C]=A?et(d[C]):Me(d[C]);Ce.key!=null&&ee.set(Ce.key,C)}let Q,xe=0;const pe=H-X+1;let Le=!1,Te=0;const Nt=new Array(pe);for(C=0;C=pe){$e(Ce,w,E,!0);continue}let De;if(Ce.key!=null)De=ee.get(Ce.key);else for(Q=X;Q<=H;Q++)if(Nt[Q-X]===0&&dt(Ce,d[Q])){De=Q;break}De===void 0?$e(Ce,w,E,!0):(Nt[De-X]=C+1,De>=Te?Te=De:Le=!0,S(Ce,d[De],y,null,w,E,P,O,A),xe++)}const fs=Le?Fc(Nt):Tt;for(Q=fs.length-1,C=pe-1;C>=0;C--){const Ce=X+C,De=d[Ce],us=Ce+1{const{el:E,type:P,transition:O,children:A,shapeFlag:C}=u;if(C&6){lt(u.component.subTree,d,y,T);return}if(C&128){u.suspense.move(d,y,T);return}if(C&64){P.move(u,d,y,bt);return}if(P===Se){r(E,d,y);for(let I=0;IO.enter(E),w);else{const{leave:I,delayLeave:H,afterLeave:G}=O,X=()=>r(E,d,y),ee=()=>{I(E,()=>{X(),G&&G()})};H?H(E,X,ee):ee()}else r(E,d,y)},$e=(u,d,y,T=!1,w=!1)=>{const{type:E,props:P,ref:O,children:A,dynamicChildren:C,shapeFlag:k,patchFlag:I,dirs:H,cacheIndex:G}=u;if(I===-2&&(w=!1),O!=null&&Ln(O,null,y,u,!0),G!=null&&(d.renderCache[G]=void 0),k&256){d.ctx.deactivate(u);return}const X=k&1&&H,ee=!gt(u);let Q;if(ee&&(Q=P&&P.onVnodeBeforeUnmount)&&Oe(Q,d,u),k&6)Xo(u.component,y,T);else{if(k&128){u.suspense.unmount(y,T);return}X&&Ve(u,null,d,"beforeUnmount"),k&64?u.type.remove(u,d,y,bt,T):C&&!C.hasOnce&&(E!==Se||I>0&&I&64)?Lt(C,d,y,!1,!0):(E===Se&&I&384||!w&&k&16)&&Lt(A,d,y),T&&cs(u)}(ee&&(Q=P&&P.onVnodeUnmounted)||X)&&Ee(()=>{Q&&Oe(Q,d,u),X&&Ve(u,null,d,"unmounted")},y)},cs=u=>{const{type:d,el:y,anchor:T,transition:w}=u;if(d===Se){Yo(y,T);return}if(d===Bt){m(u);return}const E=()=>{s(y),w&&!w.persisted&&w.afterLeave&&w.afterLeave()};if(u.shapeFlag&1&&w&&!w.persisted){const{leave:P,delayLeave:O}=w,A=()=>P(y,E);O?O(u.el,E,A):A()}else E()},Yo=(u,d)=>{let y;for(;u!==d;)y=g(u),s(u),u=y;s(d)},Xo=(u,d,y)=>{const{bum:T,scope:w,job:E,subTree:P,um:O,m:A,a:C}=u;Ps(A),Ps(C),T&&Sn(T),w.stop(),E&&(E.flags|=8,$e(P,u,d,y)),O&&Ee(O,d),Ee(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},Lt=(u,d,y,T=!1,w=!1,E=0)=>{for(let P=E;P{if(u.shapeFlag&6)return ln(u.component.subTree);if(u.shapeFlag&128)return u.suspense.next();const d=g(u.anchor||u.el),y=d&&d[Ui];return y?g(y):d};let zn=!1;const as=(u,d,y)=>{u==null?d._vnode&&$e(d._vnode,null,null,!0):S(d._vnode||null,u,d,null,null,null,y),d._vnode=u,zn||(zn=!0,bs(),Pn(),zn=!1)},bt={p:S,um:$e,m:lt,r:cs,mt:re,mc:j,pc:D,pbc:b,n:ln,o:e};let Qn,Zn;return t&&([Qn,Zn]=t(bt)),{render:as,hydrate:Qn,createApp:Tc(as,Qn)}}function lr({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function ct({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function po(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ns(e,t,n=!1){const r=e.children,s=t.children;if(K(r)&&K(s))for(let i=0;i>1,e[n[l]]0&&(t[r]=n[i-1]),n[i]=r)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function go(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:go(t)}function Ps(e){if(e)for(let t=0;tMt(Hc);function rs(e,t){return Gn(e,null,t)}function Vf(e,t){return Gn(e,null,{flush:"post"})}function Be(e,t,n){return Gn(e,t,n)}function Gn(e,t,n=Z){const{immediate:r,deep:s,flush:i,once:o}=n,l=fe({},n);let c;if(sn)if(i==="sync"){const g=$c();c=g.__watcherHandles||(g.__watcherHandles=[])}else if(!t||r)l.once=!0;else{const g=()=>{};return g.stop=Ue,g.resume=Ue,g.pause=Ue,g}const f=ue;l.call=(g,v,_)=>Fe(g,f,v,_);let a=!1;i==="post"?l.scheduler=g=>{Ee(g,f&&f.suspense)}:i!=="sync"&&(a=!0,l.scheduler=(g,v)=>{v?g():zr(g)}),l.augmentJob=g=>{t&&(g.flags|=4),a&&(g.flags|=2,f&&(g.id=f.uid,g.i=f))};const h=Kl(e,t,l);return c&&c.push(h),h}function Dc(e,t,n){const r=this.proxy,s=se(e)?e.includes(".")?mo(r,e):()=>r[e]:e.bind(r,r);let i;q(t)?i=t:(i=t.handler,n=t);const o=rn(this),l=Gn(s,i.bind(r),n);return o(),l}function mo(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;st==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ie(t)}Modifiers`]||e[`${st(t)}Modifiers`];function Vc(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||Z;let s=n;const i=t.startsWith("update:"),o=i&&jc(r,t.slice(7));o&&(o.trim&&(s=n.map(a=>se(a)?a.trim():a)),o.number&&(s=n.map(Sr)));let l,c=r[l=wn(t)]||r[l=wn(Ie(t))];!c&&i&&(c=r[l=wn(st(t))]),c&&Fe(c,e,6,s);const f=r[l+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Fe(f,e,6,s)}}function yo(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const i=e.emits;let o={},l=!1;if(!q(e)){const c=f=>{const a=yo(f,t,!0);a&&(l=!0,fe(o,a))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(ne(e)&&r.set(e,null),null):(K(i)?i.forEach(c=>o[c]=null):fe(o,i),ne(e)&&r.set(e,o),o)}function Yn(e,t){return!e||!Zt(t)?!1:(t=t.slice(2).replace(/Once$/,""),z(e,t[0].toLowerCase()+t.slice(1))||z(e,st(t))||z(e,t))}function cr(e){const{type:t,vnode:n,proxy:r,withProxy:s,propsOptions:[i],slots:o,attrs:l,emit:c,render:f,renderCache:a,props:h,data:g,setupState:v,ctx:_,inheritAttrs:S}=e,U=In(e);let N,B;try{if(n.shapeFlag&4){const m=s||r,M=m;N=Me(f.call(M,m,a,h,v,g,_)),B=l}else{const m=t;N=Me(m.length>1?m(h,{attrs:l,slots:o,emit:c}):m(h,null)),B=t.props?l:Uc(l)}}catch(m){kt.length=0,tn(m,e,1),N=le(ye)}let p=N;if(B&&S!==!1){const m=Object.keys(B),{shapeFlag:M}=p;m.length&&M&7&&(i&&m.some($r)&&(B=Bc(B,i)),p=nt(p,B,!1,!0))}return n.dirs&&(p=nt(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&Yt(p,n.transition),N=p,In(U),N}const Uc=e=>{let t;for(const n in e)(n==="class"||n==="style"||Zt(n))&&((t||(t={}))[n]=e[n]);return t},Bc=(e,t)=>{const n={};for(const r in e)(!$r(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function kc(e,t,n){const{props:r,children:s,component:i}=e,{props:o,children:l,patchFlag:c}=t,f=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?Is(r,o,f):!!o;if(c&8){const a=t.dynamicProps;for(let h=0;he.__isSuspense;function bo(e,t){t&&t.pendingBranch?K(e)?t.effects.push(...e):t.effects.push(e):Yl(e)}const Se=Symbol.for("v-fgt"),mt=Symbol.for("v-txt"),ye=Symbol.for("v-cmt"),Bt=Symbol.for("v-stc"),kt=[];let Ae=null;function Pr(e=!1){kt.push(Ae=e?null:[])}function Kc(){kt.pop(),Ae=kt[kt.length-1]||null}let Xt=1;function Ls(e){Xt+=e,e<0&&Ae&&(Ae.hasOnce=!0)}function _o(e){return e.dynamicChildren=Xt>0?Ae||Tt:null,Kc(),Xt>0&&Ae&&Ae.push(e),e}function Uf(e,t,n,r,s,i){return _o(So(e,t,n,r,s,i,!0))}function Ir(e,t,n,r,s){return _o(le(e,t,n,r,s,!0))}function Jt(e){return e?e.__v_isVNode===!0:!1}function dt(e,t){return e.type===t.type&&e.key===t.key}const wo=({key:e})=>e??null,Tn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?se(e)||ae(e)||q(e)?{i:de,r:e,k:t,f:!!n}:e:null);function So(e,t=null,n=null,r=0,s=null,i=e===Se?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&wo(t),ref:t&&Tn(t),scopeId:Vi,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:de};return l?(ss(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=se(n)?8:16),Xt>0&&!o&&Ae&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ae.push(c),c}const le=qc;function qc(e,t=null,n=null,r=0,s=null,i=!1){if((!e||e===Qi)&&(e=ye),Jt(e)){const l=nt(e,t,!0);return n&&ss(l,n),Xt>0&&!i&&Ae&&(l.shapeFlag&6?Ae[Ae.indexOf(e)]=l:Ae.push(l)),l.patchFlag=-2,l}if(na(e)&&(e=e.__vccOpts),t){t=Gc(t);let{class:l,style:c}=t;l&&!se(l)&&(t.class=Ur(l)),ne(c)&&(Yr(c)&&!K(c)&&(c=fe({},c)),t.style=Vr(c))}const o=se(e)?1:vo(e)?128:Bi(e)?64:ne(e)?4:q(e)?2:0;return So(e,t,n,r,s,o,i,!0)}function Gc(e){return e?Yr(e)||io(e)?fe({},e):e:null}function nt(e,t,n=!1,r=!1){const{props:s,ref:i,patchFlag:o,children:l,transition:c}=e,f=t?Yc(s||{},t):s,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:f,key:f&&wo(f),ref:t&&t.ref?n&&i?K(i)?i.concat(Tn(t)):[i,Tn(t)]:Tn(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Se?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&nt(e.ssContent),ssFallback:e.ssFallback&&nt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&r&&Yt(a,c.clone(a)),a}function Eo(e=" ",t=0){return le(mt,null,e,t)}function Bf(e,t){const n=le(Bt,null,e);return n.staticCount=t,n}function kf(e="",t=!1){return t?(Pr(),Ir(ye,null,e)):le(ye,null,e)}function Me(e){return e==null||typeof e=="boolean"?le(ye):K(e)?le(Se,null,e.slice()):Jt(e)?et(e):le(mt,null,String(e))}function et(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:nt(e)}function ss(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(K(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),ss(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!io(t)?t._ctx=de:s===3&&de&&(de.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else q(t)?(t={default:t,_ctx:de},n=32):(t=String(t),r&64?(n=16,t=[Eo(t)]):n=8);e.children=t,e.shapeFlag|=n}function Yc(...e){const t={};for(let n=0;nue||de;let Fn,Lr;{const e=gi(),t=(n,r)=>{let s;return(s=e[n])||(s=e[n]=[]),s.push(r),i=>{s.length>1?s.forEach(o=>o(i)):s[0](i)}};Fn=t("__VUE_INSTANCE_SETTERS__",n=>ue=n),Lr=t("__VUE_SSR_SETTERS__",n=>sn=n)}const rn=e=>{const t=ue;return Fn(e),e.scope.on(),()=>{e.scope.off(),Fn(t)}},Ns=()=>{ue&&ue.scope.off(),Fn(null)};function xo(e){return e.vnode.shapeFlag&4}let sn=!1;function Qc(e,t=!1,n=!1){t&&Lr(t);const{props:r,children:s}=e.vnode,i=xo(e);Ac(e,r,i,t),Pc(e,s,n);const o=i?Zc(e,t):void 0;return t&&Lr(!1),o}function Zc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,yc);const{setup:r}=n;if(r){const s=e.setupContext=r.length>1?Co(e):null,i=rn(e);it();const o=en(r,e,0,[e.props,s]);if(ot(),i(),ui(o)){if(gt(e)||Zr(e),o.then(Ns,Ns),t)return o.then(l=>{Fs(e,l,t)}).catch(l=>{tn(l,e,0)});e.asyncDep=o}else Fs(e,o,t)}else To(e,t)}function Fs(e,t,n){q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ne(t)&&(e.setupState=Hi(t)),To(e,n)}let Hs;function To(e,t,n){const r=e.type;if(!e.render){if(!t&&Hs&&!r.render){const s=r.template||es(e).template;if(s){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=r,f=fe(fe({isCustomElement:i,delimiters:l},o),c);r.render=Hs(s,f)}}e.render=r.render||Ue}{const s=rn(e);it();try{bc(e)}finally{ot(),s()}}}const ea={get(e,t){return ve(e,"get",""),e[t]}};function Co(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,ea),slots:e.slots,emit:e.emit,expose:t}}function Jn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Hi(En(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Ut)return Ut[n](e)},has(t,n){return n in t||n in Ut}})):e.proxy}function ta(e,t=!0){return q(e)?e.displayName||e.name:e.name||t&&e.__name}function na(e){return q(e)&&"__vccOpts"in e}const ie=(e,t)=>kl(e,t,sn);function Nr(e,t,n){const r=arguments.length;return r===2?ne(t)&&!K(t)?Jt(t)?le(e,null,[t]):le(e,t):le(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Jt(n)&&(n=[n]),le(e,t,n))}const ra="3.5.11";/** +* @vue/runtime-dom v3.5.11 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Fr;const $s=typeof window<"u"&&window.trustedTypes;if($s)try{Fr=$s.createPolicy("vue",{createHTML:e=>e})}catch{}const Ao=Fr?e=>Fr.createHTML(e):e=>e,sa="http://www.w3.org/2000/svg",ia="http://www.w3.org/1998/Math/MathML",Ke=typeof document<"u"?document:null,Ds=Ke&&Ke.createElement("template"),oa={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t==="svg"?Ke.createElementNS(sa,e):t==="mathml"?Ke.createElementNS(ia,e):n?Ke.createElement(e,{is:n}):Ke.createElement(e);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>Ke.createTextNode(e),createComment:e=>Ke.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ke.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,i){const o=n?n.previousSibling:t.lastChild;if(s&&(s===i||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===i||!(s=s.nextSibling)););else{Ds.innerHTML=Ao(r==="svg"?`${e}`:r==="mathml"?`${e}`:e);const l=Ds.content;if(r==="svg"||r==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Je="transition",Ht="animation",zt=Symbol("_vtc"),Ro={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},la=fe({},Wi,Ro),ca=e=>(e.displayName="Transition",e.props=la,e),Wf=ca((e,{slots:t})=>Nr(tc,aa(e),t)),at=(e,t=[])=>{K(e)?e.forEach(n=>n(...t)):e&&e(...t)},js=e=>e?K(e)?e.some(t=>t.length>1):e.length>1:!1;function aa(e){const t={};for(const x in e)x in Ro||(t[x]=e[x]);if(e.css===!1)return t;const{name:n="v",type:r,duration:s,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:f=o,appearToClass:a=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:g=`${n}-leave-active`,leaveToClass:v=`${n}-leave-to`}=e,_=fa(s),S=_&&_[0],U=_&&_[1],{onBeforeEnter:N,onEnter:B,onEnterCancelled:p,onLeave:m,onLeaveCancelled:M,onBeforeAppear:F=N,onAppear:$=B,onAppearCancelled:j=p}=t,R=(x,W,re)=>{ft(x,W?a:l),ft(x,W?f:o),re&&re()},b=(x,W)=>{x._isLeaving=!1,ft(x,h),ft(x,v),ft(x,g),W&&W()},L=x=>(W,re)=>{const ce=x?$:B,V=()=>R(W,x,re);at(ce,[W,V]),Vs(()=>{ft(W,x?c:i),ze(W,x?a:l),js(ce)||Us(W,r,S,V)})};return fe(t,{onBeforeEnter(x){at(N,[x]),ze(x,i),ze(x,o)},onBeforeAppear(x){at(F,[x]),ze(x,c),ze(x,f)},onEnter:L(!1),onAppear:L(!0),onLeave(x,W){x._isLeaving=!0;const re=()=>b(x,W);ze(x,h),ze(x,g),ha(),Vs(()=>{x._isLeaving&&(ft(x,h),ze(x,v),js(m)||Us(x,r,U,re))}),at(m,[x,re])},onEnterCancelled(x){R(x,!1),at(p,[x])},onAppearCancelled(x){R(x,!0),at(j,[x])},onLeaveCancelled(x){b(x),at(M,[x])}})}function fa(e){if(e==null)return null;if(ne(e))return[ar(e.enter),ar(e.leave)];{const t=ar(e);return[t,t]}}function ar(e){return tl(e)}function ze(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[zt]||(e[zt]=new Set)).add(t)}function ft(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[zt];n&&(n.delete(t),n.size||(e[zt]=void 0))}function Vs(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let ua=0;function Us(e,t,n,r){const s=e._endId=++ua,i=()=>{s===e._endId&&r()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=da(e,t);if(!o)return r();const f=o+"end";let a=0;const h=()=>{e.removeEventListener(f,g),i()},g=v=>{v.target===e&&++a>=c&&h()};setTimeout(()=>{a(n[_]||"").split(", "),s=r(`${Je}Delay`),i=r(`${Je}Duration`),o=Bs(s,i),l=r(`${Ht}Delay`),c=r(`${Ht}Duration`),f=Bs(l,c);let a=null,h=0,g=0;t===Je?o>0&&(a=Je,h=o,g=i.length):t===Ht?f>0&&(a=Ht,h=f,g=c.length):(h=Math.max(o,f),a=h>0?o>f?Je:Ht:null,g=a?a===Je?i.length:c.length:0);const v=a===Je&&/\b(transform|all)(,|$)/.test(r(`${Je}Property`).toString());return{type:a,timeout:h,propCount:g,hasTransform:v}}function Bs(e,t){for(;e.lengthks(n)+ks(e[r])))}function ks(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function ha(){return document.body.offsetHeight}function pa(e,t,n){const r=e[zt];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Ws=Symbol("_vod"),ga=Symbol("_vsh"),ma=Symbol(""),ya=/(^|;)\s*display\s*:/;function va(e,t,n){const r=e.style,s=se(n);let i=!1;if(n&&!s){if(t)if(se(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&Cn(r,l,"")}else for(const o in t)n[o]==null&&Cn(r,o,"");for(const o in n)o==="display"&&(i=!0),Cn(r,o,n[o])}else if(s){if(t!==n){const o=r[ma];o&&(n+=";"+o),r.cssText=n,i=ya.test(n)}}else t&&e.removeAttribute("style");Ws in e&&(e[Ws]=i?r.display:"",e[ga]&&(r.display="none"))}const Ks=/\s*!important$/;function Cn(e,t,n){if(K(n))n.forEach(r=>Cn(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=ba(e,t);Ks.test(n)?e.setProperty(st(r),n.replace(Ks,""),"important"):e[r]=n}}const qs=["Webkit","Moz","ms"],fr={};function ba(e,t){const n=fr[t];if(n)return n;let r=Ie(t);if(r!=="filter"&&r in e)return fr[t]=r;r=Dn(r);for(let s=0;sur||(Ea.then(()=>ur=0),ur=Date.now());function Ta(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Fe(Ca(r,n.value),t,5,[r])};return n.value=e,n.attached=xa(),n}function Ca(e,t){if(K(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const Qs=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Aa=(e,t,n,r,s,i)=>{const o=s==="svg";t==="class"?pa(e,r,o):t==="style"?va(e,n,r):Zt(t)?$r(t)||wa(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Ra(e,t,r,o))?(Xs(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Ys(e,t,r,o,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!se(r))?Xs(e,Ie(t),r):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Ys(e,t,r,o))};function Ra(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Qs(t)&&q(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const s=e.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return Qs(t)&&se(n)?!1:t in e}const Zs=e=>{const t=e.props["onUpdate:modelValue"]||!1;return K(t)?n=>Sn(t,n):t};function Oa(e){e.target.composing=!0}function ei(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const dr=Symbol("_assign"),Kf={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e[dr]=Zs(s);const i=r||s.props&&s.props.type==="number";Et(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=Sr(l)),e[dr](l)}),n&&Et(e,"change",()=>{e.value=e.value.trim()}),t||(Et(e,"compositionstart",Oa),Et(e,"compositionend",ei),Et(e,"change",ei))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:s,number:i}},o){if(e[dr]=Zs(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?Sr(e.value):e.value,c=t??"";l!==c&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||s&&e.value.trim()===c)||(e.value=c))}},Ma=["ctrl","shift","alt","meta"],Pa={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Ma.some(n=>e[`${n}Key`]&&!t.includes(n))},qf=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(s,...i)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=s=>{if(!("key"in s))return;const i=st(s.key);if(t.some(o=>o===i||Ia[o]===i))return e(s)})},Oo=fe({patchProp:Aa},oa);let Wt,ti=!1;function La(){return Wt||(Wt=Lc(Oo))}function Na(){return Wt=ti?Wt:Nc(Oo),ti=!0,Wt}const Yf=(...e)=>{const t=La().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=Po(r);if(!s)return;const i=t._component;!q(i)&&!i.render&&!i.template&&(i.template=s.innerHTML),s.nodeType===1&&(s.textContent="");const o=n(s,!1,Mo(s));return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),o},t},Xf=(...e)=>{const t=Na().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=Po(r);if(s)return n(s,!0,Mo(s))},t};function Mo(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Po(e){return se(e)?document.querySelector(e):e}const Jf=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},Fa=window.__VP_SITE_DATA__;function is(e){return bi()?(fl(e),!0):!1}function ke(e){return typeof e=="function"?e():Fi(e)}const Io=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const zf=e=>e!=null,Ha=Object.prototype.toString,$a=e=>Ha.call(e)==="[object Object]",Qt=()=>{},ni=Da();function Da(){var e,t;return Io&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function ja(e,t){function n(...r){return new Promise((s,i)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(s).catch(i)})}return n}const Lo=e=>e();function Va(e,t={}){let n,r,s=Qt;const i=l=>{clearTimeout(l),s(),s=Qt};return l=>{const c=ke(e),f=ke(t.maxWait);return n&&i(n),c<=0||f!==void 0&&f<=0?(r&&(i(r),r=null),Promise.resolve(l())):new Promise((a,h)=>{s=t.rejectOnCancel?h:a,f&&!r&&(r=setTimeout(()=>{n&&i(n),r=null,a(l())},f)),n=setTimeout(()=>{r&&i(r),r=null,a(l())},c)})}}function Ua(e=Lo){const t=oe(!0);function n(){t.value=!1}function r(){t.value=!0}const s=(...i)=>{t.value&&e(...i)};return{isActive:kn(t),pause:n,resume:r,eventFilter:s}}function Ba(e){return Xn()}function No(...e){if(e.length!==1)return Vl(...e);const t=e[0];return typeof t=="function"?kn($l(()=>({get:t,set:Qt}))):oe(t)}function Fo(e,t,n={}){const{eventFilter:r=Lo,...s}=n;return Be(e,ja(r,t),s)}function ka(e,t,n={}){const{eventFilter:r,...s}=n,{eventFilter:i,pause:o,resume:l,isActive:c}=Ua(r);return{stop:Fo(e,t,{...s,eventFilter:i}),pause:o,resume:l,isActive:c}}function os(e,t=!0,n){Ba()?It(e,n):t?e():Wn(e)}function Qf(e,t,n={}){const{debounce:r=0,maxWait:s=void 0,...i}=n;return Fo(e,t,{...i,eventFilter:Va(r,{maxWait:s})})}function Zf(e,t,n){let r;ae(n)?r={evaluating:n}:r={};const{lazy:s=!1,evaluating:i=void 0,shallow:o=!0,onError:l=Qt}=r,c=oe(!s),f=o?Jr(t):oe(t);let a=0;return rs(async h=>{if(!c.value)return;a++;const g=a;let v=!1;i&&Promise.resolve().then(()=>{i.value=!0});try{const _=await e(S=>{h(()=>{i&&(i.value=!1),v||S()})});g===a&&(f.value=_)}catch(_){l(_)}finally{i&&g===a&&(i.value=!1),v=!0}}),s?ie(()=>(c.value=!0,f.value)):f}const He=Io?window:void 0;function Ho(e){var t;const n=ke(e);return(t=n==null?void 0:n.$el)!=null?t:n}function Pt(...e){let t,n,r,s;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,s]=e,t=He):[t,n,r,s]=e,!t)return Qt;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const i=[],o=()=>{i.forEach(a=>a()),i.length=0},l=(a,h,g,v)=>(a.addEventListener(h,g,v),()=>a.removeEventListener(h,g,v)),c=Be(()=>[Ho(t),ke(s)],([a,h])=>{if(o(),!a)return;const g=$a(h)?{...h}:h;i.push(...n.flatMap(v=>r.map(_=>l(a,v,_,g))))},{immediate:!0,flush:"post"}),f=()=>{c(),o()};return is(f),f}function Wa(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function eu(...e){let t,n,r={};e.length===3?(t=e[0],n=e[1],r=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],r=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:s=He,eventName:i="keydown",passive:o=!1,dedupe:l=!1}=r,c=Wa(t);return Pt(s,i,a=>{a.repeat&&ke(l)||c(a)&&n(a)},o)}function Ka(){const e=oe(!1),t=Xn();return t&&It(()=>{e.value=!0},t),e}function qa(e){const t=Ka();return ie(()=>(t.value,!!e()))}function $o(e,t={}){const{window:n=He}=t,r=qa(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const i=oe(!1),o=f=>{i.value=f.matches},l=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",o):s.removeListener(o))},c=rs(()=>{r.value&&(l(),s=n.matchMedia(ke(e)),"addEventListener"in s?s.addEventListener("change",o):s.addListener(o),i.value=s.matches)});return is(()=>{c(),l(),s=void 0}),i}const vn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},bn="__vueuse_ssr_handlers__",Ga=Ya();function Ya(){return bn in vn||(vn[bn]=vn[bn]||{}),vn[bn]}function Do(e,t){return Ga[e]||t}function jo(e){return $o("(prefers-color-scheme: dark)",e)}function Xa(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const Ja={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},ri="vueuse-storage";function ls(e,t,n,r={}){var s;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:f=!1,shallow:a,window:h=He,eventFilter:g,onError:v=b=>{console.error(b)},initOnMounted:_}=r,S=(a?Jr:oe)(typeof t=="function"?t():t);if(!n)try{n=Do("getDefaultStorage",()=>{var b;return(b=He)==null?void 0:b.localStorage})()}catch(b){v(b)}if(!n)return S;const U=ke(t),N=Xa(U),B=(s=r.serializer)!=null?s:Ja[N],{pause:p,resume:m}=ka(S,()=>F(S.value),{flush:i,deep:o,eventFilter:g});h&&l&&os(()=>{n instanceof Storage?Pt(h,"storage",j):Pt(h,ri,R),_&&j()}),_||j();function M(b,L){if(h){const x={key:e,oldValue:b,newValue:L,storageArea:n};h.dispatchEvent(n instanceof Storage?new StorageEvent("storage",x):new CustomEvent(ri,{detail:x}))}}function F(b){try{const L=n.getItem(e);if(b==null)M(L,null),n.removeItem(e);else{const x=B.write(b);L!==x&&(n.setItem(e,x),M(L,x))}}catch(L){v(L)}}function $(b){const L=b?b.newValue:n.getItem(e);if(L==null)return c&&U!=null&&n.setItem(e,B.write(U)),U;if(!b&&f){const x=B.read(L);return typeof f=="function"?f(x,U):N==="object"&&!Array.isArray(x)?{...U,...x}:x}else return typeof L!="string"?L:B.read(L)}function j(b){if(!(b&&b.storageArea!==n)){if(b&&b.key==null){S.value=U;return}if(!(b&&b.key!==e)){p();try{(b==null?void 0:b.newValue)!==B.write(S.value)&&(S.value=$(b))}catch(L){v(L)}finally{b?Wn(m):m()}}}}function R(b){j(b.detail)}return S}const za="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function Qa(e={}){const{selector:t="html",attribute:n="class",initialValue:r="auto",window:s=He,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:f,disableTransition:a=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},g=jo({window:s}),v=ie(()=>g.value?"dark":"light"),_=c||(o==null?No(r):ls(o,r,i,{window:s,listenToStorageChanges:l})),S=ie(()=>_.value==="auto"?v.value:_.value),U=Do("updateHTMLAttrs",(m,M,F)=>{const $=typeof m=="string"?s==null?void 0:s.document.querySelector(m):Ho(m);if(!$)return;const j=new Set,R=new Set;let b=null;if(M==="class"){const x=F.split(/\s/g);Object.values(h).flatMap(W=>(W||"").split(/\s/g)).filter(Boolean).forEach(W=>{x.includes(W)?j.add(W):R.add(W)})}else b={key:M,value:F};if(j.size===0&&R.size===0&&b===null)return;let L;a&&(L=s.document.createElement("style"),L.appendChild(document.createTextNode(za)),s.document.head.appendChild(L));for(const x of j)$.classList.add(x);for(const x of R)$.classList.remove(x);b&&$.setAttribute(b.key,b.value),a&&(s.getComputedStyle(L).opacity,document.head.removeChild(L))});function N(m){var M;U(t,n,(M=h[m])!=null?M:m)}function B(m){e.onChanged?e.onChanged(m,N):N(m)}Be(S,B,{flush:"post",immediate:!0}),os(()=>B(S.value));const p=ie({get(){return f?_.value:S.value},set(m){_.value=m}});try{return Object.assign(p,{store:_,system:v,state:S})}catch{return p}}function Za(e={}){const{valueDark:t="dark",valueLight:n="",window:r=He}=e,s=Qa({...e,onChanged:(l,c)=>{var f;e.onChanged?(f=e.onChanged)==null||f.call(e,l==="dark",c,l):c(l)},modes:{dark:t,light:n}}),i=ie(()=>s.system?s.system.value:jo({window:r}).value?"dark":"light");return ie({get(){return s.value==="dark"},set(l){const c=l?"dark":"light";i.value===c?s.value="auto":s.value=c}})}function hr(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function tu(e,t,n={}){const{window:r=He}=n;return ls(e,t,r==null?void 0:r.localStorage,n)}function Vo(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const pr=new WeakMap;function nu(e,t=!1){const n=oe(t);let r=null,s="";Be(No(e),l=>{const c=hr(ke(l));if(c){const f=c;if(pr.get(f)||pr.set(f,f.style.overflow),f.style.overflow!=="hidden"&&(s=f.style.overflow),f.style.overflow==="hidden")return n.value=!0;if(n.value)return f.style.overflow="hidden"}},{immediate:!0});const i=()=>{const l=hr(ke(e));!l||n.value||(ni&&(r=Pt(l,"touchmove",c=>{ef(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{const l=hr(ke(e));!l||!n.value||(ni&&(r==null||r()),l.style.overflow=s,pr.delete(l),n.value=!1)};return is(o),ie({get(){return n.value},set(l){l?i():o()}})}function ru(e,t,n={}){const{window:r=He}=n;return ls(e,t,r==null?void 0:r.sessionStorage,n)}function su(e={}){const{window:t=He,behavior:n="auto"}=e;if(!t)return{x:oe(0),y:oe(0)};const r=oe(t.scrollX),s=oe(t.scrollY),i=ie({get(){return r.value},set(l){scrollTo({left:l,behavior:n})}}),o=ie({get(){return s.value},set(l){scrollTo({top:l,behavior:n})}});return Pt(t,"scroll",()=>{r.value=t.scrollX,s.value=t.scrollY},{capture:!1,passive:!0}),{x:i,y:o}}function iu(e={}){const{window:t=He,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:r=Number.POSITIVE_INFINITY,listenOrientation:s=!0,includeScrollbar:i=!0,type:o="inner"}=e,l=oe(n),c=oe(r),f=()=>{t&&(o==="outer"?(l.value=t.outerWidth,c.value=t.outerHeight):i?(l.value=t.innerWidth,c.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,c.value=t.document.documentElement.clientHeight))};if(f(),os(f),Pt("resize",f,{passive:!0}),s){const a=$o("(orientation: portrait)");Be(a,()=>f())}return{width:l,height:c}}const gr={BASE_URL:"/",DEV:!1,MODE:"production",PROD:!0,SSR:!1};var mr={};const Uo=/^(?:[a-z]+:|\/\/)/i,tf="vitepress-theme-appearance",nf=/#.*$/,rf=/[?#].*$/,sf=/(?:(^|\/)index)?\.(?:md|html)$/,ge=typeof document<"u",Bo={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function of(e,t,n=!1){if(t===void 0)return!1;if(e=si(`/${e}`),n)return new RegExp(t).test(e);if(si(t)!==e)return!1;const r=t.match(nf);return r?(ge?location.hash:"")===r[0]:!0}function si(e){return decodeURI(e).replace(rf,"").replace(sf,"$1")}function lf(e){return Uo.test(e)}function cf(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!lf(n)&&of(t,`/${n}/`,!0))||"root"}function af(e,t){var r,s,i,o,l,c,f;const n=cf(e,t);return Object.assign({},e,{localeIndex:n,lang:((r=e.locales[n])==null?void 0:r.lang)??e.lang,dir:((s=e.locales[n])==null?void 0:s.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Wo(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(f=e.locales[n])==null?void 0:f.themeConfig}})}function ko(e,t){const n=t.title||e.title,r=t.titleTemplate??e.titleTemplate;if(typeof r=="string"&&r.includes(":title"))return r.replace(/:title/g,n);const s=ff(e.title,r);return n===s.slice(3)?n:`${n}${s}`}function ff(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function uf(e,t){const[n,r]=t;if(n!=="meta")return!1;const s=Object.entries(r)[0];return s==null?!1:e.some(([i,o])=>i===n&&o[s[0]]===s[1])}function Wo(e,t){return[...e.filter(n=>!uf(t,n)),...t]}const df=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,hf=/^[a-z]:/i;function ii(e){const t=hf.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(df,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const yr=new Set;function pf(e){if(yr.size===0){const n=typeof process=="object"&&(mr==null?void 0:mr.VITE_EXTRA_EXTENSIONS)||(gr==null?void 0:gr.VITE_EXTRA_EXTENSIONS)||"";("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(n&&typeof n=="string"?","+n:"")).split(",").forEach(r=>yr.add(r))}const t=e.split(".").pop();return t==null||!yr.has(t.toLowerCase())}function ou(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const gf=Symbol(),yt=Jr(Fa);function lu(e){const t=ie(()=>af(yt.value,e.data.relativePath)),n=t.value.appearance,r=n==="force-dark"?oe(!0):n?Za({storageKey:tf,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):oe(!1),s=oe(ge?location.hash:"");return ge&&window.addEventListener("hashchange",()=>{s.value=location.hash}),Be(()=>e.data,()=>{s.value=ge?location.hash:""}),{site:t,theme:ie(()=>t.value.themeConfig),page:ie(()=>e.data),frontmatter:ie(()=>e.data.frontmatter),params:ie(()=>e.data.params),lang:ie(()=>t.value.lang),dir:ie(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:ie(()=>t.value.localeIndex||"root"),title:ie(()=>ko(t.value,e.data)),description:ie(()=>e.data.description||t.value.description),isDark:r,hash:ie(()=>s.value)}}function mf(){const e=Mt(gf);if(!e)throw new Error("vitepress data not properly injected in app");return e}function yf(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function oi(e){return Uo.test(e)||!e.startsWith("/")?e:yf(yt.value.base,e)}function vf(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),ge){const n="/";t=ii(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let r=__VP_HASH_MAP__[t.toLowerCase()];if(r||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",r=__VP_HASH_MAP__[t.toLowerCase()]),!r)return null;t=`${n}assets/${t}.${r}.js`}else t=`./${ii(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let An=[];function cu(e){An.push(e),qn(()=>{An=An.filter(t=>t!==e)})}function bf(){let e=yt.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=li(e,n);else if(Array.isArray(e))for(const r of e){const s=li(r,n);if(s){t=s;break}}return t}function li(e,t){const n=document.querySelector(e);if(!n)return 0;const r=n.getBoundingClientRect().bottom;return r<0?0:r+t}const _f=Symbol(),Ko="http://a.com",wf=()=>({path:"/",component:null,data:Bo});function au(e,t){const n=Bn(wf()),r={route:n,go:s};async function s(l=ge?location.href:"/"){var c,f;l=vr(l),await((c=r.onBeforeRouteChange)==null?void 0:c.call(r,l))!==!1&&(ge&&l!==vr(location.href)&&(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",l)),await o(l),await((f=r.onAfterRouteChanged)==null?void 0:f.call(r,l)))}let i=null;async function o(l,c=0,f=!1){var g;if(await((g=r.onBeforePageLoad)==null?void 0:g.call(r,l))===!1)return;const a=new URL(l,Ko),h=i=a.pathname;try{let v=await e(h);if(!v)throw new Error(`Page not found: ${h}`);if(i===h){i=null;const{default:_,__pageData:S}=v;if(!_)throw new Error(`Invalid route component: ${_}`);n.path=ge?h:oi(h),n.component=En(_),n.data=En(S),ge&&Wn(()=>{let U=yt.value.base+S.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!yt.value.cleanUrls&&!U.endsWith("/")&&(U+=".html"),U!==a.pathname&&(a.pathname=U,l=U+a.search+a.hash,history.replaceState({},"",l)),a.hash&&!c){let N=null;try{N=document.getElementById(decodeURIComponent(a.hash).slice(1))}catch(B){console.warn(B)}if(N){ci(N,a.hash);return}}window.scrollTo(0,c)})}}catch(v){if(!/fetch|Page not found/.test(v.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(v),!f)try{const _=await fetch(yt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await _.json(),await o(l,c,!0);return}catch{}if(i===h){i=null,n.path=ge?h:oi(h),n.component=t?En(t):null;const _=ge?h.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...Bo,relativePath:_}}}}return ge&&(history.state===null&&history.replaceState({},""),window.addEventListener("click",l=>{if(l.defaultPrevented||!(l.target instanceof Element)||l.target.closest("button")||l.button!==0||l.ctrlKey||l.shiftKey||l.altKey||l.metaKey)return;const c=l.target.closest("a");if(!c||c.closest(".vp-raw")||c.hasAttribute("download")||c.hasAttribute("target"))return;const f=c.getAttribute("href")??(c instanceof SVGAElement?c.getAttribute("xlink:href"):null);if(f==null)return;const{href:a,origin:h,pathname:g,hash:v,search:_}=new URL(f,c.baseURI),S=new URL(location.href);h===S.origin&&pf(g)&&(l.preventDefault(),g===S.pathname&&_===S.search?(v!==S.hash&&(history.pushState({},"",a),window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:S.href,newURL:a}))),v?ci(c,v,c.classList.contains("header-anchor")):window.scrollTo(0,0)):s(a))},{capture:!0}),window.addEventListener("popstate",async l=>{var c;l.state!==null&&(await o(vr(location.href),l.state&&l.state.scrollPosition||0),(c=r.onAfterRouteChanged)==null||c.call(r,location.href))}),window.addEventListener("hashchange",l=>{l.preventDefault()})),r}function Sf(){const e=Mt(_f);if(!e)throw new Error("useRouter() is called without provider.");return e}function qo(){return Sf().route}function ci(e,t,n=!1){let r=null;try{r=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(s){console.warn(s)}if(r){let s=function(){!n||Math.abs(o-window.scrollY)>window.innerHeight?window.scrollTo(0,o):window.scrollTo({left:0,top:o,behavior:"smooth"})};const i=parseInt(window.getComputedStyle(r).paddingTop,10),o=window.scrollY+r.getBoundingClientRect().top-bf()+i;requestAnimationFrame(s)}}function vr(e){const t=new URL(e,Ko);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),yt.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const br=()=>An.forEach(e=>e()),fu=Qr({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=qo(),{site:n}=mf();return()=>Nr(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?Nr(t.component,{onVnodeMounted:br,onVnodeUpdated:br,onVnodeUnmounted:br}):"404 Page Not Found"])}}),Ef="modulepreload",xf=function(e){return"/"+e},ai={},uu=function(t,n,r){let s=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),l=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));s=Promise.allSettled(n.map(c=>{if(c=xf(c),c in ai)return;ai[c]=!0;const f=c.endsWith(".css"),a=f?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${a}`))return;const h=document.createElement("link");if(h.rel=f?"stylesheet":Ef,f||(h.as="script"),h.crossOrigin="",h.href=c,l&&h.setAttribute("nonce",l),document.head.appendChild(h),f)return new Promise((g,v)=>{h.addEventListener("load",g),h.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${c}`)))})}))}function i(o){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=o,window.dispatchEvent(l),!l.defaultPrevented)throw o}return s.then(o=>{for(const l of o||[])l.status==="rejected"&&i(l.reason);return t().catch(i)})},du=Qr({setup(e,{slots:t}){const n=oe(!1);return It(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function hu(){ge&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement;if(!r)return;const s=Array.from(r.querySelectorAll("input")).indexOf(t);if(s<0)return;const i=r.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(f=>f.classList.contains("active"));if(!o)return;const l=i.children[s];if(!l||o===l)return;o.classList.remove("active"),l.classList.add("active");const c=r==null?void 0:r.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function pu(){if(ge){const e=new WeakMap;window.addEventListener("click",t=>{var r;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const s=n.parentElement,i=(r=n.nextElementSibling)==null?void 0:r.nextElementSibling;if(!s||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(s.className),l=[".vp-copy-ignore",".diff.remove"],c=i.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(a=>a.remove());let f=c.textContent||"";o&&(f=f.replace(/^ *(\$|>) /gm,"").trim()),Tf(f).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const a=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,a)})}})}}async function Tf(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const r=document.getSelection(),s=r?r.rangeCount>0&&r.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),s&&(r.removeAllRanges(),r.addRange(s)),n&&n.focus()}}function gu(e,t){let n=!0,r=[];const s=i=>{if(n){n=!1,i.forEach(l=>{const c=_r(l);for(const f of document.head.children)if(f.isEqualNode(c)){r.push(f);return}});return}const o=i.map(_r);r.forEach((l,c)=>{const f=o.findIndex(a=>a==null?void 0:a.isEqualNode(l??null));f!==-1?delete o[f]:(l==null||l.remove(),delete r[c])}),o.forEach(l=>l&&document.head.appendChild(l)),r=[...r,...o].filter(Boolean)};rs(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[],f=ko(o,i);f!==document.title&&(document.title=f);const a=l||o.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==a&&h.setAttribute("content",a):_r(["meta",{name:"description",content:a}]),s(Wo(o.head,Af(c)))})}function _r([e,t,n]){const r=document.createElement(e);for(const s in t)r.setAttribute(s,t[s]);return n&&(r.innerHTML=n),e==="script"&&!t.async&&(r.async=!1),r}function Cf(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Af(e){return e.filter(t=>!Cf(t))}const wr=new Set,Go=()=>document.createElement("link"),Rf=e=>{const t=Go();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Of=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let _n;const Mf=ge&&(_n=Go())&&_n.relList&&_n.relList.supports&&_n.relList.supports("prefetch")?Rf:Of;function mu(){if(!ge||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const r=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!wr.has(c)){wr.add(c);const f=vf(c);f&&Mf(f)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:o,pathname:l}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&o===location.hostname&&(l!==location.pathname?n.observe(i):wr.add(l))})})};It(r);const s=qo();Be(()=>s.path,r),qn(()=>{n&&n.disconnect()})}export{Ji as $,bf as A,Nf as B,Hf as C,Jr as D,cu as E,Se as F,le as G,Ff as H,Uo as I,qo as J,Yc as K,Mt as L,iu as M,Vr as N,eu as O,Wn as P,su as Q,ge as R,kn as S,Wf as T,Lf as U,uu as V,nu as W,Cc as X,Gf as Y,Df as Z,Jf as _,Eo as a,qf as a0,jf as a1,Bf as a2,gu as a3,_f as a4,lu as a5,gf as a6,fu as a7,du as a8,yt as a9,Xf as aa,au as ab,vf as ac,mu as ad,pu as ae,hu as af,Nr as ag,ke as ah,Ho as ai,zf as aj,is as ak,Zf as al,ru as am,tu as an,Qf as ao,Sf as ap,Pt as aq,Pf as ar,Kf as as,ae as at,If as au,En as av,Yf as aw,ou as ax,Ir as b,Uf as c,Qr as d,kf as e,pf as f,oi as g,ie as h,lf as i,So as j,Fi as k,of as l,$o as m,Ur as n,Pr as o,oe as p,Be as q,$f as r,rs as s,cl as t,mf as u,It as v,Xl as w,qn as x,Vf as y,dc as z}; diff --git a/assets/chunks/theme.BQKOjM6g.js b/assets/chunks/theme.BQKOjM6g.js new file mode 100644 index 00000000..c1f94356 --- /dev/null +++ b/assets/chunks/theme.BQKOjM6g.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.DzFCX21k.js","assets/chunks/framework.C9NVOr0y.js"])))=>i.map(i=>d[i]); +import{d as m,o as a,c as u,r as c,n as I,a as D,t as N,b as k,w as v,e as h,T as ue,_ as g,u as Be,i as Ce,f as He,g as de,h as y,j as p,k as r,l as z,m as ae,p as M,q as O,s as Y,v as K,x as ve,y as pe,z as Ee,A as Fe,B as q,F as w,C,D as $e,E as Q,G as _,H as E,I as ye,J as Z,K as j,L as x,M as De,N as Pe,O as re,P as Oe,Q as Ve,R as ee,S as Ge,U as Ue,V as je,W as Le,X as Se,Y as ze,Z as Ke,$ as qe,a0 as We,a1 as Re}from"./framework.C9NVOr0y.js";const Je=m({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(s){return(e,t)=>(a(),u("span",{class:I(["VPBadge",e.type])},[c(e.$slots,"default",{},()=>[D(N(e.text),1)])],2))}}),Xe={key:0,class:"VPBackdrop"},Ye=m({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(s){return(e,t)=>(a(),k(ue,{name:"fade"},{default:v(()=>[e.show?(a(),u("div",Xe)):h("",!0)]),_:1}))}}),Qe=g(Ye,[["__scopeId","data-v-54a304ca"]]),V=Be;function Ze(s,e){let t,o=!1;return()=>{t&&clearTimeout(t),o?t=setTimeout(s,e):(s(),(o=!0)&&setTimeout(()=>o=!1,e))}}function ie(s){return/^\//.test(s)?s:`/${s}`}function fe(s){const{pathname:e,search:t,hash:o,protocol:n}=new URL(s,"http://a.com");if(Ce(s)||s.startsWith("#")||!n.startsWith("http")||!He(e))return s;const{site:i}=V(),l=e.endsWith("/")||e.endsWith(".html")?s:s.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,i.value.cleanUrls?"":".html")}${t}${o}`);return de(l)}function R({correspondingLink:s=!1}={}){const{site:e,localeIndex:t,page:o,theme:n,hash:i}=V(),l=y(()=>{var d,$;return{label:(d=e.value.locales[t.value])==null?void 0:d.label,link:(($=e.value.locales[t.value])==null?void 0:$.link)||(t.value==="root"?"/":`/${t.value}/`)}});return{localeLinks:y(()=>Object.entries(e.value.locales).flatMap(([d,$])=>l.value.label===$.label?[]:{text:$.label,link:xe($.link||(d==="root"?"/":`/${d}/`),n.value.i18nRouting!==!1&&s,o.value.relativePath.slice(l.value.link.length-1),!e.value.cleanUrls)+i.value})),currentLang:l}}function xe(s,e,t,o){return e?s.replace(/\/$/,"")+ie(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,o?".html":"")):s}const et={class:"NotFound"},tt={class:"code"},nt={class:"title"},ot={class:"quote"},st={class:"action"},at=["href","aria-label"],rt=m({__name:"NotFound",setup(s){const{theme:e}=V(),{currentLang:t}=R();return(o,n)=>{var i,l,f,d,$;return a(),u("div",et,[p("p",tt,N(((i=r(e).notFound)==null?void 0:i.code)??"404"),1),p("h1",nt,N(((l=r(e).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),n[0]||(n[0]=p("div",{class:"divider"},null,-1)),p("blockquote",ot,N(((f=r(e).notFound)==null?void 0:f.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),p("div",st,[p("a",{class:"link",href:r(de)(r(t).link),"aria-label":((d=r(e).notFound)==null?void 0:d.linkLabel)??"go to home"},N((($=r(e).notFound)==null?void 0:$.linkText)??"Take me home"),9,at)])])}}}),it=g(rt,[["__scopeId","data-v-6ff51ddd"]]);function Te(s,e){if(Array.isArray(s))return J(s);if(s==null)return[];e=ie(e);const t=Object.keys(s).sort((n,i)=>i.split("/").length-n.split("/").length).find(n=>e.startsWith(ie(n))),o=t?s[t]:[];return Array.isArray(o)?J(o):J(o.items,o.base)}function lt(s){const e=[];let t=0;for(const o in s){const n=s[o];if(n.items){t=e.push(n);continue}e[t]||e.push({items:[]}),e[t].items.push(n)}return e}function ct(s){const e=[];function t(o){for(const n of o)n.text&&n.link&&e.push({text:n.text,link:n.link,docFooterText:n.docFooterText}),n.items&&t(n.items)}return t(s),e}function le(s,e){return Array.isArray(e)?e.some(t=>le(s,t)):z(s,e.link)?!0:e.items?le(s,e.items):!1}function J(s,e){return[...s].map(t=>{const o={...t},n=o.base||e;return n&&o.link&&(o.link=n+o.link),o.items&&(o.items=J(o.items,n)),o})}function G(){const{frontmatter:s,page:e,theme:t}=V(),o=ae("(min-width: 960px)"),n=M(!1),i=y(()=>{const B=t.value.sidebar,S=e.value.relativePath;return B?Te(B,S):[]}),l=M(i.value);O(i,(B,S)=>{JSON.stringify(B)!==JSON.stringify(S)&&(l.value=i.value)});const f=y(()=>s.value.sidebar!==!1&&l.value.length>0&&s.value.layout!=="home"),d=y(()=>$?s.value.aside==null?t.value.aside==="left":s.value.aside==="left":!1),$=y(()=>s.value.layout==="home"?!1:s.value.aside!=null?!!s.value.aside:t.value.aside!==!1),L=y(()=>f.value&&o.value),b=y(()=>f.value?lt(l.value):[]);function P(){n.value=!0}function T(){n.value=!1}function A(){n.value?T():P()}return{isOpen:n,sidebar:l,sidebarGroups:b,hasSidebar:f,hasAside:$,leftAside:d,isSidebarEnabled:L,open:P,close:T,toggle:A}}function ut(s,e){let t;Y(()=>{t=s.value?document.activeElement:void 0}),K(()=>{window.addEventListener("keyup",o)}),ve(()=>{window.removeEventListener("keyup",o)});function o(n){n.key==="Escape"&&s.value&&(e(),t==null||t.focus())}}function dt(s){const{page:e,hash:t}=V(),o=M(!1),n=y(()=>s.value.collapsed!=null),i=y(()=>!!s.value.link),l=M(!1),f=()=>{l.value=z(e.value.relativePath,s.value.link)};O([e,s,t],f),K(f);const d=y(()=>l.value?!0:s.value.items?le(e.value.relativePath,s.value.items):!1),$=y(()=>!!(s.value.items&&s.value.items.length));Y(()=>{o.value=!!(n.value&&s.value.collapsed)}),pe(()=>{(l.value||d.value)&&(o.value=!1)});function L(){n.value&&(o.value=!o.value)}return{collapsed:o,collapsible:n,isLink:i,isActiveLink:l,hasActiveLink:d,hasChildren:$,toggle:L}}function vt(){const{hasSidebar:s}=G(),e=ae("(min-width: 960px)"),t=ae("(min-width: 1280px)");return{isAsideEnabled:y(()=>!t.value&&!e.value?!1:s.value?t.value:e.value)}}const ce=[];function Ne(s){return typeof s.outline=="object"&&!Array.isArray(s.outline)&&s.outline.label||s.outlineTitle||"On this page"}function he(s){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const o=Number(t.tagName[1]);return{element:t,title:pt(t),link:"#"+t.id,level:o}});return ft(e,s)}function pt(s){let e="";for(const t of s.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor")||t.classList.contains("ignore-header"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function ft(s,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[o,n]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;s=s.filter(l=>l.level>=o&&l.level<=n),ce.length=0;for(const{element:l,link:f}of s)ce.push({element:l,link:f});const i=[];e:for(let l=0;l=0;d--){const $=s[d];if($.level{requestAnimationFrame(i),window.addEventListener("scroll",o)}),Ee(()=>{l(location.hash)}),ve(()=>{window.removeEventListener("scroll",o)});function i(){if(!t.value)return;const f=window.scrollY,d=window.innerHeight,$=document.body.offsetHeight,L=Math.abs(f+d-$)<1,b=ce.map(({element:T,link:A})=>({link:A,top:mt(T)})).filter(({top:T})=>!Number.isNaN(T)).sort((T,A)=>T.top-A.top);if(!b.length){l(null);return}if(f<1){l(null);return}if(L){l(b[b.length-1].link);return}let P=null;for(const{link:T,top:A}of b){if(A>f+Fe()+4)break;P=T}l(P)}function l(f){n&&n.classList.remove("active"),f==null?n=null:n=s.value.querySelector(`a[href="${decodeURIComponent(f)}"]`);const d=n;d?(d.classList.add("active"),e.value.style.top=d.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function mt(s){let e=0;for(;s!==document.body;){if(s===null)return NaN;e+=s.offsetTop,s=s.offsetParent}return e}const _t=["href","title"],kt=m({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(s){function e({target:t}){const o=t.href.split("#")[1],n=document.getElementById(decodeURIComponent(o));n==null||n.focus({preventScroll:!0})}return(t,o)=>{const n=q("VPDocOutlineItem",!0);return a(),u("ul",{class:I(["VPDocOutlineItem",t.root?"root":"nested"])},[(a(!0),u(w,null,C(t.headers,({children:i,link:l,title:f})=>(a(),u("li",null,[p("a",{class:"outline-link",href:l,onClick:e,title:f},N(f),9,_t),i!=null&&i.length?(a(),k(n,{key:0,headers:i},null,8,["headers"])):h("",!0)]))),256))],2)}}}),Me=g(kt,[["__scopeId","data-v-53c99d69"]]),bt={class:"content"},gt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},$t=m({__name:"VPDocAsideOutline",setup(s){const{frontmatter:e,theme:t}=V(),o=$e([]);Q(()=>{o.value=he(e.value.outline??t.value.outline)});const n=M(),i=M();return ht(n,i),(l,f)=>(a(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:I(["VPDocAsideOutline",{"has-outline":o.value.length>0}]),ref_key:"container",ref:n},[p("div",bt,[p("div",{class:"outline-marker",ref_key:"marker",ref:i},null,512),p("div",gt,N(r(Ne)(r(t))),1),_(Me,{headers:o.value,root:!0},null,8,["headers"])])],2))}}),yt=g($t,[["__scopeId","data-v-f610f197"]]),Pt={class:"VPDocAsideCarbonAds"},Vt=m({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(s){const e=()=>null;return(t,o)=>(a(),u("div",Pt,[_(r(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),Lt={class:"VPDocAside"},St=m({__name:"VPDocAside",setup(s){const{theme:e}=V();return(t,o)=>(a(),u("div",Lt,[c(t.$slots,"aside-top",{},void 0,!0),c(t.$slots,"aside-outline-before",{},void 0,!0),_(yt),c(t.$slots,"aside-outline-after",{},void 0,!0),o[0]||(o[0]=p("div",{class:"spacer"},null,-1)),c(t.$slots,"aside-ads-before",{},void 0,!0),r(e).carbonAds?(a(),k(Vt,{key:0,"carbon-ads":r(e).carbonAds},null,8,["carbon-ads"])):h("",!0),c(t.$slots,"aside-ads-after",{},void 0,!0),c(t.$slots,"aside-bottom",{},void 0,!0)]))}}),Tt=g(St,[["__scopeId","data-v-cb998dce"]]);function Nt(){const{theme:s,page:e}=V();return y(()=>{const{text:t="Edit this page",pattern:o=""}=s.value.editLink||{};let n;return typeof o=="function"?n=o(e.value):n=o.replace(/:path/g,e.value.filePath),{url:n,text:t}})}function Mt(){const{page:s,theme:e,frontmatter:t}=V();return y(()=>{var $,L,b,P,T,A,B,S;const o=Te(e.value.sidebar,s.value.relativePath),n=ct(o),i=It(n,H=>H.link.replace(/[?#].*$/,"")),l=i.findIndex(H=>z(s.value.relativePath,H.link)),f=(($=e.value.docFooter)==null?void 0:$.prev)===!1&&!t.value.prev||t.value.prev===!1,d=((L=e.value.docFooter)==null?void 0:L.next)===!1&&!t.value.next||t.value.next===!1;return{prev:f?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((b=i[l-1])==null?void 0:b.docFooterText)??((P=i[l-1])==null?void 0:P.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((T=i[l-1])==null?void 0:T.link)},next:d?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((A=i[l+1])==null?void 0:A.docFooterText)??((B=i[l+1])==null?void 0:B.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((S=i[l+1])==null?void 0:S.link)}}})}function It(s,e){const t=new Set;return s.filter(o=>{const n=e(o);return t.has(n)?!1:t.add(n)})}const F=m({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(s){const e=s,t=y(()=>e.tag??(e.href?"a":"span")),o=y(()=>e.href&&ye.test(e.href)||e.target==="_blank");return(n,i)=>(a(),k(E(t.value),{class:I(["VPLink",{link:n.href,"vp-external-link-icon":o.value,"no-icon":n.noIcon}]),href:n.href?r(fe)(n.href):void 0,target:n.target??(o.value?"_blank":void 0),rel:n.rel??(o.value?"noreferrer":void 0)},{default:v(()=>[c(n.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),wt={class:"VPLastUpdated"},At=["datetime"],Bt=m({__name:"VPDocFooterLastUpdated",setup(s){const{theme:e,page:t,lang:o}=V(),n=y(()=>new Date(t.value.lastUpdated)),i=y(()=>n.value.toISOString()),l=M("");return K(()=>{Y(()=>{var f,d,$;l.value=new Intl.DateTimeFormat((d=(f=e.value.lastUpdated)==null?void 0:f.formatOptions)!=null&&d.forceLocale?o.value:void 0,(($=e.value.lastUpdated)==null?void 0:$.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(n.value)})}),(f,d)=>{var $;return a(),u("p",wt,[D(N((($=r(e).lastUpdated)==null?void 0:$.text)||r(e).lastUpdatedText||"Last updated")+": ",1),p("time",{datetime:i.value},N(l.value),9,At)])}}}),Ct=g(Bt,[["__scopeId","data-v-1bb0c8a8"]]),Ht={key:0,class:"VPDocFooter"},Et={key:0,class:"edit-info"},Ft={key:0,class:"edit-link"},Dt={key:1,class:"last-updated"},Ot={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Gt={class:"pager"},Ut=["innerHTML"],jt=["innerHTML"],zt={class:"pager"},Kt=["innerHTML"],qt=["innerHTML"],Wt=m({__name:"VPDocFooter",setup(s){const{theme:e,page:t,frontmatter:o}=V(),n=Nt(),i=Mt(),l=y(()=>e.value.editLink&&o.value.editLink!==!1),f=y(()=>t.value.lastUpdated),d=y(()=>l.value||f.value||i.value.prev||i.value.next);return($,L)=>{var b,P,T,A;return d.value?(a(),u("footer",Ht,[c($.$slots,"doc-footer-before",{},void 0,!0),l.value||f.value?(a(),u("div",Et,[l.value?(a(),u("div",Ft,[_(F,{class:"edit-link-button",href:r(n).url,"no-icon":!0},{default:v(()=>[L[0]||(L[0]=p("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),D(" "+N(r(n).text),1)]),_:1},8,["href"])])):h("",!0),f.value?(a(),u("div",Dt,[_(Ct)])):h("",!0)])):h("",!0),(b=r(i).prev)!=null&&b.link||(P=r(i).next)!=null&&P.link?(a(),u("nav",Ot,[L[1]||(L[1]=p("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),p("div",Gt,[(T=r(i).prev)!=null&&T.link?(a(),k(F,{key:0,class:"pager-link prev",href:r(i).prev.link},{default:v(()=>{var B;return[p("span",{class:"desc",innerHTML:((B=r(e).docFooter)==null?void 0:B.prev)||"Previous page"},null,8,Ut),p("span",{class:"title",innerHTML:r(i).prev.text},null,8,jt)]}),_:1},8,["href"])):h("",!0)]),p("div",zt,[(A=r(i).next)!=null&&A.link?(a(),k(F,{key:0,class:"pager-link next",href:r(i).next.link},{default:v(()=>{var B;return[p("span",{class:"desc",innerHTML:((B=r(e).docFooter)==null?void 0:B.next)||"Next page"},null,8,Kt),p("span",{class:"title",innerHTML:r(i).next.text},null,8,qt)]}),_:1},8,["href"])):h("",!0)])])):h("",!0)])):h("",!0)}}}),Rt=g(Wt,[["__scopeId","data-v-1bcd8184"]]),Jt={class:"container"},Xt={class:"aside-container"},Yt={class:"aside-content"},Qt={class:"content"},Zt={class:"content-container"},xt={class:"main"},en=m({__name:"VPDoc",setup(s){const{theme:e}=V(),t=Z(),{hasSidebar:o,hasAside:n,leftAside:i}=G(),l=y(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(f,d)=>{const $=q("Content");return a(),u("div",{class:I(["VPDoc",{"has-sidebar":r(o),"has-aside":r(n)}])},[c(f.$slots,"doc-top",{},void 0,!0),p("div",Jt,[r(n)?(a(),u("div",{key:0,class:I(["aside",{"left-aside":r(i)}])},[d[0]||(d[0]=p("div",{class:"aside-curtain"},null,-1)),p("div",Xt,[p("div",Yt,[_(Tt,null,{"aside-top":v(()=>[c(f.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[c(f.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[c(f.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[c(f.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[c(f.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[c(f.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):h("",!0),p("div",Qt,[p("div",Zt,[c(f.$slots,"doc-before",{},void 0,!0),p("main",xt,[_($,{class:I(["vp-doc",[l.value,r(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),_(Rt,null,{"doc-footer-before":v(()=>[c(f.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(f.$slots,"doc-after",{},void 0,!0)])])]),c(f.$slots,"doc-bottom",{},void 0,!0)],2)}}}),tn=g(en,[["__scopeId","data-v-e6f2a212"]]),nn=m({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(s){const e=s,t=y(()=>e.href&&ye.test(e.href)),o=y(()=>e.tag||e.href?"a":"button");return(n,i)=>(a(),k(E(o.value),{class:I(["VPButton",[n.size,n.theme]]),href:n.href?r(fe)(n.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:v(()=>[D(N(n.text),1)]),_:1},8,["class","href","target","rel"]))}}),on=g(nn,[["__scopeId","data-v-c9cf0e3c"]]),sn=["src","alt"],an=m({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(s){return(e,t)=>{const o=q("VPImage",!0);return e.image?(a(),u(w,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),u("img",j({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:r(de)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,sn)):(a(),u(w,{key:1},[_(o,j({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),_(o,j({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):h("",!0)}}}),X=g(an,[["__scopeId","data-v-ab19afbb"]]),rn={class:"container"},ln={class:"main"},cn={key:0,class:"name"},un=["innerHTML"],dn=["innerHTML"],vn=["innerHTML"],pn={key:0,class:"actions"},fn={key:0,class:"image"},hn={class:"image-container"},mn=m({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(s){const e=x("hero-image-slot-exists");return(t,o)=>(a(),u("div",{class:I(["VPHero",{"has-image":t.image||r(e)}])},[p("div",rn,[p("div",ln,[c(t.$slots,"home-hero-info-before",{},void 0,!0),c(t.$slots,"home-hero-info",{},()=>[t.name?(a(),u("h1",cn,[p("span",{innerHTML:t.name,class:"clip"},null,8,un)])):h("",!0),t.text?(a(),u("p",{key:1,innerHTML:t.text,class:"text"},null,8,dn)):h("",!0),t.tagline?(a(),u("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,vn)):h("",!0)],!0),c(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(a(),u("div",pn,[(a(!0),u(w,null,C(t.actions,n=>(a(),u("div",{key:n.link,class:"action"},[_(on,{tag:"a",size:"medium",theme:n.theme,text:n.text,href:n.link,target:n.target,rel:n.rel},null,8,["theme","text","href","target","rel"])]))),128))])):h("",!0),c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||r(e)?(a(),u("div",fn,[p("div",hn,[o[0]||(o[0]=p("div",{class:"image-bg"},null,-1)),c(t.$slots,"home-hero-image",{},()=>[t.image?(a(),k(X,{key:0,class:"image-src",image:t.image},null,8,["image"])):h("",!0)],!0)])])):h("",!0)])],2))}}),_n=g(mn,[["__scopeId","data-v-b10c5094"]]),kn=m({__name:"VPHomeHero",setup(s){const{frontmatter:e}=V();return(t,o)=>r(e).hero?(a(),k(_n,{key:0,class:"VPHomeHero",name:r(e).hero.name,text:r(e).hero.text,tagline:r(e).hero.tagline,image:r(e).hero.image,actions:r(e).hero.actions},{"home-hero-info-before":v(()=>[c(t.$slots,"home-hero-info-before")]),"home-hero-info":v(()=>[c(t.$slots,"home-hero-info")]),"home-hero-info-after":v(()=>[c(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":v(()=>[c(t.$slots,"home-hero-actions-after")]),"home-hero-image":v(()=>[c(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):h("",!0)}}),bn={class:"box"},gn={key:0,class:"icon"},$n=["innerHTML"],yn=["innerHTML"],Pn=["innerHTML"],Vn={key:4,class:"link-text"},Ln={class:"link-text-value"},Sn=m({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(s){return(e,t)=>(a(),k(F,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:v(()=>[p("article",bn,[typeof e.icon=="object"&&e.icon.wrap?(a(),u("div",gn,[_(X,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),k(X,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,$n)):h("",!0),p("h2",{class:"title",innerHTML:e.title},null,8,yn),e.details?(a(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,Pn)):h("",!0),e.linkText?(a(),u("div",Vn,[p("p",Ln,[D(N(e.linkText)+" ",1),t[0]||(t[0]=p("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):h("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Tn=g(Sn,[["__scopeId","data-v-bd37d1a2"]]),Nn={key:0,class:"VPFeatures"},Mn={class:"container"},In={class:"items"},wn=m({__name:"VPFeatures",props:{features:{}},setup(s){const e=s,t=y(()=>{const o=e.features.length;if(o){if(o===2)return"grid-2";if(o===3)return"grid-3";if(o%3===0)return"grid-6";if(o>3)return"grid-4"}else return});return(o,n)=>o.features?(a(),u("div",Nn,[p("div",Mn,[p("div",In,[(a(!0),u(w,null,C(o.features,i=>(a(),u("div",{key:i.title,class:I(["item",[t.value]])},[_(Tn,{icon:i.icon,title:i.title,details:i.details,link:i.link,"link-text":i.linkText,rel:i.rel,target:i.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):h("",!0)}}),An=g(wn,[["__scopeId","data-v-b1eea84a"]]),Bn=m({__name:"VPHomeFeatures",setup(s){const{frontmatter:e}=V();return(t,o)=>r(e).features?(a(),k(An,{key:0,class:"VPHomeFeatures",features:r(e).features},null,8,["features"])):h("",!0)}}),Cn=m({__name:"VPHomeContent",setup(s){const{width:e}=De({initialWidth:0,includeScrollbar:!1});return(t,o)=>(a(),u("div",{class:"vp-doc container",style:Pe(r(e)?{"--vp-offset":`calc(50% - ${r(e)/2}px)`}:{})},[c(t.$slots,"default",{},void 0,!0)],4))}}),Hn=g(Cn,[["__scopeId","data-v-c141a4bd"]]),En={class:"VPHome"},Fn=m({__name:"VPHome",setup(s){const{frontmatter:e}=V();return(t,o)=>{const n=q("Content");return a(),u("div",En,[c(t.$slots,"home-hero-before",{},void 0,!0),_(kn,null,{"home-hero-info-before":v(()=>[c(t.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[c(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[c(t.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":v(()=>[c(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(t.$slots,"home-hero-after",{},void 0,!0),c(t.$slots,"home-features-before",{},void 0,!0),_(Bn),c(t.$slots,"home-features-after",{},void 0,!0),r(e).markdownStyles!==!1?(a(),k(Hn,{key:0},{default:v(()=>[_(n)]),_:1})):(a(),k(n,{key:1}))])}}}),Dn=g(Fn,[["__scopeId","data-v-07b1ad08"]]),On={},Gn={class:"VPPage"};function Un(s,e){const t=q("Content");return a(),u("div",Gn,[c(s.$slots,"page-top"),_(t),c(s.$slots,"page-bottom")])}const jn=g(On,[["render",Un]]),zn=m({__name:"VPContent",setup(s){const{page:e,frontmatter:t}=V(),{hasSidebar:o}=G();return(n,i)=>(a(),u("div",{class:I(["VPContent",{"has-sidebar":r(o),"is-home":r(t).layout==="home"}]),id:"VPContent"},[r(e).isNotFound?c(n.$slots,"not-found",{key:0},()=>[_(it)],!0):r(t).layout==="page"?(a(),k(jn,{key:1},{"page-top":v(()=>[c(n.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[c(n.$slots,"page-bottom",{},void 0,!0)]),_:3})):r(t).layout==="home"?(a(),k(Dn,{key:2},{"home-hero-before":v(()=>[c(n.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":v(()=>[c(n.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[c(n.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[c(n.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":v(()=>[c(n.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[c(n.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[c(n.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[c(n.$slots,"home-features-after",{},void 0,!0)]),_:3})):r(t).layout&&r(t).layout!=="doc"?(a(),k(E(r(t).layout),{key:3})):(a(),k(tn,{key:4},{"doc-top":v(()=>[c(n.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[c(n.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[c(n.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[c(n.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[c(n.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[c(n.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[c(n.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[c(n.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[c(n.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[c(n.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[c(n.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),Kn=g(zn,[["__scopeId","data-v-9a6c75ad"]]),qn={class:"container"},Wn=["innerHTML"],Rn=["innerHTML"],Jn=m({__name:"VPFooter",setup(s){const{theme:e,frontmatter:t}=V(),{hasSidebar:o}=G();return(n,i)=>r(e).footer&&r(t).footer!==!1?(a(),u("footer",{key:0,class:I(["VPFooter",{"has-sidebar":r(o)}])},[p("div",qn,[r(e).footer.message?(a(),u("p",{key:0,class:"message",innerHTML:r(e).footer.message},null,8,Wn)):h("",!0),r(e).footer.copyright?(a(),u("p",{key:1,class:"copyright",innerHTML:r(e).footer.copyright},null,8,Rn)):h("",!0)])],2)):h("",!0)}}),Xn=g(Jn,[["__scopeId","data-v-566314d4"]]);function Yn(){const{theme:s,frontmatter:e}=V(),t=$e([]),o=y(()=>t.value.length>0);return Q(()=>{t.value=he(e.value.outline??s.value.outline)}),{headers:t,hasLocalNav:o}}const Qn={class:"menu-text"},Zn={class:"header"},xn={class:"outline"},eo=m({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(s){const e=s,{theme:t}=V(),o=M(!1),n=M(0),i=M(),l=M();function f(b){var P;(P=i.value)!=null&&P.contains(b.target)||(o.value=!1)}O(o,b=>{if(b){document.addEventListener("click",f);return}document.removeEventListener("click",f)}),re("Escape",()=>{o.value=!1}),Q(()=>{o.value=!1});function d(){o.value=!o.value,n.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function $(b){b.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Oe(()=>{o.value=!1}))}function L(){o.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,P)=>(a(),u("div",{class:"VPLocalNavOutlineDropdown",style:Pe({"--vp-vh":n.value+"px"}),ref_key:"main",ref:i},[b.headers.length>0?(a(),u("button",{key:0,onClick:d,class:I({open:o.value})},[p("span",Qn,N(r(Ne)(r(t))),1),P[0]||(P[0]=p("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(a(),u("button",{key:1,onClick:L},N(r(t).returnToTopLabel||"Return to top"),1)),_(ue,{name:"flyout"},{default:v(()=>[o.value?(a(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:$},[p("div",Zn,[p("a",{class:"top-link",href:"#",onClick:L},N(r(t).returnToTopLabel||"Return to top"),1)]),p("div",xn,[_(Me,{headers:b.headers},null,8,["headers"])])],512)):h("",!0)]),_:1})],4))}}),to=g(eo,[["__scopeId","data-v-883964e0"]]),no={class:"container"},oo=["aria-expanded"],so={class:"menu-text"},ao=m({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(s){const{theme:e,frontmatter:t}=V(),{hasSidebar:o}=G(),{headers:n}=Yn(),{y:i}=Ve(),l=M(0);K(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Q(()=>{n.value=he(t.value.outline??e.value.outline)});const f=y(()=>n.value.length===0),d=y(()=>f.value&&!o.value),$=y(()=>({VPLocalNav:!0,"has-sidebar":o.value,empty:f.value,fixed:d.value}));return(L,b)=>r(t).layout!=="home"&&(!d.value||r(i)>=l.value)?(a(),u("div",{key:0,class:I($.value)},[p("div",no,[r(o)?(a(),u("button",{key:0,class:"menu","aria-expanded":L.open,"aria-controls":"VPSidebarNav",onClick:b[0]||(b[0]=P=>L.$emit("open-menu"))},[b[1]||(b[1]=p("span",{class:"vpi-align-left menu-icon"},null,-1)),p("span",so,N(r(e).sidebarMenuLabel||"Menu"),1)],8,oo)):h("",!0),_(to,{headers:r(n),navHeight:l.value},null,8,["headers","navHeight"])])],2)):h("",!0)}}),ro=g(ao,[["__scopeId","data-v-2488c25a"]]);function io(){const s=M(!1);function e(){s.value=!0,window.addEventListener("resize",n)}function t(){s.value=!1,window.removeEventListener("resize",n)}function o(){s.value?t():e()}function n(){window.outerWidth>=768&&t()}const i=Z();return O(()=>i.path,t),{isScreenOpen:s,openScreen:e,closeScreen:t,toggleScreen:o}}const lo={},co={class:"VPSwitch",type:"button",role:"switch"},uo={class:"check"},vo={key:0,class:"icon"};function po(s,e){return a(),u("button",co,[p("span",uo,[s.$slots.default?(a(),u("span",vo,[c(s.$slots,"default",{},void 0,!0)])):h("",!0)])])}const fo=g(lo,[["render",po],["__scopeId","data-v-b4ccac88"]]),ho=m({__name:"VPSwitchAppearance",setup(s){const{isDark:e,theme:t}=V(),o=x("toggle-appearance",()=>{e.value=!e.value}),n=M("");return pe(()=>{n.value=e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme"}),(i,l)=>(a(),k(fo,{title:n.value,class:"VPSwitchAppearance","aria-checked":r(e),onClick:r(o)},{default:v(()=>l[0]||(l[0]=[p("span",{class:"vpi-sun sun"},null,-1),p("span",{class:"vpi-moon moon"},null,-1)])),_:1},8,["title","aria-checked","onClick"]))}}),me=g(ho,[["__scopeId","data-v-be9742d9"]]),mo={key:0,class:"VPNavBarAppearance"},_o=m({__name:"VPNavBarAppearance",setup(s){const{site:e}=V();return(t,o)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",mo,[_(me)])):h("",!0)}}),ko=g(_o,[["__scopeId","data-v-3f90c1a5"]]),_e=M();let Ie=!1,se=0;function bo(s){const e=M(!1);if(ee){!Ie&&go(),se++;const t=O(_e,o=>{var n,i,l;o===s.el.value||(n=s.el.value)!=null&&n.contains(o)?(e.value=!0,(i=s.onFocus)==null||i.call(s)):(e.value=!1,(l=s.onBlur)==null||l.call(s))});ve(()=>{t(),se--,se||$o()})}return Ge(e)}function go(){document.addEventListener("focusin",we),Ie=!0,_e.value=document.activeElement}function $o(){document.removeEventListener("focusin",we)}function we(){_e.value=document.activeElement}const yo={class:"VPMenuLink"},Po=m({__name:"VPMenuLink",props:{item:{}},setup(s){const{page:e}=V();return(t,o)=>(a(),u("div",yo,[_(F,{class:I({active:r(z)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:v(()=>[D(N(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),te=g(Po,[["__scopeId","data-v-f51f088d"]]),Vo={class:"VPMenuGroup"},Lo={key:0,class:"title"},So=m({__name:"VPMenuGroup",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),u("div",Vo,[e.text?(a(),u("p",Lo,N(e.text),1)):h("",!0),(a(!0),u(w,null,C(e.items,o=>(a(),u(w,null,["link"in o?(a(),k(te,{key:0,item:o},null,8,["item"])):h("",!0)],64))),256))]))}}),To=g(So,[["__scopeId","data-v-a6b0397c"]]),No={class:"VPMenu"},Mo={key:0,class:"items"},Io=m({__name:"VPMenu",props:{items:{}},setup(s){return(e,t)=>(a(),u("div",No,[e.items?(a(),u("div",Mo,[(a(!0),u(w,null,C(e.items,o=>(a(),u(w,{key:JSON.stringify(o)},["link"in o?(a(),k(te,{key:0,item:o},null,8,["item"])):"component"in o?(a(),k(E(o.component),j({key:1,ref_for:!0},o.props),null,16)):(a(),k(To,{key:2,text:o.text,items:o.items},null,8,["text","items"]))],64))),128))])):h("",!0),c(e.$slots,"default",{},void 0,!0)]))}}),wo=g(Io,[["__scopeId","data-v-20ed86d6"]]),Ao=["aria-expanded","aria-label"],Bo={key:0,class:"text"},Co=["innerHTML"],Ho={key:1,class:"vpi-more-horizontal icon"},Eo={class:"menu"},Fo=m({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(s){const e=M(!1),t=M();bo({el:t,onBlur:o});function o(){e.value=!1}return(n,i)=>(a(),u("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:i[1]||(i[1]=l=>e.value=!0),onMouseleave:i[2]||(i[2]=l=>e.value=!1)},[p("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":n.label,onClick:i[0]||(i[0]=l=>e.value=!e.value)},[n.button||n.icon?(a(),u("span",Bo,[n.icon?(a(),u("span",{key:0,class:I([n.icon,"option-icon"])},null,2)):h("",!0),n.button?(a(),u("span",{key:1,innerHTML:n.button},null,8,Co)):h("",!0),i[3]||(i[3]=p("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(a(),u("span",Ho))],8,Ao),p("div",Eo,[_(wo,{items:n.items},{default:v(()=>[c(n.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),ke=g(Fo,[["__scopeId","data-v-af5898d3"]]),Do=["href","aria-label","innerHTML"],Oo=m({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(s){const e=s,t=y(()=>typeof e.icon=="object"?e.icon.svg:``);return(o,n)=>(a(),u("a",{class:"VPSocialLink no-icon",href:o.link,"aria-label":o.ariaLabel??(typeof o.icon=="string"?o.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,Do))}}),Go=g(Oo,[["__scopeId","data-v-358b6670"]]),Uo={class:"VPSocialLinks"},jo=m({__name:"VPSocialLinks",props:{links:{}},setup(s){return(e,t)=>(a(),u("div",Uo,[(a(!0),u(w,null,C(e.links,({link:o,icon:n,ariaLabel:i})=>(a(),k(Go,{key:o,icon:n,link:o,ariaLabel:i},null,8,["icon","link","ariaLabel"]))),128))]))}}),be=g(jo,[["__scopeId","data-v-e71e869c"]]),zo={key:0,class:"group translations"},Ko={class:"trans-title"},qo={key:1,class:"group"},Wo={class:"item appearance"},Ro={class:"label"},Jo={class:"appearance-action"},Xo={key:2,class:"group"},Yo={class:"item social-links"},Qo=m({__name:"VPNavBarExtra",setup(s){const{site:e,theme:t}=V(),{localeLinks:o,currentLang:n}=R({correspondingLink:!0}),i=y(()=>o.value.length&&n.value.label||e.value.appearance||t.value.socialLinks);return(l,f)=>i.value?(a(),k(ke,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[r(o).length&&r(n).label?(a(),u("div",zo,[p("p",Ko,N(r(n).label),1),(a(!0),u(w,null,C(r(o),d=>(a(),k(te,{key:d.link,item:d},null,8,["item"]))),128))])):h("",!0),r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",qo,[p("div",Wo,[p("p",Ro,N(r(t).darkModeSwitchLabel||"Appearance"),1),p("div",Jo,[_(me)])])])):h("",!0),r(t).socialLinks?(a(),u("div",Xo,[p("div",Yo,[_(be,{class:"social-links-list",links:r(t).socialLinks},null,8,["links"])])])):h("",!0)]),_:1})):h("",!0)}}),Zo=g(Qo,[["__scopeId","data-v-f953d92f"]]),xo=["aria-expanded"],es=m({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(s){return(e,t)=>(a(),u("button",{type:"button",class:I(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=o=>e.$emit("click"))},t[1]||(t[1]=[p("span",{class:"container"},[p("span",{class:"top"}),p("span",{class:"middle"}),p("span",{class:"bottom"})],-1)]),10,xo))}}),ts=g(es,[["__scopeId","data-v-6bee1efd"]]),ns=["innerHTML"],os=m({__name:"VPNavBarMenuLink",props:{item:{}},setup(s){const{page:e}=V();return(t,o)=>(a(),k(F,{class:I({VPNavBarMenuLink:!0,active:r(z)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,noIcon:t.item.noIcon,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:v(()=>[p("span",{innerHTML:t.item.text},null,8,ns)]),_:1},8,["class","href","noIcon","target","rel"]))}}),ss=g(os,[["__scopeId","data-v-08fbf4b6"]]),as=m({__name:"VPNavBarMenuGroup",props:{item:{}},setup(s){const e=s,{page:t}=V(),o=i=>"component"in i?!1:"link"in i?z(t.value.relativePath,i.link,!!e.item.activeMatch):i.items.some(o),n=y(()=>o(e.item));return(i,l)=>(a(),k(ke,{class:I({VPNavBarMenuGroup:!0,active:r(z)(r(t).relativePath,i.item.activeMatch,!!i.item.activeMatch)||n.value}),button:i.item.text,items:i.item.items},null,8,["class","button","items"]))}}),rs={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},is=m({__name:"VPNavBarMenu",setup(s){const{theme:e}=V();return(t,o)=>r(e).nav?(a(),u("nav",rs,[o[0]||(o[0]=p("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(a(!0),u(w,null,C(r(e).nav,n=>(a(),u(w,{key:JSON.stringify(n)},["link"in n?(a(),k(ss,{key:0,item:n},null,8,["item"])):"component"in n?(a(),k(E(n.component),j({key:1,ref_for:!0},n.props),null,16)):(a(),k(as,{key:2,item:n},null,8,["item"]))],64))),128))])):h("",!0)}}),ls=g(is,[["__scopeId","data-v-afb2845e"]]);function cs(s){const{localeIndex:e,theme:t}=V();function o(n){var A,B,S;const i=n.split("."),l=(A=t.value.search)==null?void 0:A.options,f=l&&typeof l=="object",d=f&&((S=(B=l.locales)==null?void 0:B[e.value])==null?void 0:S.translations)||null,$=f&&l.translations||null;let L=d,b=$,P=s;const T=i.pop();for(const H of i){let U=null;const W=P==null?void 0:P[H];W&&(U=P=W);const ne=b==null?void 0:b[H];ne&&(U=b=ne);const oe=L==null?void 0:L[H];oe&&(U=L=oe),W||(P=U),ne||(b=U),oe||(L=U)}return(L==null?void 0:L[T])??(b==null?void 0:b[T])??(P==null?void 0:P[T])??""}return o}const us=["aria-label"],ds={class:"DocSearch-Button-Container"},vs={class:"DocSearch-Button-Placeholder"},ge=m({__name:"VPNavBarSearchButton",setup(s){const t=cs({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(o,n)=>(a(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":r(t)("button.buttonAriaLabel")},[p("span",ds,[n[0]||(n[0]=p("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),p("span",vs,N(r(t)("button.buttonText")),1)]),n[1]||(n[1]=p("span",{class:"DocSearch-Button-Keys"},[p("kbd",{class:"DocSearch-Button-Key"}),p("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,us))}}),ps={class:"VPNavBarSearch"},fs={id:"local-search"},hs={key:1,id:"docsearch"},ms=m({__name:"VPNavBarSearch",setup(s){const e=Ue(()=>je(()=>import("./VPLocalSearchBox.DzFCX21k.js"),__vite__mapDeps([0,1]))),t=()=>null,{theme:o}=V(),n=M(!1),i=M(!1);K(()=>{});function l(){n.value||(n.value=!0,setTimeout(f,16))}function f(){const b=new Event("keydown");b.key="k",b.metaKey=!0,window.dispatchEvent(b),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||f()},16)}function d(b){const P=b.target,T=P.tagName;return P.isContentEditable||T==="INPUT"||T==="SELECT"||T==="TEXTAREA"}const $=M(!1);re("k",b=>{(b.ctrlKey||b.metaKey)&&(b.preventDefault(),$.value=!0)}),re("/",b=>{d(b)||(b.preventDefault(),$.value=!0)});const L="local";return(b,P)=>{var T;return a(),u("div",ps,[r(L)==="local"?(a(),u(w,{key:0},[$.value?(a(),k(r(e),{key:0,onClose:P[0]||(P[0]=A=>$.value=!1)})):h("",!0),p("div",fs,[_(ge,{onClick:P[1]||(P[1]=A=>$.value=!0)})])],64)):r(L)==="algolia"?(a(),u(w,{key:1},[n.value?(a(),k(r(t),{key:0,algolia:((T=r(o).search)==null?void 0:T.options)??r(o).algolia,onVnodeBeforeMount:P[2]||(P[2]=A=>i.value=!0)},null,8,["algolia"])):h("",!0),i.value?h("",!0):(a(),u("div",hs,[_(ge,{onClick:l})]))],64)):h("",!0)])}}}),_s=m({__name:"VPNavBarSocialLinks",setup(s){const{theme:e}=V();return(t,o)=>r(e).socialLinks?(a(),k(be,{key:0,class:"VPNavBarSocialLinks",links:r(e).socialLinks},null,8,["links"])):h("",!0)}}),ks=g(_s,[["__scopeId","data-v-ef6192dc"]]),bs=["href","rel","target"],gs={key:1},$s={key:2},ys=m({__name:"VPNavBarTitle",setup(s){const{site:e,theme:t}=V(),{hasSidebar:o}=G(),{currentLang:n}=R(),i=y(()=>{var d;return typeof t.value.logoLink=="string"?t.value.logoLink:(d=t.value.logoLink)==null?void 0:d.link}),l=y(()=>{var d;return typeof t.value.logoLink=="string"||(d=t.value.logoLink)==null?void 0:d.rel}),f=y(()=>{var d;return typeof t.value.logoLink=="string"||(d=t.value.logoLink)==null?void 0:d.target});return(d,$)=>(a(),u("div",{class:I(["VPNavBarTitle",{"has-sidebar":r(o)}])},[p("a",{class:"title",href:i.value??r(fe)(r(n).link),rel:l.value,target:f.value},[c(d.$slots,"nav-bar-title-before",{},void 0,!0),r(t).logo?(a(),k(X,{key:0,class:"logo",image:r(t).logo},null,8,["image"])):h("",!0),r(t).siteTitle?(a(),u("span",gs,N(r(t).siteTitle),1)):r(t).siteTitle===void 0?(a(),u("span",$s,N(r(e).title),1)):h("",!0),c(d.$slots,"nav-bar-title-after",{},void 0,!0)],8,bs)],2))}}),Ps=g(ys,[["__scopeId","data-v-0ad69264"]]),Vs={class:"items"},Ls={class:"title"},Ss=m({__name:"VPNavBarTranslations",setup(s){const{theme:e}=V(),{localeLinks:t,currentLang:o}=R({correspondingLink:!0});return(n,i)=>r(t).length&&r(o).label?(a(),k(ke,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:r(e).langMenuLabel||"Change language"},{default:v(()=>[p("div",Vs,[p("p",Ls,N(r(o).label),1),(a(!0),u(w,null,C(r(t),l=>(a(),k(te,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):h("",!0)}}),Ts=g(Ss,[["__scopeId","data-v-acee064b"]]),Ns={class:"wrapper"},Ms={class:"container"},Is={class:"title"},ws={class:"content"},As={class:"content-body"},Bs=m({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(s){const e=s,{y:t}=Ve(),{hasSidebar:o}=G(),{frontmatter:n}=V(),i=M({});return pe(()=>{i.value={"has-sidebar":o.value,home:n.value.layout==="home",top:t.value===0,"screen-open":e.isScreenOpen}}),(l,f)=>(a(),u("div",{class:I(["VPNavBar",i.value])},[p("div",Ns,[p("div",Ms,[p("div",Is,[_(Ps,null,{"nav-bar-title-before":v(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),p("div",ws,[p("div",As,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),_(ms,{class:"search"}),_(ls,{class:"menu"}),_(Ts,{class:"translations"}),_(ko,{class:"appearance"}),_(ks,{class:"social-links"}),_(Zo,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),_(ts,{class:"hamburger",active:l.isScreenOpen,onClick:f[0]||(f[0]=d=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),f[1]||(f[1]=p("div",{class:"divider"},[p("div",{class:"divider-line"})],-1))],2))}}),Cs=g(Bs,[["__scopeId","data-v-9fd4d1dd"]]),Hs={key:0,class:"VPNavScreenAppearance"},Es={class:"text"},Fs=m({__name:"VPNavScreenAppearance",setup(s){const{site:e,theme:t}=V();return(o,n)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",Hs,[p("p",Es,N(r(t).darkModeSwitchLabel||"Appearance"),1),_(me)])):h("",!0)}}),Ds=g(Fs,[["__scopeId","data-v-a3e2920d"]]),Os=m({__name:"VPNavScreenMenuLink",props:{item:{}},setup(s){const e=x("close-screen");return(t,o)=>(a(),k(F,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e),innerHTML:t.item.text},null,8,["href","target","rel","onClick","innerHTML"]))}}),Gs=g(Os,[["__scopeId","data-v-1a934d60"]]),Us=m({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(s){const e=x("close-screen");return(t,o)=>(a(),k(F,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e)},{default:v(()=>[D(N(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),Ae=g(Us,[["__scopeId","data-v-aea78dd1"]]),js={class:"VPNavScreenMenuGroupSection"},zs={key:0,class:"title"},Ks=m({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),u("div",js,[e.text?(a(),u("p",zs,N(e.text),1)):h("",!0),(a(!0),u(w,null,C(e.items,o=>(a(),k(Ae,{key:o.text,item:o},null,8,["item"]))),128))]))}}),qs=g(Ks,[["__scopeId","data-v-f60dbfa7"]]),Ws=["aria-controls","aria-expanded"],Rs=["innerHTML"],Js=["id"],Xs={key:0,class:"item"},Ys={key:1,class:"item"},Qs={key:2,class:"group"},Zs=m({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(s){const e=s,t=M(!1),o=y(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function n(){t.value=!t.value}return(i,l)=>(a(),u("div",{class:I(["VPNavScreenMenuGroup",{open:t.value}])},[p("button",{class:"button","aria-controls":o.value,"aria-expanded":t.value,onClick:n},[p("span",{class:"button-text",innerHTML:i.text},null,8,Rs),l[0]||(l[0]=p("span",{class:"vpi-plus button-icon"},null,-1))],8,Ws),p("div",{id:o.value,class:"items"},[(a(!0),u(w,null,C(i.items,f=>(a(),u(w,{key:JSON.stringify(f)},["link"in f?(a(),u("div",Xs,[_(Ae,{item:f},null,8,["item"])])):"component"in f?(a(),u("div",Ys,[(a(),k(E(f.component),j({ref_for:!0},f.props,{"screen-menu":""}),null,16))])):(a(),u("div",Qs,[_(qs,{text:f.text,items:f.items},null,8,["text","items"])]))],64))),128))],8,Js)],2))}}),xs=g(Zs,[["__scopeId","data-v-d99bfeec"]]),ea={key:0,class:"VPNavScreenMenu"},ta=m({__name:"VPNavScreenMenu",setup(s){const{theme:e}=V();return(t,o)=>r(e).nav?(a(),u("nav",ea,[(a(!0),u(w,null,C(r(e).nav,n=>(a(),u(w,{key:JSON.stringify(n)},["link"in n?(a(),k(Gs,{key:0,item:n},null,8,["item"])):"component"in n?(a(),k(E(n.component),j({key:1,ref_for:!0},n.props,{"screen-menu":""}),null,16)):(a(),k(xs,{key:2,text:n.text||"",items:n.items},null,8,["text","items"]))],64))),128))])):h("",!0)}}),na=m({__name:"VPNavScreenSocialLinks",setup(s){const{theme:e}=V();return(t,o)=>r(e).socialLinks?(a(),k(be,{key:0,class:"VPNavScreenSocialLinks",links:r(e).socialLinks},null,8,["links"])):h("",!0)}}),oa={class:"list"},sa=m({__name:"VPNavScreenTranslations",setup(s){const{localeLinks:e,currentLang:t}=R({correspondingLink:!0}),o=M(!1);function n(){o.value=!o.value}return(i,l)=>r(e).length&&r(t).label?(a(),u("div",{key:0,class:I(["VPNavScreenTranslations",{open:o.value}])},[p("button",{class:"title",onClick:n},[l[0]||(l[0]=p("span",{class:"vpi-languages icon lang"},null,-1)),D(" "+N(r(t).label)+" ",1),l[1]||(l[1]=p("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),p("ul",oa,[(a(!0),u(w,null,C(r(e),f=>(a(),u("li",{key:f.link,class:"item"},[_(F,{class:"link",href:f.link},{default:v(()=>[D(N(f.text),1)]),_:2},1032,["href"])]))),128))])],2)):h("",!0)}}),aa=g(sa,[["__scopeId","data-v-516e4bc3"]]),ra={class:"container"},ia=m({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(s){const e=M(null),t=Le(ee?document.body:null);return(o,n)=>(a(),k(ue,{name:"fade",onEnter:n[0]||(n[0]=i=>t.value=!0),onAfterLeave:n[1]||(n[1]=i=>t.value=!1)},{default:v(()=>[o.open?(a(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[p("div",ra,[c(o.$slots,"nav-screen-content-before",{},void 0,!0),_(ta,{class:"menu"}),_(aa,{class:"translations"}),_(Ds,{class:"appearance"}),_(na,{class:"social-links"}),c(o.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):h("",!0)]),_:3}))}}),la=g(ia,[["__scopeId","data-v-2dd6d0c7"]]),ca={key:0,class:"VPNav"},ua=m({__name:"VPNav",setup(s){const{isScreenOpen:e,closeScreen:t,toggleScreen:o}=io(),{frontmatter:n}=V(),i=y(()=>n.value.navbar!==!1);return Se("close-screen",t),Y(()=>{ee&&document.documentElement.classList.toggle("hide-nav",!i.value)}),(l,f)=>i.value?(a(),u("header",ca,[_(Cs,{"is-screen-open":r(e),onToggleScreen:r(o)},{"nav-bar-title-before":v(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),_(la,{open:r(e)},{"nav-screen-content-before":v(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):h("",!0)}}),da=g(ua,[["__scopeId","data-v-7ad780c2"]]),va=["role","tabindex"],pa={key:1,class:"items"},fa=m({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(s){const e=s,{collapsed:t,collapsible:o,isLink:n,isActiveLink:i,hasActiveLink:l,hasChildren:f,toggle:d}=dt(y(()=>e.item)),$=y(()=>f.value?"section":"div"),L=y(()=>n.value?"a":"div"),b=y(()=>f.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),P=y(()=>n.value?void 0:"button"),T=y(()=>[[`level-${e.depth}`],{collapsible:o.value},{collapsed:t.value},{"is-link":n.value},{"is-active":i.value},{"has-active":l.value}]);function A(S){"key"in S&&S.key!=="Enter"||!e.item.link&&d()}function B(){e.item.link&&d()}return(S,H)=>{const U=q("VPSidebarItem",!0);return a(),k(E($.value),{class:I(["VPSidebarItem",T.value])},{default:v(()=>[S.item.text?(a(),u("div",j({key:0,class:"item",role:P.value},Ke(S.item.items?{click:A,keydown:A}:{},!0),{tabindex:S.item.items&&0}),[H[1]||(H[1]=p("div",{class:"indicator"},null,-1)),S.item.link?(a(),k(F,{key:0,tag:L.value,class:"link",href:S.item.link,rel:S.item.rel,target:S.item.target},{default:v(()=>[(a(),k(E(b.value),{class:"text",innerHTML:S.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),k(E(b.value),{key:1,class:"text",innerHTML:S.item.text},null,8,["innerHTML"])),S.item.collapsed!=null&&S.item.items&&S.item.items.length?(a(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:B,onKeydown:ze(B,["enter"]),tabindex:"0"},H[0]||(H[0]=[p("span",{class:"vpi-chevron-right caret-icon"},null,-1)]),32)):h("",!0)],16,va)):h("",!0),S.item.items&&S.item.items.length?(a(),u("div",pa,[S.depth<5?(a(!0),u(w,{key:0},C(S.item.items,W=>(a(),k(U,{key:W.text,item:W,depth:S.depth+1},null,8,["item","depth"]))),128)):h("",!0)])):h("",!0)]),_:1},8,["class"])}}}),ha=g(fa,[["__scopeId","data-v-edd2eed8"]]),ma=m({__name:"VPSidebarGroup",props:{items:{}},setup(s){const e=M(!0);let t=null;return K(()=>{t=setTimeout(()=>{t=null,e.value=!1},300)}),qe(()=>{t!=null&&(clearTimeout(t),t=null)}),(o,n)=>(a(!0),u(w,null,C(o.items,i=>(a(),u("div",{key:i.text,class:I(["group",{"no-transition":e.value}])},[_(ha,{item:i,depth:0},null,8,["item"])],2))),128))}}),_a=g(ma,[["__scopeId","data-v-51288d80"]]),ka={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},ba=m({__name:"VPSidebar",props:{open:{type:Boolean}},setup(s){const{sidebarGroups:e,hasSidebar:t}=G(),o=s,n=M(null),i=Le(ee?document.body:null);O([o,n],()=>{var f;o.open?(i.value=!0,(f=n.value)==null||f.focus()):i.value=!1},{immediate:!0,flush:"post"});const l=M(0);return O(e,()=>{l.value+=1},{deep:!0}),(f,d)=>r(t)?(a(),u("aside",{key:0,class:I(["VPSidebar",{open:f.open}]),ref_key:"navEl",ref:n,onClick:d[0]||(d[0]=We(()=>{},["stop"]))},[d[2]||(d[2]=p("div",{class:"curtain"},null,-1)),p("nav",ka,[d[1]||(d[1]=p("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),c(f.$slots,"sidebar-nav-before",{},void 0,!0),(a(),k(_a,{items:r(e),key:l.value},null,8,["items"])),c(f.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):h("",!0)}}),ga=g(ba,[["__scopeId","data-v-42c4c606"]]),$a=m({__name:"VPSkipLink",setup(s){const e=Z(),t=M();O(()=>e.path,()=>t.value.focus());function o({target:n}){const i=document.getElementById(decodeURIComponent(n.hash).slice(1));if(i){const l=()=>{i.removeAttribute("tabindex"),i.removeEventListener("blur",l)};i.setAttribute("tabindex","-1"),i.addEventListener("blur",l),i.focus(),window.scrollTo(0,0)}}return(n,i)=>(a(),u(w,null,[p("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),p("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o}," Skip to content ")],64))}}),ya=g($a,[["__scopeId","data-v-c8291ffa"]]),Pa=m({__name:"Layout",setup(s){const{isOpen:e,open:t,close:o}=G(),n=Z();O(()=>n.path,o),ut(e,o);const{frontmatter:i}=V(),l=Re(),f=y(()=>!!l["home-hero-image"]);return Se("hero-image-slot-exists",f),(d,$)=>{const L=q("Content");return r(i).layout!==!1?(a(),u("div",{key:0,class:I(["Layout",r(i).pageClass])},[c(d.$slots,"layout-top",{},void 0,!0),_(ya),_(Qe,{class:"backdrop",show:r(e),onClick:r(o)},null,8,["show","onClick"]),_(da,null,{"nav-bar-title-before":v(()=>[c(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[c(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[c(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[c(d.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[c(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[c(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),_(ro,{open:r(e),onOpenMenu:r(t)},null,8,["open","onOpenMenu"]),_(ga,{open:r(e)},{"sidebar-nav-before":v(()=>[c(d.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[c(d.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),_(Kn,null,{"page-top":v(()=>[c(d.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[c(d.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[c(d.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[c(d.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":v(()=>[c(d.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[c(d.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[c(d.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[c(d.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":v(()=>[c(d.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[c(d.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[c(d.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[c(d.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[c(d.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[c(d.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[c(d.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[c(d.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[c(d.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[c(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[c(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[c(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[c(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[c(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[c(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),_(Xn),c(d.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),k(L,{key:1}))}}}),Va=g(Pa,[["__scopeId","data-v-d8b57b2d"]]),Sa={Layout:Va,enhanceApp:({app:s})=>{s.component("Badge",Je)}};export{cs as c,Sa as t,V as u}; diff --git a/assets/contribute_core.md.BABeyVan.js b/assets/contribute_core.md.BABeyVan.js new file mode 100644 index 00000000..66d8cade --- /dev/null +++ b/assets/contribute_core.md.BABeyVan.js @@ -0,0 +1,38 @@ +import{_ as e,c as a,a2 as i,o as t}from"./chunks/framework.C9NVOr0y.js";const g=JSON.parse('{"title":"asdf","description":"","frontmatter":{},"headers":[],"relativePath":"contribute/core.md","filePath":"contribute/core.md","lastUpdated":1728309110000}'),n={name:"contribute/core.md"};function l(o,s,p,r,h,d){return t(),a("div",null,s[0]||(s[0]=[i(`

asdf

asdf core contribution guide.

Initial Setup

Fork asdf on GitHub and/or Git clone the default branch:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

The tools for core development are in this repo's .tool-versions. If you wish to manage with asdf itself, add the plugins:

shell
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git

Install the versions to develop asdf with:

shell
asdf install

It may be useful to not use asdf to manage the tools during development on your local machine as you may need to break functionality which would then break your dev tooling. Here's the raw list of tools:

  • bats-core: Bash Automated Testing System, for unit testing Bash or POSIX compliant scripts.
  • shellcheck: Static analysis tool for shell scripts.
  • shfmt: A shell parser, formatter, and interpreter with bash support; includes shfmt

Development

If you want to try out your changes without making change to your installed asdf, you can set the $ASDF_DIR variable to the path where you cloned the repository, and temporarily prepend the bin and shims directory of the directory to your path.

It is best to format, lint and test your code locally before you commit or push to the remote. Use the following scripts/commands:

shell
# Lint
+./scripts/lint.bash --check
+
+# Fix & Format
+./scripts/lint.bash --fix
+
+# Test: all tests
+./scripts/test.bash
+
+# Test: for specific command
+bats test/list_commands.bash

TIP

Add tests! - Tests are required for new features and speed up review of bug fixes. Please cover new code paths before you create a Pull Request. See bats-core documentation

Gitignore

The following is the .gitignore file in the asdf-vm/asdf repository. We ignore project-specific files. Files specific to your OS, tools or workflows should be ignored in your global .gitignore configuration, see here for more details.

gitignore
/installs
+/downloads
+/plugins
+/shims
+repository
+.vagrant
+keyrings
+/tmp

.git-blame-ignore-revs

asdf uses a .git-blame-ignore-revs to reduce noise when running a blame. See the git blame documentation for more information.

Use the file with git blame like so:

sh
git blame --ignore-revs-file .git-blame-ignore-revs ./test/install_command.bats

Optionally, configure to use the file on every invocation of blame without manually supplying it:

sh
git config blame.ignoreRevsFile .git-blame-ignore-revs

It is possible to configure IDEs to use this file. For example, when using VSCode (with GitLens), write the following to .vscode/settings.json:

json
{
+  "gitlens.advanced.blame.customArguments": [
+    "--ignore-revs-file",
+    ".git-blame-ignore-revs"
+  ]
+}

Bats Testing

Execute tests locally with:

shell
./scripts/test.bash

Before writing tests please read:

Bats Tips

Bats debugging can be difficult at times. Using the TAP output with -t flag will enable you to print outputs with the special file descriptor >&3 during test execution, simplifying debugging. As an example:

shell
# test/some_tests.bats
+
+printf "%s\\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\\n" "Will be printed during bats -t test/some_tests.bats" >&3

This is further documented in bats-core Printing to the Terminal.

Pull Requests, Releases & Conventional Commits

asdf is using an automated release tool called Release Please to automatically bump the SemVer version and generate the Changelog. This information is determined by reading the commit history since the last release.

Conventional Commit messages define the format of the Pull Request Title which becomes the commit message format on the default branch. This is enforced with GitHub Action amannn/action-semantic-pull-request.

Conventional Commit follows this format:

<type>[optional scope][optional !]: <description>
+
+<!-- examples -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change

The full list of <types> are: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert.

  • !: indicates a breaking change
  • fix: will create a new SemVer patch
  • feat: will create a new SemVer minor
  • <type>!: will create a new SemVer major

The Pull Request Title must follow this format.

TIP

Use Conventional Commit message format for your Pull Request Title.

Docker Images

The asdf-alpine and asdf-ubuntu projects are an ongoing effort to provide Dockerized images of some asdf tools. You can use these docker images as base for your development servers, or for running your production apps.

`,47)]))}const k=e(n,[["render",l]]);export{g as __pageData,k as default}; diff --git a/assets/contribute_core.md.BABeyVan.lean.js b/assets/contribute_core.md.BABeyVan.lean.js new file mode 100644 index 00000000..66d8cade --- /dev/null +++ b/assets/contribute_core.md.BABeyVan.lean.js @@ -0,0 +1,38 @@ +import{_ as e,c as a,a2 as i,o as t}from"./chunks/framework.C9NVOr0y.js";const g=JSON.parse('{"title":"asdf","description":"","frontmatter":{},"headers":[],"relativePath":"contribute/core.md","filePath":"contribute/core.md","lastUpdated":1728309110000}'),n={name:"contribute/core.md"};function l(o,s,p,r,h,d){return t(),a("div",null,s[0]||(s[0]=[i(`

asdf

asdf core contribution guide.

Initial Setup

Fork asdf on GitHub and/or Git clone the default branch:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

The tools for core development are in this repo's .tool-versions. If you wish to manage with asdf itself, add the plugins:

shell
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git

Install the versions to develop asdf with:

shell
asdf install

It may be useful to not use asdf to manage the tools during development on your local machine as you may need to break functionality which would then break your dev tooling. Here's the raw list of tools:

  • bats-core: Bash Automated Testing System, for unit testing Bash or POSIX compliant scripts.
  • shellcheck: Static analysis tool for shell scripts.
  • shfmt: A shell parser, formatter, and interpreter with bash support; includes shfmt

Development

If you want to try out your changes without making change to your installed asdf, you can set the $ASDF_DIR variable to the path where you cloned the repository, and temporarily prepend the bin and shims directory of the directory to your path.

It is best to format, lint and test your code locally before you commit or push to the remote. Use the following scripts/commands:

shell
# Lint
+./scripts/lint.bash --check
+
+# Fix & Format
+./scripts/lint.bash --fix
+
+# Test: all tests
+./scripts/test.bash
+
+# Test: for specific command
+bats test/list_commands.bash

TIP

Add tests! - Tests are required for new features and speed up review of bug fixes. Please cover new code paths before you create a Pull Request. See bats-core documentation

Gitignore

The following is the .gitignore file in the asdf-vm/asdf repository. We ignore project-specific files. Files specific to your OS, tools or workflows should be ignored in your global .gitignore configuration, see here for more details.

gitignore
/installs
+/downloads
+/plugins
+/shims
+repository
+.vagrant
+keyrings
+/tmp

.git-blame-ignore-revs

asdf uses a .git-blame-ignore-revs to reduce noise when running a blame. See the git blame documentation for more information.

Use the file with git blame like so:

sh
git blame --ignore-revs-file .git-blame-ignore-revs ./test/install_command.bats

Optionally, configure to use the file on every invocation of blame without manually supplying it:

sh
git config blame.ignoreRevsFile .git-blame-ignore-revs

It is possible to configure IDEs to use this file. For example, when using VSCode (with GitLens), write the following to .vscode/settings.json:

json
{
+  "gitlens.advanced.blame.customArguments": [
+    "--ignore-revs-file",
+    ".git-blame-ignore-revs"
+  ]
+}

Bats Testing

Execute tests locally with:

shell
./scripts/test.bash

Before writing tests please read:

Bats Tips

Bats debugging can be difficult at times. Using the TAP output with -t flag will enable you to print outputs with the special file descriptor >&3 during test execution, simplifying debugging. As an example:

shell
# test/some_tests.bats
+
+printf "%s\\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\\n" "Will be printed during bats -t test/some_tests.bats" >&3

This is further documented in bats-core Printing to the Terminal.

Pull Requests, Releases & Conventional Commits

asdf is using an automated release tool called Release Please to automatically bump the SemVer version and generate the Changelog. This information is determined by reading the commit history since the last release.

Conventional Commit messages define the format of the Pull Request Title which becomes the commit message format on the default branch. This is enforced with GitHub Action amannn/action-semantic-pull-request.

Conventional Commit follows this format:

<type>[optional scope][optional !]: <description>
+
+<!-- examples -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change

The full list of <types> are: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert.

  • !: indicates a breaking change
  • fix: will create a new SemVer patch
  • feat: will create a new SemVer minor
  • <type>!: will create a new SemVer major

The Pull Request Title must follow this format.

TIP

Use Conventional Commit message format for your Pull Request Title.

Docker Images

The asdf-alpine and asdf-ubuntu projects are an ongoing effort to provide Dockerized images of some asdf tools. You can use these docker images as base for your development servers, or for running your production apps.

`,47)]))}const k=e(n,[["render",l]]);export{g as __pageData,k as default}; diff --git a/assets/contribute_documentation.md.BYyBOKz0.js b/assets/contribute_documentation.md.BYyBOKz0.js new file mode 100644 index 00000000..ff60ed67 --- /dev/null +++ b/assets/contribute_documentation.md.BYyBOKz0.js @@ -0,0 +1,42 @@ +import{_ as i,c as a,a2 as e,o as n}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"Docs & Site","description":"","frontmatter":{},"headers":[],"relativePath":"contribute/documentation.md","filePath":"contribute/documentation.md","lastUpdated":1687069487000}'),t={name:"contribute/documentation.md"};function l(p,s,h,o,r,d){return n(),a("div",null,s[0]||(s[0]=[e(`

Docs & Site

Documentation & site contribution guide.

Initial Setup

Fork asdf on GitHub and/or Git clone the default branch:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

The tools for Docs site development are managed with asdf in the docs/.tool-versions. Add the plugins with:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

Install the tool version(s) with:

shell
asdf install
  • Node.js: JavaScript runtime built on Chrome's V8 JavaScript engine.

Install Node.js dependencies from docs/package.json:

shell
npm install

Development

VitePress (v2) is the Static Site Generator (SSG) we use to build the asdf documentation site. It was chosen to replace Docsify.js and subsequently VuePress as we would like to support an HTML only fallback when users do not have JavaScript available or enabled. This was not possible with Docsify & VitePress quicly supplanted VuePress. Other than this, the feature-set is largely the same, with the focus on writing Markdown files with minimal configuration.

package.json contains the scripts required for development:

@code json{3-5}

To start the local development server:

shell
npm run dev

Format the code before committing:

shell
npm run format

Pull Requests, Releases & Conventional Commits

asdf is using an automated release pipeline which relies on Conventional Commits in PR titles. Detailed documentation found in the core contribution guide.

When creating a PR for documentation changes please make the PR title with the Conventional Commit type docs in the format docs: <description>.

Vitepress

Configuration of the site is contained within a few TypeScript files with JS Objects used to represent the config. They are:

To simplify the root config, the larger JS Objects representing the navbar and sidebar configuration have been extracted and separated by their locale. See both in:

  • docs/.vitepress/navbars.js
  • docs/.vitepress/sidebars.js

With the official documentation for these configs living in the Default Theme Reference.

I18n

VitePress has first-class support for internationalization. The root config docs/.vitepress/config.js defines the supported locales with their URL, title in the selection dropdown menu and navbar/sidebar configs references.

The navbar/sidebar configs are captured in the aforementioned config files, separated by locale and exported individually.

The markdown content for each locale must fall under a folder with the same name as the keys for locales in the root config. That is:

js
// docs/.vitepress/config.js
+export default defineConfig({
+  ...
+  locales: {
+    root: {
+      label: "English",
+        lang: "en-US",
+        themeConfig: {
+        nav: navbars.en,
+          sidebar: sidebars.en,
+      },
+    },
+    "pt-br": {
+      label: "Brazilian Portuguese",
+        lang: "pr-br",
+        themeConfig: {
+        nav: navbars.pt_br,
+          sidebar: sidebars.pt_br,
+      },
+    },
+    "zh-hans": {
+      label: "简体中文",
+        lang: "zh-hans",
+        themeConfig: {
+        nav: navbars.zh_hans,
+          sidebar: sidebars.zh_hans,
+      },
+    },
+  },
+})

/pt-BR/ will require the same set of markdown files located under docs/pt-BR/, like so:

shell
docs
+├─ README.md
+├─ foo.md
+├─ nested
+  └─ README.md
+└─ pt-BR
+   ├─ README.md
+   ├─ foo.md
+   └─ nested
+      └─ README.md

The official VitePress i18n documentation goes into more detail.

`,37)]))}const g=i(t,[["render",l]]);export{c as __pageData,g as default}; diff --git a/assets/contribute_documentation.md.BYyBOKz0.lean.js b/assets/contribute_documentation.md.BYyBOKz0.lean.js new file mode 100644 index 00000000..ff60ed67 --- /dev/null +++ b/assets/contribute_documentation.md.BYyBOKz0.lean.js @@ -0,0 +1,42 @@ +import{_ as i,c as a,a2 as e,o as n}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"Docs & Site","description":"","frontmatter":{},"headers":[],"relativePath":"contribute/documentation.md","filePath":"contribute/documentation.md","lastUpdated":1687069487000}'),t={name:"contribute/documentation.md"};function l(p,s,h,o,r,d){return n(),a("div",null,s[0]||(s[0]=[e(`

Docs & Site

Documentation & site contribution guide.

Initial Setup

Fork asdf on GitHub and/or Git clone the default branch:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

The tools for Docs site development are managed with asdf in the docs/.tool-versions. Add the plugins with:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

Install the tool version(s) with:

shell
asdf install
  • Node.js: JavaScript runtime built on Chrome's V8 JavaScript engine.

Install Node.js dependencies from docs/package.json:

shell
npm install

Development

VitePress (v2) is the Static Site Generator (SSG) we use to build the asdf documentation site. It was chosen to replace Docsify.js and subsequently VuePress as we would like to support an HTML only fallback when users do not have JavaScript available or enabled. This was not possible with Docsify & VitePress quicly supplanted VuePress. Other than this, the feature-set is largely the same, with the focus on writing Markdown files with minimal configuration.

package.json contains the scripts required for development:

@code json{3-5}

To start the local development server:

shell
npm run dev

Format the code before committing:

shell
npm run format

Pull Requests, Releases & Conventional Commits

asdf is using an automated release pipeline which relies on Conventional Commits in PR titles. Detailed documentation found in the core contribution guide.

When creating a PR for documentation changes please make the PR title with the Conventional Commit type docs in the format docs: <description>.

Vitepress

Configuration of the site is contained within a few TypeScript files with JS Objects used to represent the config. They are:

To simplify the root config, the larger JS Objects representing the navbar and sidebar configuration have been extracted and separated by their locale. See both in:

  • docs/.vitepress/navbars.js
  • docs/.vitepress/sidebars.js

With the official documentation for these configs living in the Default Theme Reference.

I18n

VitePress has first-class support for internationalization. The root config docs/.vitepress/config.js defines the supported locales with their URL, title in the selection dropdown menu and navbar/sidebar configs references.

The navbar/sidebar configs are captured in the aforementioned config files, separated by locale and exported individually.

The markdown content for each locale must fall under a folder with the same name as the keys for locales in the root config. That is:

js
// docs/.vitepress/config.js
+export default defineConfig({
+  ...
+  locales: {
+    root: {
+      label: "English",
+        lang: "en-US",
+        themeConfig: {
+        nav: navbars.en,
+          sidebar: sidebars.en,
+      },
+    },
+    "pt-br": {
+      label: "Brazilian Portuguese",
+        lang: "pr-br",
+        themeConfig: {
+        nav: navbars.pt_br,
+          sidebar: sidebars.pt_br,
+      },
+    },
+    "zh-hans": {
+      label: "简体中文",
+        lang: "zh-hans",
+        themeConfig: {
+        nav: navbars.zh_hans,
+          sidebar: sidebars.zh_hans,
+      },
+    },
+  },
+})

/pt-BR/ will require the same set of markdown files located under docs/pt-BR/, like so:

shell
docs
+├─ README.md
+├─ foo.md
+├─ nested
+  └─ README.md
+└─ pt-BR
+   ├─ README.md
+   ├─ foo.md
+   └─ nested
+      └─ README.md

The official VitePress i18n documentation goes into more detail.

`,37)]))}const g=i(t,[["render",l]]);export{c as __pageData,g as default}; diff --git a/assets/contribute_first-party-plugins.md.CpFWKmHh.js b/assets/contribute_first-party-plugins.md.CpFWKmHh.js new file mode 100644 index 00000000..e1a12f33 --- /dev/null +++ b/assets/contribute_first-party-plugins.md.CpFWKmHh.js @@ -0,0 +1 @@ +import{_ as r,c as t,a2 as a,o as i}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"First-Party Plugins","description":"","frontmatter":{},"headers":[],"relativePath":"contribute/first-party-plugins.md","filePath":"contribute/first-party-plugins.md","lastUpdated":1627017981000}'),o={name:"contribute/first-party-plugins.md"};function s(l,e,n,d,c,f){return i(),t("div",null,e[0]||(e[0]=[a('

First-Party Plugins

The asdf core team has authored some plugins relevant to their daily work life. Help is always welcome in maintaining and improving these plugins. See the associated repo for each linked below:

For community plugins, see:

',5)]))}const g=r(o,[["render",s]]);export{u as __pageData,g as default}; diff --git a/assets/contribute_first-party-plugins.md.CpFWKmHh.lean.js b/assets/contribute_first-party-plugins.md.CpFWKmHh.lean.js new file mode 100644 index 00000000..e1a12f33 --- /dev/null +++ b/assets/contribute_first-party-plugins.md.CpFWKmHh.lean.js @@ -0,0 +1 @@ +import{_ as r,c as t,a2 as a,o as i}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"First-Party Plugins","description":"","frontmatter":{},"headers":[],"relativePath":"contribute/first-party-plugins.md","filePath":"contribute/first-party-plugins.md","lastUpdated":1627017981000}'),o={name:"contribute/first-party-plugins.md"};function s(l,e,n,d,c,f){return i(),t("div",null,e[0]||(e[0]=[a('

First-Party Plugins

The asdf core team has authored some plugins relevant to their daily work life. Help is always welcome in maintaining and improving these plugins. See the associated repo for each linked below:

For community plugins, see:

',5)]))}const g=r(o,[["render",s]]);export{u as __pageData,g as default}; diff --git a/assets/contribute_github-actions.md.CA9Mkw8-.js b/assets/contribute_github-actions.md.CA9Mkw8-.js new file mode 100644 index 00000000..75ca7329 --- /dev/null +++ b/assets/contribute_github-actions.md.CA9Mkw8-.js @@ -0,0 +1 @@ +import{_ as i,c as s,j as t,a as e,o as n}from"./chunks/framework.C9NVOr0y.js";const p=JSON.parse('{"title":"GitHub Actions","description":"","frontmatter":{},"headers":[],"relativePath":"contribute/github-actions.md","filePath":"contribute/github-actions.md","lastUpdated":1627017981000}'),o={name:"contribute/github-actions.md"};function r(c,a,u,d,l,h){return n(),s("div",null,a[0]||(a[0]=[t("h1",{id:"github-actions",tabindex:"-1"},[e("GitHub Actions "),t("a",{class:"header-anchor",href:"#github-actions","aria-label":'Permalink to "GitHub Actions"'},"​")],-1),t("p",null,[e("Thanks for your interest, please see the "),t("a",{href:"https://github.com/asdf-vm/actions",target:"_blank",rel:"noreferrer"},"asdf actions repo"),e(" for their existing Issues, conversations and Contributing Guidelines.")],-1)]))}const f=i(o,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/contribute_github-actions.md.CA9Mkw8-.lean.js b/assets/contribute_github-actions.md.CA9Mkw8-.lean.js new file mode 100644 index 00000000..75ca7329 --- /dev/null +++ b/assets/contribute_github-actions.md.CA9Mkw8-.lean.js @@ -0,0 +1 @@ +import{_ as i,c as s,j as t,a as e,o as n}from"./chunks/framework.C9NVOr0y.js";const p=JSON.parse('{"title":"GitHub Actions","description":"","frontmatter":{},"headers":[],"relativePath":"contribute/github-actions.md","filePath":"contribute/github-actions.md","lastUpdated":1627017981000}'),o={name:"contribute/github-actions.md"};function r(c,a,u,d,l,h){return n(),s("div",null,a[0]||(a[0]=[t("h1",{id:"github-actions",tabindex:"-1"},[e("GitHub Actions "),t("a",{class:"header-anchor",href:"#github-actions","aria-label":'Permalink to "GitHub Actions"'},"​")],-1),t("p",null,[e("Thanks for your interest, please see the "),t("a",{href:"https://github.com/asdf-vm/actions",target:"_blank",rel:"noreferrer"},"asdf actions repo"),e(" for their existing Issues, conversations and Contributing Guidelines.")],-1)]))}const f=i(o,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/guide_getting-started.md.C3BDv6cZ.js b/assets/guide_getting-started.md.C3BDv6cZ.js new file mode 100644 index 00000000..f83c6c56 --- /dev/null +++ b/assets/guide_getting-started.md.C3BDv6cZ.js @@ -0,0 +1,13 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"Getting Started","description":"","frontmatter":{},"headers":[],"relativePath":"guide/getting-started.md","filePath":"guide/getting-started.md","lastUpdated":1724080713000}'),l={name:"guide/getting-started.md"};function n(h,s,o,p,d,r){return t(),a("div",null,s[0]||(s[0]=[e(`

Getting Started

asdf installation involves:

  1. Installing dependencies
  2. Downloading asdf core
  3. Installing asdf
  4. Installing a plugin for each tool/runtime you wish to manage
  5. Installing a version of the tool/runtime
  6. Setting global and project versions via .tool-versions config files

1. Install Dependencies

asdf primarily requires git & curl. Here is a non-exhaustive list of commands to run for your package manager (some might automatically install these tools in later steps).

OSPackage ManagerCommand
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

Note

sudo may be required depending on your system configuration.

2. Download asdf

Official Download

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1

Community Supported Download Methods

We highly recommend using the official git method.

MethodCommand
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper

3. Install asdf

There are many different combinations of Shells, OSs & Installation methods all of which affect the configuration here. Expand the selection below that best matches your system.

macOS users, be sure to read the warning about path_helper at the end of this section.

Bash & Git

Add the following to ~/.bashrc:

shell
. "$HOME/.asdf/asdf.sh"

Completions must be configured by adding the following to your .bashrc:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

If using macOS Catalina or newer, the default shell has changed to ZSH. Unless changing back to Bash, follow the ZSH instructions.

Add the following to ~/.bash_profile:

shell
. "$HOME/.asdf/asdf.sh"

Completions must be configured manually with the following entry in your .bash_profile:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

Add asdf.sh to your ~/.bashrc with:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bashrc

Completions will need to be configured as per Homebrew's instructions or with the following:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Bash & Homebrew (macOS)

If using macOS Catalina or newer, the default shell has changed to ZSH. Unless changing back to Bash, follow the ZSH instructions.

Add asdf.sh to your ~/.bash_profile with:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bash_profile

Completions will need to be configured as per Homebrew's instructions or with the following:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Bash & Pacman

Add the following to ~/.bashrc:

shell
. /opt/asdf-vm/asdf.sh

bash-completion needs to be installed for the completions to work.

Fish & Git

Add the following to ~/.config/fish/config.fish:

shell
source ~/.asdf/asdf.fish

Completions must be configured manually with the following command:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

Add asdf.fish to your ~/.config/fish/config.fish with:

shell
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

Completions are handled by Homebrew for the Fish shell. Friendly!

Fish & Pacman

Add the following to ~/.config/fish/config.fish:

shell
source /opt/asdf-vm/asdf.fish

Completions are automatically configured on installation by the AUR package.

Elvish & Git

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

Completions are automatically configured.

Elvish & Homebrew

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

Completions are automatically configured.

Elvish & Pacman

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

Completions are automatically configured.

ZSH & Git

Add the following to ~/.zshrc:

shell
. "$HOME/.asdf/asdf.sh"

OR use a ZSH Framework plugin like asdf for oh-my-zsh which will source this script and setup completions.

Completions are configured by either a ZSH Framework asdf plugin or by adding the following to your .zshrc:

shell
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • if you are using a custom compinit setup, ensure compinit is below your sourcing of asdf.sh
  • if you are using a custom compinit setup with a ZSH Framework, ensure compinit is below your sourcing of the framework

Warning

If you are using a ZSH Framework the associated asdf plugin may need to be updated to use the new ZSH completions properly via fpath. The Oh-My-ZSH asdf plugin is yet to be updated, see ohmyzsh/ohmyzsh#8837.

ZSH & Homebrew

Add asdf.sh to your ~/.zshrc with:

shell
echo -e "\\n. $(brew --prefix asdf)/libexec/asdf.sh" >> \${ZDOTDIR:-~}/.zshrc

OR use a ZSH Framework plugin like asdf for oh-my-zsh which will source this script and setup completions.

Completions are configured by either a ZSH Framework asdf or will need to be configured as per Homebrew's instructions. If you are using a ZSH Framework the associated plugin for asdf may need to be updated to use the new ZSH completions properly via fpath. The Oh-My-ZSH asdf plugin is yet to be updated, see ohmyzsh/ohmyzsh#8837.

ZSH & Pacman

Add the following to ~/.zshrc:

shell
. /opt/asdf-vm/asdf.sh

Completions are placed in a ZSH friendly location, but ZSH must be configured to use the autocompletions.

PowerShell Core & Git

Add the following to ~/.config/powershell/profile.ps1:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

Add asdf.sh to your ~/.config/powershell/profile.ps1 with:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

Add the following to ~/.config/powershell/profile.ps1:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

Add asdf.nu to your ~/.config/nushell/config.nu with:

shell
"\\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

Completions are automatically configured

Nushell & Homebrew

Add asdf.nu to your ~/.config/nushell/config.nu with:

shell
"\\n$env.ASDF_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\\n source " +  (brew --prefix asdf | str trim | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path

Completions are automatically configured

Nushell & Pacman

Add asdf.nu to your ~/.config/nushell/config.nu with:

shell
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

Completions are automatically configured.

POSIX Shell & Git

Add the following to ~/.profile:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

Add asdf.sh to your ~/.profile with:

shell
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
POSIX Shell & Pacman

Add the following to ~/.profile:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

asdf scripts need to be sourced after you have set your $PATH and after you have sourced your framework (oh-my-zsh etc).

WARNING

On macOS, starting a Bash or Zsh shell automatically calls a utility called path_helper. path_helper can rearrange items in PATH (and MANPATH), causing inconsistent behavior for tools that require specific ordering. To workaround this, asdf on macOS defaults to forcily adding its PATH-entries to the front (taking highest priority). This is controllable with the ASDF_FORCE_PREPEND variable.

Restart your shell so that PATH changes take effect. Opening a new terminal tab will usually do it.

Core Installation Complete!

This completes the installation of the asdf core 🎉

asdf is only useful once you install a plugin, install a tool and manage its versions. Continue the guide below to learn how to do this.

4. Install a Plugin

For demonstration purposes we will install & set Node.js via the asdf-nodejs plugin.

Plugin Dependencies

Each plugin has dependencies so we need to check the plugin repo where they should be listed. For asdf-nodejs they are:

OSDependency Installation
Debianapt-get install dirmngr gpg curl gawk
CentOS/ Rocky Linux/ AlmaLinuxyum install gnupg2 curl gawk
macOSbrew install gpg gawk

We should install dependencies first as some Plugins have post-install hooks.

Install the Plugin

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. Install a Version

Now we have a plugin for Node.js we can install a version of the tool.

We can see which versions are available with asdf list all nodejs or a subset of versions with asdf list all nodejs 14.

We will just install the latest available version:

shell
asdf install nodejs latest

Note

asdf enforces exact versions. latest is a helper throughout asdf that will resolve to the actual version number at the time of execution.

6. Set a Version

asdf performs a version lookup of a tool in all .tool-versions files from the current working directory up to the $HOME directory. The lookup occurs just-in-time when you execute a tool that asdf manages.

WARNING

Without a version listed for a tool execution of the tool will error. asdf current will show you the tool & version resolution, or absence of, from your current directory so you can observe which tools will fail to execute.

Global

Global defaults are managed in $HOME/.tool-versions. Set a global version with:

shell
asdf global nodejs latest

$HOME/.tool-versions will then look like:

nodejs 16.5.0

Some OSs already have tools installed that are managed by the system and not asdf, python is a common example. You need to tell asdf to pass the management back to the system. The Versions reference section will guide you.

Local

Local versions are defined in the $PWD/.tool-versions file (your current working directory). Usually, this will be the Git repository for a project. When in your desired directory execute:

shell
asdf local nodejs latest

$PWD/.tool-versions will then look like:

nodejs 16.5.0

Using Existing Tool Version Files

asdf supports the migration from existing version files from other version managers. Eg: .ruby-version for the case of rbenv. This is supported on a per-plugin basis.

asdf-nodejs supports this via both .nvmrc and .node-version files. To enable this, add the following to your asdf configuration file $HOME/.asdfrc:

legacy_version_file = yes

See the configuration reference page for more config options.

Guide Complete!

That completes the Getting Started guide for asdf 🎉 You can now manage nodejs versions for your project. Follow similar steps for each type of tool in your project!

asdf has many more commands to become familiar with, you can see them all by running asdf --help or asdf. The core of the commands are broken into three categories:

`,82)]))}const g=i(l,[["render",n]]);export{c as __pageData,g as default}; diff --git a/assets/guide_getting-started.md.C3BDv6cZ.lean.js b/assets/guide_getting-started.md.C3BDv6cZ.lean.js new file mode 100644 index 00000000..f83c6c56 --- /dev/null +++ b/assets/guide_getting-started.md.C3BDv6cZ.lean.js @@ -0,0 +1,13 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"Getting Started","description":"","frontmatter":{},"headers":[],"relativePath":"guide/getting-started.md","filePath":"guide/getting-started.md","lastUpdated":1724080713000}'),l={name:"guide/getting-started.md"};function n(h,s,o,p,d,r){return t(),a("div",null,s[0]||(s[0]=[e(`

Getting Started

asdf installation involves:

  1. Installing dependencies
  2. Downloading asdf core
  3. Installing asdf
  4. Installing a plugin for each tool/runtime you wish to manage
  5. Installing a version of the tool/runtime
  6. Setting global and project versions via .tool-versions config files

1. Install Dependencies

asdf primarily requires git & curl. Here is a non-exhaustive list of commands to run for your package manager (some might automatically install these tools in later steps).

OSPackage ManagerCommand
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

Note

sudo may be required depending on your system configuration.

2. Download asdf

Official Download

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1

Community Supported Download Methods

We highly recommend using the official git method.

MethodCommand
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper

3. Install asdf

There are many different combinations of Shells, OSs & Installation methods all of which affect the configuration here. Expand the selection below that best matches your system.

macOS users, be sure to read the warning about path_helper at the end of this section.

Bash & Git

Add the following to ~/.bashrc:

shell
. "$HOME/.asdf/asdf.sh"

Completions must be configured by adding the following to your .bashrc:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

If using macOS Catalina or newer, the default shell has changed to ZSH. Unless changing back to Bash, follow the ZSH instructions.

Add the following to ~/.bash_profile:

shell
. "$HOME/.asdf/asdf.sh"

Completions must be configured manually with the following entry in your .bash_profile:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

Add asdf.sh to your ~/.bashrc with:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bashrc

Completions will need to be configured as per Homebrew's instructions or with the following:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Bash & Homebrew (macOS)

If using macOS Catalina or newer, the default shell has changed to ZSH. Unless changing back to Bash, follow the ZSH instructions.

Add asdf.sh to your ~/.bash_profile with:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bash_profile

Completions will need to be configured as per Homebrew's instructions or with the following:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Bash & Pacman

Add the following to ~/.bashrc:

shell
. /opt/asdf-vm/asdf.sh

bash-completion needs to be installed for the completions to work.

Fish & Git

Add the following to ~/.config/fish/config.fish:

shell
source ~/.asdf/asdf.fish

Completions must be configured manually with the following command:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

Add asdf.fish to your ~/.config/fish/config.fish with:

shell
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

Completions are handled by Homebrew for the Fish shell. Friendly!

Fish & Pacman

Add the following to ~/.config/fish/config.fish:

shell
source /opt/asdf-vm/asdf.fish

Completions are automatically configured on installation by the AUR package.

Elvish & Git

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

Completions are automatically configured.

Elvish & Homebrew

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

Completions are automatically configured.

Elvish & Pacman

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

Completions are automatically configured.

ZSH & Git

Add the following to ~/.zshrc:

shell
. "$HOME/.asdf/asdf.sh"

OR use a ZSH Framework plugin like asdf for oh-my-zsh which will source this script and setup completions.

Completions are configured by either a ZSH Framework asdf plugin or by adding the following to your .zshrc:

shell
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • if you are using a custom compinit setup, ensure compinit is below your sourcing of asdf.sh
  • if you are using a custom compinit setup with a ZSH Framework, ensure compinit is below your sourcing of the framework

Warning

If you are using a ZSH Framework the associated asdf plugin may need to be updated to use the new ZSH completions properly via fpath. The Oh-My-ZSH asdf plugin is yet to be updated, see ohmyzsh/ohmyzsh#8837.

ZSH & Homebrew

Add asdf.sh to your ~/.zshrc with:

shell
echo -e "\\n. $(brew --prefix asdf)/libexec/asdf.sh" >> \${ZDOTDIR:-~}/.zshrc

OR use a ZSH Framework plugin like asdf for oh-my-zsh which will source this script and setup completions.

Completions are configured by either a ZSH Framework asdf or will need to be configured as per Homebrew's instructions. If you are using a ZSH Framework the associated plugin for asdf may need to be updated to use the new ZSH completions properly via fpath. The Oh-My-ZSH asdf plugin is yet to be updated, see ohmyzsh/ohmyzsh#8837.

ZSH & Pacman

Add the following to ~/.zshrc:

shell
. /opt/asdf-vm/asdf.sh

Completions are placed in a ZSH friendly location, but ZSH must be configured to use the autocompletions.

PowerShell Core & Git

Add the following to ~/.config/powershell/profile.ps1:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

Add asdf.sh to your ~/.config/powershell/profile.ps1 with:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

Add the following to ~/.config/powershell/profile.ps1:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

Add asdf.nu to your ~/.config/nushell/config.nu with:

shell
"\\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

Completions are automatically configured

Nushell & Homebrew

Add asdf.nu to your ~/.config/nushell/config.nu with:

shell
"\\n$env.ASDF_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\\n source " +  (brew --prefix asdf | str trim | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path

Completions are automatically configured

Nushell & Pacman

Add asdf.nu to your ~/.config/nushell/config.nu with:

shell
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

Completions are automatically configured.

POSIX Shell & Git

Add the following to ~/.profile:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

Add asdf.sh to your ~/.profile with:

shell
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
POSIX Shell & Pacman

Add the following to ~/.profile:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

asdf scripts need to be sourced after you have set your $PATH and after you have sourced your framework (oh-my-zsh etc).

WARNING

On macOS, starting a Bash or Zsh shell automatically calls a utility called path_helper. path_helper can rearrange items in PATH (and MANPATH), causing inconsistent behavior for tools that require specific ordering. To workaround this, asdf on macOS defaults to forcily adding its PATH-entries to the front (taking highest priority). This is controllable with the ASDF_FORCE_PREPEND variable.

Restart your shell so that PATH changes take effect. Opening a new terminal tab will usually do it.

Core Installation Complete!

This completes the installation of the asdf core 🎉

asdf is only useful once you install a plugin, install a tool and manage its versions. Continue the guide below to learn how to do this.

4. Install a Plugin

For demonstration purposes we will install & set Node.js via the asdf-nodejs plugin.

Plugin Dependencies

Each plugin has dependencies so we need to check the plugin repo where they should be listed. For asdf-nodejs they are:

OSDependency Installation
Debianapt-get install dirmngr gpg curl gawk
CentOS/ Rocky Linux/ AlmaLinuxyum install gnupg2 curl gawk
macOSbrew install gpg gawk

We should install dependencies first as some Plugins have post-install hooks.

Install the Plugin

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. Install a Version

Now we have a plugin for Node.js we can install a version of the tool.

We can see which versions are available with asdf list all nodejs or a subset of versions with asdf list all nodejs 14.

We will just install the latest available version:

shell
asdf install nodejs latest

Note

asdf enforces exact versions. latest is a helper throughout asdf that will resolve to the actual version number at the time of execution.

6. Set a Version

asdf performs a version lookup of a tool in all .tool-versions files from the current working directory up to the $HOME directory. The lookup occurs just-in-time when you execute a tool that asdf manages.

WARNING

Without a version listed for a tool execution of the tool will error. asdf current will show you the tool & version resolution, or absence of, from your current directory so you can observe which tools will fail to execute.

Global

Global defaults are managed in $HOME/.tool-versions. Set a global version with:

shell
asdf global nodejs latest

$HOME/.tool-versions will then look like:

nodejs 16.5.0

Some OSs already have tools installed that are managed by the system and not asdf, python is a common example. You need to tell asdf to pass the management back to the system. The Versions reference section will guide you.

Local

Local versions are defined in the $PWD/.tool-versions file (your current working directory). Usually, this will be the Git repository for a project. When in your desired directory execute:

shell
asdf local nodejs latest

$PWD/.tool-versions will then look like:

nodejs 16.5.0

Using Existing Tool Version Files

asdf supports the migration from existing version files from other version managers. Eg: .ruby-version for the case of rbenv. This is supported on a per-plugin basis.

asdf-nodejs supports this via both .nvmrc and .node-version files. To enable this, add the following to your asdf configuration file $HOME/.asdfrc:

legacy_version_file = yes

See the configuration reference page for more config options.

Guide Complete!

That completes the Getting Started guide for asdf 🎉 You can now manage nodejs versions for your project. Follow similar steps for each type of tool in your project!

asdf has many more commands to become familiar with, you can see them all by running asdf --help or asdf. The core of the commands are broken into three categories:

`,82)]))}const g=i(l,[["render",n]]);export{c as __pageData,g as default}; diff --git a/assets/guide_introduction.md.D7TZl5Xp.js b/assets/guide_introduction.md.D7TZl5Xp.js new file mode 100644 index 00000000..9290e979 --- /dev/null +++ b/assets/guide_introduction.md.D7TZl5Xp.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as t,o as n}from"./chunks/framework.C9NVOr0y.js";const p=JSON.parse('{"title":"Introduction","description":"","frontmatter":{},"headers":[],"relativePath":"guide/introduction.md","filePath":"guide/introduction.md","lastUpdated":1629230537000}'),r={name:"guide/introduction.md"};function i(s,e,d,c,l,h){return n(),o("div",null,e[0]||(e[0]=[t('

Introduction

asdf is a tool version manager. All tool version definitions are contained within one file (.tool-versions) which you can check in to your project's Git repository to share with your team, ensuring everyone is using the exact same versions of tools.

The old way of working required multiple CLI version managers, each with their distinct API, configurations files and implementation (e.g. $PATH manipulation, shims, environment variables, etc...). asdf provides a single interface and configuration file to simplify development workflows, and can be extended to all tools and runtimes via a simple plugin interface.

How It Works

Once asdf core is set up with your Shell configuration, plugins are installed to manage particular tools. When a tool is installed by a plugin, the executables that are installed have shims created for each of them. When you try and run one of these executables, the shim is run instead, allowing asdf to identify which version of the tool is set in .tool-versions and execute that version.

nvm / n / rbenv etc

Tools like nvm, n and rbenv are all written as Shell scripts which create shims for the executables installed by these tools.

asdf is very similar and was built to compete in this space of tool/runtime version management. The differentiating factor for asdf is its plugin system which removes the need for a manager per tool/runtime, different commands per manager and different *-version files in your repo.

direnv

augments existing shells with a new feature that can load and unload environment variables depending on the current directory.

asdf does not manage Environment Variables, however there is a plugin asdf-direnv to integrate direnv behaviour with asdf.

See direnv docs for more.

Homebrew

The Missing Package Manager for macOS (or Linux)

Homebrew manages your packages and their upstream dependencies. asdf does not manage upstream dependencies, it is not a package manager, that burden is upon the user, though we try and keep the dependency list small.

See Homebrew docs for more.

NixOS

Nix is a tool that takes a unique approach to package management and system configuration

NixOS aims to build truly reproducible environments by managing exact versions of packages up the entire dependency tree of each tool, something asdf does not do. NixOS does this with its own programming language, many CLI tools and a package collection of over 60,000 packages.

Again, asdf does not manage upstream dependencies and is not a package manager.

See NixOS docs for more.

Why use asdf?

asdf ensures teams are using the exact same versions of tools, with support for many tools via a plugin system, and the simplicity and familiarity of being a single Shell script you include in your Shell config.

Note

asdf is not intended to be a system package manager. It is a tool version manager. Just because you can create a plugin for any tool and manage its versions with asdf, does not mean that is the best course of action for that specific tool.

',25)]))}const m=a(r,[["render",i]]);export{p as __pageData,m as default}; diff --git a/assets/guide_introduction.md.D7TZl5Xp.lean.js b/assets/guide_introduction.md.D7TZl5Xp.lean.js new file mode 100644 index 00000000..9290e979 --- /dev/null +++ b/assets/guide_introduction.md.D7TZl5Xp.lean.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as t,o as n}from"./chunks/framework.C9NVOr0y.js";const p=JSON.parse('{"title":"Introduction","description":"","frontmatter":{},"headers":[],"relativePath":"guide/introduction.md","filePath":"guide/introduction.md","lastUpdated":1629230537000}'),r={name:"guide/introduction.md"};function i(s,e,d,c,l,h){return n(),o("div",null,e[0]||(e[0]=[t('

Introduction

asdf is a tool version manager. All tool version definitions are contained within one file (.tool-versions) which you can check in to your project's Git repository to share with your team, ensuring everyone is using the exact same versions of tools.

The old way of working required multiple CLI version managers, each with their distinct API, configurations files and implementation (e.g. $PATH manipulation, shims, environment variables, etc...). asdf provides a single interface and configuration file to simplify development workflows, and can be extended to all tools and runtimes via a simple plugin interface.

How It Works

Once asdf core is set up with your Shell configuration, plugins are installed to manage particular tools. When a tool is installed by a plugin, the executables that are installed have shims created for each of them. When you try and run one of these executables, the shim is run instead, allowing asdf to identify which version of the tool is set in .tool-versions and execute that version.

nvm / n / rbenv etc

Tools like nvm, n and rbenv are all written as Shell scripts which create shims for the executables installed by these tools.

asdf is very similar and was built to compete in this space of tool/runtime version management. The differentiating factor for asdf is its plugin system which removes the need for a manager per tool/runtime, different commands per manager and different *-version files in your repo.

direnv

augments existing shells with a new feature that can load and unload environment variables depending on the current directory.

asdf does not manage Environment Variables, however there is a plugin asdf-direnv to integrate direnv behaviour with asdf.

See direnv docs for more.

Homebrew

The Missing Package Manager for macOS (or Linux)

Homebrew manages your packages and their upstream dependencies. asdf does not manage upstream dependencies, it is not a package manager, that burden is upon the user, though we try and keep the dependency list small.

See Homebrew docs for more.

NixOS

Nix is a tool that takes a unique approach to package management and system configuration

NixOS aims to build truly reproducible environments by managing exact versions of packages up the entire dependency tree of each tool, something asdf does not do. NixOS does this with its own programming language, many CLI tools and a package collection of over 60,000 packages.

Again, asdf does not manage upstream dependencies and is not a package manager.

See NixOS docs for more.

Why use asdf?

asdf ensures teams are using the exact same versions of tools, with support for many tools via a plugin system, and the simplicity and familiarity of being a single Shell script you include in your Shell config.

Note

asdf is not intended to be a system package manager. It is a tool version manager. Just because you can create a plugin for any tool and manage its versions with asdf, does not mean that is the best course of action for that specific tool.

',25)]))}const m=a(r,[["render",i]]);export{p as __pageData,m as default}; diff --git a/assets/index.md.CX4EfemI.js b/assets/index.md.CX4EfemI.js new file mode 100644 index 00000000..46c0282f --- /dev/null +++ b/assets/index.md.CX4EfemI.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as i}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"asdf","text":"The Multiple Runtime Version Manager","tagline":"Manage all your runtime versions with one tool!","actions":[{"theme":"brand","text":"Get Started","link":"/guide/getting-started"},{"theme":"alt","text":"What is asdf?","link":"/guide/introduction"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/asdf-vm/asdf"}]},"features":[{"title":"One Tool","details":"Manage each of your project runtimes with a single CLI tool and command interface.","icon":"🎉"},{"title":"Plugins","details":"Large ecosystem of existing runtimes & tools. Simple API to add support for new tools as you need!","icon":"🔌"},{"title":"Backwards Compatible","details":"Support for existing config files .nvmrc, .node-version, .ruby-version for smooth migration!","icon":"⏮"},{"title":"One Config File","details":".tool-versions to manage all your tools, runtimes and their versions in a single, sharable place.","icon":"📄"},{"title":"Shells","details":"Supports Bash, ZSH, Fish & Elvish with completions available.","icon":"🐚"},{"title":"GitHub Actions","details":"Provides a GitHub Action to install and utilize your .tool-versions in your CI/CD workflows.","icon":"🤖"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1700090238000}'),o={name:"index.md"};function n(a,s,l,r,d,c){return i(),t("div")}const p=e(o,[["render",n]]);export{u as __pageData,p as default}; diff --git a/assets/index.md.CX4EfemI.lean.js b/assets/index.md.CX4EfemI.lean.js new file mode 100644 index 00000000..46c0282f --- /dev/null +++ b/assets/index.md.CX4EfemI.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as i}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"asdf","text":"The Multiple Runtime Version Manager","tagline":"Manage all your runtime versions with one tool!","actions":[{"theme":"brand","text":"Get Started","link":"/guide/getting-started"},{"theme":"alt","text":"What is asdf?","link":"/guide/introduction"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/asdf-vm/asdf"}]},"features":[{"title":"One Tool","details":"Manage each of your project runtimes with a single CLI tool and command interface.","icon":"🎉"},{"title":"Plugins","details":"Large ecosystem of existing runtimes & tools. Simple API to add support for new tools as you need!","icon":"🔌"},{"title":"Backwards Compatible","details":"Support for existing config files .nvmrc, .node-version, .ruby-version for smooth migration!","icon":"⏮"},{"title":"One Config File","details":".tool-versions to manage all your tools, runtimes and their versions in a single, sharable place.","icon":"📄"},{"title":"Shells","details":"Supports Bash, ZSH, Fish & Elvish with completions available.","icon":"🐚"},{"title":"GitHub Actions","details":"Provides a GitHub Action to install and utilize your .tool-versions in your CI/CD workflows.","icon":"🤖"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1700090238000}'),o={name:"index.md"};function n(a,s,l,r,d,c){return i(),t("div")}const p=e(o,[["render",n]]);export{u as __pageData,p as default}; diff --git a/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 b/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b6b603d596933f026dfecf98550bbe4d0876276b GIT binary patch literal 43112 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 literal 0 HcmV?d00001 diff --git a/assets/inter-italic-cyrillic.By2_1cv3.woff2 b/assets/inter-italic-cyrillic.By2_1cv3.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..def40a4f658cf8a9f7029c98931f5c9ff5a00910 GIT binary patch literal 31300 zcmV(?K-a%_Pew8T0RR910D43K6951J0MIl50C~{>1ONa400000000000000000000 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 literal 0 HcmV?d00001 diff --git a/assets/inter-italic-greek.DJ8dCoTZ.woff2 b/assets/inter-italic-greek.DJ8dCoTZ.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a3c16ca40b2a8f454c34cfa91996ec99ae2e4aa0 GIT binary patch literal 32564 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 b6r&82^QQ+ZZ1?Zre-i}g|91_a`#}W>14e7b literal 0 HcmV?d00001 diff --git a/assets/inter-italic-latin-ext.CN1xVJS-.woff2 b/assets/inter-italic-latin-ext.CN1xVJS-.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2210a899edaeb06655f7bc50e7f94444da140b94 GIT binary patch literal 120840 zcmV)DK*7IvPew8T0RR910oVut6951J1HHHa0oRcL1ONa400000000000000000000 z0000QnkE~8yA~XRZa+v?K~kD9KTTFaQh_K2U_Vn-K~#ZUCo}+yXfJ^_3WDlfg1iJU ziP&-hHUcCAmn;j5SO5ed1&nkDAX`75ljLkj62WJ0vx~-VI!9E=SqdN`qweRwECW*1?Beg^e9`m3$G=b$U&8Y^EjENIiAzM(Co1o4 z_Tpa*c#8eo${c)hudU1nG$~V<7q=e!wZdEU#C~;O;Lqq@_zp|PNRVd=qLmw78mz&* z^q=pnm?(cMp%kC7aeTa}8HwTHdJMuY(d2zar|3E_vU@%>xZ5|S3FG3-JS0^S<99=u zTzML?Q3llNqTdWAVkfew-;UpdPN)4B5ksT6LUE##n#3-&gvjD5XdE9C_va6r-7g+x zolZlRcH9x;p-=I*x?ci#vK>z~Bw@m`97HLXIz0a*;m^}@{-1Mw?j2pvM%W}!0>x|8 zf%d65v$Is5i1g_PkvzFq8AOR8*->l5cJ)Ym@-Fv@)53Qp`d)da!zzVd-y46Lw zigF!wJk9z4b9R$#6bMpiDHVn4HSZ>&?|l{7&4vgTAb5m`6L-Xewbbpp3=etxw>2#J z`$Fy{B;TDRe@Q}eB?;;BeaZDDNm9w*5Ni!7Lx=*lFhEq`s|pzQCZQLFRp!* z7itFV{qN_+YSTn{L8)G9X z1ZDsR;T>T8ul_si%l0CF7#B4_b8C0ExJAK=9mm&!HoC6{VdFoKaJ8xGO1m4t zIZaCoO#D9ion3U>MN?q%f4k`Jw(Y{lJyJI&#mx z9RvmJqasr&4=5$sxa?nbB~96x-Er#`AVYU#Lp$kE`ukDrZDXePjYHhF+4d_WL-%1-DBtM4Mvm*4!a1YVh$-4&`8p~Qt>gwm}5X(x$k zW3{<-p*ZaU8~Z{C5YE0N_-nua?S7L`%n@&pm~Osu?hqnPL!((qM3W=W{kwM*p8of1 zvu5yg)}P>6lcnF$xSiN2jnlU@q-E~?Y@fU3F{i>Eyhlt0c23kMMU@n7nkJ=~z&9VF zIcpG$*hUO-3j_!R31WeO2MMmhEZ{{nK}spbDpzQ)P`#F?sa&u1llH84m20nO{R9kA zfE_SvQI6*R$sD>97TT&RU8~55Y9RU#lNVl|odpUV^P$el2mjoDQC9bDMbs^D$hLT- z0fFr#3-o_FvjhBJV6U_k;_fP_uEzFDf9%m(OAuhsXezhzyDniTQV3bQx`nx=fQ1;S zZt3o*OptU~W@gQYs;KW4ghB@FOt?7FJq`oI2)is?OWXXGXo@3Cpw7E&)c&uG$+-f7 zG1ZD?88kXIu}17cbU3`fFH@`Qe?@{ykZer>YRx3rW((?`-A|26&AKb7?sdkT{Li0& zD(fdGW@SO$i7Zl)NQk?Mf~3hxQ0hdLI86{B1yZJ+UAfxVkmMX8IR zx)(;81;I8HsqS%3Z5+o*>~ThGoH-o#IJe_Eb8_~0-{Tw)>&*SS|7WUI+J#218sLgc zP!5vTNN3mBAj4?5#@gt7RP_tR>aK=qHVok?Qs5YX90MB7k{pLNpc)X!M>#XbdP?Vg zX0yBOf@HnTCcJmy1@T@GZZ_e)%Pviiho@=HX68{sR)sD!7GYYEZYNjsuZMn=)>lDa zp->i&L|6yU|9j)%zc3grh0xihL%FMIo29j-Xe2}!NiqMYvt10yLprR3 z%WuP4LSuBpg}I#bNU%~hTS6;*;%AN@PDumjqULvBuDZ@X5QZ%Za)_yDLjpUNaOa{l zPkaYUXY3DPU;${jFIwS%C=Td^@ZkSzuT?Z(=21$@-%fX&N32vmZ|oXZv4~Eo#;S9S zF@Vg%MQvWTt5z3Uo{LIK?{LcvT3 zwzk0a7Nk?KXqs66pMpzgBc$5@{@^VH0l?!;AYEW#lSo-C zjR*gK`{(}~bFy=Jv6JM;l5FYc>shSj_f)e*g`|-fH9jMt=y`7Q*X2((U!)?&XDP%Q z>|qwRgE=IKYT`f*uO#5hD!pc9GF;~9i}>8iM&`UxF{bdeQT_Y(RAt#N%;V8CL1YjS zDMXBjG}4jD{B8XiHs3rH`{z-0_fgs(j}Ukv7-@n8kznS!ZMbR$-tDyJSdc;}?9Ib} z#Ifej8ggQp+l2naF~$XJgg^6!5@l*YT{uFOLb*;fuJ zsWJ^$dT!j+Qb#NP0tAT^ElCQ80)>jT)m{(1^wG~y!;PA0!WdizX9Fr+{-6=r}#P&4>YW*kCCbwp1I5g3-fT6^cznv8gCF9mQs% z*kTmhhGP35d?))rY5+w|=Gdjx`ImD6@LghA4)72FC*-qmc$MZYe1xy}kNBU+4ShQQ z6+M2;`R~)Wz-Ra&EjQ}xFf7x=01Dme*5PYFdSY7q@M$ni36@WNZskxC{&*!kD%Ox z@I%Muzok!|dZbOY`@E5;o@{5cSb3{6?gyv-3#^WPgaUdLG0<_xo9X6vejpxG@45T@ zsqeeW_UwPDaoqF6KN7v~yRV8KDShyhk2YVTpN_QqJ7Sm&y6=dUR#7JtnxibL7J6x}O5gT?UMGJ^;7k>o>gtKDzlO zn&a-D9BRKz9v}Gh6VFNM^>;%eO?&{~29%j`oMAN5Zrink0N!c9VLy!P%_1OLD+l;% z(}5KLa0I|n9BtpdTRis6i~cYgO8(IB$Gb%S%Upb0^c#2THQ8^HvdwLNbN$`p8-KU) z#L=TSK8`za;{UJ49Y68rpN`#K`ThNqIr3&Z>gdV04}7&Sy?ykf%oJ~TV_%(q=jc;AM*s9h#L%`sFTQtw=FjU-PHzA6(^uMq{<8Y6efhs^(2O=e zJv#iC+aDPk{_Do$ySM-K=GhMUUmqU2f9ZWI04U~&md_;@kV{v;w|Dlj1{nUf3hCzT)fA7 zupx?jU+0BWYxjEhH7?!je_pvyosTz`?hQWEUcR^g@`=ee;?X^W_e+m9&)r`;f8qfI z?(JQEAY4C_+`rLe-UGX({&f%4ehN1p?ELu2g$KKv1@-;9Dm)bY0&YCix>B_t>Rrj9 z2wDH(W4jyL*AI_B-20JZ6EyRq$96Tm@Ad~DEYTkcPd{qx9~*cyc)B1rZvEI1MV+9w zAA9W9S>oTy-idcMf0*N~#|*?#4N*bN*@N!-ZU$`T^Xr&mnwU0362$ z1nUYJ^WHz!vG4+Z>2C6KE2k9Uiz{dE%G0xGqVqF`jF04}%sp!Qv*vzM{H(v9s(!RG z+$q0(V$nBMKRcpy1~U!a=lVbUzEoGgk+Npt141<^=cB6TD;l=>2<-?diVu z=RdF*_!YPIg6!5$y`a0kC@Qc2(ELPC^fCWlR=(GNfYnVc{pQcwWA^NDJie>vz+Fdn z^#&(%xOeMEUmNQqKIk6gM`P-IsLk*YAO;KM-QS@R#E0 z4`@?V*y7_m)$wRYJ|xg*tgVamE4QExwWqB65PZ_Q3+hjq_oY5}pJzT`9fB?iNqe7m ze}s=}Q<8g+c8}!Ur9CL${;R)`qW?XLTif1~2b>>pDi?w`FY{}-$= zSvX3pkYD}4IGe=(>Y<1ExiMR|zIbRse_?8TXno;~aJS01SGn;I|Kosv{+}IY|5DaZ z7Ko=mq94fnxPC~14<7|e_a*6o`LG+o{Diz$2{-oNr}UdAcMb0zSL8jcY{RDte@Yuf z_%m8RrSH}5S6i(U_iO&1kzp0?S4T$&G{b|sJkGPe_V+A4qaBsstLsOl_Zo|DLxumz zUzsf*k3Jy0&$#!Y<9jB!>Dj%<_Z&XD*K(Ej3X6VRe3xY&Vc%t!zc|13R6H@h_3ZSk z6CaG2ql0UR@ z?1XfXcu#ouDXoDH_tCxTt(T0k+IX^aqncA)+2qF!e6*hk>htloO`K1*G>Ag2r?Gdq z+gUogx4FDD+tXer#hzx6VO%Ef>3*8-(m`?y-CCX&gH{KG;}Z ziKk=Qg9B*LzVtJ<4VgR6Ifs`1BD<|8<@TA(ex0qO&CcrV-mufz1zVx2%BR_TVc z4<0dHq@E*&;&0FF`_w8*$45X85#!48f99;0`~G=2%-hdSnm~B>!9DwV^7-7h8N2YM z@ZlYBb-#aZLMV65*C};CB~frF?(PLJDAb%_Pff#G492?bFl`tSUlIUuufx9wtYD~p zY23{{_I@kw*H8GHdPKF+6B8zFW;otew-Q^3{9IZjL1n}C{&I&5i1*3rH^BT(FH__q zefL!X@92f(tuqzGXfR5C+O>W00L-$dDFy*b(iAVC0|(nYK&+hCtN?)rFeW)?*NR2E z6{xhoOlYnu$_#Xo3TK&ViJzLGVT~}{c0cJTNkv438h5CG$*}8i`HaB%nSTph0?1Vj8ATG!jYlsWEqj#%Y2kX*!yh$)W{mjK0t!Ek)mCFItYi zOI<%&k=|!U3(@AVd4-lMm$oKR%)G2*LvYy#c*AoC@CC)^rJnL&s`IK==Pf5y@ z`NO|o&_!L+qI(uWBJ2$(LM^&l(=fBBWv(u3l?;w`T&M0#kz$w8HQd5^Ok;8boZq|-;4rdwm9iIjbxRMFDkVAi93crsIs_9{n#$pLW16xVQ@YC4qF${} zsRD1!*0Mqk4HzA|s++I)Pr>M96X$N7Woj_D;f#^Zb4S1fcu^{S8qQY6VL zV+q^je822bzT}DC;YA~fAM+SGyX&&oj~glP0FEO2E`GNDRIo!G?`I9_K>};VH=`tK zQ;E{a92XC4yN^8B17Q%lL7sdEkRgU4=i^b93dp+ji-3q`N9G*Ut>k4N`=4&KYrmL)cIlqxA1Q=OYK?P$Kq>6jEP~^xWDuEAGQN^Re45Ba-q!MW} z*kvtrj=nJ@#>Lcofx3vqoJflF$d5yDE^a7{ZU7*nmH?=W`fI4hD^7{ppd1zJq6j@U zPqwj31q3Rl>Ue)TM)AZ-xST;1d`cmaEGITD%|eM#o*U=pZRtif$GHBw0EBxJilt;$ z;+;X@WSSTkv@u_odj!@Ix4hf&TGdj{1=mFUPM+oj(q*%GX*w zhWEjp@wx|M2cQ8j-_XJ2wU=$FV*k%8mI1klSN3D2`9+Un-b%bkD&>xtk@{09`C>0* z!RJ!(;Mp35EQ@hL&M}UCd17=DoMPz1)|)r}1A0+#fIU9I{C0L4yan&2x_`M9PWHQq z-7n)(Lo&`c-f-lq!I-COnV%1DWgF2C`W5}(thVp2B6*~Yq$-%;>s(c_FZ14)-Ntu} zxAV8dSE4@Is4n1*w&;g40CJ;07Ww!3U;L9^;q!dhUn=ENX{mRXiPogv&)d)M<-hO- z{2qTI7hB?=8~aGB5;O7lXY3MI_(grTcI5uck16@Jv#&*){K}`S@Lm5&|33UKmX6r| z2M!{-=WIyc9m{ZOOwM10WiO|qz-qR8|A;ftc)s*J#Mwmx7B*Zup8BmEzi^>RjCY6R zT)bU;f6Ttbu6qp!nD3HDaTad&J1Yh$jhM*WS@(M?#1rYo+r&S(Y`XARI{!N!psyRC z*V3=>IqvtB-n_X17Vk|i#UOIuOMTxk0Gjh%Ix`xe{bFnS@iDnOc+($F#h>^wAG=_} z+v5B{|1Li3Z+L#R;|+c++XKQEmY;l?2l;ax6JE}9dAwtjK^$msrGK@J-}+totA9`z z#Ba6UG4bHW9zpbxa#aO&yc~~;yKKq7EhEw6%LnjQ+{K3e8RGs*za7K3mjOW~ez@z$ z>8toU{)S>N+w%*36uWJ?2&(W@cJy!emDhMlezoB#z)n7?Kc_A}@>>@dwz->pqpip+ zyW%aufC=501lcCIM#=1k8nI15dIDyw6EA$VT-*< zRjcG;35ZE{=w;W(Jq)odbsa#s3}C#G-xiz#;J>Z}(6y|bUL>rVPO2 zI;|3>C)6!*7jr=`!f&{c46RstBb~P8XeW_(tJGevg#Z8aVK4!J&++j5^F_HVFm)%M z8TX1Qfy2vFboUkx@d+>N7=9!7?{dI9IL>@bk~n3&$^zG*cKjAwBmPC6J$;qkiap*# z{-8zCV`VSXc)Sn(5F1&Ow~bG9IZ6h6f#m+>a78l&UdvB>dF<)`!%T3Ee01Iu16c8e z%wIn(hq@#2Qa{JHDLzQgex#=y=hNnF1zy=%3AJVn{E<9&868nyC$_%FwkX0Njj>=zz|;+6N1z z5XSm(RNKXHAMx?#yfu!ol?UX4VNf2F2b+iw(;3t8Nz7hLRb1hZUoJWeS4)H6r_V06 zx>^DLt62D60Ig39drjNX=pUbN`+ITKrRcWqZJCYpAE_6Tjy)sq@_sl>78PqimDOS& zS6D&@5zN1HoUZ{>3r?yIZ|oE_dD9QB4hl`F1I-s-CkdVAqVRv1+q zra}e3i;J7#G)bjyN2UZeUixex4hK#;^cx1N`_POg4!xhf011uk+b^V1@mn^iq=!e= zgGSVPoDUCj>lEILbNxk!~41u7vzJ@J{RHvvv?IM z_Znp|uNF8R>-m z6-dCY;g9M!ZQ-z0raV+`TRZ4a1jp<*hMx6--UIwSwk*J|=u*XB3b^q)0Y3EjNe=q* zN@{ORdRn~hy|_Cuxze4HPiP-8b5;(IA-`kIvBEp9w3$M&6p`o&vY&v9H>!_0*4Q>x zlW;0p`>Imsy*)YyOtra19umJdfa)nQ`MCDdfV!1f=hPDAU3FlR$3*u-`kX;*{P*UW0WPAnZr#RqfYMPD-Hc6 zkIVX)8*(>ip18x?)5|`7H3Yd1JaLB3ALI2ZF-h-|v-B-1*N_P+vJVr7Atpz9OxZJ= z*}eJ)c6L9PU7^Fumr8w zyI}$(G|tZ>G;fGV(c;Dn#2|ZSUB`~?j$FBm&W}6i z{Fqy=IBXmR_!AvR*8DURkhh$w0ANmb0`>ZMpXAB!s26^i_X86L5{0JG8B7+N!{tdz z%gD;fD<~={ixjr(*mK~>6^p+BY=MFV3&E+vZvz1QT*M$27f*^*Y0~j!$dXMUN3J~i z3KS|*qEwj*m8w*$QL9e9MndBzOqwxk&b$R;5{s5B=be!ZNRVJ5LLE~MkAR4TjE0VZ ziG_`WOU=xxnoSM6TF%$%0S5p`Z^)2IGGlo8G-=kNRhur|0-Kr3jymSJ6HW#vVe=MLm^Krf z&GM2so*gFlM(ywo*-vGD7oTZ0b(`i;^Tae}%$lR7p`|lV&%nsU%)$!EwgD>*T8#bW zYZ(?KeL@xW5^rC-(r0n8Pa^p#Y;fnnGkcu{-20x=+8@em?o+*^gnng9&x~*PR zp-^AzwhkJdkHK0000000000005u0#xC2{pc6N6LpO3`H*r%pOE;hG z+Zp{%?RN@4&oK>`rf!yQUe-qvrd->fXSIxLX^EWc1YO+}iEjr!yJwo36h^8uG!nz*Beiwm?CG`>^&J2z`)=K%^+qV#EfwWbiXWAR&Ar3b6|bWFgm3 z5K5>*9SRL9Xrn5^$kYvz44EV|mU0y;)u>gcUL&C<&04f-)2^c*DcnFYgDjh>V7!Dk zl*ey@1Au!2P*y5-QMH#IeFpY1w4af`7&B$YoCQk=Frm~m9NaSso8 zI>pOr-p=rI-USy0x+26?p~8fV^q(l#M7u7=4Y6*zCEjg!+;vZ)`;z<*)uI72l98e? zicqXfIidi~M`j)i^H`WNFfk8hVivk_f`EXGRfJtFr+O}K9*w+wnlx+Csx3OZ8$IaN zXTYGL7_Ko!T#Sk_<0ed+GHu4Jam#3$(J`@bwCm7`>kXbR{M;S8x&wJUn{Sb~l$lgJ}u$Eji_yTe`Xc8_2Bm0$Z!{%y@4CU41uoQ~$XkYCpE<%5rc;$MXw zDzv9t1l%!)Kv) zBDkp^0{ogQ^~m+tI`K^zTG?b@2bSSRik;SO6wv{#UyhYx$qA}qf7pN@$%YkiFDTc)- zBSuM#88>0lXH%xr%-q|y{=?D?yFt)yx5k{d;*r}4>rJlGPXOMkH&~bl_O&>V7n=bv^!7BCl;m@x5{$<&-%YM?c;}kJI z)qJ31U~0kAimfd^zx21aI_-|PXt(5c@Y&*Q_%yJofgQJDC(=xdxJ{SwuYXJY+CZvc zz^5LIFW@;gDcDH7rhPq#H;8k8?Qi_8zw`J0!9V&Z|LkA6YQAT9nS>V)tQ>z4qB(GIcI= zy8C5WaX}LX-R7or{kaQ-WFJtcPMtb+>eQ)Ir>?ju^1KeLv_Z{Nj&Ae=zIlp*wlWP( zzP_;_03H|aX5N*Dt6k%IH@IKJP6bteGMBjlt*z2|7VCj(E89vx6GSy+(yPaZ_fF(?FhdH&vv~meVWB zu|9^}S+Z-aJjNMs!g>G4HHopNrgfd?^WWILWAlzrFY$R}{ooHnd+{*FNqxhV?T=wc z4pb9L`*U5osO(WU)FJoVY;DU-SB+aK-+T%_TOeXQ*+%XX#k2m4#wmbNc1{(XNrK^} z5O?t((8p&AxbTumz(PgB=NujQMM2n+=@&YaENC-7*N&ufYz#U}S7)J{*Qb5eri0X5m&@Mal4N%g<0e4 zr*fgIxbm-T66L|`j(Pq~3EB|2Noe2HYWtlcx6Ihq*e#?VW1xUJj69V0X5C+bYUZD% z>)OrGqkkV^TwbUcL54K8wDee6tX%+^Aws>&+forvqq?$-gYX##hl{-VO+4Hu2UmP* zdG{Bn>2}A+H~}RBf!C8&Qu!q=k^Cm+#$$x|(n}Zh1SRg-d(T}`bu$tonK=(}E)QJM z#jrr8Z4$+fzPfr|{ci#}Z?qJA`267Dr?|=Eq%QW>w!Q-H9@o-%ZxD4<&3)^S4$u4Y zVy(`fT)F;;pvCUrc36nSj~?=u$fvjTdV7uVi(K&5J7%i`Jkn({QuM~0P_H+HZQ-|drL#TClROH_q*kzRdauhJW+>TkU2 ztV??hc7AWX3a?JRmUjVtMRl@C+O3N-y3*XMN=JFPTEgqG!;By1>N|U_&yM?Ai}J(R zOkHx32!px|)gw})e)M$x;N3vHZmTA|rjpn>_0`3_HNJuzLubrA{^j1HyRg&qdHhBq z(ueaSwU>P)-z&7I-R!TKB+(Yr{9j(qZX17BVpaA#19)vG3WywE6oGQ=Iaj=2ip=+~p~ zhd&1pO92lj3#7Rh-Bo*VHdOJ3&wK zq5oM}V2WyU`(iYL?6yutXXN7O+kZp6&I^89NTf!uf&R6-{>g==Qra>QNyz z6nw+09Yz?1n+e=3C!%rI2hGRZL>lV%W5l+BI@K-~Z$LyY8#`jqb|H&_=!u&A5$@j` z0uo0CZ&8c4pkREaloYjC zbwF+ZLg(S3-r11|LjEkW-4X3>ugdO`?F&_G$gYv;HJ1=(0gH?P5!eDYY!|rQm0%q@ z_Tw-(tRajG{iMk(fsCQYJYHZCS1`kRgK|MWN>unDph5vcKtsVk+qR>uEI9I#N&jKX zF<)!*)f0^NizzhHq|L~mW@O2UTzM}YDMGM3+e!INMg7sBGF^zQWGR72)(&0aU$pz< z3i+z4=}r+&$w?n`i9boktRB93GukEKt~2YnGo(n#MDFw1qY|(!s??-XlS&0lH>%~@ zS>JL)IHsps+HOO*SVdX4Ok0AI8SP@|d$$PgfQ7(23xRX+(c-^1^u@~I+V(9B)#75} ziDTGpw+j0A9Q>_Od@9qR0e$PqkO|u+7c}a6UtH~F)xadO5gAd`oKhU7JT(ao0|u5{ zXhi1N4vlHW_>I~mzAUPM4&r|UTj0lbD}^L<=4o?`%Lz$@lzHNH15izGrP=}>aP7g= z1O9CS#05aHHTKDb3?24H1ZqLih(Ie+#56#SCb$B?-erC3fFN&0BkbP?4sIb_%IyS( z5G0||DKE9G)e+bX7f0F#CzuD91WCG5(k{7TUXYPbWgNEDkzz|yF*%W0SVNnj41h|p z!YG>H!4v?bywPSYa4nOK>O^ zNhP5`6EaDkOwEI|#)Gg2a29QsC5hx#bdcBpo~D)@2QkOL_e}b_$WLz^NG=g?gsTxnKD|p*=@)o{GtVlnbGgTLc$KDwnHeiNiAj9I#2;0oic!CT5No`Ph`N+8T`^^*Aua|xu8`LkI9TOW-&Blh+ zODD#@70aNXzm6%<8UI!+Ss(e|5bdMiqeHZgz8rTZsYke0-AZ%)|9GK4j9zXwS*ksb zU)TKiyyDNB-_M4b{Vsi(4FdqIg5W%zw;K=`>P0Q6hZ$BeC_Q;JDF-O>cYTilv3(mk zs9pH#MjPNO-Sq_qev{kwAOTWO&07NFuLQk%AlW$d)(qg3;{si<fHjcjCp78#sP1}f$2P?9a0V&=rp0F!@yY=VJ zbRgcbOSj|c-HAo0t;~D2*XLijEBBH$-WDHReJVc!*N4!e%X#8%qV)XXO2L}RM|$(_ z)Z<4>Iq9xHS{$2`ihHb>B@6_`lmhPe`SG_Ib2U@l%f&sBPs`Q#!~u8<)|01@q`UNj z+762enyY&7bgwsC+DC1h`gx6X6>Ueg22EY4XG*RSy`uKTT-wE^+WVyjBnJA~9!I@T z6u=CX=Z@J@Wm0^vDaPW(l9f+62m*Hq$dWVy-tZ#fcp00r>!mIt^oZF@L6RN2C#?0GA*tNhVD>`)T^QX#l<*~{WRvE`MT zKJ(6}OhV#+?&r$(og{qEV2Hsa*=N7p!X6~w-;>GHmrh$cmzn-?i8B1*A@FrY{PHn2 z{>flKfjQaD_MHUHtK6%PxjYp$KIOAuYiQkR^y%=~*T{88t(R!W;8d9Uxi7}oU%a|t zm*d|L;3ou5ETcWHch8QM=nF0JbKharZ4;6|+0N`AQ3P&&oY;qtU+GgOAE(Vxif6u! zJB&32xcBR{FfT3tv^Ar@lux6<=1j1m?&R@~iqkftt*cxn)76979)7B7_|LCxdX|kY z8(wc2?oNYcgRBRcSxhBihS{MpEn~gk026f*mv$t=uhUY7*4yS_hN<7MY3BAMSQrbc zJ!E`9NZ!H~cIL~^89m~6(qy}{BAVWxMX?@lu-fBB6UjRt0}IxhL=ujYbr~6V1Sut( zv~>9RAwA^3^n1o7BZZnC;~~xr=_pq!yGc-5=mBS**j@6RHO&bZGnqGq&7ywc3L+Ws)A7G zm1!8TxjSqs-{Hnj7Va2696X>ckB(MVW(ja~(4S^_V=5SSCrf0+;KazV zb8?gt^X&Gd9UE&8*A(Z@Sz$v&Z*7{RXBt!1Or1wbwe0Fvg7ZHzh_YaIZ&o!iyd(c; zNpQf!uOq6Wdj*}BZ000WBiRFqAQuqT6i@f8FsreK| z!f$`~tFz5cTb5GX^HcWeveJziEDd`P4Zm0k*lm9hu->Xa+(O)dIrHk1*nr>d`0#1E z;9BJN?!m3Jb*dd;!7*Q5|MEYuDeXd^`!vaoiolAK-1-m00mFICy1y9M3(sB$pdmx1 zkSKk&M3fb$CvSRlqfcdn54|eaq@v*eCwrHuM1-D~2K+@yRidkbMj2-2$K!1%)XJXg zZp(&n)9sXOy1f&TJCsIr8>wEO9442bNAJ`bb<>@9vHvdCo9=p0BX>K@MJOV!Z{krU z09rfrDQWm4-QT_3vFjL_iS{e6exkJC#d#g*85Cs-uMy_#%0KvZY#7$2y0N@zW}bD9 zx#nHw@GDr!NUJ-*s9^nqY?T=s|7$F&VKu4d)K+cQ;kxL z7$O;?n4+0uc%W%uVy#6|$zo}`_HTuV#`Zemm8uQ=JdRhfv&T)Xl*5bN}!9yRrP z**mp~&>GX+_;&QEj;3@rgWIe(&Ech%O@kc)o{jCfr71p6^=Vq|V&J-K0+H^Ux1TisEk~Yg~D~D9htkrL9w^Wp8Tvru~*#u*>#o5+}ZCq0ywT`HyJ=G+8 zqo-rS_X)dc73)~WyhhsGvPW6dXlowTiJaZ8N9O4btsKX1zmdx5o>@*SmrlNUh4hLU zYT*4f=6_EK5L91yC?(m9iL9sRi&$H+ld72|A~gG|4Qv7y1F9l0Jqn&b#sk=1L8FRt zQ_D-Es%m|`V2g{?8$B77Gr3eBdJ`+%u%C`GTl@C5`F%c-%s)?6GQJwxUK*&@V09kP zuGwMk>dC9y;#k%Iun%`3z}fihJY@VC6;F@ zuQcB2d@}fEYEoI#Dw)-41zfJnTru=`?sLBjgPuDBMH5jRpzGjB#9Pw1uy4Bb3 zRRbCt)YyBJ#28It_E}3)SWSDE8Ja~kD=Y+_4K*Ab8~}Glgu5fby+Lq)FgzF;9*qW% zM~9cQ_j$T6Gkl%drF}CB(dEa0{Y+xDo{sDFc;1Zf?F4)0&M$Enc7GSwvg3mdw_}^w ziPbl~vQ2hi&5aGQl66dKp1!8QyJ0fY!bM?z8EsZh`(YLo!4UiCq>1=Ui9 zzRx^zjc98?ja)0%fbLy?op=>*4+)T|=u;bRkc|F+{f$yX-3qAWzh4P}{~18uqHehPWuJ640M*X`@QUdJlhZCskiFy@6k=v^Q{+1zqdShT zmIBj&@c~`~)0nAhguB!?fHyQunIAYD!8N%CaG14AIQB$r0B}RKJUIbhfu7@9BgL`W zgs4qH!&;|m5%vt23xvPuI(0yfbpfpcwn5V37G{M8GmD-ae24pRRAWqHLUvnBHYtrI z!gnBPE8rgFh#om`ZFuN7#JIYWlM5D#1}aPn;Y)NS*B;|ydW<=yM9>Aeb+%Gq;bJ19 z%rPcfc)(!XwKlUVZ#j3+1O^kOi>XZ17b(|4DUm1_XtLQgH zoZfaA1raAD6apnQMCJ(K&vicUa>`APJk$b$nGG0_%DztI!eN_MdYT$!fdwxV%(2uU zrGZ4!WZoLR>;*j`Z~CjJf37h)~OKf5uLNvB=4(QcC~TTJuSbZ$DWw<@&TVpmN(uthOL z9Y~OxWQ<-QkvYTa&{j2p$U+AzsVzdIp8~82~px$iMfX)Lbbxk$Z#j$SrrwW-a$|zS%$(-KjRx zMAlLR8r8p7AN^U@>5g51Vu&D*-+KgIakht;QDv1_ZC<3ZO+c5F(qqx!bg{WI{!2~e zGw@=BCM|Glp(yNXi*b%2dB7Z=dQzc+Yp&OIfiygHIwcZva7Xt4tcV|k2nIDIa}Z!* zwUX?TQQ(~s*i3rl2=`d77*OY-aogy0v7i0Q-5S}j-DWH=6`92yj4@2Zss>1q)*KGf z_@`QzQp|6C<9TSeMFVrZ3QNI8Jjy{!Xb1~3NzV9deO*Jl7Nsjg3Pp3L7=vnrKcS!^^&d}IZ;a(pU7Wb)x&q^SZy2L!s_=r_(!)lGkjV}Qd@NbJH+q#WgC)2=xjZrm51#u-Zl&~_II=x^b zk4Z2m3OYRNk%R4T@Y05gm-Ji1Qei&YGw2YSBYk;WmJz5b|BV+BUqQiv^iwaX3tsxsZAR+j!^C=+@3 zO+<8I+&>O2%0gz6O$JDGy8^AJYV6Alg<-%10HhikWVK5HJ~-JoZ7n5aq#U8W?4=zm z3g^1pz=4^ME~7HB4ptc~43N%XCWPQiP! zkO&t#oPoe*A98m`dyrTu;9Hf@n%J{|C+_!huaserEIltXyHD{@DioecJw`HV1o}OA zN9RV?Y&-PdxiUixhP|s&(73(p!m~;e)XE4S=>tlE+V6yN@iG>`P>ozePqc}AjWyIS zH-&xpP*?Aa+VPpFI9VlXF2)7hacZXIiyL|^^<)I`Vw{?2=r2`ak5rX5nG9@)o_Qf` zfO3;PNz7WBiuV=2^?hu5R58Q2a$VSO5t)2!yR^VSO`~Pn(Fo7fr_1E; zbbGrqD6Eot1H;LU!CtyX=d~ZZ&g{aoM2kjD-*2UZ^e=6FTX=V%wYkHgCYlu~oGaIj zZaQw3t^^aPE+9W%2O}7}Y!lqWCW&Gh=G%0pZ7+v{%Z=l3Rn3c1RGgMomL9sk`mtp+ z9HHPC7Gs{{Rcv~}eWmy=P3k)YT(CC})9Y}RCjD85g!M8E_tT0ZL;2u`bSofQuWL}H zfpekr7|8>bC!s!2Q-{f!t*Lo^74PiC+-vzD9j_2dy>0+GtjcE&r4-u7r`|=8{j+Th zf*9&*B=;qELuBy>v76PoURJtLDOG>9*p`bifql4#!E+*ZFD|nXqS1cEDsqjvbW>|F zyIB9wIT(tfC3aa)z)2mFCD9rV#XH{P|6_&%wj?SN4bbQo#M)Czs9T&iJL>ZZi(sTh zFlQ)@ZMoKrh7vgVuTgH6^`%RBdk5J-WPMF$A+Qs07GVNzX(JIzzP z>lBs#egqq#i8Bg}Gey&8>@F!N^=MHwGg?EGJD3*F$@#kKx z;Alvkqn_dRHLK)KDS4-jEF5LKSls|~rMk7heWlL1sanIM<9^1O71f@>lc)pDS3OIv25^KdtZURW^uIsKf61FukoYJOv?@bct6!E3nTYF5e3AmE=lrZ1`~t zOB2M8pb5UJ5!}y5QL--7cY-s;XVZR_8uHCU{v7938Cg$QzDIdCZ!jwEq!^(s(pfX6 zaaMRgMcw(3@UDV@4un)ehv)b$j#?>YkKlPbHq3esHn6(HAq1H|!d1F5(S65emez4) zqSGN6OJM-<)PiOxIJGQIQzjniA}p-2{Hqhky*m#}Qwmc!A{j9xn4`5P+g}x~B2x_s z>PuKJA%#O7Tl=$AE+dpw3;}f08$3S(jP_%EBkeLXC8kk*S!0o66`NuVe5SaO*Tt(D zhuut*530PbDdOA0hVit`tnDPtS`XbG}Xk83j)Q)`O-f6=RF%c`14@! zN^wXQe#X;jVUbPl|7I|3&NrJThuPi+kKSuE_J8lz>{zwI9;JC8GcvcSz<6rSpsX8L z)2x#vBnp$?g!5(v2^4s7`(i4VOp1`7D89_sTx~~-m%{?5ZC(U@7x8ft&i1tZN|WZd zCUUqDKJYX3u`c$6%xq0{WcYaClMoIrrt5)(CRr~J=ZJy-Hwq{+iFq{j8VRZDP)A*h zk?_i`4%ZN=k|!PG=RjbvBq-~VL5nBjEX@n%!495ioorO+=99UVVp?BzK5?~)-a zF)0vMyk6->7^j?v@q;sCsa&@NM|tb~lF;~16Ro9=yt=x~!Q2%psB(0Qj4=|^$8km1 zo4f+X;Bj-#wJATWO|Sm)yVw%ZdW?c=e;sScf}ln+(|M_NeR6 z0-ktp+C37v=XK=swk=;**b_d?2VI^fhRmMZz&qpy6uu%x_?ez!nQ(I0{MMiyhf*V|=qng^CZeqQ zP6}-ZxBYeVU^?gowQqF8lH999?tE|4PwDMY*n)^V21e;k$M|KWkXiGb70qux#x-z| z7fFWm^Lc|bs43~ei&EeeZxWY!f|x8uD4&osn1HJAB?L$>2~poVWPKzoId6Fx59e)O zn?_-CR}3ndXoAQSA591j7vStV0H%J> z2)|S6J$XKy5kuqgq*F)v@{KNZZO&nPS3zvsPHKLs==)eZTJ!HAcJ4Ium!kFQ(#>PW zCXK$NUbEX}r6rdtQ`3zY3w9dr(t)mG0;-=5pC7n-yS3jfh`h@*Y$@iF2s$JZ%30pt z$G%iw9`u6`d}SpCDN|!1q>KF;4RO(!Cxc3=CFK|O`HJWm+)AcLGr{-_cN_Y6@&t}Q z<|H&~^^KQOPNs+R9+l)-`7e$HkgPwrSX7F$*%65&g#0EK2={bx0zd@Ktz!gnHQMgd zGs3V#IktmTxQJrZlrdfNUZabzBZPv}9Ljj8Ro; zb#6gP3C_WX+}2wL)?q<)D=p|fW!sUN;f6EmN8 zv;9c~vvCw7Tda9+q;URmiQ?|klZy}N=j|1tJpEcM&_8gMNHz(X=6BO*OD6M%+j*Zr z#iyd#8RR+;P6!>?9autKvd8EcjrWS@l*3`E`Nn10wg0MsbxjQNF=J)1@$WUYNl-wb zWPCOqxRf@5`8c^gNXIuZ0N!PXgz&L-JQgt`jnh_xW*RyVCcO$1Vf?sTi|+8{()kJQ zz(l9@lms7jMnkSSGJd1bzvUxrGi1kVH^=6vA6s-#x1wbZo{+j{JrEvBpnDBuVN8NQ-H zn1$4SOClbx)d(7!-o;7yULLQ`sz7dN_EB~Wq$J5v9bf?6jf=6X-6IXu!bDl$Hsjrr zVQN9lfHfkHkR|qinnCI6hs=lPRFuxO?@0I@6yB&uw0dV=F+d6Ptl?Y6()Fy>fv?}Z zN{VRbC=}$f5)llnft2tjP@u5uS|anOW4wc9 z`8>v=NZ~Cx_C65>hemUeY~$RiA=2l*wJ;(47F+I`16zObS)yK%eGj2`0&6~mCSdeO zq26npsUh|hmrx?5Jj8hfyuag5c0I8t#8~wfXYQly0>TWCu#LxPLgp95F&C93ZlC1A zzO^zmv&Gj^wU@`G17-3pjJk9hzatJe0P{6iKBHk7kCFK{Q!l3g#F-rx{WsL ziH*zI!S*>FKoR6O05g@$6P$okCwqP4%TV}zcOyxi`3~Us|JzK{495W7@%T_4aAW8 zPmWE+C-~!F7;qp8j*^wf@;!>rLTCQzeTdjv&%xhQP8;7Ty6%}-LtFzzd$Kq?b3DnB zjqZ9?GSYl4VUC=W&Z*J5*V1SU6KN+KV*II3>ru+_R@WtCe zR#>j_^ORhtgsi)#zQf!}* zPux&l^#_jHR!b93WxubzQGw6=TJPsWw);iwmr}GdjV&9=NipZ z_bdcmd@EuYN#pcNVI0SskljH1{N5;`6R z+vnf*wmV-xTy40YlXaEQ?6E~#a7kDqwpM+3cH*Zn5WZl%H&ccirysCpBovGhkz?{4 zy!@H7D6sUbMpV!C?%x>m7tne!NI4iK4MzcB*NFVu=-cU%X7EEtg%>`i&Z@4XDurcXDc(LraO zG#|ErpoLA+$26{CC6EKx2zju!x;lwjoe$}9XP;Q)I}A}+gxwL?F{rWbd2_#CA0Qu5 zjf2Fy_M*whbARu7anvx(^+={$cFbYf%w24(t2?;8#%~ z%zo~lguWZ9)2v+Jq1orlTA6w4-;azpcl88)mAUs~uSKqJdt+Usi*|OKezwW;1uF8hZ?Qw~2fg9EASiQv zKoH81?yugP*M?}PJIlts87}0AZNjnD$%$_4)70SSDPYOO$IaqDe?{<5sBV;*@6xYt z!Rz)FXu-NJ8+O{Fr?DDDf}=dxjuHZK(Q4Xk?KF8Da!&2O%@Bzmq(`ryjA!Mwvt><5 zqplJ`ARIvm64m9Cx(!?{c2;hAH%1NFhxh+60&~jR)1pf^pfZdqyGz6!v;Xh7(fMxM zs)RrS4CPQ!TPBE|veTzUAkPsEGaK*t{i6FBVVChv^6=|(TNanCsDy4uQA{8jSF_kN z6n)C3P7q1kr&ld}@h=}l!DvtDD_yUimE`4}b8AcM=vx;lZwhdm_brHdZBx@;sOXy^*LPRfRD!pU2sFau2l7^l|abU710M0O`NzxPicaZDG zR};qLy7{92f2b|_&&Ic)9>|7dCgdT29c4PXT%&{aPp*QaAv@Z~DX(?cbuU{IZ$kdo zEbQo-L?ZNV%kjJ)uB{YMOW=2f+ zRyv)c+`(8zrVxi z2g=J@*Kg;;`+;)5Nt;)HDkQGG9^7Rnm!OK%R93rFenj8<@IPr6BOOxeoGwZ6ZKseU z660)D)lRLO=&#&;XZ&D5Y5-w65fZTYCBBDiA^)D&&%ghSMBh7~pn4s@b3^geBc9eD zzGia8kV>Ha*K_m^;O~ho+bWHZg>{|5%Yb!VM`Yyc2RxqnQiI=rH5ea|%4XfBe-O;N z9ot{VsnR{F&Gy#f{aTVgqSNi2=cYdJS>+HC;&{Mr8JW+0icZ|vh7a)0)0PPC2!6Xy&P@75w(1Jxz&i|Hu2d?uGr95& zoC#;qzgA@cESgF?&i4fFN;*Zqupq@yGL(@9UPYsi=`fD-&9+Qr zYSYN|@I>d?Xxubb6BPmI2ey~rWKxvcE@a8JyN0;C<_;d@Ch4aASuOEGvG=R6qnS@h zt*1ZW`z()#xr4LtEWsSla1tYjLE$*Zu#T>QW`RHc08wI6-lQ@Lf=RjxWEuZCPIYw+ zZIy0uGef3>xn8Emv6?M;rL&R!hp1axQ9P46lBAxoxf<^-KiQBr%#%-AT}$#+Oaanm zN3T(4?1(0Uvp!PJr0f!OA^!=Uc6>o)Zf1oRT+QLO`&M@Dbp`HBJW0PWFaJYE>sa>5 zLiIm!rI1zsO0~XHGhO5n`$fp`dQDWw8@tu^2p*_rwOOPk|BgKP_BN6d`GS|=QNIe% zF|A+bhu`aH4*hkU`?NSCtiz~+12YGpPwHW{5gVZih3Vr76_d7?<7xTL1w>w{Ql0K_ zf^D+kn8MHBXUHnD&2=S$1d@@mk z`P_5-kvz(L!TPfkXPfb2uBcX+-Ur9oGq#;Ia5NKBkn8Vm$RK^C@MrNG4<$iq$hW7R zH(4}S(*VvAUU;VmZnb|boYY{k%feZQG7Sjr=DQ4N)$=ngZhtJhKj!APo;b=T)@0-2 zCtbBw!8`=nrfn>utu&_h*3Yy?%5-5=<2yt`irh3)YdbWB;^XV*E`Kr%SKbVY8@%PIzH#G}Kz7#bY8bV^TS-uA{c#6L60>q4 zYy_yzdc9JN@oFwU-OlQBr-65A+vV)=S9@6epbCPj;?y5?27VU^jXqI_XYP8*2Kj{& zgBZv`jffKd$@wr{76M*mIVOjZ+ZVzWh02hFT492u{$u`t#Q{&PcbwD<8&V_u)A(1< zHk@FnDr(2Vf{Ofe3MC!aTZk<>@4a`QVffrNWoyZbD{b|GPX;<~m!yVi4}m>XAw%9t zD<=`V8%W*b8{dZ^wfvzN>45oKoV#MAMlu|u9wh7I3K6eL?tk zS4-%x6P=F>v6Y)~nuWZLUMGHX4kBqZRy$(9mDtlaRL<{bNqk7wq*JWuJh6$?F?91; z4oI2Io!lx}9*Smp)blc`>w4{I1=DfxO;Tsct?i;q1W!SCF{zCy_5$Q;Ub8gM<&JE@ z=XuMe4VK$=IG&=&FQi1+#K@I4tdZ~cxMB<4Jri}L3v~@zsC7U*cP$l zw1$G7rSSpF*|~xX>bTL{!urCo_~To|cJDbPGol<0gJ?>~Lw5hyaZA%fu;UGIEMov) zpWRj=vlMw2u&6;hcVFV-YPvp_V!pN+L5a%^x6f|^>>=Slf5W%i8)+r26l^n#mTN@bXN z6)EXzao*IzhiHWig}Q$4Ih? zC?>l&qy|bf1R~1b*izo5faaxX*zg87K~*rP=w-mVeLT&4pCM8fKXJYQFJyIkY_YWg zrwoC+pHgX?aA&0qMZ%ZyZskk}vavAcz|ToC2Eb2q7gRbz8s@xb*ZS`>m`i}=b&xWW z&)mFQ(((9m9T?{?HSoIxwYow6l>-?{`tA&Mvdt35NiT`HfDS1}v2?f>R>bzh`s+ihhxh}Pn?*kZ)>KzijN#mNuZq^u z{U$A^23ssT#3qL|8?}=rUa~zCDFvR4e>`2a-yGyq-gYt})Emn4F;ulH0`aSzwZ!|K z16wBk9hSU%(s1rxyW;WST+hCJO@CU3d^4S+Eg}wuucyl+DQ{G_PF>XuX=iXPAY9QF zFwx?l0A~ zl%Xx<|6eBAyDmck^-1^7nuCPE0%f7OU&b*FenD=m1;PWV{=C>m;=vNIvOfxb#u8dYzaC-QrXX$Ay>11ncHkUa`VR!hx_-iQpYST{AHO}OV}@tlrgjG`qt!_x4y&N+Q4QRRCM zfhyxk^>+C$z}SXI9%aOi-c?zH(|tgAYbY~}l@c(#ePUJiN%QPqCnWo<@+>qWN?Dy{5o;ffqNziW|AD@)Fv28wRH$9vD!EMM~2j zyihqojqb1pvuB#*Mx(FNQ*$dfk*f_En@(a$W({jSL?zYryw zmeX!4VgxlN>3o`g1MkGUtu71GWDsi>ncYI~4~X|3T;ASWOdKf9&FAcyE5HD(H^ts-kPUX7@ErM)+M}M!j$}{SULO`>!rq(L*WR@A5MmMPvNm%(EZ7 zx}b5B*XZ)A5)wU$SW@8Vr$+mn^_tc|fA&c!Sn5S;1tU| zA<}^9J@GUlQa|!V3=VNfBt~yFwK#j{1I5XH+Q)XAwBHoLZ z1I<~Kq*IJpJB~Ru`v_YP?}7=7!d2@BoH~`;SSZMm=@YC7qm<-_zZ*1c^Wp&K#-4Z| z*CGF(&NQNqy*Zb{J^{B|;($mvum_$>fc6sF0}}j^{2tkx#4zXydhGWKSQTg~8FAc^ zrX+TTBX>{BY7!ItK(wcM_pbFUudI+NA!Xc6HQJO2UlH0!Bb=vu`1a1<`sO~7j}hCQ z9tr28GBfTHsS>+G4Y7v2)H{^PPQ{08S&c~aJQIJ>Mj1%I6dgf25)G%*W%Z`oAaaz> zXGg1Ts0yzMj0c;L-IW}#72PCVa%A1i%V+zUv#>7kN!@H4H&+B()kI=|52S$`Wqyw+ zGt~Ln=Wk8@G$Pt&Ky*kB9!9fzihgrkKSrIoRQ#BVvQx7qw^NPK5Sd`-VOogiFiOho z%*%K7ikak*K>0M*PFWUS>rEJoQJuxx)z-V0!5v6=F(j}DEvn9y@M+67o(Tl4CAj8A zOlSj=*pg63Q6GebwlC|a$2Yd``oj-72hGqyA;P*aRg35rJE?Zun_Blgebemupj1|c zVKgCtqyiTZO-)z>cm`FS^U*X!(y`SI0jIS26DV3W#%oFCf+0?Zk?-~6+6($fgC6YS z+EOqdU3&xgDJ&0tr4_}G`r=ePj zAFEYCbXp&$Pvst@G)^Z6VhfH?`8nhk1Z|>z!kQ2kA*~G+_x3&vf*hK_8Jf#{p#d-i zzD#7ObjPOR=FKv~tLj#~Yu%fH^j@?g>yR*k?6(5mL5pAZxCW@5*(5a6{#g`OWjhrg zghP?bH5NC5Hqtm@gAWUrREG$=L=Qt`4vk<94He$-=V34mU#vIHCQ4WE_D#Gy{+_7s z3OmWQ7Rczssu83V+lD6)Ec2m{_wfXQEc{Gr?5NpE5TV$o&#{PqJ+EMU?4?w2>W!CJ zYA28eA80qo6tq>=^|Z~zAx-#N#(GkY@sJwtWh!Z__c-!Fc9mV}+sgfppnz$|r0@1& z!x6{;VAt8k8dtc*UPCW8KPcrIe)n&2BukwINswu?GX$B*|M)`>S-ym@GsZun zW~sJ`dGFjlb9RB~LrdE7l@Y&W`xez8=}1<7^C`9oGnYm-<3SiCHAu#h#|)`U8##ek z7&09%+XtAZI>n9Ng3(^$3e(0Wf)vT{YX-9)7;-_*afv~U+&@p-qK<50b&yqXaxzSC zP>eduoY^nYVr23|gjgLgRFMAZlb(l#G(VwRdtK0dbYQG4+A^t-f4oIpaFd()P;RbA z{nDQRUzc0ptnqR(LO2S%;gH#+xT** zrt|vivi3Hr{~cWdeD4-`Ev*MGLGXfwR-98&J>o1V31$*KO@nhJ!piqsMEPGmMg?C)LZVn2RP#y!CjoXkn}~tUJ%nX*fa*_=_p>O;@sjjJKQLmyph=$Rr3OPA zU`Pat)R0N5T0^cIUqvgV#m~-`9J@`ZgBt2@ep?(A7P_RLP4HZIBV~}!r3Zo4|7taw z4JkVugyc8EARaaizsrW3+suJ^R4~hqCS4-y$T7Dl{e0gV$1Ah`eWo~)gqu+ZN1^#e zeXHRLcW0lyhd%EUKY!!(Y1mEq0Hzx9r7m6f5_~!m9+brAkH%W(Jh@FUk7P{J4;+~+a($P!8UiH;5pi1r&jp-sXK%36%jhR(2(D~!j*otqy zLhZ+&k}AQ+qd9ru)J21P(gWr6e#HK!{(aaUDX_|N$x2>OMeHK3t^4p{L0aLtIH@1x ztdaqK8ELdJMnsk-eU9@F=5s@vErSRI^5nwZXW_;uyeEG>rJ)GFkdpiz7(?V zA2YajUUpZ2gE^5@pN(z#wRK5x-=6wa&YtUO&8!ZC+90td33pyLyP#uhv-&m9nCq~Y z^O;%S>-_Q}%5~#nA%oFcLs$jg2X2({_XNtomk?#_J&7clTE%99JHBl#25H*hsM(W4{3d@JlIYLCO6!I|4ygvxgF%49f2)RDxRM@e$R zOln)1dWoX5i0VfWVQK$>5CUL%xwg^rX{`WizI?j;9ehokhIhj0BWOTzbH{h!^Sn!H z8*o=LuhAKm=`hDo5#3qb9%nMIHS*X+Vq5t;I~5-xX;xD1!50g9MF6YA^S&h7q+jst z-u3K83*AL=UX{n0mJ;XxcZ2X=u81EZs{H9f^-uJ*uQpGE$6u&jQeAfcZoZ_(e5VBe zv+4=8OP{_v?|R6m3kZ^Ldu$Uy+@wyJN!R0x)R%bVx_UZcK_M{ID%+dB`70?cYBK+ zLG*1x0#2L3sTIh9=2(tSA=@SPP zYIZ9e9m1?nr&1&9p`yZ|2Tu%dhj@Qtpo?Hwf-M1>&YOWs-B$(s1|H~M2fKbCSUNKE z4HS4zj)Ql;fsC*l&(1tMfakBhr5oo<0oWedv(WbM5TI|p>D{*-vk$QP{*6udRj+*? z99O8+;W%`M)NRxsGO$R~%wUjvK0$O@Zf!U(*-XlM&tsiJeR;MjT%2CjC-vW^>ZJK^ z26W_C+{!$Ajo=|P3|@JwpADbSmk$RC>jP0ZZTrYbKHzFHbC~P_ZY~@) zyiUE)N?lN5qM4)9gBTqQrB_>kl>-E*Uz!_o4YH#J34_B);^2gAP1Q-f6RT<8ewg=2 zcr_*TBFb`F8SSNT6yiAzF4P7mGr zq>|ZF?^1vWx+pVH7Ls^|aGj=-3T zI?&B--Poyr;1hpcX(N}O@g4nCJMGR@84bWOE~>~PhUddIb+4ADUdPvvx}#seR)jB% zA9MW~kw#xJi0(++mn2sFygVr+=>)N<>a(+wpJLNyey>Y-1U4nY_77h9o>Dj4@)Z{? zG5dnhLO=HfGG5-acHkbG>s6Y;ERy> z@g19lf@>`$a~K7|)7aY?*WtwE2f)6Ds;0I+qzsGhrChyE=_YyCUJ}mpJEr7qrPM@K ze(D8+Lv3mMFUpB*^P2|r;~QH0c+!rB%fvQ<$GQ`Q6zvc=7kMou-m}iT^7mq3aq2y& z;%m8x8j9cUdvR5J%#@WWd}jtc&isDpvRb!;AoDcCEsVU0ug970V+*xDylL+uzMl2k z)|)gXgkCA`#Y*NrN2{({RRfb|DOEy=m(*u3%-+g4dyUY5_Y7WrtDiFqX_oFG-!dyq z9S#<_0#H~@>&UPe7(heMvco^1ieZhP9>C^4(UwO>x_YmV(oW}{#>joJ_)w{AlB5(I zkk&r6Lto54O`SjcNI?hCzTA}Uhnm-~rYx-7O+R~!+=Z13PA(Se65rmXp7mDs`p~Nb zP&jLT-vTaZNc(-4w|o-q^LM1pKPVt3Cw41v|-=lv^OdECqqrlwO{=h+;Pzid^x z^J`CHSkh$`2>trC$b-T4CxQE^87b4MX8Eb#+p(1j+GLaiZhrb9OI;lja~NX>emj4moJ3-_vV~IW~mT zC!`lXtAHDTOGK4-7>#D6TN_9llx&%dAF%LshlS0tBq0JAeHu< zxtoQS91Js`k^9K~q@Ljq?{!rcH#XVZ57=FRL(2c4@Iw_2A*I~?LGR#)Uo1XI#X#4~ zkhxfvJUz;Imsn3~Z@>MlD8GCri8D`r1+8c!Po&0N_zpLDSyT3SZS1uy-(>hbd=;Sq zUvIXQ#e$NZU}}Ac0H?Pa$>IRdEOoqQezPN3YQ(@`UqjYIc8Gdn<0ILEm%Pka*f>gz z5|mDy;7Qc2DaR&JEVQ_Md^NUw!w{{V&lI94EHd~oPAAW|89@pp0O2HUHR`zFDTcPX z0UzM4&{r_^9B!MBu6?f~7@(h`uTIK8!X2B*oX%5S#aVG?z0Jx>t!jd=*uXm=hr#8_ z3IGR%XSgqQrj+lUhP;oqQF>tzjB=r>k#;78RV*VL+}CVdwAj{_mn<|rjgcUJ zunt{k>yo{8BgjchZ7RXlcidr!76$u=RC2 zA_q@FQeKsNe5W?1Ky@WsDVMaTGgdH0?Xa@or7!g06!kzNXBx~yx&=w& z=$#4ucc~=nDK|*Ocvs2rBvlgWf2V}FI$3x{NQX)~h>&a2C3LI&Qv_geF0#u|9(=?M zMoL{dFKtoll_MXU9NKSkxgY11`$MQe#n=X<(+ehdlhn zX_}MjFNtn_{+O1a*yk-Yr1v0cC>DQN()&09JZT-dn;(1&UklZa9(-GxtdQXOh}cn` z;IBx?K1~^}Xxa#sG$TkTjz>+iD=)IoMwuRgzC^EDTK}B~P)|P2jC8fX%^@@#XO-@_ zdj!TzB}&Sxwb&7%m|G}L4zBJr+7J8do)V+&%T7}dQ8(TU#UaoACm;D2@J z4T`ENVe=#pVvoD5zdl0np+$`Yw?fgpclBPS@L2+*B>W=R*DpV}Srct#ST_{7e>k8cTb z!-)*iDx&hTA~(5JpzF*bEu#2)FSNw3V*H=;?uZr%Ftl>0V#`ze!yeCQ-6DFI=#SUK z3yo`h(h5p{87AcWvUM%F__H`}AC`k%%+zzzczXB6yB08Ui#obtxTAV#79~V7A|+CY z@-QT9>=2t(HFYgA_4Ji($~d9*>Cc%jUR|pSQy=8)Q3p-`Tr+i9#m^j?Dpq%_K{m9| zxD`v(%)t% zW`vQ@mLNm^Pec_+i74K`PjZQ%mPSGx_%4z=?g~*Cc9cw+xXY9SbU#S9(bmJwSKBP% zO#E1YstqL~b`LFdcTTTUaOt$Ro{Xv z>OCAt30Y79nMX1RUbhE_<-jravYk0Mxd4^fQh;AVvxc!!!U|unv2=^5hJ8v+=Y`u@ z59W4(5%NX)`ESp!YP?O<6YJ#C!}28|!f$+XT>ePlcjr#1 z|NCQ_*t&okp)?Q9BAa`r@h;^ErIqq`kxWN&P#7#FV6@FAAWHa76l7X!Z@Rj zt}eqkC9a#JF+i~c=A2jN!Ye4|uKuy>E)(fzy4~U~j4;BkcL? zcPg_Z0}-R%2uk>h!H||^9A`oc8~d+?CM-)vFxAWYRzp6XemKl5cEN#wmjv2g>4+ zapL5ieqs-yXRdpUJaVs>)JN=`?JM!eO&V!)LZld#ua%P?KPK2YmxQ}S^pN{EPRSDb z4f}r#ieDl16FjY3`-#!J;>Y4s%|&4q7MSKww2xI zjTZaff7KvtU+i}IJ8#hr&m*s-t7UHSs)1emeFd_aH-rB-n5BP+t+Uo|$ZZdmvPG;?nno^jNG+4IEKri<58?mL$g@LQyIoI$XBDLLCNs@|-s z)QdAgX1}3aO+z2v7VztB7Dozp010)0nkaURFm~9yovS+F@c4S>xli;d(_U2ZA>VA0 zcYeFG&)ePd;3CHW1KmLS;<1>2+#v5y!7y=H=nZ^xMESoEP2^if|GQ8T_dd9kK#{It zn-eI|wS@}>sMsASpKIjiag$!aI6}}D=@-7+T~!AweYsCOV#~~vg$RFkri{h(w+2`r ztf;g1DYL`VC9h&QtP%P4Z&@2gE*2%v40^v!Xe4#E-)ZJAXOrs4CGlHt!NG$6i^Ii* zH%CUU@_&+tVGz6%x01<$(dwWSH;Svg1v*VU?MLdNYZ{x0Q<+Y@}kT+)w!oX8;CJkA^E0GS0F%?;ELPIih%aTF@h`ly7f+TqyUrUa2BiS$%qqn*89aiboC01~4Tt6IxWry3e4#+Ju_-L-yUC*?9boX3B%ggkrp~{e8mN{{T>9u>>(=S z^TlLp4&lJ5?q3gUFl~!%ZoiNh^O7FEQg$r=#~?2p*NbmFeUCVk7pzoY&QeQRE&|g9 z&`MT4@GbS8ZQXUwkLoxWpllzZtw(cc-w_zs=#+G+t!ppz0MZW|5A{%S%+rnj(KOkk zyPWOxY5RM|Qui{IK{Xnge(c5cwG-h=$1#MDVre_E7It*!6j+fxU9PJZIUyd-E=MRJ zA1$0w|5xq0+V1N1K%$wLIgYbXr>7MDS1?veP@~O1hcHH}-yyUj*%YuX%3m06s{Iv7 zhxn0cjD)yRkeD3XSFut=y-#c>55}m&|9en)_ww#J%*F*}Yl5}{?Ig3?QS3tmH5hfK zP~ZL^WiTvu0FhS#yNTEmHfD+3r=aZ7CE`G2`X+(X_V>}w?(NwHNVWu97oR#84Ox)m z!7!PaaDeJ_; zy?kbl7eP#R_xb~r1u;tt%QKN1j)*aMywC>OV2IaaObxC{r!Adju^dNQ<%jz=3SF>( zw(zF)Qp?>2d^^tCiTjNDX$Wf!D9&QkrA2>)g_W0tdVQJje-MMWi{uX?A=wo)2Qa^x zWS4~q;K;o@0W;V6bRogE!#F zJl*}*_j070@Rm5G{uMlZ?GacvMQHj9Bpd%bsm`e1QTnTApZ=u2h(2gLP8rt{ua!)b z^!C_-pqR(JPQLS7<SgoqEn-E%#$h3C;kOMU!OIy!qFmZDn^cp8B1W}-tL zCP9&N%rglasV_B*@1*bg$5vFpD?xhQHx}E)@g06#q>EAX8pVHCY2Hk5NJB(x(LA63 zgzscnn?O2RRdhxk7@p4j)ESL|+6x1^FmeCM{+SmYa5m$Y~ z(scpeIWT&2P#GP8l%fZQQ5nt2S~!mf{mr-sEN(NkS`qTiflN|$Mo%X7*Xl0foi#Dt z88=#mJ<(1i9b-|wC^|3AqpL|pEl64u0u#+gAgcMJ+yF;FxWBae=1XfC4hB>ny?>wm z$=iVUQ}qd0X|c6OoeN!FY#Rq?rGWEK*Vok`--}Vnh9@_7zS->4mdFkPk^S4e6ECgDdv$C?P`SPjE?Nrw;tL_O(Ygp7dk%59Ff~WEhmVA~ zSm*|y^;BxU43ok7VEwQl==!o){3Ga9vpT?Fxm_U>NWO_Z19IZMlw9mN?9=6q8LN3N zt6!3df7aRUn&G`$cg8#-2KN$`IvD;sIQ?HN5iWeD0(nob4qit&(ovG^y2}SIfTwVDnOuKFxfOPY0OBRkaWW1aFMo=nY{^V?v{7 zZ^RnS0&-D7ICmm3M$Y{X=j@~j{C}9RfJ+Nf>vE7Q101QFpsU{Fkh=JRC@iWPRoo2# zvOh3l&sUz&bI!1uFUkuh=g(;u)6FM!7vPdY>xoZUHvy;Plb%^E)zz`!x$p>Dkwhpp z*15}ofYqhg+rXYko{_;A>D_g-IEGobXd#KEL&OVWbp`Nhlv(?1ROtX+2^*tZA{fxs z_^-ikD;)4-P8LbS?AN)msU)&=6U=oJ?&~Iu=q897$-$oNRcu4x*g#f_W6)_1snHhI z1;`($1Y31~C~^@#oM({GP3iW+_AGlo@QkwmLUYyMx9`G?U7nXM4|4Jb?@hpl^b65A zv|5YwAne>@woyH!-i=Xo_=Y6JvFirVNQD?N$*fb15DZda(r@E*PU?rN;YmbuVQCa! z@in*ZgfL0KBJDbhIaW6?SpUc}OaQENh_6Nv{1cq7@?Dv!?Q2LA)AO`)m1pQ-;1Smx zp5v0(d7Vsg_rJ?iZb%LWlH7ZzehBLf;$18;&kgnCEHSo07NO>6T9^}tTu%fpTENgo`Ic5buOh>+U14`-$p?WpC&MKo6Qb& z9VY0~Q*GWMo!Z!-x{EvPCF7uZp|=hQ9KNi(|ICVIr~n+|1Cv5|SK(dB*|Hjy9u79O z9&-AkxAZab9=EG4$+`rFH-I85-cC8!aT?ayTNHbzSvM;BF z-g#O-5P8y)shwU_A(d6?V)OlIs8QP0ktdLrfg9ITug_l7ob3z)DNu=$tC!kual}0` zGL|sHfUz_QSlCd38CBwk;8qUfzLTI`GGl57w=M<1=$7)`b#EL}O7nx?<&~C0SW0z4 z5YG{%Ovgg;x1bfLkqK^v2FA!eoapX&Alr2IImx~VLD|TW1u8q(?y5P$#5=-N2iDn2 zfqS9Qi~;keh!?Qk<@}Y#7>M};1fMLhOv42t`>l;Ew?U$bXWOC*&28Ef!%}(;;FQxeA z3ieG(C})z!c9n#iFc`W;8HH^7der}dVN6G{3Ad;dKRUjBL~KIv4EK zcU&3IB6Flx!Oe!6en4wtm%}GS zH=X(0Gn%??jx$U|c)dQ2wp2_g=8;GUuMBdpwHGcULMf-XOqnVLRd|G(?q>AGl-W1z z!}AkrK51u+cM;=qN95e?ODGo`vfuV4gBH(37jTar`w2jen=3Qi^iAb6hrGn^J43~H zsAObJvSsj1=HK&)Kkw|M=ZPn_kA3R-v9-O=cK+huwdg;xzjn}NYxk~wYy0t)TR*UT zmmR*i{`G^wc7J31AcWhE+m_#Q;bhqRskbb0&;6gj-C+S7E+@eC&*ZbScp$Ro90%Ni zIvnhAiMnopE6u)hZ6i%OeUZ%MTCK&Wyv=%Z3l9OxpHh|jUmee}`lb~KCJMZ30RF;K zlZzn)I=9%e;eJCrx-95s)oEXqpSeHFFTQJl2-FG_hoL|LzZbHX3D8SO%};F*uJfM9 zp(HJMnySVI;31pne}2XA@|lki%YGPzpXTKx`&y{n=Z*=%4#eKnd*#__aHPLMV!sN>!r+Z@S(6Jl#?yb4u~4+=P>BusatV1xvd?B<{A|Gfsor= z|MZ!fOZ`?=re_lDeW1=X0KDU1WG+VTB=p3%1~KS|fsnEvy}&RMUrJ!vd^p_mf`9HOvjrHr zJ(T$*6*IZ_c4&WoVkp9fxU(C(jhe^=Y&fH&t0YLM~7RV`@C-M3W*90p{ytpkGjB3Mh z#hK8UrG5qBzLJ)%QYa<&+fpN2xJT22ok~^AX>x<~Fu^lD27YNg>X-btlBei9L4MF* z<+iFBnd6j6@F%ruOXmNZkW_P4dmp!IH1P0zE>Ch>)XGOza+M%=>VZC9ZcxRyjo##C zwJvpQ3krh1;qb^zu0nB((y2hmkCGqDxJXb%M*8P0wo(+gCVfi=L}s#;@s)lmBg94b z|B`uBdXjb85)ouSjKUW@%S)stzZv>Lz~9-Og3R3WlLcw7CZXUVVklUK6-Cr0@Yde|7zt2 zt5tfLkGKEkZy-iY7DD!K0>avtk2nJUo2cT6{f((QwK^P3D?3)To|02$#^G~f zXE;b%S`h0ixjw7;|0qw-_^O4J%kj4X42h>wb%t~s>9^g?4~$zlU4MaiyeiTF#^NR; zqQ`VqVzd9EXo*mr?reH#GBX`DFhmlQ+3OepVGgx(?3fdL&fHGgnjnp}Ty2e$##(N+#!F>2cN^oS zvYLkt$(;&c#VM4=2Tg}umdCP+Dv3l7oq~+KW zyIjxZxvXHOLIZ;=LcAjF6-!p4yE4Km6i3>OtnDRB5cga~Z?Saj#l~vvs!OJSub4G* zkVZioFNLLEn;LEv<56`Ckig(*oYB2vYU?YJ@wFKIt#cg7wd>#oa}m{n(A`wn;}Z6U zHy&(Vs}p2Sn6nWv?6iCD}Ayt)>>9J!c7un5yOpXdx4zBL#=0_2_r%_8Mx0&P2=fpMp1XM@S0WE zm(0y2ZXs=7k^5%dcW0AfZw2g!`F_H;HojjW{kAb&5|X6a2AG4eE#`&y&|}G1Czp#T zd4%q!!A(I)FR^e_glg|ysVt{tZX}dcFt7$M3*{+>j$wTUafk08L1jeEk!D7o8f7u6 zv7r(fiKeN)cqF51Pc3?yxODIc(uM0RN+xURSs86L8#9p3$Z#gIGeyqaZdTE=#?EFu zTRnp%GL@Zy!Im+egDehn7A2Fl+^meTnyK6kkmNyPe4aXE z%*@MZ-petqjJ1K~d@PBXZ*P7GJjW_q0KY&-QL>R1WanM!to=Puu#J#{aW14tDCLBY z8wsP1MU|D!McF1^Oe!w!#9M+`vh_`6l0|$knRGc&xk!0N@|g;KPccex%3#VdDjd~} zs0&aZsewhfrWvZWL_1Qaziz_mjkn)Q*)%e4Y{q!-CUPP$)oWVYth>1p^XkO1BvgxK zTM7*AEDtL@$2ab(DdBBRz0u+Bq)uwK4vW+&+ik?OKAW~&wo{XFXGA+kc;S4)-76y_ zyP(~GW@jEguGaICAL)*fdf?^Q?@(j8o_1bC5$BvdI9p~v9C77Np0~o_KCKP7Lv(U@nEae+r zQdU@r*_g9kVn4@$$1!0}u;4ida4F*I&&{2?*F3aK%5?)eFT|S4+S*YX7MrJ-?vPAV)!SqLa+ZXsR&u2Ke`sR)1G69U^%JH z0x-R02NC8}2(|m`!RmA!n6tec{G!+RAz=XEaz%i-{l{@Y`*`3aDSX;@d3dC8a0A>Z zjM50vbV-6p;9z?RUZ-ocHG_QDiB_;JoPSqjlN+2`Mj&JXw}SlDL;xbdtKdc+ZvP#M z15ZpGmlR1E*uzY5#0P+abg#A*M`>^*05V5{K@vbf;h0>4fVNB_dckO2KLHe%0NViQ zA;H@Kr7>}^*}$!TBEp{Gt%|!L^q3@j=e#ry0eG5#nSa40+aTxWQeZAVjcEpLmobTcwh20e&AVeBIvK&q}l^i)7^Ae?;WX!y4CEi;%BPf#(Y^QX3YeAIK&VrI-ydZT^t#z+EfO zkm>+LoxnEE%oOUX!n9{gor@-c=Xc$0$~)s~B%bcB?b9>$il+4&-Z6xMDe z;@LZUf5^AJ((Y*u`e*tR2^N}_&WG=SQ5g|SqWQp#*FZ;BhpKMzgc8AfVE_5(zJxNu zNZT>nj=AIN;%oDKH>+_qz^#@x#S)3Ql}H4pGW?g8Lwh+tyBa5FjQZ9ZovL#=;ftd_9gEY)Y6L znX-T;5-R7@ZNUz`K~&+!>k#4DBQN)fz>okGN!k;L@YsO<5BgMKle6Nf^?-2U4?*QV z4*=Wu4~Tw-|J@6yfju_R`~Hr_<}ev1!{kp-PyG@7M6!c$AF%n0(koGZft;Mpmeq;= z?v!%(pP)eK=W%PkN7Dt#s|{e-$*yZH%nDMbphnAo;<@&z4o$UJy}5ztbr-G6=i%3> zL_9Wh+9_Q5UKV;Ic6LYQJ(K$KrJ%VpyLQgPv(8wq_g1nw{B`i7CE3I>$C=3dY!UwK`!@sEhyCF4fo3`0QQp&9#)wNupLB%&}FTx}f<(3J3Yz zD!6hWpXC@1<{NZV!%_TRM5QsVTPAQUMzd-xsR_{qa$ZnikiaMkYS$yS;XAHTOhPap zBt%Azi+i3HhAgYXH9zA}Yts$m^;V52L^Kyoat^Kh-fvdj)2mtP&3-lSs>|OE>8D(uu4hx1|r!^-2msRmUxqrV-aQD3DqA{aJwfJGKX}s=6 zl3c7IM9#_;O5xt|xIqw$WT8&7xoLzoYAcmFI+EN+qUiB%(zETYwUy6jfL^3X|grKo|p2`Kq36q-n1=XP~oCyatA=x8rI1;m^W_ zHtd71fWfYlpvdE9Bf_A2?v#64DRU6Ey-mCnPFMi*m>M{V@K0RRpxcsw_x>l9c#5p% zvXnqq&@fnT+qtSa>Pr?SGo|t}m5+}OLZqpRd$0d788Ok=z=34YkKtv;Ru1mpaL$=r=p3RCv0Q+$HN2?nAN2IdbtEZK0RpmS}x_p(xA|ti(wNIZX&n4oW_u9Yru2dKzTfF}M1kyh~x}Z4!J& zCskg&hKxViq*mX-TYvp0Nsua3!NR6PD{YnY?$D)s$tkCBe%IE`C2#IlHTPTi%U9<7 zRBq#*cLsK{;v%YVNO-)wH2o~;ZV$b zyfwH+=Z)4Z4;iOmx7PO!_0QEW))Blp z!#)Lj6DtgDSgZvx167EJA6I4cDeUKB9O2rY2aC$Jgf;Mk5O&S5teX;vV7m}y`(9ZT z1u<67RIElDb6jDxFsYE7HpdUKghZC2IN@f~d5-}oK?z1-6-vzuTe5am+YnQFS>8YT zT+N&hdfWE^-WC+4Stc;;x`bEFG+6)=Ms8_+t(2MiGnd3O!5wS;=u~)`kS`KDWq&CI z%t`Z)3$tDsbg$^Y4IbhkW5nLVWv`8vj(%5WMA8Lz|J|Z9M!J;%`~0%EoZNZ$4<>L*8b{9MCO`P^n`9SJPgdlo>Tllo>#M#TzmN`U zjG{}H&Kc3|HW$(SJ>&55Jvjg~e^=zr>E`!9F_yo#(_FKGYuuQ5*A$`rMjL$e;szP! zG&cFdC?>S=)cZE_TN5Db+Bsf@^QC>fJA+UL6b+TabV1qQ$G8h^u+^eG>A4i`?G*PC zHGm@6v8kPNSWya|PeWu8U{0R_TTbBVAI!nM4fUGBWPZ~ZvgXgbd{#)8Z___TrSYcy z%^xEOsGnFqI=IELeVc;eg!tZLfVLg~Y&%c14~?|%m(SP@$B~YAWB1N=y?;&+V5Y=# z6lqD;Uuph=8*;BV&bCI05+zua&!CNAn34ikf{zY>w%LWTPzzQ&I!@$)7vta~x8JKNkZ1=XyX`4xz6A0D3iwYz0T^IVW;E7pt9zc>N(!G#^z^$m z;8E~u$J1@x-7dJd74UkEj1nj~ffGo922Rt_&*%@Ed-?msm)U!G&}g&erS$!2`$7dU&G@*%j+YS+urv6w09yU z+ykF;J8bF<`2e%9@-2rD^0)#E)g{$R+G?tj2MX~yG9a#-UE!!^6el@7{R>)wVI|@| z-3R7iMxdCwH@bwCUqQTHtS62?VHRo>v5EqXz51CMy7SmTz6@dJ54p24dvcJ3AJ0e@nB4EGvC;ZdvGzH`FF`o4)2 zOzmlK1WYM~cz~KMh#DLv+kFw|8dx&HGvFN7h@dRn`l&15P&%FD$KYhd7fA~%9 zwU@Tt>wU|bR-!vN+;7Hy`s|%1F6*YeUTqLzT_IOoMr^GL@9Vs>0eRU_1)5i>SV(>d zcWsD|=`V{MAK-&0@PS{2dPX0o9+eLr+RuTe7)|vwRL7YUgp?na7LBvi6+4{M)Um$S z{?%WgIa|+(6M~jHf9qys!MT|pJFzAwl`INY!VNPuXiB$%L=(eAXlgww$wEsR)g5Oh zY)~P#7!W5JOJtuQ0wQ2BL_ma!<8fM(uli7EVWjIEFDRO-?xRg{Yybq$Vax`&vw`jO z2j1#0DsED=Q|0d(Ew}es#e*PA@Xv;ZhlgDYD;xFXQGFxRzb0llzZzZjNkeFe_X+>e zmJYQLST{lfC)#?dYIh)tr%q*estDBnNxtgw)r%5@wq+`kEEkDQaUej!BO7z9FE&^n zec-Kp0bOpm6$)OPN;(!7;+dUc0}o2Z9rbne2n%nJg}5WSV^!l1?QuZY``fqeR8XEz zh6;d{um-k6EXs2LyofU+)7D%Z9{?F=1wkZ&fLI=)z&i2^ZlE2`1sL~%K|A`jngtXw z@+{bARYiS$$QZ{7us>yWL{jVP64P{kbXqx%X(JsLa=&*^$vfpcbIT~E^W7dS?F?&Q z%B*aatBleXO;~Xes;y=?Z2;n1uAE$AY}oRh&rT|Du8*EbrG67VBPK(w8lG=b3WY}9 zEqEgnx@tBuNup22lQ*y+B)0e9$h#i6n<9l9@^tf;pKB!=71&F&34U1-;U))2@z_ZI zpp&)U5*5ee$*Y-3<>UVGy)^v`7hl2swsmnam^3$k)!mxrez{!#=Jh2{{k@9tt`gdR zr<1w-GtapdSeaLf4coOkMXR_vORzl%T+$n2l+%*#MUsi!CrWxM=#_A+dSi5?yc~?x z+qWCbjB{8wUGTS=bt5Z#WX#0@iPi!iqdgw4(oLwl7{6iFTC1^mG#BiKwK0QN3C0x732HfKf39$Ek$YoSuk~%%d%@%L+|r6 z+kP`L4OliPc@CnS)l^`iwsRUc)nfUO4FrOtx#T-Sw>;lU&^)+zhci$onW_2pfv6yu z?48m8^@Xc1J%u^vH+D~qchF{2?^$%-j*Q{K~qrg;ialoJbH(IV@7=jQ)K0jS5 zhX8YwXnOO-=j?kJHTJ{Qv4C%ypNsr#H*|>q#)W?&0TjC|J#(OuLxC2D@V&UVv zfe*mOS7sA8uk`vuK&>_*C~tg0eP-d^?*}*6kCi5EzE71`~mlSNf-#p^u&$I6dCg3ax-s=2_ih6$l*a-3<{6DV^nNz1&1t^tbz zmLUSxffOMci%cs_W|4|?1~O2Y5=!>DO5p`uJoFff+U^x({LJHX+SeM6}qGH?Gwax?YHrF3Y(2iA|FR4vb z3nLvPXrILGLP4iGfw}bH?cHPuGs;bAmb|ZZ7re93Ey(>(6uD-%yU+C$D0z9-@jhq< z^d{B=(+2@#L}}06j-;)3zg4quu6+I*d_lzJahS~QvVcyx0=Z1!?RNecMp)TGGHbcy z)o>U#kC`*icq1wV-06#+@uuE-M__Vp?_MkF0gW&OJzp@wQ(U}@c{a&>%6l(B4+)Ry zaiq&qjsQRa0uX>;A3{a3k2zxh#ZIGpx_xa?0U?mec@+?5GCTl+QOXbrhSZy@XHCd5 zlsr#S7UX=$daaZP=pb+yUa4!XTD9^$hqI}r+M^do5?^jWn_yhJ&N$Xpo*-xnt6Wv7 zR9T)yL+!o{T=-mEI$wMm&?wscEMrdJvz(MBB8RuFSST%EHZ&_!sbn+7>NQW92KG@a zuFfEDVopTcK}Mz)68A*QC2~cM^sqG9S*{HdAqjvq-VOUBIg_Fp9LqFC!kpr;C}JSQ zdc+0`Q8EmkVpvtv=KvdzF(jm^C_pf=z_?xlYl%S5cEK;gIFk4b#~jcIRAGFlm9!KjXPBSjWedU$S*iBV+fzu41&_Ue55~A zB>1|p{2jBwX8Y#$jLf7Nb{FMeDJEm-S;Pr1iBB(o%_V>OZ$Aklw_M)&`c@7Uab5Iv zCKE)!$?Dx7tbpNHi!2_}s2i=u+4@&YLe5@5vark`KgasT0p{E5pg zz5;n&avKOY4b%;eOq@_qEAb03JdDgHG4w=|bu6^@{~!4S)rQ)EFlX-ol+%?~F(v>D zao<}6PFh~e$}S$j5lubr0=RpM+H>_&zeMY2MX+ba=53Qdx0#pup|9%BuE?jb(lX}r zdx2ZmScXwFg`;?erZHS%X%@sI7noJdz!uU`3S$Jz7Vf|G{Voz;fAOFF|I+@D8R`#h z{{dvQyk&ux1L7FjZKNoMBpN*aLXPEeU%64PNNYRsF?jcH9%E-&$^3_0Tw?Xn2-gSW~BB)Px> zvr0)B$H=7mWjmA?MHDXZGAl@eu9Jeu1HZpFWDY>1&@x;J(=BGq>|@5n{&SPg=p5UT zpk6sLtG)~=e_yx6fsL>E6RMWWdFD!)9aw?!+gDLS+c9*|XOd)j6&7lzYDJLa=zI#Z zFJU?xTX_P@hj1Vnje@@4ONJcHvQ7{Q>O1{q`3zWwE}gCuLHqO8&|4XaV0df}XxlUD ze=MX%n*8p!6YZHr#_hBN0N`uYee71N;`r_OVVw=Rtu>coyp9Efa24I9v%db|S_i6A z?>lV&9X6$g-yN)zxSVTIzqB8n)=B;%tT5O6$y$e>&E^ETt*QIwQ(Q<5ul%!(#X}eM z>E{3(ngZ8fInlKVbDH$`!mS2j0~r_Lrf(}o6WqXSEEFglC;kJB*Saz|9~bSMG=u7-Z-@J4Ob+^+4cS5= zD@nh{6>2aLQjk1&_~NU00x4#56_VpGz)9sY zYpk{#T~yHieoCg}goxEi=a>r>!6aFD)$}>&ZHgfrg@$KjS=`}uz`$QKT&~Eepr~s0 zOUE30%)tAani|@!PpbzkgcouuQXG5WX0lQiWXlxM#44HWH1x}tg>tQ7Hp@M_XfLYXXkYM}E_VRYRvO$U5X&ST@DsjN5Yq~r%Y zZB6)_S0$skKg>cI(#Oiuk^&@UTaJZBuFel1=4e&`4lnvt^*$T9+q{wzJV0d+FIQEh z0r5`9&ng{vYY^$vr45CkUY3*pkQj+#qy``p1#E7?^NW_4i4LAE@Q7p$!O$_DKm>Mw6VQS zH~p(WrG<`4vacK5dV z%UNMa6^sxJdKj^dFs7y0C#A4Xgtn9t+@n0@vaeAByEL5~3!63JL?q>NJRv}EN$Oo3 z-hz`$D~C&_{sDavhG77G6k<^n$2qbvie-h(DZ^gS}YeV1i?790;&7nCmVle2*%*%mF45$Gy<9b#z+JpG(KlZ^ z_uZ42D_Lk4;`+``58|Qo(Gs8-?wBSc>8{>O$ARlWK2?DH@>XP;;(w0;MSiI1h#xX0NePLEPl4qZl z5==H<-1tmxc}6nvKDfJ`6?QFOlL8jGLE=7H#@tcgL#MMM_Z=19>49e?f;X$4%4onV z11Gn$%rTmvLXVva$0C1nL*VrK{GxSHE_~|+=@(&YOpL9DJk^e|UX&EpHs&llG!^brvUG9nR(=tsX&l9@6FNqlA24wS& zo6>RxgFWGyG5*efUg|Bn4nO4D!@em&cncpZxEpNkDdC%leS4szGqgNKZ( zyxPbAyo5Z^56^hZ;I6|tQ^Nq2$z9u68N!E~%-*Jf6?VKtd!q05{pyl+UKzaFipO^+ z`4Y<8!W_K{Z4F}Wci(JgVf{x<%#w-J;dLB>H?x2(PnZ}HvK?ObJrw(M{VfL)Mz+H1 z&=%V=JUlQ|F`KOWe&GB=iNF3t^S+ah+O>3l@c}bLjZ0qQ9y`S-IvOpjbVlNVp#ly# z!~>%wrnf8VHqHC;aK0&9XZxMwGJtg0%7p?c^T(gJHr900XtZ9FIDK|#>bkb|oSOm#Z<1zpHS)bOg2|N$?@qU<0M_->DHWhE? z;ePy^v2jwAn?n60T8w_kg+>6`$KPJt^^AkwceVZfOyBxriK`|%>3msjpw0BX`m6ij z$|5Br$50FJ;2}a^>1GQ~vN-~{5$Na+9J&%94A#iHrCFom)>(E|YPkK>)&8MxzLbG$ zw`c$Srn&zw3sB@Ga#g}KTjSdjCrVo3H5mk=7-5_0b#3K=DZl$V&WctCN`63S7D=Xr z_c>;@Z90AWXZQ;JX`y`fx!&5X3_e1kH*=LvN2fu;p@l`w;7*xZ%OG>%E#((dfWMNxrjXL{ z-3B7zFbf;cKLl-J5$NiY0UWW~P3I8Fz$1MG`WgWoQ9u-DMdQyEax%bxE;P>Hpa^!t zK3KGiIFxjPVj8=gfXH^4vM86&FW1DG;A|tOZ1o@y8{VuqV`HgiyI9Rb3JruA`#b^h zPV9C%vt-3(nu66p&f@c48?iPYkhiL#o27i|Vg^_RSl+vOT*oFT6T3{#Cnz6dmlKec z4@)8y^Z#c!9w*ULd`+o?oU!4f6GahMV6Y#~z!}(aSR-IDT!fe)MFH7A)eWnr0l@1V ziY||vOCbrgLt@IYtQ_p77BDO*lmUt2kacL|6^ zIFhy&g|X9LN08P~1=gSTx{vNRxyQ9DZmwCC%|cqtpl6fyFI?NY~=0)j?Feyp!X*zfY~>GL0NrEyiPBcXqB5K1DBw`hNbc zFCJfs?4R-QoM>nN#+z@h@UKiX7AqDCJFg$-^J(^7kAUFafl^zaaS4 zxnA49kJEkHwCGCB2lXpcSn(tCSGlmYt2Z>$0Vf zGdNMEC8;Iq^M|a5f?4I5Q5?)2oS!@0Sklzmvk?bqZV`jdTU{yDXXAaptm_et9IrZ^ zT$g?Vfk|D{X3M#u@6_8>6zQV)gm_>?*9BpyvX>hnOc`KSMobA5q6FoM#0?X2E@I?3 z%oYrVl;>|vPEDCDv#pF$*sZ6tNK()H zOGYkLTnli)>FmG8$U{MvGCFipgiEccyr$qWnHp>cz3KD@y}20``B%}?m3l5a(!JJR zCG@~XT{kxCOCv+7=N!w{_AUEXStLQXjMz}gV5J;6ky1nyS;7H$a4huTFmZ{pI`q#w zLQ6kz2E&M`gLTYU8>bI*&gebvc>#G~ zok9_Ie~Q-!>hr04a74HtIE7jG!{6^QpPmQa4Sie5Q$VSO{gAFBFs=vrmC_GM8(LVS z-~hxx0%Sl8#O$?jlcK5$_|r9{>LFXBbMMy2k38}c(!JfS)ea2C9&njz&c9bSSEFAH zOOE@(D2$57v>!mK;zRtV^k0JyzluF`+^$+F$6j}bFZgHnrz(b&W!=tyFJPFT_y5^F zXp~-OPM%U7_xgZRmc%Og)8&e477nm6BqGUI$D*rJwb|rRlh=s#Rdb$qlE~!~qX1qu zp=zlB<;sBVa2fE=T_q5Bi0cB->+$Ll3~4_XcUevA$Cxs90T;gHVS)GN6E1U zV-E^j<|q0zQx#!E()3E&AE?bqms>x^U7s)<4{(6`o7asdiLZI&JyceO8-rux#wc|A z0-p896os5p6Ed|ZS!1boXNs9(LPQwljBR_@y*;_fOGC%jCxz2+(D~Q1Jt~L`dQ+% zGxcB?&nRFWmu9t|RPSmX_3MPn8EgS}avuu*#}Q=Fx9=yRY}PRzlP?_JMvf z9;3}>`ub*5hY+dMi$^sVN4a4yq_LCQHB(h`asn?k3#`=-s0VWZt0wwD?`7o${5_kG zBLwC2!+P;!d+>6Zti14b;4=?FXY=(wc(yU#P<8uN8F>ej5R6VX0Uo@>YEC1XzWEQ7 zM!WArZRO1~BbOV=$VPgP(%9oN`3;$6J>~C?-t4Q#Z=&t*+eXDj4?bVeP%5HL4b6{c z1n}--ggSe3_}%a*y#cqGYcXsCPzGgi8cI;fQi1E1Mh+$ZmL+<>`+PPc6-{NXYpPo- zf^N()ZXi6wtyXB3A+-@cmLLMuywPiQ_f2x1k=p=pYjDrTQp)z-XjE8N!BUue#{sgh z>>K4ciLJ+i!5zv=^wRj4?%3*?FLPnznkh}OW)IEZyJ?>~DHm6!`v#c!gzW@uIo# zMRGc197t_|AZuZjH^z|A8Mhlpa)EbS?yQ0_{WOn$4T9puLN`g?i6$ z($|DXSxY+^PG0IqDNQveOnhJA|Hev_E9491nz~$!)G%Go_qslRK7BFH-hAuRN&A;r zYUVVjssw$e=LAnTY$*ckbW#^AQ^DICyX5Ln`eoe(Cd?oYu^?xRoxSt3@89jtU;4Ba zCz~r@+AbLE1$c2LV;iYPBa=?1a@myW77E4WRwn9N$>k=rOhCI0t-b}&qa&LYy4+nt ztfV;^I-mj((O=(e+VP|jU|v7YqQJ*YYrTE8yF351+XjHuPy+`c0oH28S{$LWHLlsA zmdZG1o%f|AA7acod&w!6le(<^!4_|gufigA48qMZ=4>FVTaA4+9w=tf1U@fT4#E{f zdPc}bcGh>|w)Q7^WJkD4nmCMYmq=!0eA#@z&roR5x{iPA&sdalj8l(04_xGuq zpK$N^F4t9BaL$ha9Mr(g$IncCmhg(XbY+jA@~Yn%qOtbQaNr8-YRLB=Ez+lSfj~JVjBv#)eGJ+37=*6QJWYj^+;T!09?0`jAn>v60WM5aNNAt}CUNqB+M_tL)c_89O? z_(R;&6V(#Gf8jrG>Jq5?Lo2)y{GjwsQTju*Yc%aWY9@R}fh}Ay=fpdC;^VB(>l642 z2Q(q1kv9iK+-eF{l?L3og9*=)o!?L}U?0c=XjAruL;gIKKWRS={iH1A%e?Eo7YJCy907c#?ye%cQMPZAf$25&!0KcJH1vLiHtYB5_xAEa?Vn63ha>qww6=SC? z+Ldk&C2ETPcmO&;#lK(x%hj@K7p;O*&(Fvs6u&TfH0epPu>NeK7_FFd9m?-BkizS| zxn*g|g-cOYSLs$l8HzY5iS1}vffcu)#;`P3-?45Mid7AnO(f{?vAHs{f5iD=k300X z;K4Cds>}r+Qvf#?Szi9D;)s3BLEeha|Kq*yIiwElBhVA&7xvr7>@vPPI>g}}?a1t- zBj5+2lapK|Hh(3{@j+D##Th|SLl~N77!Zscp}wmp#n=Lyaa~}#Wq)U>NRV@KQhw+w zlyh&Fx4g^YnI*7Z7D#MQcD44->y)N7tXi`;z!*u`+WqLINH5D~#FS(A%F37Dl2Q$| zOHI;YXJC^oBCdilgS@tPuq%m0puUPWW^i5*h)HvFiLi}iISL^e$|69hQ?dwby~qrS zQgIm0_`2&jU$;pig6cHQFs!a=x`JuV4hk}|F3vd#)my%nNeMuH}rzWn-$A9XE&2jEE&JaE?;h7G6 zkG$~l$Ju%JY$DQGjO_+I_J@m{{qoo@*luBJ%pF@bn|WM4^cKl%%yfG4QruI|1;)BG zLSDFDJ;WsuxIWqo(Gqz4d<4!u?nE;YgZJhpLnr=kng<^=12zeO9_c|~oRtaU2;jC? z%cD>^i>ZjB4ZX%e@D3^Xkmg5oE*W_Q+7n;*!s;FDCxX#tULXs&VZ_TN{y0hjlP-M= zMLay<1FY)7ru*C2fwdj`@}@&SpChp)@yHmnU^g-HFX(rUlFe+RA}{uGE3orW_a*bx zSL4>R3GKUrxwDLrvy52&h@sWgzqO^W+P`nN{?_+ZE4-X7O471i&Zj&*n5g5DG$c(DDVyq1Tv6BX%UfY|l6 z?dYFh9oPQp9cje?6vC+Q&s7+$!S|+BDXUO(?@^shW4Sl2%mRwk)_WwBsi(Jz>vDGf zfBRxiX%!qLg)+_H0z-jh-ki6#q$?a&a0?yermS-J{bw0WS>bpw+UvJM4a4U8!r`%)#CI zEacRW)Js`(vR5tBxtv6D#jk@ja;ZZKE-vUNGE<=cjMV;H(xeY4%7e5;QlB1Sn9&{a z_o1)fMf|ZU&(Flz)i;|kl8G1FK^gi`m%90O!=%5|{w$3%K3sa{#yUm0)~K}E#VtRj zZ(N8pa)%u_ta!jMhrxk-+jjojKYmU+e`eODflIs5Tq5N>^^qtc{TOJ< zM4{NypZHiaMn8U3ASx!S!p>5g#(oEJ4Iko;aTu}#P=(GtWhzgZ|V_9jheeZ z4FI#>jx{*bmA~&s=4z$E`$qb3V5%jtk zr`@RD7HX0n1g{U;n%qk-zG-mDOnW1dLNXIGwjUi+lA`U#he)ziS}Lu~;M2?oa47Wr z12ZIN5ssLm(W#LxlG9Q8H=0)&SM1x(%}Ts|gY-Y9qvI3@?nw%8pymRO<(bc%s2z_Y zdq+O^m{%DUJh3JN1maxHv_%SKz1;I^x<2A?(7sN8fVY2o$&Ra)GQN=!FAG#k#X;l~ zN=oC~-W62L;zRZ!$^O@v1vnaO8k2cAto6E4eWBu$bf~I&psR(W+lwfX-&pthqnJ`6 zl<~m3Q-n-jv~g5u#g*cOSx9s4#U$-Ubum`i*}2*JI%0H5I2y6c(CEsER@42&rb59X zv&&oL0L%v)1z#!l*QENv+%vNfLlk5X3}O&hW!H6$5m?zWB~vw7PWRSD0VgJ~rn#gP zVYUmL7Uoer(N(%MMrX_8#3=Ecm)5k$rW5S*_u;cE1p;dTPC;0Q!x6cPe9Zkoqq?oUh+lt-1O=!wf*qDVj{xIJqhq5XXzqm=7aC05dJ}%`S|8nc|@n z<#}1U4T0lTULY_ahcbAFqlIptk23<}+WP0x1Y#7nO6HKJjHf(4wfXl71lQ%)ea90x zxo!MzT+{xHJaB!y!TFgeaD7}?w}D^J(4|loh8wFNC&6_zUKP5JGv918>}gqeVF4Cr zhUSH)aqFAyYK5O_QN>H;oU?vUHN&fmg>Bee{9QZH2#3!fHHd{;;w7?8|L2`AYl@fH z)Gt7xwxGMTU0|IS&+XS3KUJX$X$lVDJlQ)!Xb|#l~nSeTdGyRn2xuUWt626VVY!DY762|y z_wyR9G@$H94ENS5T~FpnJa!xyc-dyb{pY`tJ*VrsrP_X3JnM)^vvnfT*h*D=A#$$UP-l1^R0lw`N`f~)X)u4D z_|;rvj|^bI&!PuMVo)^}l#W)QSQKk9qDx6)ibjxe+PAlkEd;dN`_yeSOFnobh9Tr~@rwEQvcZKM+#xj4i#k=2r`t&_3g&yO~H)y=c}YiRd4FJlX1Zqakb z274x=&=OieHgjY+8<^agil| z1ph9~R)lA548uq-QEnzJE7C~!b~pjorD^QgO0!V5V=s&+?Y<0Lz!Iij*s#sArljkd zg4$E&(=4aCWLbtBB3^-tDF{-e#gV}&cNoul%?;jwrKuLwV%NnBnhEh*9os_!V$PMG z9^D4B^x(1HgX7`@Cq;vx7#m%@rjZoSW_*zG6Z0Mi1{q=u7mqt5&}qWk74a=iTk4vv?1LQ@v1(EK^`QnV}CQ&I}=_~Q2Y zvLDBpLj&Vmod+t zA@P*Pu}QL3uBw!BskQ*MfB+LS7e~E*=jq&>3~a*O4SA-_LeGMxnMG}uuiqj79Th?^ zIL_r22Hy1Tkv)g&_$oGF>Di)gUkN(BX6+1k-*%hYB^c|+p<~aH^y>uGyQtl)t1-Pl zW37`CLd$5~zH@bwm&3diO{Y%wSn8 z4Ox|o9b7cPtd6}_J(TNJ=z$4f0XyhePTP8XD&%$P9mkf7+z}mywC)>@RuZ>h^?)bqN{SD_;;0dy;-AL)QfjxIO416;xe`%O%RPva~bCfg+#NJ z%$2Z+E%!=x?%X`A(tKg0SQ=>>u9vi*dO_D4xadF76ZOLpJbOc@Yvsp#Q!=qqyykAi zykFR&qjM%%+CyMQ z$c=yg43WQZJo;@c#!H_l-H7vdpYpths>{~HKDuZ_{Hot#Q+4M-FQjvH)Q6M#*4QG? z@BLO(vo{s&f8~o3H@$6deb9LGK{Y)TEN+ht>L{~Slh~b#Ef+2{r9$v&4wEq7xWR@?%rBpYy*#1)4C_F z6JSI0^P%Z195$>(?mhp{k4N#Ot*B>cY0PrHR3`h1$g{LOQN5arw81v}zwzZgyC%Ke zQc4in$ZRGzMJpOz>!R>d0`$r4FOQeO<2328-Z5syL5i$--5Kzu+;q8%5j}TgB zivMj>(5C0eCBC$A1jlgCL~o=Qq?5@;cg(tlrBXY-S~pqS2|pVK-?0 z>RegUSt2b%ao604hwOSujk%9oL)II*Z|yR-Ug_D#X5ZPBQjp zTcKquWigSs1)^L^zM4pAs_N@ocHj?6`wk8_3=)E0RftR4h9`9i4rv4&jIq&8G$uyp z22zj*xljvvkQ>SCpPt#uae}U~WR~vHuX2gi2+GMKffjQ}|MFU8B19lTN!WOHhTrn( za4*-JW#r0M7%8;IZpV-l%mgX>Ef#6R8zyt!pLVy)zCEa#sJd)<(T%_tEy-bLG>1hy z^WrsI?TdgdjYC^+EglblGqSY}5|T$=5exfH$4Y;7BoWdC7KZU}QO~nV5m8Pq)7T>)UlpA5WtkGp3`#ewwt6>2b7=3)uG0yxyXtTl#iF$I`k;9rRg$TtLz&${I=PG^!7} z76L9VMtNSfR~L0#2GO#&eu2)pq-F6?P!82p>o%0#uXcmn8ihc@BqX9)32b8 zjz&=Iu!6(|?)u0FL<6f>#R=jlQ2DLbP!u5wV8t8&C8|aJLz&WK(mga%BS3?CiD5Z)(Gf|D*krP$T z(8>TY^5Z%2(eP;60XNfMTcrL}+|XJ`2oe3hFWz%Z;h%#gW7%A}Du@3-(V$7Y+pdN# zQ|)PnkQ}KtAfxm=CHoMOUxkycZv0=Bp2kWDW3@cal)83>d1I)N1$)w|&a3lfKYc{) z+G63kg+M6M!3fs4q-DW~fycj&g?y=jV{R^eG(~CkZrW&c1U+^NCUSkJDFCbTS^&&JQF|CZxXDwyYhOv;i-DOp}UIxbqTUVA3r z^2O55BP))awQIZ0-6nxxgyuUDLNx~=La3<8!OL^UT zauu?p9hdQH%!>$&)Tq;wt*R=hnu;lzQYLBV^D0j>EW-!{;(A#erX^addk&7V0w~mP zCENZy>gpk?dcnnf*^n9duz}Xp(x?9=zxh_Jk0n>jG;^TWNPzZ|?^fNOKEjsCt6FMn z=BDN*h)PxkHe?Ur_?==xF8E!o2Ve|wbd&0@c)P#6TDyAnFm{v9uUOXK8?}0q9*E!z zlVKH1M3WpeD?^4Mr-tZw&$Md)Q>gT0?ubGW-B~W?_EyihET+=aM>eos6d5Hv|Is*_ zFLy-X!AD>Qt`YP?gi!YTifW?OG1gz<6-8h}D?t12Lh$AAMuA$Irp^w_6W)&BoCbuPt?xL1)m7H9w^X~y#scxK8X6=O~I9QyVkE$?VF z5+RhCFyFmV>pB*SY|%x#eeHHXzD@;_4&B{Y+1^@qGqlYGyEq)~j-*;rrTq&J(nNiv z^)Hlb)T@LDZk9gcwyWK;UpyD#ig5COJbGowH-}FS-_%SjghIOdncJkBcWCn+T#`T) zMKpCPqC&|K1q#JzL1G9shv6)*7z%9|Ou~a$3B(!?{V3AhOY+~?8r-W&@TRY+BAFQO zMi@^sQ+HbllU^^6vO*k%D!+HHG4BZ0MVIO{Gx|eZxEkt&JPQPz!=AO@qkdh;2{2T3 zI^tRKBW10iPzyR&-bKUKe|T3Hexdte=r~Zp5i?ewH=U0+| z_~lDdQ{#5YxCyOzc-e@x0P?TtxM5X_+4BYg!=K$B(H!Q*DR7*ucLR@x?QLK1TYgl9 zvJ=-+#Ehv9kJl&JE%8_(X*-WN4^Z#bzr0Q)5e@{xu_*~CBel+n>nZf%JvtlH&o=T} zX_hRf`=~5>;9_gQ_x$M_C#)aJ;*=zAh@~@ZxYenbpirLRrlx_tEWqJsCqZoQVPk}6 z1bgxs$D8NyJ!E`dg|Q)l64%H@7ES1)i-<6wMzscTAF*^HRQkx zldUU5ozB%x`_e>c1)5$n57vA!p6=W*hCAPX_g@yN+BtLlAm)ChU1)MYj|`sVE^SkW)Ublg@WO zRd0jJpHXbb4ki-`Y?r-5u%^?lvHUl2!{`Xns@EwA5xmp3N;IQyCU9!v%xrPvj;tB7 zXAsU#s`-RMc9c`ZPe`elizX81CJmKXd}Rd>&23~y;#}aVSXu`7*ipCc4`)-~ z*Y?Qdf;uvbUfwe_XhqGc` zdYLjU$wRL?}8H=6NkmlnTP^2~l*)DeA7* zI3lDY-9*dq1^;px5uZCUD*k(#@b>`u4DGwU(?{_Ze+ z{kNIL8-Y+{R*JkVSWP7oGb+_QZ;!v4Xk~d<&ea$Gk?}Il|9xw#x6gUK0JfyC*+~9g zT_QIA``3M=|NImIbhX~g%{i7TX~L`TXh>FFU+r9c1B0Zf@aqSp(#Ib$ox1q*#jOiH zhm1w@LyjmfOl*C;Viom*jjt8}t)tFGREmW{z6GB~tyZnH8_j0*+Lb94%e7(HAtX-< zQ?DEcS?;?Nka+}aQw??&7b(5WbwEJM&2wU1Nd(z(9mg^ZU2`ql)@6ym9Z-#=2XQS` zfOMF)v@?sN8a#lPdv|l_8v#X-9dk+SexJ;`WE79b142KNP87?eGTAQ$PfG9gvV>tJ zr@RGRYa!aYe>8PNx#Sruwe!Qv8$Phv>m#=GxAfhV$H(lWdGL!SL8~^P?zK>#on6A= zGMs$H;Z@`Y&$`&(u<7N12qYkb0uZdj?=^omXwd9Y3u{o&ki*rl(FfZ^C4yZopF)v4 zWQ(dP4cedeIx&o9Ybx68`E+t3UM_ykC&bfU=viikz0S7hbkB(a%%nT~;=esm8_>!} z-q9~N!^4-SUi%8%av3^F)M<1Qb{==;`#d*UCKP;l|BW)Lf)3jEC#AlcS9AB?Jv=hBJ zX0bIp3zw3{;(%oyUycu?HT(cS!wVRLZ$sigi)EIIv@A<1iR)?O*eWJUvIND~HcOJ_ zY_^QWT_&hAlQveI=3c8+fQP8S$_Lg?0R4n;6Zo1n>);@i*G4-&k@tmG+`WqCtv`Y7 zhd$8wuYI+0JZR?x5xxDfi7De$;-YMAa~{Gll_YcT$ff>ZxsU7<8=NNvzx~e#>%)av z|MlxOrfH2g5lKmQ0jH|wxSp7~*yrVdV!;Ae#);I=e1EY3zgI^O5ASI4y(aYLE#)G8 z$JtL`n{=E&3!fAdj<*=dw$6R6b3XRRXJhS89LiVSnZek;#}n~7Dic^YQ*g%nvKR4( z)dscnE?$?Jv4I->qFw5qXw5F7)_IH1NS@kW)AT@2m4-7AV^BqSX@m>3bsp}=5a>nd7y94 zJDJ1VbN+_c34w@&a!Yf+m!P>sRdB*l4?7-80aNRKSKDRnUTHA@?l^D+jDl0g8>@i; z!yQ8=sP!2p0++(&a03M3(!q4ubY>k2!=A@+BH@QoZ}IFAbCYy2MU!32NH+>!8ELe9 zXjb{^s-kup`+la>LN7P(iSg{U){_!I26!6zTQ z8FO40jxSHvm%k+%Q~95nN?^bfuyXRe2T*rvScwnH!F>K1qFDCt8ZUr1a*OkYvtxdq zVA&WOw7JF3;=(buy=GmsFSOsgqr|xunJhN?8#_7R0`!il4h5_6`!4>?lYT6cZU%*8 z+te@Y=aN}w+59u^xw>`n5>vvxHoZ7^Y8Da)fib68c>PV`id;&tv0$816_zH~H&7)Q zN&saj0He}uSd-(JF}H8HKnQ*x;-90Mh+?@9zMJKD18jJdi7h&1?v&Jbw!4vzAbT zgzth(4NdJ0MX(XJLOc|`90Rr}njz*NNnPGO=$2H>mu<=@!4qELV45 zs8^hicbSd&z7^j4-5K(mox8piQvoYx1pbDAZG8Rzo4HEpxE)!r{lz>lQslN^YRo`2R73}`bJ z=?)we2uU$E9^uLh%$^Wbgz*Mi;azcLu&0P{|EG-zyJHy!R;gI@-?-ps1Gj>8`6x9V z`0{s6uDnKSYr}A35U2Qt4v!tZ>%olfzj2+6v53AQfkprd@oI{f+b3mXJ9dDgCFA_d zP89w2!^RGsx3TxjhB~CWOkfd(D-|u94!cxbSRw?anOYlpEsZ=$LZoB^i@C%R7D?y}hqY z5OzG!Z<`JVz|hdI+bLi%1fU``&Go(-mCH{ii+SSM(w7|;-aRVCTSsU5u_!0vJ_!w@ zjoFF9CEOEfn5Sojuk_;5IT*aqfDy}*8MFVKrmX$ypx12#qVZ<=#tG1gY7uEyQ%9)f zM}-Z`db|R+19P(s_|$V%>6`SOIHSPyuP$tr0b@H11JfZH$_(`@%wXuKo2D;PG#aLq zl8g^Xjm^RdX5#)hT}pGI!=)?6d2 zIzm}V)@t=~E;W5lRYg&A%fopVS47&fAm0z)@S@$jAh!|bngu+Dm^sZ0vt@-JWlkH) z-q!h%92!$2q(R2yZsnxpeBU0afl1u5jwnd!S*!I$OAMsB))Lga&lpc6 z+=#^jotHv?zs=@-ItjDfTwkbH<-q~HjJ?9L+t$M8^V>xoeOyl7STAotdq47aAh8Wv z!kY2io_4Uy!4Dr9hr(L4;wJ zqk=-;6()qCijhiA&Xt!+UV&t?Z|0Jjo za$r4_01Gnf}W0zb^&FyhgT{{LEj!(V|uKfcc@I} zjuhVgK91qvJRiywU0%(Q@fyD+rtufGG9FDP&)$Hq6Avd2(TE-pfLZL0Sf7HZmQa!j z`ouVR`egLXd^foadsUgQv|qlgOoLC=*9QA_9yq_aA=W|FdVt`eB;5*ER}?Dr8@_9GNdqA_d=?`0?4A9-XqY=u8z(uAEe~;=&hImuuCh62}V?w^imJLHU zDY#y|Rw?&6%a+OsvTlPy-NAVZ%2Jw6g7x=mpn#wRD011a!zO`ch?~LQej1o}90e)K z)=YBriOU-Xh{s+edQ{Odc@+GDm=1Fe{_eYwVjhgPhydjiuox|qt^_;|5g%x1#iIgn zKa6oP7$h6VOW(0gg0St^k4cnF$by-!hYzN$+J}WsS8`!FJ0C5OV`(W_Rm?}|94l{ zAoyJ8=bnFZ-p3nwqF9}%EL;8jg%KJjhY?6PL$-8<51Y1$*-@s?>|G&cS1t-YlHiW# zpaH#*cLn+%pL?iRWh|~@xTELp_+6tz2DeLZ{{I!=u&WADi#>nCt}SmJ?(MN~c0+`; zy;!PmW;d?9Zf>lDOP5ZIeSO2I=8g9Jo!}&$O_W)_VwD6n52bX$(_IYBPLS&+c=Vy; zUFI1z+%KbR_#QczYvi_-q?6e4&<%u9P-tEtVU1-iUu-qn!%14Uyg5V+5A`ZS0(CXc zD}4CrcbDSABmZV^tC7YNx-7Bbp6^~N=hb7PyBG}(-x*j$Sq}~_Dr$-)4I1kL)eMF! zB<4{h&F9DB{xy@mSeuq9<@#ivB2`Y;)m&LrWPxRiWLV~veWB=#A{IX%UaQ5x(QHfi zbuM0M7jqgKcp`5)q_)W0OUp6k1eR>**w#0yEsPOH zL=-BgiOkfRd(-z*P2pA604v69Op~&Pr#@wj5Ii-SY=cEMLUXxq zhXy{pV48m~?B>T>B4K=*Qr&ugsl>H+ndu=ER?FS}r8lskwb3S9u3L)#cAgZU@UIqM z(8Pfn%{j}mrUfiu%8e(ujnMGRzOGAdm?rb_OMf-V_&JrB`h-Az zRyA3_4%0)<6R`aYP6wqpdi6$dsg2F4=G(=(>+Y7gkvKJy&>dyhzN z>cF2L0wJ&nY#?NA9RB8Xox@fO*>pOZs>E_cp;#@W7!F*4{={ppq!St7S!9;;p;~N` zAR@c3Sleaac4hpbe6gHBO4*;iB0L|SOJ9OB`_XH*n-T|5f_!meh7-Q2ZKa*ZmTjp- zz0Q0o6C+oYMG_Zl3ICoSK&4S!-BQK)`V-S9b*pD6oWJ9QQu%+P4E;v z@1C?Fw9QQiK%!Vr8&vw1yV4D?>tFGUDe5;~Gp=M;>dU5@x%->ou_&r5aMdo>+D^hX zgaBkrL;*)br^$P^*%;T2uUyC4m_5y%i2Ahaz(4KwK+}E{*0wXC=X3xZVL9Z(0f>a9 zKHmScsw%N;h1B-~mjlJibh&_XI#b10in&xcQC`at`9h_HVi<6y-gNj(tj_Z5W0i7R zAm8hdkrQ5CJ~O{y8yRyu^m=>1W3`2B9kL(!v))A{o5@#@pSvQw5S;()GMu$+_MI<0 z)@~d`5MVJo!wH;dFGS9NET3g>mUm92$6OXzoT%Wt$mw++1T?s?V=mFu7gwX3aH2zq z(Saux!rqC(-G42H-0@G|F?LjcN54lfjoh2VW{mYNK7UroAwhDVPqd2!L5rfL@V&q| ztv`@#(X>Qp=$pm{$+}9Hfu|aZVt^s*PrR;!snQU;8K{CstFd}6b1QNpSd1o&fTRQu zq-w)%!kh4Tqr>%1O=ef~D(6!*?E*=8_RNlee`U+xu?qb^oIl@R$c=CoCx~3WNQrtJ zsZc@XFO_b!9vxH3bHV}Th`yy|+`z^UoA8Z(FKd>a3}VY8=_Kz>s_iU+clqnLIniq(E3pZ5&B_ z07-A~qVoXmA2s!YAtr=Nh#T)}M%BrK!6aS2Ubh^=OsyoM?P!ke z&2r-IMEX_+BrE4kxqVwcojs95eh(0(+e*~%)q_OoWL_}|ofsGVYK`@B-W;ZGUQ8B& zofmPYzcNz)^G*f9Ln_6f9uV_glUiH)G%G&YZj`?mT4LzFccO2&4z2d zsaEMzDS4jPDxmH}$EV)>%+J{zqt}XsjIF!hni!q42EF^ce-z0MO3lilF5Q>@=2|yy zeSkrom6>8b_|(H!_*%&l-Rz3Fak zWlTkO<<T|83w#-bn8lw%Oz zVF8+Mb4Y*JO2Dw}3c&UIiX^}iSPG?(4OvY}ce?`slYx^t#yU$>NX}>}I`z_V80|;US#~$sJ#k2^~n~u-brrRRpfTz9=51Dpv5VN%?^vSZvYCx@du@owEll}?=HW;*yc)B0zTvPz*%@&XBXYc z;{XDD!l?R9kjPOMn;jJTAkA;Qeie@NSzjN?{LijiYTy8EoKbiffQcbiB81jJ8uWBP zUt|MvIBj;Kd|WWYFD`}Ue8_$=oLc%5Kf$De{!%qj2WzX;hrp4<< zSJ%1mlW;Kf>C9<0fp3}yx5WWHt0>?&k_NE+hu+J|M_j#2$=CaE@#f;-K__5=2i(%< z{sZ#bl_%Tezg&>XX%@0Rk}E}~(P4731UyJ?M8jcHi=J4IwZk>O%_wDbeeQvWT zUz`}W$|3HP#bI$YcQ7;jegJC4jaVw^=5-bkk zOyV)F;6XI|xKd_=Y%~JXjm9IyN(Ncf&l`@1M-lXf)peUV|0-h~yuG?V>-%8UJN3iA z{4*K`feZ_1>7fs|vM9(#GSOV1!Gki33*Ge1b36jvz!jvR2Cl)3!{rhtbr;U4o7Jx9 zWiP8fcIRrl$JIpNB_cKcKh#gT7Q<*()DCN)NgBJnm5VTMXsI{Ko0=+LGpJEI?P^%KbxX=%h5`C^bIFs@Cd)K-Ir*WQz35ogt_CG& zcvt~G2i!I<3%E9=sj#VyM0eI^{J6uVs zXo<-AJUB?2s^TQ1D4npFa65Nd-Dk04ecxJMNijfTJ={V&}7{@fDWKd5bP9A?ASvct{a@=mP4O`_WbRicQV(LkE_ z00=<_L7)L{1*~2yn#+_iTUV!U+v6X&LIF1A}BSOm?|ap{1IEC=L@qf7pUHrI!7o#4GUVr2NJ}peswMBC0ZFMxY8M;7My|WX}=HU}CeESI`tu&2kOUY!K()7}$&+ zmwwBFH_gyU4WKky8OIdN6>?&stq{NMv>H<6au3A(4_>d*GdVfy_AjpB4Bs#K?ZWc* ziZky}2P8?x$SU6ob|un7*?~c$@jr<#$bsZIB^(N%%}a8(-v z*Kxzv%pSBI#R!KJ)45yycc0D_6s*S5bS=YkaBZ9juQNSdc#YfgX}qO)yM}sy@k|6! z&m<*2g<(Bf!LH*Gk-?urR+ed66=-S{2Ny91QK;Clu~cJ!Sleabt)wMhtiR5HRnRJ6 zK^7t&KR%}=2XAEn<$d6J^T06a({q?$a6K*n*!UO1oIo>pgZJdfgylMSlXSRMgX8(+ zwfHrbBUMi97Qfq|r+ahLD1v&5YWsHvH0{l-3~B?N{c3ajC%wV!I$uwa zV|gwKMl(IAz~+hHEo;#uhGgh4!+e8`898v2l%U*uaW@aA1Dr#}VaCU-;l%P*C7vsm z{SJnjhyn%Klmd#FIYV5x!u;%7*_%V%uP7V&qWgR=jKxf7!>vAK&Z z%Yx*?1#$@lE*CQ2%O1YUInYnUTN_DO0n5P`(lqh9K6a!Hj$HzTlFYsjBp&Io$FwXhm$}|hbT{m&0zFsLKOUXdEk}8H`Los<$Fej@5;#XQ41xG2L?Tk) zxko*AgLs?hU)+J{OuGZWb8pa6Fj7qNA&Z||9b|Y~NCOQm=_Y+(I`-H3{)IOYwS*M9;82r; zJNJ%aN{2;(0R2xKOzhvpz@*QJ0yu7KYnS|Cdcvm#S=GL`yjZzB(CA-S9`{2#inIfN z-3A{x^YUp=4ifN!NYDdGbavlJRx}nPpoJAOr=xcO6&zNx?OyNEdK^(!3Exb_%!@?9 z`Bq=|vRZuGW{i9Y{tQl>fB!=o@b?NAczATM|7!pztfD*mvGf;mipZQ8oOUD)T{nHJ z#eWh=>RSeww#z}5ExwebF+Gxqe=IyvB&W_kxL78caBvMyOO};fEapk-LRc7IfGHK| z8cATBDwDCQWJS9eNW`OlEoz8`kdnqt3&dLjpb%EVnRCPAZP!v^hh;#dV2p-$-dz?X zlyKbc*3?SLQoh@rv!HfqOK$j2UzAQe3e+%lR z1h>w5Qu9MCCgb9$S)-Eq$O+UNj z!fD%{{G(d9@(9O}HNG#AH&>l$?N|?%1irPxaW+C2Z{N7s0$ULp!u_lDUgI7v@wW-F z&PT`n`;dA(hD~Zwj*U-FOi)k7Ot+%JKB$H3P=WT^5L;K>^LtBu7h`p(X$;F7Y=Mfg z{ZXLh>H?IUINuH&cRBQZ(W)C6wSM$bWf(PMeNq71Npkd`$OH*nP*N3@%%o71Q-icLQ$l546rrrpC7NagQBo92 zM1pqle!<)5am$?J{mrzBfi`X!b*LTJV(S*Eg}xR!{XFsX&lW9)d^&4#BFoSeg$#PG z`z@<+Dtq0WkXIVNNledpW4=8`T#}t0f%l3I-iFU++Z@XfK#C$HE0DgHza9fFY{A{6udTJ;n zO@#zw>o2j6`h{MkLyRog=g`EpRTcHEK7b!@S`brR>$gkzw5uqbrb)8wubVQQO6i0W zgbp>vOhuNQ*UTBOHi=YE@f73GN}zNNvnjBeTs)TwxL`3sV9Jn;t}CBycOt=supn4z zgs|r$9&!vLBdU}&UJ=I;S4++n$<9+wtSNyTKkAHNYx7J1y5bZ?Kk1_c#%B#h9H4;J z%D~;et_$85LzT}jmcQ6k{%({fw5);pq8Jz!rSkbs3PKz>P%57{$%J9Skup>?tXqA6 zvhoAdZy`Q+HlPt8Sebw@$OuYEoddYJ#bDkaCb0~ke-k(3k5>81hgwvF5Q6%JBXS7^ zUcM3d^oA`SyaD*@UbnkXZVG*G!sI?Rl1o)N$2xXm_?|dfZJ)gRD?MQ!ztxD_9gfW>3C^-EpcuXfPS0d{cZg;5%e`C$ zCxzBDRvA6MG>6UiLSS7-G1{w8s_i;fc&$EuYSqxr8yyyf#OzEl+Jn%(_1aCkp@=CG zj#t;I#F~H*nLR3o-?C88P^JBn@wyljeW6d1z^bHqnBXAC8(eHD!*eF%n7NIbt<-xZ3$ze`nTI0=b85FWi69YW{O_Q3Y3zf~|C zCvv<>p;RhYkU~CRzMe`~F|?G)!lRH`2iO3bz3ImPnAHndJwcudPccHbA2@a<>BKUZMGPYUs52y?x{7y>=S~YJy1cK|6 z!T_Ys6T+>;8f=R=D1#^70~_q{E$Mk8c5SH=S&melLpfR0Gw(qQ96XQcH&xl0&*Zgv zm(32kj?@O63Itlwph`1f=gJ72f^678i3j$WnL@`fVox#>d}-ymryo5Lj6f;oxNoNY z`yTM9=9X^(#Bp`zTjfiBV+luHIMGs zo(A>HDkUGhznce6_dME30jZDy8L$r6kYS5T!ypv!>_uPyFDXbDm-yV)H~duUDWEPL zt5N#E77t$cd=yo^E?S>ziyccMtv@CnQzuIy8h?yF-?;28QO5c21=)F z30*QEZx`W*UWl#csyQ2@UN_bEltHFtAj)*il7F-4`pX`AG0qEGU96bGo zRCo|pQ|#Awgms}fAJNWa$l9W0H*MWni>HVghbL@hDyepe2<8;Q3i~GHnp-tM5^+6V z1%ZPZFz)R!tzS(9H%N{MO#v0onT{%Z6+zBclZNhOa95@TiK7h-q_&&+C=+>sYBm#i z_)2A$gM7lNqU!m@>x(r~2v7pw*WIuUjzcc&%t80&EAN=7si&`h&*L7CU3^{TInj-_ zM0|g>Sj;12$#N`)f4s`K%k#l_%UXImPvCob^y@ZfWRVd%C2S4L%Gt{6O?W0=*G`$9 zXq9YbelmKTG8~&JoEdPsoxgRF{o2WaH7o_;Ps{oo*c6*EHLht`beOq12TjHO(~anU8g0YB(LMyjl%1)=E za!mjo(8_VyO{c@$MBcS4Us25|4mhV2Y|%O_xbp!VwbURRPqCv8o5zPB zXZV!mSAI}<;QrPqLhmTVmQ?~4{Oj@O2Mz;XUJ9wfhS9_uywD4Zqbmz2L$PluYN{3YPih|KrsLu9!oPt%+$}p92G9A&K!>to9nHXk?GzUN z4@?5}{s~}=gb~Oi?{#S+Yk}<7B9b)}GUG~FhE0oLhHcz?xZd+&9J_?pQYJk)h2bUK6d=kI+ItQv6DobgXNRY z%G@804mo$c0jgiKESq`T9kr&ZeiFIxn~{yp!Kq(^W+UeQk{O~}8jcz~pPb^A;8||T zFpd!awdp`{b4^k;J!(g+DI&ZKUAcyXLCv2`2~EYwUE3UrdSB{5M(bquj#$lt73`JB zkBsSw>M+z)MR0%20Ilw!<;i7OD6J^e*=z{vuVy-!*UoyABEy0isk|ZAv z`b%wjv;JI4bFPL*pqgt`P-&vQnpNU9ulIMp1Q1~MZ@{3!gb}Y5a&qEU3ty0;h$d=u znKy68pu(FGuO%{Q-UO9Y&hfQCPIE9Kg0e++piXR%s3|b}Xa5tP>MS-Kn1nR{+cQE9 z?13-NtyGV3lEvM|OfgHv-U?kLxWp5td8V9xIo|MHS0GjoCw+9*C$wSCBfWtpUTtS% zPmIMe*gH>@)cj9PP0iPs=pG^+N6q)g+ghakqw zN^7B}uxAj7SDPJu%}m#(k9g}|`p(oddhFW!wn<^Aq6`YqxrL|JK5Z-Ef zI>DdD7Z2qP1`E`Nus)T2Y14}1I>I!L80w&#g&G0Cq_9Xk16Q**2-{8(JkCJ7cka)bef-V+^^E}U3WVbQ95*P0FR@f=aK&7<_ zRV5>FCSJdlLFyHUmrr@ZW4wLv!f^)7-0>w5mNZcDlKKZ10|`_gkb8ZFfl@zFxH^F0 zIIvR(F5K;+`Oa954?Dg*@z^S2)HTSO#>O5HdD~3ao<19g?4&t72o}3KJ#62MKKAsy z;Z_ixI)zF@>ingFzK=kOhGuX$JRaqn&2Hs)3ot$m3pt$XU3zBsx2)$79#P)mmC5+a zY6>9GNEPTt;z9s;0t^Uc>WzX~L+Uu}4A=k}!6ujwwg10QfXb)?jK=}cj#2_OaG`*P zi*0WYu3b`AKVz$v2mWF?I~U-+>13mU&ChD#Cl@#CeM!O0q+v)IayA4#t zxj^0h&@7*}iMkAMoP?lt!fSdzUS7*0o^P*1n+Y?@Eal@ugZ4h2xLvOS(T<=NvGnG( z2#t0__^uNn&u9c2iLVq(w%7&BYZazKyo+luU~MAFgfKXos?G=CH1b3{$B{M56kZ&u zmX-5ErBr~XcQQh}*a@D92oD#{8NhyDD-8q`rw1u6m(1kKd1b5Ph>7XIAqts0-PY-f zPNs%p+QnR*I|%7x%gq2AWQs@0LeG;9D=MA z^3%g(`FtT$m@5+IFDbUmbzP%7NR zAx&=m;Z{yR0*mF7F=8b)Zl=^ z?-~FQDIxqzfuVh)gcQ=mhi?5Z|4oh;Dv^jMQUD-aGGK-Jkw&hRX0N3w~!sj z+q$|Bj2#GTD5og8#KT(yr0mGo`zUiuB=~ta4US_e92-bT8v{i-iwcM9UM7oQz9H-Zo0!hyHqHEFK)bu3mrxLeKC z_Eg2@iL@C=HDc|0!9nXe}cmR)$Ud#*-;#r5B6&A_prI8Fr~d(*{sp8k$XvDKlgplQ8ec=~!&4W3 z9+XWkb#X!YF%Y^^-~`ihT%9Tq&wfHdcRPd9Juo*V;?QWxaOq{W!)DESlhH(L&pTm5 zqurit>lXF_9U6WFLRHh!)`!7Db$w;jR~Zu{oafXo0fN^#D!Ig4>O1PX*)0CR@bDN+ z^-pN)=Ad{ALQp4DDPy_ut@Em8x~g&}{03VcJUBg@ZElG8e0S{m=oBiSTD{Hr_PjKs zE795yn$gI^(!QN}gABa+`$y$z2OS(Nk&|CHhzZ~;mNj)#UgZ(DpZn?L`P`nLHAN*b zRSvUzj4$fz?>`P0fpKRzfBpwu=^FYvKF+6B6@Lx>14kl)n2@wIv*YKsrzMTvEa_OQ za<~8?5r?!6uV8Hjf6n*d@%4s9{E|tCw-wQKom^_~Pu$4{xAhKpH<(@7j!gV}cI^2# z$z!t4)viya&lVRWEZI|D%6-SNo$%~-af67{guqNW%{qPL4YHK~xR?h8Pq4>oNNKN?uMa&_uizw4!UmUwWb7T4g7usx!TIBV; zRIU9juyiz^)SVkrSWeUxWe`KpPi@OHC4lb@A0vpIr0uSv>?SjNa(B|<)JEa zEK5*$C2L0sa)~+ZAQ0ysX5N{YG&p94Mj<@CGH6lK7enEDnSLbT`4mzf;Cf{%pI#ZTUoBpH{K7*Kz7ZKy zG{+F`Ka}ew4NHw$qkMurUI!%t4>zxH$1swv!)t{@0=c_&Ck+wfg1=?oWS-0&MN1}i zXC{YY|6Z|<(zP@f3u7d(evN9+P^+bobBXVwHn&*f@nv}cWpf_g5M z$`?&+wQya(-j8ass=;Csia=~?+6=lTlP|pb2(j*rB*uh|r%;Xv`c`Z^9g@O1=Z32m zaH|yATrl{MKG|Q$?j^|}pASDKID;lgk*X7Jcjy8())`p;9>d6Z*BK8QgfB@4( zw1v@mk_}qEjbhAjMp)PC#GV?|#}R-YOuzzUW{uhtw%G!qB2!_yhpZO%R}!#S{tiK6 z6eaj`szY_`%a~>&n%;`aHrqI-{A87e(Kh#kAbzrp=#k@CV#77$>wIOK`$OUt_!Bc6f((P!sVnOlMd-Ku_kbXrgUzk zvLbs%rpr1NQzPeC<^+&_kehb(SPfCa_g5i3H{uawLn)L)Fl2uNlr%Jbir#-~!4($m zma-yy1x8omFzB-p=+r59@Or)7Z}N}EqnbaTBBU$Tj&OUCV(Ee4{J3}fq?QvX8SgHI zO>woXo>TNv@!C1*2NoNG0rmI(^(Sub?Tf{Q-SzUV5&U@P4gGLK=r;FXPZy+F8Ig16 zCIcNP{^e5=kl~22VAo;q_Y?5$Jk(bL zT82%O5`E`9fEm|WolyuLo%*%?g%hb$HzB(D@*5~H9qmuWO>B#)&9%JEtcKG$pLMYu z>3i#fbaP-+ne?k?S7o@+_dN|o(MVjkyZ}t^oc{s>Aqp0OB?N}^rRj@_?4%OuX$G6a zClw~eUd*Kh-PK5_R(8-tt{H4)^)fsgK%O*}D@Qt^l94*OyQL)6=YX6`+?HkLmADbc zLWE=M0r!2kmZ7gXLQM{@U9Z9Vkr}CwOl(x!_F0!-S972+RVs+Lv@S|m!$bFfKfEAz z)K1b^=5Vew4fk%g@gH$v1sN1jq>JdiUf;w2wgj;1=A{y{lNi0awJFL^`{P>H^0<}9 zr3edC`rC>>K#E-}3)sXe>HwQFz`zFs;;7SHCXC4hJ|vP$B*dKOb5xZQ0RHpbq$3+F zHw`|W-^4Z?{v88^{O1GDsFYsBMO(Ps%dTfP{$lXWFU7JEF8!aEzOitZIIe*r4OkJ+ z`Z&rw{`R2Wer)#`3_LLr*gA=|#%`udHSsY~BV>W7YR5$`YG4Z~haHX1crlpg&8vE% zA z*VDf2jH4yf$YOewC0m!7%eG+NpN zPVHr$e>}jMTGHJ!FHe|G_P}*ZpIoY7OXu(ku6t&q4fV~@sJFi_Qo4D)e8V&`SKX9opVMr`AzYnuvao*|+#NH|`ewxQ&dRS~(oNXMk3{FlkXX2qPgTESLv zA>!^sul|=~JdLCH`qXhU6!Ufq7P=dZ67+40=qFXaN}}^lw6o#@jKTkewDLIi<9x-S z2VueV-y`?=45p18SNUx-_SzqSQD<7Hqc{=f8*0R+$9dohfJ z30+_qP7(>ECWthO_yv|>69fqaM441xU?!$F<~m3ug8Lruu85~~ksV@*+vi+&#*ih^ z%$DhF^$1zOlBPn(gyw{$^;B|~)gqMm#U;tsBtZtxIVkRrf!Drsxku!9!6xy#&PKbw zH7bf`v*^&7Qa_@qsdzNs@1`@waz4XOI8Lrs9hGgFkZv>@3%F%xEbZrIgp(!AFO-P; z20(1Kk}I-&zBJ5l!#W%4)W!_Z41OM7Ojp5J9F)2 zHT}slBveHRhkTt}E|h)GFk#hC*(w|XJ6p`G#?UUAJHBehcpnWKH}A}u9iJ~k?5FJ~ zg|W9Zw=mTDS>#;O*6iER{IU%Q$#&u75IZ8Aie{5r7%fbt+xyTP@5B zTQ@+p>S_#1DwYsts~A2i^-kt80RKb=%j)!JLX8Z;X9yRS5L`F4`Grte1UX;}p?l+S zR0H&!>ZQVExygt!BtVJi>RCQ(+8Z+cwp;#bCVj53=}6j4=gjD3z#G2XTQ!CDrWeA# zJO9z3`onkz&))PVF<_nL>;;WLsG2ns{4fXFO`s3%#2RoarfrW0%p1mm^j2~U49ctF z#*EhQ9rz>gnqSn2VZe)9pxTUNaDa(x0S-R_&;;`)NpP*Ni(wgYV=0@r9=jdj zUbiMf+PJaJ!_1dI@-+pns<(0I@>yYA8r@<|L8p6HBU2Q%LJnUNucFml6hTXdQNv^}4FhL~Vv4B@*R`OrBW7bZb1#bp$Us3M}~fS9xl3$3LfsInXhdx|mCdfqPN zQ*euqMl7vlR{=hK77GMAz&Ygd$mmW{Xg7hs+ex4?60vsG#&&HOOB)CaAq@(_4U&gE z>)KkBVQoT%Y;CZ$KG1GwK2M0>_p5QKU~KW)zbk1QCyM_5(<8i8!u@icDjUR7_^@>? z(j-ClVPl})EnF*=<@78%QL6={AMRm064GWurL`v`c2l3jljal2r03br zWkMx)Kb|jC@8eE)n@W5T14)n#P7qbzdB|F~LL)-t)P&bR05M)DUJJL~2pH^`)peim z4=s#n#lD_(d9H~1aSBnV2;F6Cmdm(VMS$&A3KTi%`q3W8zw!JJOKqKWj0ih(maZ%6 z$=c~>Gk)+`KYgASGxgC|V_6C?1r#&~4=)yLTu$$`urSlTHm4pEFB4L*Advd!vtte} zsddIMBl#4%_ipfe(w(stRnt5_u+{V+#xNv=DOAQ*As;U7AJqxf*uMVmb%JF}RI;9) zZ=|qWPcTd}Z1L=`8H?*X*w754hsy|2JmI3pydH@LgQuSz_^pG<)u$t$a0bBTnWh*slzaOWp!fzJl(z!(9N-DPu{fa1tcF~&) zGV#5N48##!`kXe^Uh=1v!4H1&Qp3hD;gAbsZJTp|jgILI+$mvtT~gt^fhu$7!; z<&Y~64=p$8dqvdHqQ|A9b{go~I>C$ydp~LO|2UDiZh0|{`~4&xX~omY{8Ws%Y+xg7 z-oT2-un_2Sp|moC#BS$OX1mknk9e)NsmWj{5{^bfiA*_}%>SoJ+^TD;k1^HY5p&@o z^F!;oEuUH5n87EnMQ53MK6BOi3B*eI@5lUsws&Aq^TFz`B{7t0kaWKNXP@f7wv|Hp z3fKzGZ)D&paJ*kaf|bB$T%y9E+lMq`{*RXKm~?M#*Nsq}tBb@q%y8VxSdAW}z!TO<-r$h{VGX31_%h@!0R31;GtrxF=wFq#NNy&i|d%n3v{ zGRkZLf_FJsRtOMbcY{KLfb-ANg~Jvb_D@grLyUrnSk!I<(;HDx{Vi(_x<q*BRLCbp7{MtxaHXqT7>s;`(H%xeK>W&G$gym=w`$S-CI&*rJJjRg zeicR-#L7QogFjjp#p5L>e%#C#!rNy7_AOyD$hg+$?}mSTouna(BVU}L^jxJ?Z+0Qw zt2ac+a!Xx-z*%>vrD^dY$Er%%W8ThMuhIf+!Y4;YhQ6`>3y5Pn;+gQ|wo35!kS2neTFqRPdU)>ou45>sp^A)@dAqBfXVdF1Ftc~S^tCNUK4W#w zbFV4T*yd$P)M9A0${QJDdu-m+47rrDjFg?rS1RqUVazNrjO~Cf=P{_ZVe?d#lneyM zPB~_Vf~P6FRX{;)VTK_@?2EEiCQ@3c_i^hZe4(Q9$!kBs31h=8>?~2?x&r&7J6boW16$ml&b2R# zEA|<$S=@J`2wDe$egFNIo894}MFQs{LqehDuk=KQ>0(gSC#?g#_NPmAEB8^$S$O|_ zMH@wHUG{|-6$&cJXo(`o;5ZrQ#b|%9AGk_ERg)0M&dajB%bGzZ)m87Ty^@5!mYZ*b zX9qAbUhrcvI%y&Lp5+PIs$y|i9$b0~sCDSl?=6*Bo(Kj_m#rDJ^aUP!P}E99qO2%p z45diL_zEOm$TnmOqMI70kZlt z-oAe-b+r*2=#e0OMW^VUGJn}sr_5_SUwBPJW35{6b>08K$b@Zi{Q+XS%zk%SvGEq! z@$-|lag-wrqUbr=mG}46W^_P9OhDAinVaE?S6tS2EUUYMB^cz{+T*=lyDST#Y+>=9 z9C9M|%sO<3&{as!QyMs@GS_%1=51W)D$@M5E8$Amh%why^7??&*#)&^9z&E6rmnpr z+pT;c)~|2hN+tj~Cgw&lDpqZsy0X^t4VEo6F1GEcbMRPWPz)R44Deu0&VTt;mILs0 zf38+Dskfb}<$P+Pi0${Du5SW3Aq*q_5FZ&47=DjXeps+GWPqje!zu#1IPq zB6zvcLqqWl!V^qhE?k-UqJ2ODZ~bBth~LOrFP?&wkvrO7)@34 z&l3-3gMbI*<@t#z7GrDW<{WyHP;aJrEvX2cmcq5%gl2(KP)oA6x?9 zhX}N7iTT4x^MV3(OPp=h96xdU?WW4r7$MoW1C zRt7|WyU2CnoEgWvnsF;_!3piiYYR_39SCr(6Li_VK%49oxlzuRV<{#RwzBcenoYR% zdY=tvDT$}t^)NzDts zN|)o;tph-YXv8atn@jGsciJ{*Aa^Ij3>PAMm3tVteZar%f5V=R=|@OfeeO)E&Hxj= zrQ%Lt{{8nJG}ZWRf~wf6VU(`w)a%EGn!u!8Wk*fGWh*c+SWjEC9P3$Kc9Xe$bnCbf zSQs0R5*SyLSM5{>h|9!TUHGP3Uypl5fwYJa#h+AUbY&*MDHpo!@qmc=Gk{Euf_4k3 zba2%gL=FU`zL~ek-JJsST4$@nh%f0wLy7+()=XxnRzvwX-G`LsrTK&{lVUhurUz~> zX_uqeOQqeKB`2}g;&#g_AaQ6+?5)ye;0ErK{j3({X=k*H{^iVbqouX)X-6qpr{f{_ zE0tI*YuBp25@Nd(mW{7Ww**&zRn!jXlETmb-;=!ot$wJ7Pj_WL+CA)Om+j%NJ&UGp zfU5rY1h7H}E89oSZFC@=27@Hc-HDpfd-?w)-=90no_2vnhvVmJRhP`GNbsfti!PUO za?}uapKiqmf|tBb$Zs2%jG2c~7=L_o3YcD8p34x~81Uk|xC*Qoji&l=60im?GZHiB z4;RSfWY5G`!r7r~hF%22P!>exi&w&&)_gDF#QrJ?oRToAP|-~lyE0NFqpNE3jDy$H zv(1HA;PUZV&cxJLMKx=GV89t^&{4aHV#3!4Sc!mzf^fkK*|UeN+2UIE0nt`#3;!99 zG<9kUG%M%w#k%u(^;m9)X($7*k)FAY8c-Y4SGoY?qTm>kQW^HW#v3JlZVK znA&U<#40^3f>JnmZa_OcSsdYif_uKw%+Jk~3fXirkxFNBx635r!GJH3&Z1>S`c`Rk z9GW&W96mH?T)BNq8d&oDaC9jws1J%e(s7U=Ot<{Vk)2Efdc{BRvqJ5tu&+4rc(rI*Y$0nhdSEu-?qM#G6rB=x&navpMN-*N) zcaF8Am4&-^Fi##8omI#yFLQQvb9P(bKttQCnjlDlM?OSdi=fo_-dZ>fLqkfY&78A$ zw9>&Ff<^n29t!HT{LtX|v17e`eT=_r*ksz zTgOB^b*x(`?CPDJIi)g~ak&rWrM@4ikRJ(heFXP%wXJi_>1ocEcA_;8_}FJGgh}doA0V#DaNr9 z^8!C6^}|x`ALo-RB&*AL*>hQV7JWj*qMNXS;0fy>j`ZT`q1O)D=^@Uuytc2m5pOF4 zT96qrP3C-4ezQ%EdVBwA>loRLOHZ~RoSl<@KJc}t2|1~ABkHfU2&=MVcGPnHn+qge zFU)htq{pN0I9=}fF!^<9DHq!iSvFj+`?l+IV&#egLpWTh|M|xVLp>SDO!7Q_ zsEL$tX3s)%Jh^B-)5aMbN|mPVBR$K9)jS6l<gBk^Hqyy`vQmu+R zQrdWDv(Hm1w~8=NGIa?R{naeKc8Y_)ouqoINXT+~A@UCNW*3@iKn=QZ6YS+Da{$8Y zHONGaKh1J(mleUa<^nO(xE}oTDX?BHjD4NVO{J1kD4@w zxF&{ytK|(_b}^hdh_BER=(KAon&LdXJX~USmt>R8=CBd~Sa)@})+MT~<)O7ZJj|4L z>+3bSXb^&Z>cp!rs7VcmVREC2=^B$>#%pV1>Q8Mmq=V-vXi zBI&DwYkw=W_A#{zR@>2qV1HS0Y8vx$ts3Dd&kVy>Uc}CypZp1+RvX5{>VocM?fP-` z;MWp%us6WbdZF-Op0auw6+KlZqS772YmUFEw=FPHSW>kxQKEG;QY6JJrPZui5k-ND zcpv+wUxQXcbo?>)V)^c+TdTSFgZq;H&P3#RUJeKSSFTD|cZkJrKcMSR!$mV#dA_FH z^UnL7IASBofnACkHD-qnVTk)`r1h1(YEimdY9(MLX*!i2PN=%l4k62!{Cpv zy>2zfzWC9|!pr#$*G zWqC7Y^B2a~V`Z9S8OL(m0-YB5O)~JlpmISS?+8ZFz;#VuGg|Rl5QgOnntbm8&wbh^ z%?7Z&Ixkj`ys%Y|ez`#NoZ-TwLy5dP zY>kM#+}yMo`}G`)UhLN>YzxW=r+wQ|;&){`H89dfoagWh93%=pc)eT^kQNea)P@FgGMqVi^O{O&@cudrGOB>JUhK2d3H}U zK%0pq!f4efN&6}$*W$rL@uG2-VnPl;jbwVcRJg4 zvQ*f8y3ehPs?ChvGMZ3jLsZbKumOWT*e2`k>D2&ijqN-fPqmtE0bAtg` zIL)bo(CYb+bo_8t{9Q#Lcv1&Z02$XFuc!| z8qeT-LiY&*adRCr$0Ei3RjVq&V&hX7k4QW&YaOlAnQ2dg8#}w7eY1~*aoz!1C>qh$ z8!8F6a_}V+t9(2pxyXKYaZb0uuGt94 zHEX}7F5-X?zX7YD#xS9_)U8_8Jn=M>q&l6GFm10LA&MJ%-fs#S78wU1AE4 zDlmsHiYFs?>SU9JlV3@>sX`SjZKdkXq9AU6>rcV!@rr;^(hVm&mDrzO)Yrfc<5QHX zU|WLxbzl}T4+S)%kr|1a%vvE@cmIJUi%P4vPUnrXpW^91+7E#z;AoE(!QHLI9_*@n z7?Hob;V z*K9FT5)Qusq8RgBd-yCae{HL#@F=L0*DNQNiLeaeO_iguGV-FQxa!EELTatTG4Y~O z9+1^9j7_C3G%n{Vn!mRa{nfBs=dw9V+zKC^4j9QSb@Cu_V}-BkT|{bFyO0Zv5tR5_pfGdn+@jxT*^-@1DD!}Zc0QS&wiax&N`X1Hfx zPdildD&z5bN$^w5nQgSgr>u*?)BuVelyQFdIv*Y*7w9k*1g&PxPCKDqu@r{ZEE)k! z2)iCzu<}@IN+T!|9@x6#pe&M%KOd7gio-e}RSm-(3p&AJMQ7mQs46f{C>%mFG|q#t zwT8x!3H&L=a4@V`D;qLT^L!^Cr8&8ZIO;};omWwY!e5j@R7JC>0-|nPaO8Dq(BQ$x0;z*Fbp?4(BWAc zxin?5Oqe03wNGfLA^PZrjk$Yc&L`r9=sYoP?TZ`K=v48sHP&Q9{t$uqSYi1QuT{|F zNys5D7w(u(6;i?2CQpPjr;qmg3Bwg0|H+q^Qjtr&%Qw&vk?dM9b>oy*-^~Dlg8OPK z>Mj^f)W!{ekF1MxiBD89#6U;2Ep6XO`>p~>jzI+DBB?JGesNEA>;ZPzc%IJ|5BLM0 zn9xX?Cc@kINkdfE_cafF7aUb@LIK2*EJ~#gAQF9!ONV_n3KWt1M3T~7XR)?3n(iLr zqo~A%ivw)hi5&H{Y4+!FvP)b(ZYG~EOr}oKe13B*otXtq=LzcVDoe9llXj6Mr|8mV zr?zi%SgmfN{PK?^i7G^6$_6aXbF_5<#c?sT`OpnnlTlRDu-PHU&u=4XxhRl_U*H1V zhEe$bqe00lvAD-QsIc3;)7FV$!_>Hu*+Q&2_bPoYyuy|*Y4i(uIYwiNSeolLjOGu5 z#H!k2wvYd`+;fk-(pLA_o#_?wNQJHrQG|l|QWr-xlae0#wqYVo^P_nM(9C0*CP(I4 z734lPL>#YQ`>nB>HEz%tDZNfL8ta3gE9N%bDLhhBCxP>pwMlPs4gL3S+Kg(a zE7+5|7dYU*9X#Xp?Y=`pAyiQqN@Re_-N5its)B4f09f5NPF^Q z8u~Ao=~zZ7Pl=b4wOVg3rj@`frtWg5wr(U{CEQnrmN+ zu_`zr%aKI)Tm3yNkA25(48FJgYD)m&jMaCp$1{(K%4%&h(mq_>s$+xe*1;A2kbf*g zr$(-&(P6~jnwc8uRh{kC^B*yeD|HnA z*uhuHxVw@_tft?6hA=imRb55LyPH9~XLr37xOix4kXXuYs}8%#UQ^4wkDv`OHR z884+J#+2Uv(r<3fR`eZj*A*0bqe#1GKRj~G=x6RzT3&loov)W#Za?01n!$0KV@~*; zo$Yl^u0rl;fqgQ3C(DVFJ~ItYV)1G58=J>R(9`^6ac8@pLpGoMhFl8-3w1sQLtPqoh~sHlktI_E(Mxn$m**`9mUTE4GmnI4M0jZ; zwwo1TBLtkCT(zT@HbpBda_Z)820${R_UYW(HI;-87UOEqZAo-2+OdK{756Q}&a(w# ze~D<`FM(j#?>wOJo|SX(dp;LUFO-+^21ouQvhJH3B;nq6;<`k_n`yJl7g*gM&2Pq& zF6MvZ^)LA`n61NnaQdritE0A?s()=}n%}?c^en=q2LeN&&ce3stNtpyU_eppvPSPC zGV#NGsy&_c#;W=TpY5bgXUYbtPEB>H^uipDDGoZHE~7r1U*J&5InG(x%WJS1U@E>& z2qVBJ=$l78?sk|xxW9i`6EYXdr4ngV+a3;Qcb%Qy;bM+PQ3;~LBC@FN9i3iNT~A74 z3P;X80NAZ~F;QgY&F+rM!iOr^+Ar!TiwPl-u{dIDk0u5uQg$5^V$+D3Td{%KSdF;@ zLM4xgzs10fU!op9alj4|TIvNC9EOegyP$q=6OyR(CH9W?s0z!)K~rEZhAaNR^}Phc z5SG&dXhQ;UL!|t2=&9&ai5{dl#G{HAMsJSn4$HZEeDK%~GA`h{sd-vW^t0Oj5p#gJv_WGtfb zWF_(vrpp4#h;XE^rHo+!SNa2SAU0^d_7Vc>T3dO`H z$Ctt(arjK?GSLN9mjT|J@IALlzDGFbw#(+xgp7c zCQgy8mdCUvsAklzw_>N9uK2xj6F65#fF_(k}C2 zhgM)2vDwJ?Mw<2#FZYdJpYhrX6Y~tGwoyseC1q_$*OWBx&9m{KPAN9}@d^L0PT^4s6s4dd*ib;8TDx$<57V3FV3K6VeEZ8Fiu3;q9 z_%^o9a~$LwZgzi`8sNEj2LxMe*%wi!tv^iq?*Z)X-qp*XALallsj4~`sS-#9s$vgT zX%d|7v}70bCu4rI_!;lJ$&&(5CwwJtNYfZ*xOzR--hTsrX@%@`&-|z7y!7+`yY+ql zfwweZKUoRtzy@;3G@A&$2^p0m^0p<(M@vxw&kZ9;niwmP%)aNyootRpF+SY{3A}HR zUi3D2F|3AbEN70L+H%3MrKGa%JD?F=^}VhiLo+}n zsDwOzV606hoPLLK2G$tOr$?<#_{s#W)JPsqROn-hoAYE!dCKo>0$b--9bf=VK(oJD zKo&{BIFN`)0&`RWO6d$FvJ>2ZS}kBSY80($!V6nDlLmDwoIGsZA6f#r=5rPsZKUt} z1$tq~J!Ta}JG749<|D?JWB~>n8vm_84V1tsca{gs&&p5c?7MRFJoVn@PcSeN<;woz zxLeaWzdTx=C~Jerc3wV=bHfrm<$W5{KdhCl1dXz+EO#g(oI+WR7&#l5VbKJ{}2Tm7u6F`p+D7tXgKPypq1><#H zwmaPkU@_}`aY3uHLo}~B>!%x2f@LRDunA#ytD=_DK5|-dO3JH@8nY^Db8iCuk$f`{TG>9;R&;WiQR0{LI&o`$ zhD<;*3=PJZrKy>v1k?tx8Vj~BC6J;j-)1^k9usEPv1#}BH(m=B-D1(ErP3pV)*!Rr zZ(yg9BD5NjK#|y3JS+___jY%-w|DpV_YMyBkB`qTE-x?6jt&dv=DM+0n@0zGJC1gv zZSQSuFFDWa=Kkr$I-BXbtW9bL>EB4YMR@7F0fmKGAMYC22|>!7dLF3Llq~M0JaOx^ zQho+Sw0T0RkcSrZY{UlO2Z1Cg0MA&0Yn!EtlC*6iH909JEMTOorn#jbouDMMhaf;4 zY==0PtpEa>-K2?yp8U^`y8^Kb1K$~Vs7_QXC1%C_U86kR82b0ZZumb+fR18!)b4iG z&_A%V!;R9e-Xh?Oys+T6J14#Cn9;ota4;&!NU~h*a>Y981{hsS==YA(802VhTo2LM zSPUPGs2^FIjA$fwMXz<#n!}E)JuB`3I(8C)1#zGt||&gI1& zI#L|5_2W*AYulcUbfDvR&iemBfffb`jzz+YQO5V?CHcsUINrks*2j7C(*r_LpqZ2- zoT%Jj&Ct}-&=VdsWBGu#d@T8AFTu_Zn4ZkcK@S)%INCU6NQ&i%VjWFw*Yzd2R)H3A zLgs2M7OGT3#>fU+jRF?OH~|U9RGt$>l44a21l=boUlbO1U7mAT#hSX8PyKjN)Irse~qRnGe9Uz#(k&ALZ|Y0FotV<`TlA#7Jm2w#em%pdC7_UCQqh~x?XJW zN^dmt2XL?qTI~A4gMNScl)lhCJUBc(_aMf;0!q$M|K(Za!y+2A^-|n&XBB4f~C-5%SviN}X1l zIZF~fnZsxaE`zutZYIz?`g8TV5Dx}L*sC!NN>dcd0&3oiGVFsJNb3`>ha2FdK-~t| z;0SE!M&P%#%d%QGIVE=3ND+BK(|e2Mz?81&JiVf*wq=+%Vs{nyaXAP*67FLvli0l1 zH<`G&tok0PfOaM4QUZCC6lZnJz?eX5Jl``6G4edw8BC^ZgAM_H>2~bt>*>2Me)#&7 z!?oPpkVxqGSiV;IbEYKrFA)p1Qt*5ijCu5Pl`63|vK~#2i+k4Ii$93;W8P5^)*A~HrZZ^GY;Tk-x1m>LtNN9eR<(pHl*{+B3=gujD^ zHV=BMn2dc8LnNewE{MRGo$X3BAM~0^s`H-C@Cn8XJ`O=uo|!#euDoX z2R6GxTcHTkT}w2*D-klq>D@`0T~sFgLjl zxhVOgN(35~4nT%Qvi+YHlT_3D*UmW-GcI24PsCMAHGr8C&Ydw;W%u-hcZgyy)Z*JZ z9_CFi1(gQrmV?H4Bo?C0OQ4)aWl&(zuFp@puoE_wOsh0~86N5PRduYRlFO{2UO<6E z!TaA1c@OD?LO<6h8P}3yziS4gg*iTUdOTa}$behXb-iNdX2gZsA#S2 zyDaq-GyzRO{$6sZ={nfmThku|hxl2(mbQDgxi)^9J42c+`=s~hA1fcAX82rO%_fz7 zqg?F@ro^d^RpkOH+xN1+=Ufs7W3@|3RXNlu>Yk?=#``KxjwFI+MM_zB zftbPSb0erx-aqM*G{w3u*G}eHj3{_9%R=^ICJZZg3c$F^ig&rVhGV2urK$##du`Kf8y;R;5Bin8|`XFAi>^?)~7U75`n z^Do0Z3Ha@$+Xg;Ze8h!~25-WillZ-4S0iM~XIgYeq>w@h#ee$WPe1?A&ueXqrn0F7 zfo8!*yIs`iINA?o2>WS!y2m2N-uja~(HKv%-~u|1p+x`0(E(9a&YQ^5Xbe)%>E=gN zf#oG2eDIU~5J@px*h4afI@-d~BF;ACvQ{k0}(| zu1g+!LVG_Y>$bLu3qIE*t4=GAsIPbJ0LkkUEjqAosK-cJ7EV0IKjF& z&7h0tu%3{s)T{}1%D<-@r)S~YUBflIlkqk&HgnT|(Cb-v?}z=1rd%Bt^2&{JK)^CL z7YW?#@cD}d7YSSGAu|fLjSN|5{(BNl3 z-%kt9f=xvDoPzlHd_UbOBy1mKk$vCa%=><6 zbZs^Ukp)juqPaecc3>irb0{szX$O+S^ZJM|3v-dA(dGK?PQd7Hs9ZZZ{gbyXw{~9dZ>P3Ec8X8-y*Y}g+ZQ=cTohYzrb002Y=%l zucE}m+zXyuFENZj=JN#_RN%y=h0w>Zn*r_5f8kl2m$w}7JeiwikrbHwdTbIGBTf8! zG7H&<@46u5dfWTIbZsQcj3WMk*&j+ej4Do6w|?`<@CZu4Mnq)c-J2v#@?A2zMhe#; z^Z633yM8;V0=?a_zl%rc_;B;8&8lx{?*%l)Qfuw%Go51NT)I%b@^`i#dmG1ZCR${# zHgh-65pH_i#C=0Fi}sl&Z?(FZQO)Sq;3&M9j`9bEK17)mm)CwNqDaJE6-pzpf5bG%WI&QOxtGqtd9#p_n*B``qk4F8ukUk=>kB@o zx;$6;%+L5?_w?qsT~AeWCAO&#_~PJxs)~G`3LV@~Rf~otNl_bgqm@tPimJwl;TK4h zP_sL#VpMdp4Vs37;Vzpk%U%u39g99@FxuLZ95_bdXRFSFyd8o!HY^wO))lLkyo+*O z4aHQJtvV1rtL}VB%Y%$Q>#J#e=s6vnfgG;U#8=3Zxs|&KMwqg#l3AI&S~}zEHk>@w zU)8Sd18{M(H@}vZBv$e^uA;B;*ubAzB2=~03#zE$(GIICE9$APg(crLlP@U|(7}e5 zsIAeC)Ey6r)wx4IK#-_t+cus4bvxTdn+m2<@~NY1MT*Cfm6TD_<>SN<#}DP9vLSHg zRcxHl;Y>V7FVU0aaABy*{pEfLG}m*^S08WR5xnpI8@kNyZu97tt;1(>8GrPZDUJj( zQ$Kohw@hqFUW!EgF1yKe9f#&*-E`KP;}UCXqB#< zh;o?qso1vVMQJ6o%gx{mDtV_}Es}+Hw{M}xTWfXq2#`^=Qc@if0F$H32RizE^|_bxDDH&1i-pUKnhy$;ReC zQ7zUF7N9^?4ToGV<~XJ@=yXmhv-nou5;n`Flu5_7n-{ef@Quhg<0*z62o-AxDy~tkEhp#CeI&Mnf0&cQJ zroX?SPPX;Fi=JGT{4l0UyI8Lg7a=BL)}XPNG~F3F7)?o;Zn{T|GkJJgxHJ%eXO~;b zo|jA`7hhYMXWyjI;^rE6EL^eUT9(> zpFW4`VV?6cjgF1Yd0M8*UbnY4*F5D+-m54zS(9>@w@c>LEFj@*EwDw;CGZcG(VfYv zF|#f+A8#zwpU94Pc`d>7kHj~3{ zv1bZVe>mU^Rc^byuCsxqNo{cQGO%I>9+lu_-hFsj3AhBVN8yns%Wxod;wEOW8#5f1 zva_5zQ1|G*#F;`57Sz^N&N7>4Z)8C6qUvSp7t(X1Wh78+-1GdLJU@z3QF9kUl3Q0L zUpuRAB_J2fl7S0i$LrFx^OocoCuo2dMO_oKEcx(oOPa-q?YpyB!#m1bXOQ~RDVYP4 znQ!i&hvY1L*2$E^ERnpjR3FH2Qjz^@8}QHug=9I)O6FejGPtpKv5*IF2)eZ-)w^CQ z7r{0q5CVz!o?~1iL#_vzl>S}m{{DNpAVoX@P)7!%BbTczE*uoCHRL^m`@h6P zKQuvLf{k}vDL*Yg2_MV)zhvgm%UeL+U1#-|@O z-@=*w#}m$*p9|`&Am_&4H@F$yD8YD+iE@nE7%2^xmG^xSA>h6*0{%^vNHi1j!MhMd zhfsaxS5QsEv_wIWq;UWz2yq>tYO>?HNe9$Nv8;=V@h7r?(_k2mnd#L`ju{6M#+k{L4M>`QlUXP{N8v`$M9%GTCx+k)zlblXi?OB(P`7?`sgpcd?R z@nt5VO$|6AAx@Ai%L$?Y`$0s~+s{v9P!xCvE3Iqwo|}Fw45oF-u{qYY_43HY^1=b$ zEH6H+==x)w?$x67H0WFp?>28UC${aNJPx8r&s6Z+Babz3xO z8A#9a5a8ngpfp2e5FPlY^cBbQx{=2z`NGrS%pG8Q*C!W+8p8#-9JBW+x_1j=Q_0r| z?&@-wRaCh2_YV=ktp-%kn0{7n?!ZYk>{-hTGPmtL^1QBZzH(_Gpb2!oc~z~JQGEwV10gfhHY#mC+2|j!NauG|_1mVpX=aU1eC+Q>Q6NzbdgxF|Rp#WO(JzrAQax3;wX3^O zL!tm%7Bd|T^c5jkFpuoBew#*{UaHK{_#o)rY&I_FdEgTw$+BP&aU!1to$Ua}&_y6) z8#`7YWz5~o=3^DNtD1^i=LtT2yi1x!EXFrGw*+V zuRd)3-**jGj13D#AtR25fcL-5qN`zk&{p!sebdP#%;#KPUV|C)BTx6~ubeP583?)833!xCwAa&L~mKUxlw(Es_P9TfZ zu2?cRU!pZrQ=nY0-=4a{fc#MV7zgoEg*3KW;N6GGB+*E8vb6vA#mwu2b3N4`5|g2g zo#B!GmKa>Rvvx;zVlt7AGmGhTr6i~`K_HeFygRNc?1yE}QMcv(m9eo=j?Bm|p$ z+K{ffxl(>crBXD#k?%TzEN7B)YJX!QlYjm*k?X^SH?UAskdw6o5&bAN4;lggkS;&vh`3aJ29SY1b=lwAfP1JL>u3$Ed z^oiD`F&qnd+b`X$kpxI~Z=Lo6MeyH51q3fKktu!tD? zF8Mc^nABaT7?x!;4`>wR=GC*jdR?#%0J}kj$KHQ>fEKDG*mO&ij!r(^N^BsL)^#T zz}(xH%g32HgQ-@7!tnE`y`NNd`uno?~VVTvUgJY?bJrH0Qv?GE7ni)wzjbJqz<#QZo2@5|IL`(*g%$@K`TlG(gQ;bxB zTLmHX&Gu-aa6wsb1B#X&S^22(Ys&F21^JZ6>Gem0v6ik54vnPuD*ez5`$|oE^{eRf z?&xf>P%PdygITj~Ua7vH$>??vdm`74t0g{JoDtxdh>OM6y|(Mm1r;>?X=#v5D7`X; z3`O9@OuqYQGBJD-{os^&>G-w6MMaXS5;!Q;Y*qjn%tTr4#B}D8R)ulo(pj{S=SmRh zkTh};F6KFsR?9;sEP?gFhJ~{)8k$Q^XUb!+>0s`GexLu&>KAMPX#&Ytv_@6d6nO0} z#GaiFhsph?!5Sl4zUUra0}IKRr+T84$!9depQe@8oNe`A|Fn0_o~%xo?PEvmkGnlk zY&RJj4-0R5ywOZLv!sB{(%0=qN9ha z-0>p93=hg(n&Y=)!OWLG@z3}Vr&62KX?yLi5@#V`W6{)Wo%mYMa_-vgWezIVty8|+ z$X=gM+d9@C&Pr14rY+(;dL&uOXz_hVuEv6vVQa9IxD(AR=X2H6n@{Zub}{&FI94o) zr0DE*aAy~+&MesNrEt~Q;!$m&gp19}p6W*2Wi*!+$KPlsN7VU7BQucoGQ(*yBC5TE z#B=m;aD_itD927)&bkLG=|&Xo3d%wPHWwtCtKDhyf|GfXVR&aLOKzTWg!`>A4DU(_O0brZsnc`LSoaxulwSc9#7PZndO~@{-M!D zuv^$9yLCA5*S9r2V`snUQb!Q!IqS-0W2gkV4>`v5v7vCu4_H zlc$lD6leTdk(rfY73>nuSOzo#ql+O*uRwD*BEH5%+@ED7nktnmJO?%1;D9&qw(-*2 zCzLtKwr!qgBW*Sia-Ic9Kn+~wb*3F*d-LcfBbXq5Stn{|F+;eU#ScFAwnlPTxa$HO z&9UJKj>PdO+M7qvCfa*obJ=s|13E_spaT-<27%C^m(n^!6fJh6JOx4HmlD<88!U5c zeioJs^`!dgS`f(t5YD3Gcxrn&kPKy9hB!x7i%=YGew8zHL4-XOv~Z`PB4$H?x7H^D z&*AnT(_4oV2W@a=&&V-k+j-knf;^?yA%hQJK`H}r2W*;7!D`4US502Elz>)Gb zTdwdp@D`HeMn?tIrp*ek(pZjJg8y*ld4EF65BByKtyF&f1KxUC6(){VREIMliQmlL ze&88@bw3$Shg%$U%+eyTwh*5>tf@-xpZ<7TSSj(U2YM^*1bl1t_}%~h#V1duYbI1t z3=hMhyy4rSn6}#xX4IT}eyu7z#{%VPv%`7QRAahjnzrLPAyK@n&%WVsG=UHHYt#zP zg!$qSEsJdSy5BOY9k8d@QJO4PU;xS^;*d0}s)_;;7^-FtRWx@oRTtreOv|E}MeWKILD z!jTJlN+3p4yCUVr%@v(kVH#Tm7#Wa#HSJm*e~RP5 zELc#$kkJiCn6x2-Gn<;iVZ&p(UPPAqW)#EhcbqBRlWSxsNt&r>R-%Da@D9h6y^|?A zK}?WD&yoz!QV74sWW=KPv4L1V_DPIs8RA^nor^6abI?ybepg1qsVI6@lQx|B(jnq* zDwp$R@bet| z4HTbPGu{9If{#kychGY#2%}Dx%_)U#HnrwLidET#*mC|N4q+JSyU<$X!eeNqkS|~a zUMW{ltXe9TPStmj_{}aP7_b5UB;J0jZWwOGE=Rw!_0PG_mT%sgsvHkBr_uRD`sF{} zE4qN{GzbZHLz~}Y(3cv<3k-}hq9@|{+QvjGvP=ry8Ur~I>Z!NJzW3#@|Is%KP}=Q! zHC)Y1%kw?gc7m{E_iqLyfaPW%fOt$FQJ$2{Ov(|KXHeA}aY+)G7+spU{>H+PWheyj z@bJx8eub9uJkhyjZyKBSNJcx+qD2c4?bpz8NHP&%1SZjdkv}YA_|5y9hnQ{l?)#Oc zV`1^PE?}V?jqROb3o}NgnPF$7^ie8DP#Ar$p83SFQi7~-7nIf{8au=uejNA8Mn7CI zM4J%n4_$JD`XLm~GDhQn;kDVQ9FmzQjeN>V-5n{0FWY;uBT$z{W?nRHpQi4Mz$<<> zJWgFzcL^Lg0h|+nALal-Quc5KaB-o%HY-D%x^xaUdWp}dMM}AL{$nEyA>-1yaqH^0 zeu`~TXM0FXoQayecoYz~)?;g@<%yn}d;!6V+5Ai=E5*Q2E;`1p~L4)3lg8ZWg?YqQF-oU`oph!B*P#oNmMUdCHB0{W;2;lPbO2)K>eEsY6r`HL#_^%Vl0p> z8Cg2DXe|8-t3{d}IJ3}BqAZGmb8!*P%vM#FH%<-U#>%W!cS6P*K%e#EM7{`vg>)iKlVo$N)C&=!MFth zbw!kC*|6!@2J#u{WHi|gf*JjPwz%en-!$Z}**C!C&5?mj{+BJlANaq$iZqYR4+q8} z6v8Gi#OMY%)-?fgj4DGz|H*R`~OSf*s%La#rBE7rWK&WoS1`72e*pXHs>bPoi!!R$H0fc3xs4cD6p zjQcujPpOcF{`fYTsp`*m%JjW&CCZEY{~OykBkIyfVNTldkXRZytz)Zk=%pi;71^VN zhGsdE!lFzJGAO{Uito`RL z5`gRhW2JSkONP1_YnuZF;unAdk-m|bw9O0T{&h95F%Sj{$ObzIQyo`9dqCq9IYw4x zX{tkEDVm~4k^#BMffd)I%vqG_GF(9fTed|?rRD#gYTezZJG?dCdCyhs*Y7NQ-IFr? zR`TiP!XE}thtJu2$~NPxqzK+Z%Q|?p7;0(Z`WfLs2unH;jIn2iLRgb^dOxX;8jNy zE#k?-+|4)_P<$`|S2-}<0?0>3na}*C4MY){l*t}029BagdJ}g2U~+k7mSI`igupP>L!w%w^ZW?ZbRO9vt@@`K++O0G!GlA|QTB*=_;QK*%#BvPDs{N%B z8Py^MUA}}^-v}JWcnUBanNj1omrOGK4wy_aHy*{9bUoT3M|J0_%fs~Pm2~u@G0dlF z*~_FA498>bJ@oR(V2eEJYeMl}QPtqlvYC5~Ya7t19g7$YrwlF9~; zeCE1c`2riMw-*U%w|lq30;i-SoNI-&YxQalX05v5Q#&i<4gcZFaeT{Nl(d!j&R78X zRWczMnS(+-Wiy3aX_HKjaC081p{jr12SNY1^v$V{UdTaMgI}0YVz+ClxmQM5w2;eJ zc*|Ew1>RIQ) zhE~fCt_YKnQH-DrlNHhp?_Rt7@hN-p+3=B9EEWKH=oh-tsX6=tNpphgDtrmmgN+(z zeT=47IIkIPoMA^i)I@QF4>URgB~ zgkHT>Sq0*{Fe;ju30w#b(dw`Cj1@nj-AQ{=VKwZ6<*?ND-dj34j&a&CUND~X*l&79 z8=P|?R>EXiw|&1Agpjz3z>w{Ttvk835$RcGG)JN{q!+wMmHRjRQB!3e<>61MBpNQTr zRbM>X+_+%B8r5C2ID~kb^XAwVVPnZ!Y%C`VD3iZWV<$ePrm;uMF8rq(m`3JSRMvL5 z9k!8%0`;IFm8F8s`o&W`zilVLUYdt5yF1LTv>50>csMer5_{oc9OQLQ;^&M=&Y z?Qs(C86R33i^0Jr8vSqj(d(~8fZ_kCOg1wMX8(ZKl+~FRQJYh-Fgq*Fr^J~Mt}?04 zx@hsW_WLnE2Mc`KpPn{La@5pA`IyL4-*~L^!}jp!%lhN%Mh8mn-%GhSe!RoS>V|bP zudn<_-6^KiGYkJC9%yPO{cleiJ)>d!IV9*M^~0^*hj8ONufZk}fVW%-tDubYFJPgM z_^(U`DU>P%MJQG-q7|CPs)ZtgWRd)Jno_A;uAnHOQ*U#Y`Yq!jpKHcS;p2F4a2!+IE^ubO7|)vpM!i(y$a>`v?m$14G@wFG|REjjZ( zHg9z=j*8;u zuO(Zref9_-!RKvr7pK@Lz?y&**N~)Ti~wN!QW^(vh%R*85UyyBVRYU|Lr>pR*H@4A zhD>t4)V?D6hZn{MgLgNdxRHj8Y{k9Cu(&Eg<{#3crVD?xbRh(eo4zle#aueM7yExX z4LR!eNIG%kBgCFq$K)|d*vx2Gh01G_^(J1id^BhYttSo9GE2_F~>V7jM*}3mB-W@}* zmfH+>)VWEXw9U0d7=RsRn-;cI{t?dv!?VV$?Fe^~Y00`)b+>+&q%lV|2f3NM3E*rB zx;RwQ5iC|Age>^SK2V#x`S8wr>dx{mk8gbW?hho!q&{q(@z|o>8z^3|o_s2KZp!X^ z{D3@9-oGm-S*0!TU$}0+i(lQ{91R@NfIzcoCT2+9>xIgh)~GJI>0h22ChIp^C&2Mv z-sy^L;|B)-bRJ=-O z1ZYm8t1AEkhZy{e2ZD3+*^5#f!zZE|1VOha@pg#-a=M9~4(>^%+@|B71GQif$f&Yi zSo}BbX6uV)DlTNvs9tFm)w08)YrfDk3{=uft&B+HNs7-^E3VWd+#?&_rUdZ@#uCA* zCMje>m{K^_E6Ozxfx#R%gVlP|(gr9toBmuO%UxvZ$idgw>K<%25HCH^sCFN_laV?> ztK^_qZ-H|a21+hja7HL(tIzQ{3mE)F4hsP+Sm-U3LoV^c$OuNckwSx#ivJ9^SkNy8 z{RxK!M9punOn-fDO1DK{vYpSe#DFGuuvA?jahC&FWW{#W&RMb*|59)<+8FCY4mtNZ zL;z!{nVi<f zfVF26S~S!G!F%N^V!zZn;|hFy&(MHmTH~T!qO2*}`T&V7H>9jkT7CGeH0yx8^%k1D z-*+ng0wb}=LT}5hERd$nxYlv@YoYE{MBe?+&wsV|wp=cEWyIott$q2nRP<$bUpTus z-VvPQojF7so+WeDvLDP#v-=BlS0zp1r}ky;L|O(`@XR5L=l5Hi!TX{&exG)y#9oYI60*(GI2>W39SzLnKq;FFhEjo( zr}>Q%)Mf8emY7CKXamOaOQmxZ7t;kNfp7f#sSYB>5BYjCH~A!lr7UN+r!C-$j$g+BojCHcY!XlLsDoE)~25$E-6&d9wJ29!)i1q;(j z#thd}=)`29_c1_8if2}U2+kQL`*@_RpcJdYhWLIJwjXx=EKNLeqC{XwZm8l+n&2YR zIt2yf!3yvIh2_466VkY-8OJW5%E}}vvdM}ZbO#O!INPODcJ z=$6JXAh8HUDI_6%r^287z zV(@|_=CSsJAVc6JMKct^kY_qMQG^^zzfvVwRiQv8T@3&gj8j7JLAj6vP}CSS7M2~= ze5|NzAqvL1^5Hi+WfjEHQh62(lxC*V)^c&!Icubk7&H6|qk0|P3C|;>MM*kYtkt~? ziNhE{HNbtH#-a}<#|WT0a5UgLh;xk;XMH0V%eC1*e?WjzP>7^+3F7j{jZ^J6h^Nmh zy6^%TBBnOWhCh*)fqs$k17)FHW&nl$|0D{Jv_&%dc=4RnF&2e=S@Pv`_!FMT-kEY5 zh%rS-1o9mn#%LenD^=-=B|=PhF{HM}k)*pLMgpjp?iEf^t0iM`6VNn!xTz=OJjEHZ zMl8dcrx|aFqjMm8xB};}n5zLQAOsfY$=8V_DKMF{f-GejjijrL(w{OML`_Eo8cYY$ zf$>EQbucD?zNDPiZh@ax*}jz^$mSAvo4k+Rf59EBZh45EWZ8c0zMV|cY%IMU}xpRm- zRyAc*ViOgh@ij-j5*Z!xY+4x!DMAs$UoM@X=G+L@Sl|P+{ffE6S_KiC_P~ZqG zUBpm4n#D%ncNYU_9#BOSGYGLM>d#Jn>W!lduMN%&N|q%vnX|GWWVo`m!#fd59sgUW>;IM zHZNo!e|%RHeeUNoxU_L<>BLkiDe&AKEgtlGs!~(T9MkR@!fN-9?WjbBFOPEA$T5!7 ziE?aAXW~b0MC@Xet7zx|zLQRNb7i4p2)YCsh1NiIXghQ*RM|rg0S#j!!hRwl7yZcl zM|Mem-iRtZs3$qh%TU?0ZkAtK3SZi^FgWbO1Vz^yr%BKPc=FVAt*xGt7igB{=sq{- zl@Vh>PdO_Y`;ExB_C8gpa|NU%IV?(3qnVu>6^y2YLS%WGW_c14bHXj+fY%a|ws1m9 z*O)^78co#%UQ)|g3g4r98nYgd56!d1g6eJ*7NiB^J;v$sKnzQ3K^a7Kqd#ST_!m!| zsEd-EpxUC9Px=7NJ30sT@67ExJfNYZX&f@z#7qxvsDzu|_tSOpGUktGf8p=CiiU== z?W;Cv^wVEaRiFS1%}V-0M8U}H82|8$DouSQMjRh~M0bxI7MSy@h`T&1J=QHX*v&vS z9+Y*`JIk*2eW=(~XdiP;fk0fX88AoD6hW@Qrw>FUX`R4n_z(Vq4mi!?OCGc#oaRK9 zYHH+4dX*wd5)-1T2peie9hGm=P03E)YqFLDl9SF0Tx$$J%TmHHLg0*>Ghx#Sj0r03 zA~wL>$9H7fK>Fgf4T1p;zRLw{)?h^MRbmSjX;%9dzqw=NPwCA4gVuHe^!dHFvHG2F zbh@*P8GQ+GaJSQey}tky7NfFbzdI*{$U!=*N-h!6VW^yJb2C#ND`$6a&;p)?pU%b91G~Be7P%c^NiUM~s3J)O&-1 zRN*8je){;%#PMzC~ywz2k} zW?;FVRHEx3nx|h#OcCF1+*M^Ez{^2mm>Z00XEDjh@$MR_Wcc&2 zkvrv>_$<$Bm+xQo(^DM&56?n-63+h8!LO|5OSk8>eVI)(q%1eua#vw^JlXFw>mjoK z{7gx7pO0a?QBgFu@cKdR`m2l-!wh*fEoIg9UPK}b2h|EqQNO)}kJGqPQzf3Sx-hvm zl7cS+)BGGQtFtOvt2_yGTZdIt4BD4v882Qt7$4g*x(%#J_HUvqb+33amk zGDt&_^_FCPJy_!teHJMOHC*Xq=}!R#{1RtI#=w6y2Ncyd6$^@LL(7IMC0u!No6I7~ zvjm4CB_KQ4rYi`jyQSi0MniY2pqcsFoBy;G$GMGO+TJ%No^3~I0v%YpsAE1kZ5Q8_rX<=~T_mx@Dtc!J|7glYa%kyej4_{RXXtNT>YUNA@{xxA$H zEKq4FgQsw&Q0t|#Qlq0Ob1A2i=`JlP0bM#SM%gu@uF>i$CZSLU?@c#G*FxyQn4!Zf zGIBA9v;^rZcXa)yW^d)^Nc_n!v*Iv&QgJ(1L-XI<49Ai?+m^-cQ)bglB73+NUAYDl z;f_>+d#UdIuhe3DrA%Xkbm7KLTW>4-O@?z9)sa~7hja!x<4qYzlst}KVkzMw@hfJX z8p|o@^wM(cmvL3nSj@z_UPRt>rc?qc z@1!}l+xUtAnKqK?jQR2(mAkKi>Kl9AW>!t8=~8p=pvB#*cz>(+v+Y}~tfDMYecs>i z&dTrv7W5>wohL6Tq~H#U*R@1x{1;`#*DE-OcHBtc>#8T6B-+Oe&{?>rN~bn494w_$;N&o%j9vs)@_SJ zGfeb;Wgw=RXy;g94;#-;;tkRrs*llh%c_#Vs@#lNYL7@c99dJsi;CH}r)HjPrY`yt z_IBBKht$Rmqnf*6ce=ybE5AkUa>7p~7 z7uFA68iuD13m!m?P%Y5 zv%`hlKt^K}_QE%C3iiTYExyNGO{T)x(+k)@qLMTHU6z}el0KhD=zDDy=s~5nsLn_F zfGj@Cezc`13)-4dhve9>3?MGGxVchLFAg;7+XK17J(MRgwS9caX@KtLUYYqs&VM%g zir&6lTAj<96N~4rOeMxEoM3cH^}RGSbX$#O z4w(ZtD%wA;`w6|~l7&Cf{!M+Bd$h~B9KBuj~!9 zjeQODWM+F@Ire4);8;ofKzyi4epMhBquRq|2-3J-c^vG zXfq9P^dHr|rT!b9j$Bj+VdbX2k?zM%*(0*!i1Wo68QqXWEm$6?5GU295{}c}Tr<)b zeR-or3H8@_-mZSXUzmRR!IxfAGcf0>jqq{mpB~A}+j%zPDqTz0$703khZ6l$!|&$c z6Oocfw{rZVO-MMliuz%0z_!@VN-UZz{9HDBPQ*gML~gb^TW=%~wo&)IUchaq?#clu z3Yu2ur3qv}vkqd ziZ=M7LS z;krDTIYcJI91_n$$eK0oY*zvt|DrNLvxSEeu=Kh9o%7qC!jENp@NQ9q$U!?L4GW-+Kp=f9o_pMLI~FUzd<{Yz)bI$tYT@F5*tWj{IZI8=!O zUGnnOOg&TT9PI7yxsi^S5)!1M>0aHVJG4@DIm%Bia*>@5$y&zJjxNvk)$J%IN{L@` z*M1qwNV}vc8FhqTVZm1r4npT(e#0VB9MH}ere+agj{G~8v6HpB5LVLBW>}Z);ThEO z{N~~l=Bu+@>V{f#n4B9+UY)3nFu4Lsw-2PEHs@0EN5l1fk9QcBWtQ(qk*RXg=&>Y# zf$A+|TxwMpK!_Np*^6rdLP^4-vuw=4gcgX(Kp_na5tCO1D24a_ZT z;@T$7JE1az;&5jNy=iv^{PB4KBtjpx!s4H;Y8P1U+`qhV<<ML%2#`7R}N z;V4`W=dRx&b4Y+*GBPnqFCNeY!hzW{db<$Z=S{ZXmi}2tR;rV29s+-X;uC{=35!*F zmN`>?^(F?`+%?uu`QU-m6MN}KQ0FO*Jfix~=}`i1awc`aE^&$03A_Qt(=i!$#)R%k zCe@@3L({}S(2av+maZytjap|2tdh{qR;+9~tY!ch<2DB|L8$x7a~N!j%Cm69^E#PW zB&|heq*D~qvmoXf)s0IE*A7UQbl^1~&WucGJ{|kpp4BPO-Xx@m51HowKNg(!tX+}u zei@9)cj%jwI%I=5jv?`KG0hjqJ~Rh_ePRdzT8(J9$vP*)MzdMYqjl5Vi_j~xoh>#; zM{53cxo4aShQh<$a`0q*&(QY^KwsLZ7b3@g*sY9T8_X0ouJ9ONQ= zo-)UjSR7!9I~2tpzBRt~>86(tedWtX+}zOPYp)8Mq5k&FbN*hzqINVF%g3#*qUQO? z_gHV=gp<9^rv$ilvmvTL%|oIGD}9NOnl6T|Isyj5#v4Q^IOKH`3Fh6jEviDfqw`*AodtdAFYeECW(Xrlb1An62S5TbPN@La1UAS#HI{nz94I zpui3m`+};cQkH#_FGy(f;+4(oV!2a3!1b^oqqeMER%~FDL(Tr$ctq-%9)?J?9#J0_ z5_NDqYaR+Ve|dYW=T`MP1xbV$&PfMKlds1ldv?i-?h<$)ieC8*0Px{wuO82mE*hI# zW0l%vmaXw^QyE0wKxLEkgwT67U|IE(-ag8aaxRMb@d3mkDdWAwgHTykrkOg1ZC({Xs? zlU^U$lCc+586Y;Kr&3}-$Nx?FB%x7YRNN9^61`xQ8wdLE#+~FcXti3n<0tHcQpQJ; z2V=7}45y*-%wUHlKBexVRQS4w#9UO+Q;Wwy- z!@Xp8Y#A(lZTJD6>s#;l6)uy`+p71M%jkO_y=xv1CS4|@U-4E=_WwtgcEh?6uy zN#}TT%NOk5lutokRF-EHw&VmTC=rp@wtl$%MeTpa;DJ}q_OYa!w;FsoJsV9((ia$H zSRsKZn(Z!20|zh*{lKeRzmYyiGw-f+w~`Lv@_UkLSx}w(uBI*q`02(|&B^0I59H{g z2|swx)O=`oG*-o&+v>sd(*zUh*Z~=>AV@34dtsP5DkEl<;{ii33NiTjN$zcjh#n2% z`RJyVI4$f#1a&VM15Qde6RUP(I4cUzbM}z$rbOlLBI(lNy_d^Txl2Xm!lL#Z7s|T; z1VRAOdN0LSs7K#_`fvlA^1sz0w|&>Ey~On!N!Utx(?WtJ9m>_<>eOC$D}gMmAd@&G ztHp59*l}EBGT&Hmc5p{=N}Fr&(< z^{O=5b;IXxUUsf@nh7_uwP=J3v5T=y7s&81av@ls@1I(+i(;HtwZz{QZh@u!mZw8| zI>t7muk$eq{2O?FgN|*VIuq7EL^hL)u{v(@>#WKB^VM;4RElfmx`qpt%*Ts0}#%V{66h3_K z_^2_czx_0Ivp(qXwy{5Jo+SDI*Fl8U-d)h#<{oF9?2b+&=R4Zj)W%MbL(ks=I${QC z^F1@8OtFP#FcEBd9gCNyW7_0#H4oXn=U=Wny}=Io&p)B3ra_Q5SwdP8r}G)T`Z~Q8 zuB$=PGW7(S0ff3~ZR-+}XKMB{vTJb-U1g<@?HZVU@+8vh4Cnz21UfnbH~r(39kN9O zKtQ4Io}HbTSYpv`4GG+0m^Zb-l}E5eIsBnGJ*KRwAp7ttJ@`tj)w_r%25$9{e% zz3u&M%HbFFt)&k7OUf0G#}bKLE}4kM-Bxd+wK)<@wY5^jr;=Um&6P%L zu(j_E6@Vupkimva##N|L&LhTRmayEBv7*`IVAbrH>CzI5g=s{J^%_~&$GT3_Ji6ZN zHCnV%id%}B&@{(X#7Q=F$eP6S6dE^bysv9|p6S-gjm8yz4N|5UjtA@BSG>?ffbeu3 zunKIa4~#UYjPLc*xPG80`f8ikn(kuuo-od=q!hRr?6GO3i~^yJ8OyOx^CQ*0nFvow zGEVjSS!-`O2Lv5jDOB2VZm+k0!&5gqae06#(~sxBFY$)=+jf04a%6=OHN!!H6YS1~ z-gBYvg(U_?cmF8&o%!^~-D=fTnVWFUPfmsxz-DPKfv0u4QmTI>LfApTf28_lVYZ3o z{D$g2Z@(Hzs|v`RVV!f=1%7-==tM#G!LS! z!`FHOg?ciBDGD)tN)P62ner{a^y04M#T@Wq>nj>%c00K^cUa7?iD6~L<=m{A`Y;b{ zu_DTn!j|uNUEV}EG6TRo>5W9jP%jsoecJjjs7ZSH*+#-rPPN>%F7+}rDR&<0FQYV} z5%tahcsEifsB=GAbTL;VOfpr<>tRV~!dSt6A@?z3w_BBk^VaJf9$6#4;}p{o{u1Md zubzPxuz-a~_%Ha7LrmMcyBN}DWmS&f1sR@@7`4 zq;*~Pnf|b+qI&zs-fZ1rTP71fYwWD!38h~fChgghIAxWnQgV(;o})>|Q>8S}X90-I zoGb5deBwt}q>jfAc8rr#gCPgM!AqI=TCAkD(Z|*d{e9kdZ4w+i^;vz@@*m+kjxz54 z)90V6nIs49%CnE%^R@-D4+on5$=bX;N6pfZXy=FsqfDtLvxiu*69OhSlzM}bR<*jr zKqoAlS6)KzJ&Np1sA8`n((412~h=3wmr{P$zYl@hMugCSga;=F`F&w zLq}d#DvB=21caePA_HMbkJeL1@zL{{yKOQ|h(*n?dj8^e{J=3ZgT}|#YsT0t@^I~&n4;30(~euJ@ zK!6|!8hOANr_dBi2~dLb0S%I~Cd4OFrqp?~uo6cDAp0Nv!ZzW(SzccT^q~-@#vtV; zH{2aCBi0WW>K=2-&$c>y0%G<`jz*0vmSQtLbe;uPTr<3;Ax9jaJ@sW7!)6iYgW+BV z5)W0A@{to-rcH2CjMGMcs(@jpS@H{T$nW9lnE2Udr`JK#GsB9z&^@`*tFkCYf3Uz+ zOII{Qcpf+Grmd*hvul1aOO0Wo?hjn6g)~Vz_((r(bizec-xxh1cLgbsW}I~|n~K*3 zU22PxUz@*tW@ab2`i5pQgy9n-MGHer^MzKyeNO=`BgXm221DF4UuNS;OtLx<0G5@3 zcbVoM1{)iSsm6?G@@$jhiEA^lXl(8S&yO3LV~QffbldTQGmNzBv*vl9NSQ1tvW!I5 zvJC%6z_m}YIxk4UF-%&NS(BtO zDO0jPTJI3Y*E^m^Q6P_c8(IV|u^?kIuzU|mcp4%p_D-@a6ck1MGOz-ieclwa0N~ws z>6uZE=@P`~DOElr_aP3`>ql3iGQCd^VsA|JJzE|L2cGL1;ou5k;nKs2cC84!Z&!~S zd}(V`R_p4Fj5P4y5ez3g*?)#uNEx6X)ifycJojZF2FAKNM?x=CD1K4gQSaDat~zvG zp8ZltgPh5EKEAL#*6_0OoRO-g2pmn5hmqP~Sl*NPOdy}7>{P|ry2XlN4*B;ms6SfRHzkJ>^r`SYdb_5d9OqSTw7$BU%!Z@kc;V2_nwBa;FNGL4bVA#| zvrB;PDhb(K5FNM4lkIRnFtqt9tK%25a5xEKC(k`|)t3ydjwDA{c$4G}>S`mE;VrRb zAZptvx;=EzR@H5=L(SL4hb~w@+Y;FvRzq`1XKCmtu2r)1? zmY4V{5lxZW&^1L;Ka+`FDZ5iKfY_Hd5G$5JcL8G%bs^>Nmt>Y$hwKShW6DU^cm@&s`6sBh}ILc!v45t7(ZaHCi9@r81$2 zU0Y7|&_zep^1yCm?lJGcJH?U3sdx4a92?Ui(R^QK8^#LGPy{5lgrp@c2gR>uQ3UNa z0@i9xt1Y5F)f(d%kM7=)yth!G9TVad1yesMD3X@69Ev>ONB|y7+P1O_%U}htA=4#Y zFR7~1wm|Dyj5)F>n&p`m#IKA)uV)yRD$S?C>Hz>)(}fYdw3QpY$w6%x5fFH5cb3!b zu&^|}^+n_4gwf*km^(64Fa~3q7hoX_%Er%JJ~Z`d{%#1a=BT+*=6Oy~7R2fB!l3{) zt5=vTmq@O@e;ai=FE@YvwSSEyW17qnD2kW={rQ7~BYJNH%lpTol`IRwP={U#hMg+C z+~nHy&#(OFDD1Yf53eGUtQ$sxZ92mU5*g9FDWVpl`l3n23ym5$`*p=}r6@9)C@$y* z=u|Z#)oVh_FHA+EXLOA^ZR-XC0SqLR+g2*b2XEqmEc65GK!2KrxULsi+^;Y|4>Bx6 z8Lc3GWh4$=qbVA-9gAj%_?!51O9V4;T~&!IN7z3_3gkWugJK~36+Oz^XfVdc;6 zEbP|ecU}=aZdp-QfhVa4o7L!nuPk z`IvRV$p}J{I*_&)2{4C@6AQxyV|EF@vs{b{*-ri-#xNuS8{>Me>sM&l2k{cd#=<%) zw_HQff+)+hpC->S>{BAnV`Nril5AO}Ibu37IU))HKsgGl7}j4Q9ILHRaX^QYm0MQ= z!D#a5F21?*R=*7E9AHFP#Mgi0@^?sCjl@?ue{^eVEmq#?nVTi(0}Qjd&B780_qFa* z`!E|E-ZBqQwZTO2gtr>&>pHJw8WUGnG~xVj*MgS4&i2g*zelJ#!rF47m= z(XX|9Fci^6&}=$=HfQuZ5v###GwWx8!z>xYrqNp0P4ziKQFToasOgxMxhP054Rj?r zX=0jSO$Y1^ZMc zyrL2&TO7+O%@|XGnIW57^hcFC>&Q{KPJ%QCv9*VzYvG15w?XE_brxD44sK@WD4SSQl zUN5?s@LWL&)isi|(g#bJTGfE!eGpjeYxdp&-?Lnc9j5U0N4pIg2Ii^3Vd(AKS%~qW z5<6LDh0Su(_N!}91_Vp@iA&}ep{)n7PLUDD}vp6wv$hNcJ27&dmgx+}$xu7Is= zzzO@J^Rb5`09=+;pb491C?g83pkfpF3+1x-R7h7A@p^$yYY<2fuzr2-bk%2z0BF>( zA?Y~imQ)-)&t@<~v<$*RG3ksFv()Y29w!=;rb3`48GF2*BwW`6QDi%iOY&3VK!A7t z9kuf0)l>~%`W8aikJ|7dg`SGZ!<{tK)(uHK|XIUNalm{THdK$q2XgP?gVGp`3lH?qIk_ixP$NQ@In55 z=AAg}1v6jUC@C2PmTf_$6U~9a0*}~;a5RtBDM}`4-3x+%3$_A0z|YgVcxuEAxOCUj zSpGEs;!xx%2w9eAX^LNrOd8GR`h5_VM<}~|Sr%l%0vV?&K2Vr5Pt`+11k(U)`XCF$ zoqAG!W{Pjzn$`(+ds7-_B~?cD9V=J3w1iwLxp$A!eHl;{V;DgJ_TU+hUZf)B5?oM#H685g>!Z%R*yYH-6 zp+lna8b=}^DI+C;gg>rGY{dZHWIG(N4bB@UE<&T!^iEHf)aZgOq|>(AU%=2jQxV4h z*79e5W^8ibMWa1l(1xO!+lGTS%llz*bl2< z`-*^EonuwB15{!vAPXj%>m_5DRTQn13P_UU7~lzifu;pNlLo-(DU&D1C6W{g0l*l; zvXIb_Uj$xE999jqkY`O!;pzGM<12fr?(lt-!O7?TdYLQ+L)K4cQ54 zs4m|88>!{g)6lMPpf$im2L&pkMK-QSS#}l(K+YH29WY-#jMN6%5SOR7Qikb)!4aip zOASElhYQG=+3rkjsO&sBP@=` z3{{bM9$ii3hWVq7(>2{N%u-sG+iMS^mXq{vDC~#NTVk1fJ8K98iK5g5N%)yWv_N2_ z+zUfwh-_>zT&2PyI06IFa4q2h7~^{cqQzDnBxI@^yfmU(`UYaJ;y%m2)1_P0feG{F_3-?NeCfwz=Cf)lG~d`LMERe~^i6i4Su)nf_+feP zu%x{FE0>D*`r1$mFMw)FXuTJD_ecNySf3-FxPGiRIH!KsvvjSF~EcktrKAK3r%y z8rPX}{{V*W0FaTxOAUalxYdQhQY5BHgO_EPIg!+j)mEznnAqfvivUIoQoW^#iGDR^ z@8*ilXFBHSmPneTV>R5QRZ4qv`4jRA$_}@u$xPURufjTCIoZ{XRgj(tZ|!fOnrX0f82RoiEh_OWUT;7QGpuY*50s&RDdn6AXCUZGr0LSgu=qE?JQWX*czMCOMZD)s56pkTO2HhE6r z&o41LzjJ#LRzInJcKMdcgUs0opCz=1(7yW^3wYv72nUaT4XTZvNN-NslZ`v(jpV=V zFZAph*Q-Vu(-IX4)L3@90KZ)dk^+ObXIK5^1*0>)fg-gQ5t!R5Ds75IT{J zWT`|F0t*v>2$qrq;QB)|Nc9qxXY}iErqipqsvkTYLsK}4p}oQwfGV<%lk{tjqG=I^ z7@0U~JkJl^N)ayk8#h6RuVg}{OZil~9A@?wKjDiJ2lG6SVaO|e00!n!1o z56`yQ_K+5)LBS#vn`jrwf=y6PaK4Rfeo>by+`%0|Pi)&aNBo!s?p!DCI=7ox%p|g@ z?6x;X_~B;Sq^;;dHCf9er@o(V^b1US!b&oJLJP=JZH4u4hK|5>?FjQxpUT{tQ=ca8 z#I|;M+iA#|9%Jj3UawC?3%P1BDlA#Bgq>1kW1_SvTs+O4`RaK@5+7X3`sLXqwsH#U z^blPi9I3OaiquHR3F>em$~}qXloq5~txE)*@}RZcLuo6)ArqnCN-hcj5@07s>a8k) zHOQqxSJD(cQ0h%u0g-C9w=@9JQnt~+2UY8Q&ej)A4iZPp#S*N-c4P>UVqRx>F-1C& zda9qnEL*LDaA<_O9s`3y^AuXuxgh2OP*)oUnjC;83U-U$=i%XnG=0$lFZ6H>&Tw9a zV^c*tw$#y|H9#=;pkG{3O+iLu!&)5lHQs(aV@akNV=_MKVfg*M%`_$> z;VUjZbxD&(t=1PF$JJVo%yhe*jBxP-GYIbgc#M&DBXL*e$VwG;6?uulxhpqX_@%X? z7LSS%pNX)<l26Hyp~>^koZ^XeBK1^O%WInF zfgx!G(k7;G%0NT2%5_0kV}Ly%d7r>^B^z%nvvx=pC&+5$g(=KR29C0P@J!e_kxrzZ z66=@+p(sfLflHl8CP)b-3Vo!!CKqoVq$p9!(|W!El7fTS<=|?kHib*9j0v|^qVpdg zc%HLDMl|1DR5O7SYyv(P1J5TYUkZRQ0-uDwnKQ9FJAynEZPy_1uDpCK@3xCjk91Q&^9(!&P__ld^V?f z9G0Zh`bm%@LFKGS#d)~|xilJS-AWoZ>54av`cNMaurz~$U^N9T1XUZ08k9HFO>v;J zw~rfE91g!P%BnIN=)?KzK>oky%0+x9_)Ks$zI)3@c*6AyMX>r zn(N0OC>1FZX^U!1+KjCodSY4FV4c&yY;UFwYw+RhieSo?WE|wALY_B}YjNLM5=1Vo zL4dffWSaj8Ngk-W5!9fLYzM163#%VVEMeq-vVp zn1*gzOVVX+LsK!K%1UwSC7^ktZSZ8!X^CLi)?brasxW{IT+7thJ`iX@6uH>K3QOJg!*i~ zd)qT-Ycx}Tmw~attA-M#+F{e{tzOz}0d}JmH~K@y!eX@?@z0t7yKK_G4XqU75yN0u z=*KrgrW2q+5)>4|pv0QQi25YQHJ&8t>kr=3$f`tNW+8G#asWeB=PImyXD$b@pn!J- zOcb}ab#@wEf&-r;xdjD5e+%jp{RF*sUwuE+I_>{h!DXLYk!Q5wripmxR;HcBm1Qq! zaiq>7OFAg1tEblg8Zb0_8_Qx=uNA4GwX-*p*k0Du5f4j#40V41dXabO` zDkZ1Fc*Mcc(A*^&!$>Kw+i=ty1rW&4)7=$B%UM5t?G~xeE)+fE%#Z^D zDe{ceBE5?KTR-QDaTU9H>a%ESqX~GTwp-W*u_XeXwuK{}G0m7lsq&lseWYI1xNji< zZ0fTpG&ds&g&v*>O`Kcc+8~VU2r|vB8H00W}YoHr}@X5>Ac zWiTP67B*RgV36rD|9HjTgW|sDpC22o0?#RqQ#}DCGYScDQ@1G8GFq6ZrnQoI`8KPX zDJhy9frT(uqZOUvHMNj*y(-i^6BVo|zC$S|Krxo-Oww7JbAux36Najll-TnOl49E? zt^*)jRuYs0oNPG_MJ$lB!jfQ(jq(;Sfpb3NtgLv-tVn7WMH5MeI+xF&tb$x+1=<$w z<*Urifb0uN%y56Q%E9WG1lCnBNS*SQ=YCJ}Ep0;v@~7G+G~DV~tUNc4z{J1wR~+U1 zM3y^KR*!=c#TzDxT5O67(v2#ikBh*??y zuy$)}|I<)fV4l(S1NRkQK0P~U+2bctmPK&Sc4?K7iq|z5t_&&zjfy?{-HreulTGH0 z8iSwr5*ZA7sS`DFf;*G^KI^%_FL?U&DoS+C!kYpO36=e zkHwgYJG{jhZv8;y9)`{XYSZ%OlHVM|*LDUBkJ6Dv2;hRJdqvSe1h!pLGb`bUl1w$$ zYhqy1UDAZRNExTC0bw?h=;3~tcReU|VD5!t7L!^IzqYS>lWmyk)0E~>Q&w|H{Jrr@ zy%rSBoIAsT?RWCMdqHI@FxHK@`y7U$6n=)&P#Q$0wV|a_axJkGLknjc@^f8P%ZBnp z2zoCO+>{ojs4%lZG*9!d*C&MO$+cdz5TMY=Qhw{xj-hX7_?VkY8N0u)q`E{r^H122 zm%Vvphk$g{T7OUl%S_w~X!I6cNZvH;J>+43Nxi1Y=GO=MD@elF$BLmve@a)C=sEJ7 z!PLTAKVl?b9UC$QV#BKLUPEHxW6l%Di-txjVfNTn`yhNXk9TCNjcQusW5lpQs<5k6 z-Y0tjH2;)HS4Fea?Fr;a?zuNpO8=Q}w;GMGQ&uq0@E?kqUqP4+Ta}V;Mh|c?u7*B? z*5y+kb9hP|4IX+e^$qnSRZHCgy@FaziO_L$6s@H0f&#o(oNiZK3^0}tJi_mosq-4& zQxTG7LB04)5qW zjk(d*o@?5!WoW3ij+#>%W#+O1~SVt21!8nntGMLIf6E}x<} z*l);3pW%1;gB#zsBg?QtTVI?qmx$9i9RX*5J9es$kiP;>^3d2TCK1+iNa zt%Kv+6VwCc7qDWY8OW1rRPJR_Q+*Icbs8xbwq;VLAirPqR`*<8`JlbCmPpIZ`P!{D z6$-b_(DFgC7apj%=Fy*CJ$gl|Z2im8UHM`?#4PcL6WKz2S=<@F*rDa(PYB68madkD z3YcjKg=i=iON`Nh$;@{(~^>pyY#!OZr<3N9R8%k>P|OeWi9 z7O)d`_cz_k&WlIl@knE~)frpJr)2nVKo3HPz`Z*X3u$>Y7ZL=RB{15>aQY%{;k_cFaRjlOhwk@nD zZef8<1CN_0UQK=JZ2s!PSI-Z*h&v~E9$lRZ?8`S>P#FOk$E;myUmD+`A0M|wK^9Yq z1Gd{dU~M04tv=^ijZm8KV&S#Y%^ixQ60h67cK3g2PfVCJuIt?Q29Ij4&_*;PI>?i< zc=V<)Czez#qN4292i0r4e9R%R3z zob@kl3+9qgI1C4^KP`zATg+&6{fzHeY2)tNyAyna)N7Smzc_29-xI zPEUtQXzw(6H2ZsJTjcTrDhNIAgEAFhl2{(4fxQfZ_ zK4eAEC^GG@XR;!yl*z7++@}1Ma}Nz)$3exVgvz`f zSRmXxm0$_U!{ht)m@P}9$PqFbEycXB2;2IKtlE*o9}Tf^AK+qfm{g57~fsi^^aNhXxQ`B zU|B}i$pX<2laz^8VQ3$@+NhY($5s{Ttp^H7z%qH`s$g*0`c?c-g#i~8Qr|6 zm(NN9(RO8qX3`AZ?$`stA&ZE@zLKTWAB2N}HW>jS%&^p^>jW$7gi$a1QV3CoFD%pb zFrtWhoSBxAvx>jJFACXYPB+s3Ir7t;1r;YtJa_7y$G!GNcGJz8KU!lbmRotHBROT@ zqDe820vQE8?eW>MtoQH?{Y@V?FQ&?$o{>>oAF+{BXBNRwd$tc7FV7=a#j`m=W1=OM zm&HUeg+Qsjhs1u&XV-SZ_Cz=5fnCR`#A>fwsQaFgAtJw43Qkv0qU+mCJc$Tm?lbP# z2eOxgf`eTMYj3~@k+ic)a&`RXKt##Vql3HoAA|Cs%Z9Vc+8i+DM6#~Erc$jnlLIlA zW!=y-4=r!l1EJzQiGq@=EhEB=1=?f;&f*J8^gY%qNe|_h zNX{|*kY?x%^bR~P)W{kKaQbU_ZOe=>V*$|tJWNwZ5X8@g1GqrRu}k;~#g&HJ;8`jg z4bqY%ij$;N-72J)8IU!c)`NqTU@Wvj5}h0*$IQLj#fSn^c=9!sMm?0eHFWw$;}Ne6 z9bcBoDj?0tZ!hRk+!xtH^}41V$Xu=~;QxuojDx%Ss^iYbqJNDu?etG(rm7530)pCI zCqNJF(#Q#cMZF`_9AxyDM?eN{U7$gxvKl>M#F|PNvy-&xfz|8ydcAZy%gn=usI(15 zGh=wr5JgGoDW%(1p|Q+>9>ZiA6|`r^E<|af6Vn7rzmf>EHG*2(`4oc$Q9NKus;#2T z@*0A4p^4Jh$AYnau?J(rEfYZmK@bBvAezp;hFoY66txvn1<%3KOcaFzS4B%4!+42A zam#r}l-#K2`X~r`Ov-b7sTaY6@=Jz89zc;dcff*9{_YaUTU6P8Cr7)Bd}f^(@;9CzkHHj-v8%9O`QZzjc&o#ljQ5EKu!+usYt4|0ctdw~uyF9#3O#{nMAIJ&*7;Z2 zISYahbb=aX55vIZoU~4IjX!PS5SO;z{S8>_eo6u~pQ41{+eW#<8LK`p{vN=6LT?F= zl<-(5JR4Lb-~$Xv>b4hcom+#4Q1i&fYx3p>;CLGFcNq9-5`q& z8$i#8`5$}7-bA6?kdZD5K8<>n`kZQ@zM!6jN>CYcu?+OIvV$yjt7#S-G9~$EULTPo z`7_gvj$`Z#!E4+0cO81*TBtGmWm@Xl=fHOQM%@yBvi>60|rR?Mn&u+NV{K2xF`-oFGW~6N~P2u86N3$Y4+OC{^glW{e|sC7B)q4oVD>(A32AJ^$HH(>!b-U{TQ-G zwD+J>E2q_js%Fc(2LtA|t!$Br+GrbcKhc3JWU*Rt55Hr|)J3^M%5=Ea(l;t>A3@s6 zNumK$b$!>+K);lj*k1yokPxYGyMVnS7J`g(shQT1+)*)t$-WLpmPQKYN=Z17^o`2i zMf=|1AUFKg1^N!v*^)0=oWESpwlcrzLIk&pD!9>3L4aRoGh%~pWE@Q738zB9bcKN;Q2SZi{)v7Xv{!`R*G)3(2|BY_)Y`CYwuFhPy(Tu^V;40 zLh8mtbR(!TLOcf|8(DoVk=6HZeuH75$@vKR9+X6#v8f#zg7J;C7m}g5oK+c2^JZHY zBMrHoJ6pV8bc8vzjED?rH6h2OZszRvD(Zp3brN<#ju6=pwQGsq04>vt`NSK1LBK{L zD1kLAf+*#t$P%qomSs2!8CnN2IF4)*QBV1kf(BCMa2La@;`+Rgfzp2#g^+k;0a}VD z4W^_;T+DB6yFRS$ky=Mr4Zq`~dEc_L0o>*Z45~F&U!6W*7+{L_7IsR>@HBwA=zs)6 zs_`suyz-_TkXy@!@pKtBatd>+GY~&o;Xu?O1fd$kb(x*mGpx!0Bu~r02RMX~lya z69ODm=Rp9?f(JSXK8;fMFzH&r*tT#GtFK9&O~Ds)_B()BYm@?;?{& zfq#3aD9tqjT$5}>O22o4%lY(~vy7ZEdYMBLX2-V#^Dm#)CXeB9>*8)fu9t-$k7YQiu#%5%a zi!Oz;b5TwLrcmtqm>~RP5Xh=31QmboAkX|r{0kSo{dKrd*aEZfX16hKayELwD@jB< z&T0Pi)Ms#@uu^<6OVgOQ#$l2U9JX%p#ZC#}1 zyb7ETRtoXdYQ+7yoRF-j({{WbozUd5vI09ZMqcUuzyNz-00S6|K-r!Ft@R*{ogmN$ zS)TKyx1?cCUn;Sa#90;W61EDGQHBE*w5hSO@)kCZqQL#R9)42X;A#qPzm4-qP@|2w=m3WVZ}t-8%rIgE?$voiZP*s- z0VlVQ3AYh|`+T23WjH4-NvtGN2PPwqE@T5>qdw(*I=iWs5G*lPFiTxQqiR(7gZ#_s^Hm%apiux8R1)UiLhn?x4PThjy7ffuu!=*i{zYv>o4QqcdoThVXDr|W z7>vjrV|NWSf3MrC_qRMK=aX~VXzN&~48 z(xG(7knz?1!QFhSxOXIULZ~1dwbe>{FEZbmiObr>+VeEc7G$P%9b7JIBSy8=l-vlr z)gEWJpHVV}(#Y`e1U|H1jb<`Wma=Y_NM5#k+txL{q=G6b+L1O#cCQ3Q5-6G_5#KKh z8V7rx<5hJ-0>HI3xRiD{jpsB+kSFwW6VZ7VCfJ0 zO4xc-(ex4|%UlQ(ysF@XG*riMwnU43l{9OcU2bbC(d`i;1N-{;#)j%Z=Nn9?szM36 zLS5j{Z`3Dz6{RJ0)$8a|{zz!wRoc5zss4)zc%$wQ*s|Z;XAvtNAHBY>5IsNh$Ew4H zZdX`1^>^{=Fs%g?&7}VhA2Yvn2Gp@*^+Jq7gHQun3v3*1RQ?(o4yImRD|JOE_++%& z#%^|yXSR;WBD*t*TXjC(q*KUqTv3WpIW`FVy7BZ#->rMfa z^^>h=#CtIA5heiLK7{6WHC1XXB>4ov-+2y7e9Q<@k%6{=srlr7orR5(;5_?*;;dMT;@N$%28ih7qQY8heE2r7H;duYQl2) z@iIHRm%24Ko=T?^^3Dl7SA7u!zXNOnt>@OC1mE0pqt|}c%8~QK!86l}K^MtLq*OE$4fr8a67K zGd5?%^`jF6)&hxB7ZECC?92RgfS0VB`EeaO8k5w$TDIfJOa_V-I?XzoyFu{I3`^S? zi!28W%7s$5j&gvM5m$oeEEQVR3<`}>=afWjOum?JDS)bT3FplrX|`1zYYi@3oz+!A zR1}(46?^?Yqoa`TVLa%Tq7dTpYGdm7E+( z(hOCF2Z1xVg9kW)a|G&PsHv*R(3J{GM+99ofwVUzWhyHq8o~`MesEz@#lC+aPLZ=9 z-8>3L7E|^1wp;qK$XJYcg|P$+gtXO{(GSTy$ll&KHLSX+^MfTuFf7mvBdVI`xmpC- zTu)?$`Y?B?p_0B2GNe>R#0G+fqT?orzfz6IiV+wV)}I^zCksAloBzZjK8hUSJ}xA3 zxx^(^d<$NWxa8dj=wDpc00iIN48$D+JpVm+9ZQ79alS;J^H`1P%ArFCT;^Ta5KAoH zAh2AKtWAL=1($Ufb`RliU;VZwQgIlCR!Zv{qV#15CuN!Cq2^fX!)%3S)!91|KKdc| zKV6HzestZyu5as%b4E5LMUk+3FJR!4=JwyXs{&0(Q13e=VIz{qG4XaKE_6hBo{?pS z*L#xJYO{I^$4fPXg!of&6>!pGwQu1T7k=#^CQq8gG)F>XEo77d=={2ndr^^d`65hT zr36j#&%c#kW4lYyUvhKRNL@I1uIuG9sM*Ui^Q6@_Klz25@wWU~KRcL6R~owvI^jU_ zTMGMldys_+s;e^N#lC4i!ZS0aBnlkK)p zlyk8W${n-ry`)-Nu322AU6&Y#-e-rv9S<^CDWA-P|k ztllwZy!-8y5Wg*7zY7TlxYNr=($(C^$k$bBbvh^@1pQ!CuD;Ax4+ZK$7wAR>z_56d zIvuZ0Ztfn4MDublwRdoE^mc=WP++H8B`$e}L? z4NaD=uaNv(m4d;VrDWp;^>R=#+a$$^6gp)3&$F`Jm{Vlx+6KGnL^&BV9?+ZE4HiMR z?q#hOfg7|0sPx<#*)}(^bWral2#WHE_iiB$WFT?a@Af@27**Z7$u4fic5K>>)Oltj z1#CTJ-uYLH!*sG3)ah11RnNvJbQ6;XXEj3Ay%4W7qS5^xP{7xHlMwFvKBNr9}D3m~;65>GMp39iDJ&f(M3ok3>DDORN3b+JN&}WF>>B^p|~9k$a%6?g%Jx z75SsLJQ(3P*DFcCMU1@T2$uC&A2VA?oNwL;S4eaSo!%qRwE8DYyj@eaH|@dptjA zg(PS%mD17Mu~;AwD^yY?JW}gP;l8@|1kXh;MU$6CH=&7tt{1kUY0r)Lcif?5-^{s2 zVc_G1L;zSxyR3Z58igfb{c=b=g~hcLv%n9kU_c^?k+Y;Q2@{4%lIPh>NjyMH@XWTn zuo7NvQ(HownFh%{S5;q0g8$A*z`y|q-~b-@^^pEE9F2IrHU~pIDX*ClxQ6SokBfvLh~@ zhtCclE)|h10txE3tXA{I=-&UVtrkjapW)3l1A!9k?kTqdbm4yAZ)C0;00nR5IAA|H zpwS!5)TaRb*FBP^>nA4D(S^i|$^^*c2IoMjL>>JCt7j!(m5y+8i-Y3g{@!C)U4KOY z%Gk7GqE@!DX;<_uPF#PzW8@Q5Xhtg}%?$``9g>}1BjDL&cP{@pe@~&n!vYeJfIsMh zBr>~~mnDfKiDI!tR51bv+0;IZM;$FUl`B@_Z`kctMm(}3?dT^8m%F;P^WUEQcmM=D z#+0Arx1?G6ABG6$&no}o<_ZS|oY1?VeYfBRNI11miub|XHtIaTet7j~cP2I;7ehQn z(}JS9uA_F18KB2XRZF7|XN*e=FO?G|D_a^FZsru~76PfYh)r|=URtR~5hLldB$*z> zzmo83#(z9o#j&^Gt$GW7(cojvV|c}_1IfPZ<5PW>Ss_;WN!5WzA?Zk#W za5|!^#y)usrQBE;UMyvfkL13HpQM$&rRh7&YN@}Te^57DY!67a8o2H5!$%Fnira67 zTqE4elpl1&C;pK9BM>jZi?sm?6G4vn2ilzui`nAxxa~GO3ErMJ&MM?G>1^(E1*W(U zO7J<`X7XORV$GfE=aIpWifYsv=WVC;$nxL+@?#ceO}_uwl~skB$1*Q?g1X7#2fKqe zNm37>ML)0d)6kuH>?POEj3<-)wdr5#67;->hsVqFi<{eb6ta3w&5;%b9!>Vzsmjl+uQRC{s{x*+HYh`$c&{x3ZJbu*Ng#67PRRfJ=qN6 z$Or)7dhGhAPB@bGyg-^Jr{1cV-_T+S#qnYpw5IiDEE(-y*n5wpA?dt$IA8(8I}c`TXaFl+mU^nmJ_8)3!UMQRRty8LdW>#0gOP zlFYg_;Yu?+S}V>fs>Fy&#ffMg%*9RAX4RxAPacFb}`XT1ME^g+oxV!&(akl zo~Tx-wR={ZFO7vJ9M2ht+d~;7jM129GY~TuEI0^9I8IV5OJXRB_>PJq#`FCG)1g!_ zs8u8CYWf#18D}X)T@5%=&z*7Jsz#o|`EgC#Ija6sHTgf+_}rdzKYN1~M#%>}olJpW z{`w%@UP+}$X##SHog6r@q%u&|H!B8v)o$LalS+)K>T?r0XpX8!A5#rSU}V=&#G|+0 zICx)l_o@Mc2dCXhp{L4Z3`^Ee^bnxgS>C%SL98t@-?%Z@QbL9q*bl`C{BB zZr2;>lRzb#q9+P2F(crm+M^~EVVis&=lS&-1KN+E`HBu1K`_KUdGl=%wCEV|I5k>ode{BXdS!>^0D6eJV44C>goHP4N!t)WQbcivb4+f%Nb zS}jGC8jVUJOPW-uftj03gNsydepe^lOaYuWie5P4i>U;{c9#NIf_b-sX3nj$2E{Im zx#zSyYdaTb3u-b~Y3;LsS%(8fhkebg*Q;1Y!TKn?!-w6N`6xZ${2OJGwsauT8s9Ez@|W>W^^WccHB^H7&;`K zvRNLJ6>lz6?3f_r7N}%pqbCDx<&~BNHVE85=_jX4GIfDK)#;Y_$iG zgNIwKalsvpITaV4Tl9lZ$e5)#E$A9Uu&D>Z+6MXLX#51oXNkL7+Vnm%#i(1W5Faz> zv*TH44jWdKvR=2@DXj;Jy*MF^u^vAgT1;g`s+8!NI~po3w@R15I44WHF8e#^x-mws zyFIo%VH#r=dsWx<`6leeLb-Hl;Mb42Hk*rjEj!g(avhwP#yOgR#C-aia%0#Ip<01@ z{mzIGM<8x9O&pHSo-<8nS5S)5j~nQRV&cz>4-DxbL(1gm8jHz&us>Gb*a>*Ov3RM` zE7pnt@p&FKLf9@k1{bx77uKPZLeR3LZHM9cZktc!bA=?)cguRmG@ORVQ_r%SAlN25 zJSwBm!uOAoIdn)Svm~}A>w8}{ydqok9Anc~v-@KOk8=$SX*#|gXCL)1(G^nB(;HW4 z^YCgU7M)Zd3+eO)n^RCBCy2;NFwZ8`O$pmS^@R(fNspmtml?EXgRG?A9f-6t9jMT( zxO&yzOt$9<@WCbnUjp-4J1^-s|b#)m8>+8@C z4~vLn;#pyuH3KPQ*ezfF`Kl^Gx|CYUWG$;u1wa;$42T5nL4Bh<+=|F|r)fJahW^7aID5wx}!DSs<83T=m;v6rfc{>&aSqtO;9 znQNNYaUzBXZSEi@ZFw{nF9Cil^gJ5`yn+&#f~U!~DmAcOp5HC*M4=F$mK?w83Ae>V z9{LRv`cK(G?#9IUN2OFCmFIZ^t3h;zIk*Vo!tF!^t!gqbiU^%n1^h0nB!fLT=1|5% zk~uokNklSv)kEKKk3Fpzx*#Ea1V8pnEdY+Sp_Q!4vRVdNOa5xMG7!JcRY@{eNGZZ{ zHWRxAL-F)LD-Z?yun zt#*gqNysN2UmTW@pXE)kw_00PsOy{-3z>gg?1ztU`g^9Eiy&gP2Pe&-M`J#?21PRB zvD&l{Vc_z>5rvaqx~=bg(z?#&ssjoGWSUw4Ln#Wb43D8I21bL4(e76i`Kq_>kj!r( z3R1xW!WhTTG_Ig7oSC3DqGg6I2%;Wod{Im$3nW=ct`xGM)S)Fa`2s^KN^$B-lcadN zX<2<;KS{ucZyBVTkG*M*fiaDo1HB)Eq6}%8OWVzQ(K?i+p!i&!F)x@A+=bPiq-$u?A2D|7=7jbD30A)1h zx)IGNip&6f+(=lcane;0*BPAF{t98E6YSXqy~MzwS-SoAmS^tEgUarnafd&fNw@&a z?cRZKYvoAm+S{1ZZ;$dMaDR$Lps~lL0)-I0EVUmH5Qy}&J<+cuHR`6ywQAL7?HehW^Z^OA@R0lO zXtl}n22rY$Mlk4ALAa}2md$3=bj=Ki!Yw7Y)pRueHE3>MRcv)SO!+J#aUB4(@eG$J z@hMNd@x~UTe*6#L()~WgH{N;2tMMN;yu@&*yvQ5ee#1m#QVl4S_z_b*qcT$Ip!1Y* z$qpND`RLaf%x|8(lSgeqG_TQI^KzxXX9!)dO zQ`dHc(Qz2hT>AczNc4~%sl<*eIw&9z_3^Yc;yFRhf9N8YbZPBiWhT=D zX1Ah48ccI}dv%0s6tDLm`*FGfRCk7=;VN7nPR-Zz+=r@qCnlL+8sv5d&NS}7rOxff zl39O;Yr9^7ff1iYoisf7V6n3~!8IgfQTb6A?A7cvLR<}F3MX^(%nKH4z;S>pK1jd{0CVgy_$54@s6l}WkjWl{U&2n_7Xckycnp3C z=eF&DE{bXIYB;zbQN;7X{iqoO&yv947=Ef?7dBnx(sdNUU{D-MSegnJ`0H1Y2rhpD zeeVFx^fyCV1y)O4k2}vt*dOv}6EWUK$ws2!~tfvV9 z#&?%@$yg?WTw=S1VTb_CK{vIuEUZb`*Vs%@+W>-wbUWX{I>xX8bR3|>xYhxE@;FHX zImUIW$_b3gtfz@F;+e(Bu(Zv&R6fGyfv!DZSTby(>3@6?$2PAtKzfn2gk z`@|yyR;+q)8z4k*W%GO_L4oPsa2LVpQZ`YRdFMTUK{FWQ@|9;rpAS45`(VG0J;uaw z0qiWW)I~2vQiot$-Przzo>BY`S>vGHokVahaR7CNbrLoRhNElTB=&SY!%#S-f`iY= z(AMo_wl0Iy6b*Hl>Y|f?)|J66)8}dYUBZmjpMD-|c=j=GpY=MGFD4Kk?&;%?SaIjC!ZzdG_DK(72#7rogz{)aa%>1H8aToO)@loOVp|y` zCI6lP!XOM%!Hx?l6bCN648=gNB_V3@zcSFv94OlS)(Bfs)2TF*Qw^Pd+ZfrcWc3C) zES@ocSoor$vLx?MvJa&zV6!ty&;F*Qr`@$eNL+G$Ry@7>$RcFv0Wf8V|2Y!ZQg7l= zjU4l4%(Ly^tuA%OcV{F-O@g5reX$eDYkCutb2*06F$pgT))|JWDe9z})?j&-iY$pj zxRs_v834>czy%kaU%}}XNMINZ5dd1qbZ#N*Vp0T>@m12`ZLxK~ejE5Eb-vuB%BL2L7i+AqI6tol)ZA^Uy1JTSI5UvQuR z0wBOf2e^NoggSHK4QIHm`kPlwP(^$N#eA&5J&!T(yRXydKY(J0`ZBRoEe~RTOVX|#q~IdFHYWIr8=H@nGMmV!|KS=XU+6Y$z~ zO%*}i{dJDCiNdaC&4`EZ3N+&l{1vLo?sO#aQq??m9tLdOE-ay;$43Emh-;kkx0%TX-?wt3y$51nip`Kp6qp`05M&MOj*^D0Idb>}#&Wj}Q_NI-?z9G8LSgZ_2e~-Ks~@3J#bC-L zt!>p~;RwE`dxb;3@;y zqPh^rUG{`nP{lyRu!w)z(orH>`O{XXJq$BkX>31+E1iEgw#k{1L?JjbdEI^Q$0p_SCy3<8Nu)W zQ7K^SUjX&k4hK{An?EtHatC(t3t$>=?Kj>Mhn& zy{cj1U#gCl*Qx7LhYgOZj~ec3fCD--gcuBsun3XH zXhfbSIK^&xkmIr}R`D{M?wUz6lwsvH2L-DhEn1$I;3?M%7_5J`K5Zkl0Rfw?Ef{Xp z4rSP8?ZI*X{|>-lm;5gS!zA|RGdnn>Szg)rrDqBAu%LkSa>~81Q&v5(=x~&ccTYcQ zS5(Wik{XdAt{IKlHsJ zCg}dW6EHedkH;G9-$j}PeuXFFP=Q)vO6FaL&SG~!6)lE!`g~^Od8B(eT{B&LGgp&6 z`q_+L-|I%W3PNaO&(^yI!TJ*nHj8iOXs`#B!+W>~t=udyI{0^0=YA=Zom9Iydxk^xzwOu_fAARM4%U@_2ep}zs(L=e%gP((WI!p@<1%#T^utiVB=aH{$zoq`p#x-T)UQ&XOF@J-O>rH_l;h_*~ZY+GubIr*_ z$9_fg=hU9C^ttn+n5hq)5-WJ;F1v20ZFTc+@WzT>BFFrd^2cHh!Ls5%CO02S(TuR1 zCLPMoETwm{mLjKk2|L+(2DbTUQd7s6SxwIA@3a$Smi@}OklGvTo5CR37x9QBbs;$h zU?R#oi5(LShdkhB<|n*4F1ib3S__7f#fpjx6g}6yFxcIYI^rK)gDGYNwU`A!G-+Fb zSh!oJi5spF1}h3d#kstg z=%sBfpAs1|QFjypRP!}Y1uvT*8QYpjQVfJn5(7pN?@2az7u>9T|4cUL&$hpwA_1U( zU=IH_>MeMzf^v&EPwlmr+N!sxlOiah!3Q`N4}%3Vz4P<0O1;)k<_kvH#`?2_NmSwX z*?l3wRWiIUne_;i=H6%=MQsCwLCSHsM<@y*yM-(9iZPdSywq+A^dUaM4(d3$%Bg9q zQQdgC$=(sjH@OWY0a+P`H=^9lz(N$wRQ#azRbrabC}b^r55fHig+7hUgzTcVWH4w% zp71QW01T|KQMnIH=u~v1j)B#(@#c%q>q?!QtXEx~uw@nUSn?ssI)FrbLu9h*s-oRr zkXbt9IHWzeSKjX}IJF9}p%u`1WbE~;5)olg33CztTA7!;Bfu^a@&#U%GP#8Or(Y)5}&)F>SMIg}!A)+z-m>hwV@}?y z2A^0*;60it?Y7b<%Yp)(;MR~Iru~!snPYj0Z$UGb>F=@+g1h9frhAcY0HqOkg?wZS z)eyV#lrWd_ggxuwAyq;Ul4PhmI?7cvE`lkq3GL>npw#(h9LsuFpzM78l|MmvxQQ(D z{1y4W0n{gGvI(Z-Bxa@V#ZBJ=r&NT=F83fj1o2ix$)KzV^G(Sd#fxUtb{g)*wd#$U zBWu$cOH*F%lUj`C^>n{_YP)w_cS!Z068+d;!UXY;%i;*tA z@7%B#^YC~}WNkII3gT2R=<(cR#V3!Tg5jVQ`2I}Zugpb_RJQ52swXQaplRa>GjNU3 zL70K^!odNUlA#n6-&V@2zlA$5i}?3}eS_+t1RQU)XT5|FV~k5G5vqMKl7>L>W>Xpz z{DJii3f<02iAkc5v2o&8{}$ZTtKGey?YoZ)juJDxP`2a!b^uxw+6I>IxsNp-5)(=5 zoSQC36GdRJ<;C0&t3^vEolO8kMAR6yzI5#ElX>unVvxoc1%BUur{lue}hPct6o@Hs?pO=fAZd=1rQK*5TF|AX7lOrUo#r85) zvZu`uq0wT#AW>x{fr$}=!j(VqlEA5|`qWF!nLBvB-q4-ayoIWW-nNX)$n*jxl7`jE zmT<}9KQ0HpjXQ*&QFM(zWYID#w&HlpcwG4CrtcgRNY-PiJdgEU{Z-{L$ zf)osNy4T$WR~i|_lhMI`LlcYm14IuAfDeuLEWH|^o$4OmEfCmZWZ`3YgI16m`s~%D zxp=}=&QN<@$7by=aN$TM3QWb&*60mu1N8C6{GrlXEq~5PH=p8HxaXunD^M3rGgIy4 zSt}!lQulcPv#uAv%Y`6gc?>1ZvV8l_!EBE@DyO(!QF{}BLFl$&UycOVls8aoXKiSV zNrFM2MqT3DrSBHPq^qFb2dCJaUh)#wWo&%q3#u z4KOdCmiCV^59A|~)|xWx?jH+oUPNF-w>g*$)})M~3kAkom05%>jSF#Z!k__ti?s`= zq#7eI{vf+IjWt1duO4`ca(tj5L7qql2A@DWgegCfMteiIO1;2wu~iwq1t#Yop!c=r zGK?1^*YtyL$4#5i%VvFg`^lLCl-C%o@?zDln^(NR@OisD+cJwRM93*V%cm6541uqM@_$4R!u5D$NsRh%`F2EFeV{3y{7zyxz z55Y+~lHV5Km z{rLo=9ed2;xDO-YHtxJ$ZZAnBaumOthoBod-+CaaRPU-Q-azn1>P!$T27zyb>@d>9J+a$>fyb&G#6|qmxmNaQxY8lKaGbny?j>W{D8QH(yyHmBN*wJJ+K#<40bN7oD`UeFYU<00> z;)EA@Jc)318T~ThYFim)Y!7>93TvuBz@2w43?jK<<%-aHXrn? z5Q;lqu4i0Vf6WlJ9X;T=Ipob6@on(7_?hzJKDFuMl)lE|&&b$sIEhc58rXaAtlS(8 z-j;m1T+5mCzC}UqqzPuiS)_Zzf*7Bd(!BqDo;0=GfxGoZ{MZqD&xOh2%P$WSbEJH6 z)Ab+Q%0NOJ$Z2Qte8GhG4)cw^Qa#8sVovN$iHRS0x)eUw_G{*y`q8HEt+)JO2ewQh zeJmrPK8m{~;iveuuLA|2CV#DWK3Opcp}jZ?Wah>WKZkoLf^^se35#>I-rafRTf?UI zXVaiKWh}7L3!O^a=N&lib!2+UPFmM^UnE>QE#NeIEov(@Fk46B{=C|LqChbcY+2u$ ze9>@3?_!b6t=KOWO*@hCQe&#}9@K0ge+)l0mw4fPD8X4Q|7zxMEJ@D$W)P-dp;Sj^ zqfAw^^J_fM4KtafFS}5Gy(_e+saEIQ-%pQQX4c#Os&4mR#Z6`#&4@EoX|TQi9NGqH z{WKiEzkWkrT6&|KsDvvrds&N>C!{~f&NgVF|E)as@$7!#v2#OM`+e4VJ<$B)<~4l~ z@TsMJPx}7%PBB`eJ=V+KMs>ctaFP7HdqM>$Go7uR`&``+g=%&!ph4;}O>O?FIf2C_ zM=-H9I;BiN@gw@XD*4?dswc9Xi~RCgORTO+FK;}R*;x}zYEFE85u?Mzu7>c*+t zv;(#a2PQvSnuVu$pDd-XKnj~G>2D75`SWw`^J4Fz(JP>0)^S;y3G5f@(~A&>>e_gD zm^T0UxoOhg^T?mbdFMm{#R@Eq^&D#N@xAs02qEzLPVg)^n^N=WXR_%DhxN302Xs8k zHG-mp_$wQpP1d|A)*3G0H{iMJYE-!}DC8f(r^=JOAiz|9rn)@`F?-%2KKI`7eV$!R z^aQA91WW&TQh*RG6C?P8dHfNfx+9}FGaS)guFs9JEns1cH3d$lCh;MdWm%OY9MF_s zX{=XBTD8;fnAF{BmKRYD9F~w&8wICyxQbDP!7LN+4K~rd9GY@*6yK)=>vKr!)lSn zVSiX(=%O1 z(uH7^4vzk2w3mjsr|Ouw*;Q3&W~5edVx=3NvsA_iE=?@+O`{Gzy`*GVHqP_T2vad` zm(0GhIMqL0J}GwlXL3hvomjT^i#?w%a;;EeCZ%T0m{*uj?T0kmm1WFgp474Ioh4#a z$aRTD({*={3V$Jl()~{3I8w2Q`&;%Dq~!tY4Gb`eP?+trWyIXAUj>U?(1{0!_ye98 z)w4iRuZPI~5xZ)|u5gdmx~_gI<0X;ugWpk|4C^_N8=qeS=0JZ7y3XHUV%2W4;@kLn zSFh06p4AIcuC?VyL=t{EJC}`%ip+Dg&tkWxH~BgN$CG7+Pw0aCJ*xNE@cF7 zl4JT3{=?Vhr4@to2poKz4g9?q7rgoN{k;8g;j7g?r>Fs9ZOlPrJrqMm~$q?@g%{g%7v z#6ygI13%z|N~G?jpo3XOhC1PDM@sVyzvwCZXr)jvmrNALNVD&ql7|cv(o9}n!Iw%g zJre|NSJoFFt3;Z@3Q1wnYog;BxR6qid{1MuBCrb^*rAa|$v!GjGnSEV{Y0kY;`m$| zQ(;#FVp6XlVY#s!>9#Uo@Faa&lX*epho#n@G$Y_Tv)!HE_1rYC&W29)Qdcy}fDmJ4 zb*^MuMzs5t|{PN6bDZV?Io{sHY)!yx~*LSQeE}`kGPU zQEM{s>hlIY-{}Ccx4N9G_PC8Od70QYqFOkMP+hP*Po`T!cZ3Ja5d1vDjzHw$$eB({ zx#mu@AXzBC0dqn?0xVJcGhW&}R7zO!B|_ZKZ?U4}~I5zVMu9eK~S3QnF}o!)Wc zpO+V!-mHmF4;xl!#F#?kojZm4qimMeu}i5Wtc$`CG!=#}DBM+M8AEzvoEMhwBS#w) zx$caIV$sT+jBJ@l*>P>nDdR|}eDiDHm8KB=@zwTJ&_`e^;h;!4A4ekz58x-6^rZG+m@|b0S`r`IO=)ucP zN)Xg)$XALvb{*m;z*Y60KwKjBws2XzTBD|Gbq4H~kaFy@6=x6&8TaB|6bd=cz}&De zIo1&JR_8~}I6l?Qjk6WJ>+xv_N3fg6zYF5GKvJZNSYNL%6ydH6x3N)0ta|cPvsPQq zIbmykhxQLrKpcB^Of{*Bmp?TEu&=&@bZ-oA$>gk`Kaz8W^p|AEfLmYj7KLmsVnPA; zu-YNL5=X7B=RW&9@v^b|GV6>dcP^)pKitS~6*A!|KJP|kn$%+O@w(iki}~KI__L5K z=OY)D@bN*~{o>qKcR>kc;5OAM=G2J6gVyEB_|^TEeeYF0$49DWJRF({`RHStvazr$ z4%|%~ev~st1Ua+izdJ#UDPPO?^1iKfJ^&{rJfsRjqIh4{l%qX zm5Z#g0KSq%@4q1@>*2x%AlHi zQ=8chTteK><^5FSAzAqS1EYQ)TsV zFmGKx!SUMSgwlHfTz-YHREBb2v2HwyS~RI8=XFYJht`5CVV@_~GWY3{c> z7hAS{IeKG#9M7lL>O0Yt)iioGO4)s?wjf{kC_w-&q}NiYU$Ck#3nFX|*Q~o(Vr>oA zV&Y9-UXdC&*_K$@hGSz)E*V9q90ufi_L1lJ4blsz*Wg8?BA) zB;Y4kb}?kx>i9(@p+Z=(oek#bTv-K3IQ`6hmGw)$U6T$l8~>RH1<*({b48t(0r6oB zvf+NlKb)N7D5ij{(`@i}A+T*OXkZ_`PY{O0Hua~+Fo>wSrQa0;Pf-0!lF}ACp{tOR zjsy794AB0KU6drRk~z;Nf)87slYfLA>vmKOeWG|>5HV}2Jq<}!ZI#pS8su~wrP^Hn zCwG*J@uOkDtDepU(Uh3oB$;NNRHaa}DrD8U{y%cl2oQ^&ML%CKP4qF)Y`g5b^s(<#9fj zGmH||h?YpmCVgD0Kc2FwXOVRJxgE-?A0sT^t6MI-EWS|viw$QXgkyZk-H5j(@4`vE z{@`bSQs@rs8o$oaxaZn?3n6bKuizsl$Lq6pna4W!vgFT|F28a2vv_I93slEmoIQjS z;yJ0uN1CCZ-RnF!UK}Mgwn?$rLS2ptZ%$ZY$K5fyANF_}E`NhJ*woj}JUI;qdz|?F z&pBF{CGo6zw7{TxoDH&0wPY(6@Njam0iw>1Xxq9d+k8s`sjFlV!XYz<5$t#mE} ze~Hf#*SaT`R>1osc}FXH<;c6`^w=4ND#=^kD~YW7fCc=&cjs2-S;Ip|v>|-qJGA_p z*y=ci8#c93EqV6fa|ZjZ&j4E=>eQ7N}x3KR$wdYVvGUDUKK~_&jIbS%}UfuiYSIk02HM z-^X}Hj-l0jjaIf(N6YihpB9Gi;eQ>L^U%)mm&vWN8qn98_W#~=uT~6JaF&v8nm11Z za!{CNdD>Ts!gN`C!e}c@U(uTkXz9rtUd%u?CUw{I=>7N60vy9Z-QzT&M5F4mZE;G5 zZ(F{-n!|Ok-nE>4l};Oe!fD#|OKQz+Qiv_W3_E?MH=r-ECIqT7Xw7XW`x6#c@iZda z31;b<9gh1+ebIThC74|wR}1cEi`Wn)MI@WsYj?w8IeX`1Bp7|~nHd}cWVb!oL|K^5 zvYZzL2Lu@GsWl!Io5|lLpT#^H5Cu|V$r-H;dAd`bZ$`X%B*asg5<3u@6;%6*X zx^WV#6Bj5*DE4oax$*2&B|=BPvZUiYvNSCeQUQ8hMX5=jh3~2HrWE+;65R7yXFDrO z286BjEf5|Ky;Nl#XdWg+6b)&-y^|w}LJY2-D!>0|>{~vV@^biF#<}Rv6kLx=dxNKT zf9k@HUeRxn9w&I~H)SOZrEbVQ5h_LbuwI7qnC4pf6WKub$kTGU8Lq%?Ax_T49wD0O zsaNh1AfI&Ks5P}tW;$`7s<;r-P!D~@c<-+?r1n*fG5gvnJAfrzf__YKHgjB7Gc8G7 zWieuBrB-XtSudUcSVY$l>DzOUw)o-AH}-x1h;xQQJJv zz5aXYY$U!+;*@DFh?LvpYxKPV@2ntM(UuwS6)R|%Q*^$UU`gG)B7H0S)$JK#uvzt_ z>9esY6N%cog+c;TWGz41MlYSO5xK^a>Mv#uKgFl1>*?qao$7`2yorSIVvuqcm0%V&h8h>| zoQD{r*C}emWs7!6yVp|*sC5Aq!w=6zLX=)b}S>>xN6rh(*9DFYwLbe6C-2> zp731jFWQNp=}y@;iED!3WzSJ|&BFRyadPKP{OMT7DuLL1Q zB_fS}Zj-`s_B8SjsC3)q2Rk>eaV>YvSPPL^XGbt&OTlU@9GV=vq_tLAQ;zigCDS=G zFRsK=>_yvwVu=m%KE8=kSIIfQhx`#9NydPAU`QKo5ID_y`ti{&Ws8}`tV%GyqG#Qo zry~ktr2N;H<80!mLQcDgWEpMQ60j-i>@*8~%U5%m^nSXm_mnZuV%BU=-{BSwyWKFx zCK$X4?s9n>VfL>MYOIRmo!|S6&cWZ%N^xl;Oksvv;l(I5Z&#W?cx@D|CRomlLKp6@ zvz_pejIn{`N3h;(jp>IA?z&ap>?onzO*_u_JxC;RNk;_OS^E&=9b~H3HpfFl~EAwt!w3o)%%R^mOZHB(%|E^V)i}-g}$N5y3Pb ze%=!WpN^Cc(Eia9XT{DXPhoKEI-r4cXs2$uvUkDezs1ky1Op+rZx=G%t*k1A_M4Jd zOJ9SFz+Gc>V&y^o5mVUT!ApCc{hj;iV30CKuQFM&Ahll#C-L?~F>!MTitJDDd<)c- zM_R#L0}IY6nPm@-bjD9t`JL7mX8_Ge3ASe%0e$1~(ek+H^v&KjhzEQgl?n z{ze1wEMJ5XZRC9SFPA<@j}O#bLrnQklxJIl=Q>Z3(As$whqWkz5(jPN1DhqeDic&& zhfo@xIc}iN+(~it#)f{=dIqUV>S0F}lqjPLH9lfd?7~*2CCPLtjv})nmLhlvqv7cOgFyoxIYcbX@$zYx{>k|K_iui2LXtQpxH0V*& z=tmEMX8o0lqt2X{Q4pZ+y2M%jcj+C{y45S=A~#dZv~@@H7Z# z(-0Ux7*~gx{6AG=7y&1!9Hv447-1-nJtv~I2rolh`MQ8J2Ezh585jxt@bILPKe~QF zD*e=3cDj+{lF)c*d(yGG8AbiD1g#O^knJ;w2u{?d!m`I?$k32sy9qgXw_=tF10M{Q zPGe)P1Z`XWiWQ9sTmOPhruww~#>F`xcG86%KnPxpiN*5%A!G@xmeJ6I<;K?bpslh`6~7g`?nP12(B)?;(Xdj!cLIq1`=Tl~yVENdPV2 z0^wqALbAtDLy)l|RBf0vqOoJ}w|m)au;6sb6KuK4HzuzoT=aP%r!fLZ+*5*G_En5-Y! z8WJ)kvgf=z&3qsjDtr9r5YrHa1*5Rfu}C-^MJmW$WDt1#UTP9bBokNaWdX6SF%^d6 z%BqwSxb$)?HDCPrT;8HDSZY%N(J)9rK^1%uuTj`sEVzdea>xKQeCaej!Y3*ue`594 zUQxV+S!y>|A_#~tz!#jH-j#^|%>!#7$PoP|*mdsNS-Rv@g|hdpZC&JYLC=kMnIr ze%pYGca=r~Mgv@UEHN3^@L|d=-e59&`k9t<2PaDoFk^VfdZ%g$g(m}XF?5J}s0k*f zQr6j0j0qxE90?dveQC*{&w}#Q4fmkzWK`~pmU~E+QpU*IpOZ195U2?nLYE~dk|gaO z!8>fDt{L}&WltZLSYm}Mt5rkF1YKLSf$Gq_o3ekdyLs8QG#p@ZC)gtqmr1LIAf=!) zYI8i8fkT1#rI!s3TMfnfr})w+v6}_Z_Tfk3Q2mwzkwLKc4|4fOf_TL zBx0VIBHfs-_+?iMDwT{`=fIN1$!>F+<)-@U)}$OW)zvACmZ`hw`~>Y6MQk4T3OZ01 zeMTara0(NZo_(ifyTDXL@mSuAf;f_NI9iDDtgh<@Mf?02%4+kbQo5cCJGHlFwS98E+(`vNXl23o$OPnv{!o@Gmvxg4&U`bSXG6(5|Y+G#B|h z>M>e%)^WDQ6{P^#tCwbQeg%eum^nB6 z*Che{uWE^`FrWXALaIY{fhjyZC=``u$664p&KU7HE>jb>yoB;nvM`cI%}Q1mYh1>v zZLgFSEF+rjp09kQ`hF?Py7)?tzW4rEW2K{oqg=}@bs@AxL(_>ogAGA34Oe{fH5S1K5lq6`k0dQ*F!2F=&?Q99pm1rY~Lh$kny&nw%(guBA1aLt#qOjZViP zM(A4aht3A!mJL4g28ayt<%cC485o9}+kU<5E6EyBKJRJK?Jij{`MSP8y1KqsmMj6U zYO8+dU(?S_O-UvulfeK0C)qA;HhzZapscK{iDcwbpnyK^lg+k`rL1U?v8kzOGAXG< z0KjpETchxAvn{d8EV0r`HPZ?;!U{FA_z$Bhq2?#2+ckEY#+SndBfb6+{*cJJ#!DLD zh=%%Qvs&6#)P0Dg*)?)mol@P90P+{j8|dy0k@Vdt2cv%f$?-2-Ey0-&uPB82-RJBS zmcZeD6e;f5Y6FYyyJnqKV>l(#h-4yCdsB#l1R}oRzJ0(h?Y2wXmLHZPq&5*QE_mV~ zdjjsJQ<(x*ppgA>H=j)Y@{7=hpg0<(8msJ4+j{&c%wlt`YXdw|vKnr3bh$G$wE(J=WPXnk*>bk51=2y4^nt@o4csiflT{)int1Uj6Tc>R7ZoSP1&B-m zLaF0K`H&-_$m-8ck9mc95a{2GwFbwh^DOhiFPiGRzuf8@dqr>{wp;0M-muE}!jLQ~ zuG8urO&Lqg&1*+3t*l?%+fuT#VE%Gq^)i{ra&Hy`t&iVdxs7+^S5?46WoL*K?xtn@Xt z2-?p%jgPoLQrb-6gTOhDODGz3SLrby?d!VOGPCx>-?d}bt&gS$5-#$Pa; z6)c|AB%1{suA>jb;t!07mAoK`o{z4H>Co#35`xlbMv2|OmYy5Fi5^xvt7=jvW%xW# z@N`Vu(1C3?gA*Z}1;&dcS?H^Ho$bCdKYVe9TMO!FvQ5BXif9Xkd5b6?3XXj;o8 z)h3%rgPLdZWXAmV*Y&1BLGCPfvcNPpe6ZL>2(=A8v3_-1&~QT61}j^Cn6`r3w>{Ij zth%B6E<537*a$OC@p|MEoFk3Ty_ln~Y}QzI_fMz(PFZ@E&ez-GUi%;h8D!l+&REzM z3Haq@esLeu*&@~0zY$<~={Cg&IuQPj-@lno@f5s>_WaJ5-kVN=IgdV|e*^wdxv;3& zp}Bei!kKc}kkC=_rE@I(=6i zwC6Dx$cP|f!6Jc?!U^itKhhL3T0E6zIS(+ZVer}5d*|k3VpiO;c~wiXe*X$lEiPNXPhHKmHIr2+hn*yd7<1V;U)42M5bdfiO#Oy ziOzCnE`fq9@|O>d7Z4u=Injf1As!c~SuE~lnI z+2s$q*GXC)4dTu$A>?&8@S)RlG$?C_e76!9`0lF~fBRGTem560A=jFC8)czPaM>-v zy7%xUabYgo60M*ZbP05~*unp~h9X_nSt-k(uhnlP83jIh@kw`ivg6=?%vhhAY^45H z@NIfLJ8k~JyonRwbGzl0kpDSpe2@?Ub{h|ye?Q))F}{`pZw0j9dlkmws?hYNeG`VH8lAy@PM2~Ldvw7N$?xuaoB5SzmrzufaDkm(AS z3*YUiRDk=2w(4tDkoe4bE+>SEa-8v1SPuBURl&sX2a9$7^wUw`J#xbk7RR=*V=GdG z#R|Sl0FMX-HQGP9{ZVHI)k(htg!_kYJ)?371p7xzIp(?E+*MM7I?pMP51X)Tphu@Y zp+g`(Y2^E|*{pQfW8rsDIQA}d^HliPr;OVTMGSa39pcUO>h#JAcJ(&;&GZ|B zZ)FID>?88&4ijJx`!h822_^iY`rt*lE-V>rOZ^vNC`t8RMb}RCbG7px9B%596N8{dvYls+xY6)idwfgmEn&iH$s`Z9IS~c}&^RpY} zFaJ$l4~sIns?EWtsM6x=wuScgMlKiL=Qzgw^AU_T{X{3`=u+~EUl)JTeZ~7~R84c- z#${4<_&s*}jZbgI`FwwhJ=ZsXSF)<;hwvZCY3^^V9|AKaDyP#A8|>~~F2brcnxiy( zmn!eLIi8I_1#x0}%2l#_4EF_vZHH@?;k#H;SyA+6CQH$5`tK#YWmFM{HrqSMhW zRj-_w`i_jm4+TrVJ3pfBq^4#_1N(}Jx8>GqeSej?m%Nt>S(&1$L;FdE*gZnbLu+@PNf)6lXaZb+MyX7^oz zjN&AHGix@0Q*EOv&?{-td@TBYmUjkfm3IaZliTo7cX)Pzm(xI zHfBiYv&`|}VWXj+&P|A~@oC(#m91QIuNF|SFbR|;oyC6RN;G!Zht|-g0jRwfa=f%8Z`5^w#DNg|3VFcLp5%vLgh? zEUqfZu-beY3J?qYURl}EiC#f6V3TQ^f1}il4MVeJ-jTGSv{eYeJSv+kwJwUeSz*T- zsC^d?1X;;}0KiSDo8;b7RuB&d_F<~9$H1Q@(t{>0ETF&NYxgFlFCRhxj%WEYg+p+d z2-wsnX6`Q!6wX}txeUb1Up)M#sG4|Ny)p^9~>J*?P|#j0)&3d^MJGgj76kr{n!)7pHG@ zg`UsXPDS{XoC^Q6auWwV&dkm36phfP(d`ZM2Q5nYBBjhtvQAQFiQE$*w)DjI@3gHo_ zAc@H?#sg*-(PjdfCm?(RqdQMRKutD9!+ zBNyAGBa;CJb-FU_r7;yTMWL5d8GBx@S zKvJpBks{k1)bW@i-dX9*y8$`DEkkQk$ZLreG{zB<=CmSMK0^KqzC`JW?0~PXPr*eg z_JJhC*h_I+T*mQZNf$YPy%7^VnwoY_#MOqv60m@ZJJ#PxItcX&Tfxnqp4pMA(9{w_ zt=cHTps%_3K(MQBNC;b1ZsGD~8OV%Ow6H=|1r{cu2f`1sA_F6p#h1#|dJmJVUiO;s z5Z)&_@WC-ZSPUVK$sPeyRd4p!%}|a`^$K!1@tN3lg4DssAqEd&QKwe&?Yv`s8&>*I z^ZgoEd9nkJaF|yNLg=B%Xr>X$r7L-vhm@G8p0{NNdU7G<5Mvmk__^?v81vtAArmX# z4|uZcSw??nU0FwBm^pHC-7nP;(rAHG$=}n2ptG_Ii};PrS$usgw`+yWZ_T2AslnlX zJwTZ*hNG+UeW0f75bsS24$B|345EKGU9ZX|?_m-Q{ekh2s` zsIHG%7a2I`FW}7UcB6+O=iMRav(4KZcK!}K|FOtv~ z@KR{UcCT{pkiXN}q{Tu`PB-V-ve%&atG26KQClctcERm9|gk5=ZKKw=aFHhcwJ8$P1E^%r&TAToHsHjuDw{ZlNJDiMwLl)M2t!}(hl zkW&0f(>{I2>CWH3_?WB(T69(|$9Ln=j)B1iNpKi%uUm!&pi`KPUBg2ZQox~jZ{q|y zb;VLRZ>db1QepvN3y2C1^sh1`LmJa9sFp9Y!_azsF|xf{%6Fe<_pt^3?6Smk)L6PE zLs%}`gYvhxM!WH)7w3JVkLY(v6r@|VcXDmq(Kp=_Sl?HVl)nQT7(;E?`}r>-~fMyN#mF(-qOxJ00D>{JeI$k`@Y z?Slpg%;&xp2_~m&FBIo_KeYV1*gT^81S3r-pcd~_xkzGF6@iuW+ghZounK={eEX+S z-*4HPg2;A!{^X~J4dXJz6*z)Oq*Nr^96f1@MWybJ>Pu~y^v2Cq?cms&$xw`tl$>SMXSh3)M5ib#P;p8kSu7 zjV(bXh48R#R9ivQO(4VH;k(SH;UB1}>*yegBUed?ACQw<#4mB5nD{d8rjh2K$`7?%h{%q?&HI3-YR^K>arB($$SxcECtSsOZ(sVff@-y%m`(t=qhV>{IbzphN1h-C50s?-~GA@_zw;f-ey6N7<3 z5LX|0H1oY)fL&U5iZ1z_?{MSSHuU^!>oh-Mdn+otR1E$(K3{1NrfRvY_@eQW^SD&i zj6!wMmbQ-bYSwARy7f;FX#`%}l>X}1<2)VQ)j~I*K)%4i$V^FT${ZaVf~>;FK9frP!G()biXK)?i2^0dv*x@i-hlDl+u!554g|W2|+`2Mf?dY%F=OC z;1kP%UaJm_e!{<-6>f8j`{`x;Szb|ya`1G8ZL%jqTu&Sz`#iPH?G*?z=*LWO$Mb`2-c7=IT#S}6-+H{G$u?u)drBg*#FjX)ph|1_a3)r^bvWQn0 zW&`SNT&UM(!7n;}DQ0#X&rmc~TfA^lj^4?Qnp{KVbdIHU2x|N0+~Brb>AaL_=yXRi z%OB^01>&=6Ucy(%hy4!#CqUT0TgCTtB!7dUTVhfHx9on!hW)f$Dd`qLHKrh$jSm#w! zSy2TZ+~iSJ@8)b&eNwyC3vsn2qAICR46#wPUWszd?&IDz17dVuU3QA##HX9?-QP*>*Pz+>;MXAU4XdY9#>F3$OY~XM%0e$P3r3C6*N~(|j*|pt7cQ#|&O}P{4ZR$2PCxl~ zcN_e|a#89%h{xz@?G@a?TE;riZth5l(xx-3eJP!v)sH+$gSK}nF3-u;sfT>)mJKj8(IO>(JyVjUcVkpWgnlO)ru~`-3N=rN+la-8a!q*b7cG@lGe~+NwW2H}(TZ zWNtIxWZ4^=|87A&gDjZ=Za2(W-aCEi;pvk|PYAAMQ`_ncQG{0ewmkinfq@H7ABQOJ{x^g)8}g5uIe1bjYF%m zsoxTjJFl@)T4^mc41YzWHmWp4VdbWsM+)Hu$d-c!UF~3UFbwUNOCopUO)-VxF2^`C za1LkOdBp9qwE|UbV?s4pm)EDogf;lFhWWYALew#Xjso;fp7jXIRBxf}b)(@=wwtq> zBC3cB;YMf63cGVwrX0u?2AuaTX(uc6y*<{($+tlWc42kOeaOC%g(bfZU_m=N<(pAR zqfgQ-eg>o1oL7MPWytvghUaIVUw&dsI=6Lu`{eEJ=RMQAotK>#Qg>fXI&|A*lIq7_ zm-%nuP7Uo5y3w}r(1&jfi+N778I@yfeiwp=;QO^TuqvVu8v&r>0@wJ_+pAxmuKj4w zFX=|cl-ZZ>mQ&tCo1912ombk$0jCok<)cJiJ&Jbirs4UQH=L0_Cm#Pd0TLajo~cSM zz-qR3ahQb%BZS#=I87Ox2}{Nbt7GYQb77Og>t`HBQMD77UgY-le5fj3wbY#3S#YGh zSuvcTD1;H=bVf!^1hdPxzBx)SN$9r9MO6-N{jC9(J^@a%s$PEpebYAwZU@$0b>_cv zI1Kf8e-nzjZ(WExHY(OvZz<|dt}nX9tE(l@@Xs8E*MCMgfxo?vwmX#jbXFpd=UdKt zvNkIIt_G`eJCwH#d@bH=YmkKA-4w{+?h%mY;FK0S5zUoVShj?<6(f(acdcP2ASjRIx(od501on5CbzjB(_-h zC4!VLKR`gned*t4XV>ARr98Ot@Lzx7J|W$=1}CCUt52!~e-BVNdZ_O|p4!KX=(Q_J zjnicJ$EE7O{NYfRTB!iuc1?*9Gd@nU2)mX<;xYU0vB8&tj!OqqcRDY-tQ-Ts6n7MA z$r0kuk&V1lXj3pr&MDFIhRn?w$;98t5m9jsbb|hn^GH{&*f@0X!b0u zo^>37r%GDS@rI-1KtqSMF=ouD#luVl*HS1IXXhPEO{;|A@hV%jEZ;;f4NOV_P7*dhRgiv6rao$=gyLZ-vDWRKeNBb4>3)paz=TGNVZgL6tR%-tzqE0g zUqtG+*CpP_Nv61wlvll0pt#x5kor&0o$ZI?Q_91N+^LAobVJ2aWA>0tIUaUd(NsAB z2=;kea1|Va6Y88z8@)}b_xZ}A z0@au*`>bs>s>)}xvH&1uEmzgK_u8A-Z%5zxoY=+b^v_QtXrYuPZ<+^bmF*Oz8qLTb zkGz=9iD=O(8t?~wfisVvzke$A@7~+n51LCVC^6}u!zBS5 zNd5Mb%RH)-Eo~(xPh}4&vX6vc%`jCC*D8l(snSoDEJeK@WqF>oWVEQTra~;9j(ej1HW7 zNZ5^N&t@Qahygd0KIiB$PN5G879BclPBq`ll4MwAAqMtY7b^NjXyE3gaRHx`Up2x( zMAM3*6z%Ue+qHUr^vaONYf8#1U(d|G)M}u=?z`~;sgY9*cm*6{R*>{hw ze$6>hkTWRC?BBmGHB=t1RSb!82P4m<*VYbztnuRU^>tmP{07(X+?tx6D2`@QN<44h zrN6PEJ&kVAbnBSyBzYsi!}?|GzD)pmTebn$En4L%1}9iWo|qYTx=;Y;fWRKl&)tK6 z{^Ev>?R}cKC}tzm_6^h>Jp%UjqrmzfN(QiL*^Yp}hUm@%RGeo{ItXe!n4I`C5ScjNP_e0Uv#H-cH>3Jg|8x zXDlOcEb@Ys7ulj=N>!s!gXssdu5u2T-$ecn9!puZ&~U{ag#4iYX4PC&L5s<_Z=K0$ z@elv6$^p&MjZC^#BU{ph̍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�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

l(X_I+GK&R zpZv6rUCvOiOW)8SLV&5<(q6Z$bq3Ukwf8@wvq-m0Hwf)^lQ*A}1V}+(E_^gSwDcCS z>q|@HHjdVbrrBf4$OtpJ%3?#v>oQA`7KMO}Rssa^*hKGK<2>{Q9ba`_M#-@io>=yM z1n+qdbL;$CIUl?V^+K7dgtpI1X1f2(eXk?!9u>y5FW%H~I;)m3uh)K>MJ2ghkAN}1 z-jys|kk;-;^+p8sk!d_S-OuaOAFa|Wpx+4E5|*<>Ac9sr3$*FjUVe%2i2 z`L#Q=SO==azQdtV9kDaN`&FJ{6D&SAkqajSk8ybWq~D`hA=M z91emMl>snTEJ217m5CWJda50*meNPq$UY8FVmnzjT6CmLb1TK~u@JglXgrvim0~<_$*(n)_ z`wPj{qL=jf+4GOSOocmmiw;IH{NRBguA;? zdDDV9Tj83dXC#s9QKX_fQ^T?AGh9DaCI?GZ-y{fj8+^p5XnTYD1 zz<4%cuxY3@T&0LiI$`2_YuWb(Cr$NqymhisSzP|*)}@B@<_WncdloPVKyGOkSK>8; zN<(@$vz|6Xs&^voR^Tp_7Pbn!BK`+H0jG! zM`f=2kYcRqoC$-KZ(*0iVDsC3A{R=2kZe)sU%WwGdK!fHdCmf^B&`2)bMfk)u3x-u zF5dh5%QmbyP<#PZ7f`%eT}+f?iMCmXEpu!FAMgRDHq`{PrNi>Gg6?4$vu;F$-pQb6 z*C-@~o-bV}Imd`gnmXya;2IZ(WU_(CJ=D`rC;@UFM_%QNvWASCgXZ76KfypyFFd;l z(BUkU!%q+8&JE+xu${B0noi6*)KP-^EKjLhn*2w{xl=!if82Q1oCzdP&AZfbidx7s z>Xu|{1*N+tinepF_t1#lX1-WN;i%?aVnu#0dwL}>yz>p}kXsw9T_en$plnN-t{iID}<&2g~U9MShGQq4_KmUX@q#RDS3N_IgNDkV!$ zX~Mbpgx28JM_p_$1&1P>Dfn{`BAH54Rg=S6sTWArdS(`72{lp z-0QmFHpmn@ol>EYi5rwMX|vAM+G;WDbt*-JpiU%tV_q&1i~qipN`magQUmy0X;RIL z#d;?@R(PD;#y7N4^roWEcsb|5jCL#jq-7#1BqO2q1=AgOq6RZJlKQQwwvkES+ z4!6n|WtuW>4mIEQz5+9X!BWJ)5JnM_V5f{wB*9+rY%0inj?8k7diOQ|1vpk}_eVCZ zhnn<}uy$2=tZ7G+JL}KR{^j8M^>KL{^^j?XLgm18`-OfCJWaA#KcnzwGxtRkU+>>8 zyTirT?W4%_)#g(0AM$wt-E3al4-UPmG})%3=qa`HDBd1xmX*F$W7*mvg# zGAX>;)G{(Q3mL0PMut2bg)+8C*FDwmHt_2-mySn306+o@q=b7vi#*(H?3A7JnD$Q640?v7U&+zzd?ByGcvh**_^u{O%hz9Q2Jesc6`g}0g;h$U< z48vX2*IQu}ii%2U%QVsO^tsjDCrABwn>8T0w;#}e0l#nvG{?}#J;VX(+A(KL1XK#~ zM}MAG@&(MLVpu6)ZT1gYIVkYYlE>6QY>wKULu-CN8R_?ivgv?v6FM^;d7f-BqB-Kc zE!?X~*Bw&D0H2CG2%|5fX7d0Z`3cu>a-C_~7?6ktitz?G?^z*AB_(xyz&?thSf)&L z89IbK&x-a!aGb!r`*OUIG8*z8m~)Ggge`i=KhaHs;V5$A2ZrXBJtl|;zkbj6-k-kG zXZF2J_wuc?lyXLI`k+{oKu6OpB=(#S_zr*51o5287Vr2N2LH z^-jj)=GZ)1Kj8Pvx2wI$!er%_~=|TxDU* zT=*XM{++CSYk10oAiuhIKj&P7)A$d z+Wu+4_5MlMUtdCV*lMSv$|u+>EsAVS=`fVfis`Gu)D4+&YR#O3)(+fUb1Gv6yr9M` zuL?qh+7jc7xd0JdRRhT&Au0i_3#WM?bkL0^!(-n}u#^Snj397BLdr@(6KJ?AWzFb{ zZg>eVl}hXe*=kHh>Hm4Lm(z-@a2v{^AiE%nq6lyBWaX`@kh6707DG0mAVDmcx3P7k zHlPq-D}h@ys?cXlTOO;vAnI$al!$v6r$OGhWp(_rZsQ8jw{w_w58eIOmNX7Y>(SZf zL|{XpDhwCPwfB%le7ny_uiRs|iJ^tdmINVi;(Hqzi*@*-;7ma{rf*#-Avdn*r2soB@{-)5`GuBXd} z_5aM+%W1<@xb;li;yh^=ZRZW1X}s0b$=TF!8xSB#)NM-F;t?{`Ed#U_xJ2EdG`?s{ z%w?FR#)~|^oMt%$uERBJUCtu6NK z8dyp4x}JuQOAQn|>3%fLQV$(%=Q+Uivz#ELzB+OF40}@ZeAyn&=8m7OL3xafE7xFu z7@H*i=e$(kyv&n;)Zg)>Eg{Ca;-RTq)CC4RFK)XPMEr=}cm*$!^Km#U942FYBo_mA ztG;*o)suOXw2+i``-xz!gy9|OzwTze?CG+Zbjk=u%d_8+d9N)P>vY(y?QN1? zQZSuCcG9{uI4Z4Yw$I460nd%fdXi3j!!gcw=G^ODK%-v22X-fZU|ZvY<7STtb+HBa zY`U-Z&9HDC4f_HCkDk$*w5Od)M|aF}A0{%|%Q8}z=y@1hGzPFT5T{ldsYXhg(3!0b zr{u6BmJh@_Q@-mbV@i@*cd3x-@hKPKHRWl&-a;Dq~R>_b=XBLK$?3VZvdmO zM#0r(qeoH$PP<1jk~Q%C?jSyXHu+v!lJdO7Wg?g!L%A3O9{Gl z)B*{O0HMbIZPXl@POEN37I}hkPc4=?UQ`sr1jURa;Ee{Oo^Cpflt!ukNeM&rn}HoV zwZGXDZYTj@qj4F$?0wjYIn}V*`Co(&g2vkA)lcwYcf8tLS|;{2y4&+tt8tv^6yp>5 z7xZdZ`ef`OD1x#cemQNFxa*xUh%y7)ufS^SgN;t;CRiO3gV$fpWCUb;I+SdT8uI*h zpxcWAGT>`WHq@839UDLG+I`+aHh}*;_J1?;%0GdplrJOb^1BPQDyJZ)3jzVm;s0fx zID^+o0FVJyt!gEUvWfslNE)20qb$oKy*zD*+RBa&eHa)h%0-rt)a-#6n#l@bklSEX zFRQd|rmi}v2kJJWz{}L<(=2_Y@D)x1-?A*6lt13X+}6N(^ZI4F0juy$DFC`xr=k#n z>O}bQ1XO*pk~7YO@R9HGxJeIse@|#>>_V&#cIYlkGc~fDTXhM`w*I9@Il_he z?~OK->=u$KK%fqet~5Dt7{`pY07u3frs4A$6sP#|z#IGj#fJb0fB?$QjNa;f#HSX| z4FJID`MJxo_=DPL`l$CYql;zy;nhz5caUz}okw)^pnW(tKjewdC4z$sD4oy+ z_*c7%$i-bUGtdehd&`AYjAr6TT{1O4J*WZqsaoQkhOUhly33{g931MeaJR<+Z3&3E zc#OKc)`DNO@vT2;Ct-SknEa?#i(k;myxg8tUejK{8y_C{sE$KvVF5xcw|7|cQ8lLG zjj?r14}i39Lqwp(yJl^1dECNWH%vX-2A*$40^rTqr@FhpFx;LSxCzz=>x0!cekN5k8mlkEP%Swz~*euS$E zuBbMliUCLgD-b0_AUOx=pR@>b40wuRK91_s_+DQUH1`xuj#s-LzHEPFSUqd~f$0DS z1K8&ZJ123HH2iB?e~ou*;(PQDizsUM@aiy&#rkdhV4Mg&u-aK%0-eN7 zIlHc)Dr{U5okmx1bMTB+h3lNqB{I<8`|)%_{GzMld*E(DB*j+!%j9#b;axJ`s&7sP zn&h?c9vM+mA1T_R5)_*F81*&8^&VbqMTkcdu;Pn*BLuFIk^SK}70p2aPT(oQ*LFN@ zxmIUJTm}LXrsbyrgj5SLMB;NCuPeBPfJB*Zi-zPNZxjb9SP&1KI!FLYk4l6;HcJ8* z5t5OL>r&vL(m~vSj66L9U zIM^ly2$p(wd4gH*!l(!pO)`OGj<{r77p!zq$)JTM|aR4aD zUQF`;2}^Z|+R=17Apm9FS!`#bJi0NP#wt|JvAc2l=^8>^)py(;^SqQ-8;_=_B`vmR z;xT1;{Wh7tIilqgjel4Lp}d!N(y1`9VfqCokrf?Q^dmWb;Ofk14S!3wfkG$>-P>p z{oYznc>f=9cOlEHFdAV%7_tgk9~Om-Mp7PiP7@{j256gcNr-?b2sSDXBZnBpD(zU7 z%f>~f>vF!2v9c1QF#(11;C`OA^?&XJLy3W+y=&w~`JxBdeetVvhQUb8z`{ZWi%4y( z0&Anf7ykI0^?wp4K`J&Kxu*K{#N^ip=sZ{1yX#%?nn59&EIv^j#|xt=V|Wq&z(u$LUxOm zVr1o_^>dPfssd)&x+=mC1a|&UXZc5x?WH4tE(k@Rrbz`j)=^RCU741#V_x>!tkDoc zAh$S654`gnzYkj!(1!&cW*pVLdH(;WYPJ3Mi*&uSs*B@KuT&ukllvla3ECrq(@aW)h;KxQ;M39KPmU=FI5LfuJU1JyF*${$g7lh zG4Jz!pVpHX+ieeg-|uxcXE*K5O$CLHFpko0dQ}ql2mfDxrLFHi6KP~XXgcB!uxQMZ z##+rAEs;z#Mp~k8q=ZW%D3dNHMboEgQ-|S^!|FX5%-p(ZRx_x7_&T!ueRxaK8Epu1 zkYiZ{5sM>prBC`V+iF&Wnw;2rz>{F}KM;{=Nj9Um&C?Ll`G=h5Xnst({nAa0*GwXk ztN%TMCMSk(nm^}33$sEnIW9PO2toQHA|@+KUa75s(1cJ$=t!VT4>cq0I0%yn(+IN( z%v)gDGId1OQOtID>`2Pq*xhJb7}Q1_(~Ff*cdLX@7KHd$$dJ0xksH1|Gyy zcn4qLXZBA`)>iC_qi_xTPg7-0|GC*T9yLf|K|OB|c=aBDy8E_VI+;CJhyX#|cXYp@ z6{VV-tJ}EQYCK=we*N2I5I`_j^8ys0L)zbf+q1&XZ#oPB7SKmz~R`@3SfHKT3}r`Hf%rL>wPqIA6Q_E3eS3xnZzwZ2tQQ zt8LlfCEpGz#Ax3a80aE#6 z|MlHhQ2y$LS3chPT`d2#rpoz_=uACuw{RWZy`W3Jzq5smA z6Jl`k%E|5UQU6x$phx(8xArKX?e@-GUf5~zLwD~C)S**5+xX~xwSU}se&_IcEG@cVE*kps2ngK^Mgfc z^jjo`FLlzU0gYZ{K7=F^WW3x8Vk!v0r)FawYu=`@!S}#>Mm6|i08+P_qoxBM>DAzW zg&V`-rwijG1Q)9$6CykcmyRWqXQ{#`NA3sq@zc(wE2q&#Y$u@<+&o!hbNRmvgM*7l zKtzU^th|Dvl8Po(9lCVuQPZd2fI&lsjTkp++N}8tlqClS77iW(Q64gid{hM(SlEh{ z;we{wPe4dSOsZN9ITbZ69W#ptRyIwV*|lip;M9hx->@5KlLtQd9dW=aA|g9zQ6801 z8*Nb$x)_eh_#28Cj6s6(LAy*yOmb40joFcPsn6m5S59VScH~GE$_HXqa3vI`Fhwt6 zX{))H>O>WlwhZO2qN=T)!dk%=jcQb9c7F3(-j;6fnl`k%|F)t>21mFfVq^~*Pn9=H z%>*K54gqMjm+Ke_>zxD&>|BM(=4<;*(dBIVO10X;rrvC(we)0Kg;!udMQmThbmcGm z3hvi-JH5jwm$}wO7pHJbp#ktd3#fKT@-eKgWSb?h zi1!+59)+{zSLj~d3;tRj2y4wsI>aP6=ZL)I%@UcaEB>rb+N3W`h|;a~w6=Ji*%MMnUvHQeX6hJivRP}9 z(LdAYVV{K@GHX?2BiCA}Y*!UEg4yMu^>>;HZMhUp-$e|XTIo>GuTqGPM%CLY^%2^* zMYGlWUtY42Ib9LAF~~;cj|l* z%~IoXO@~S)$zD`dfdjJ#=|=2Gb3}ieggA@{3GdArzMXrrjph&fG;6>*lnAD1tCFzB zC)E)EO)hm}VM}uFSu1&y`8{MpIP1x6{fx>DkGZMQx7~j#2~D9QbPUC06qM97Hy>=c z$tdkX!8L$mlbh|_1353W$$+AG4}y2Al` z&Rx-dmiFkFlH}-0V0WwMt=cKwc%C~2@8u(sc`AhBfS6nrI`nphKb#sCq*3hCy73|{ z5I?4o7Q{8100Yv~$b`aXDHnTWQ2A8IXOjsMx~7v^yV4$x&MDtP|MU%FE0-F{oHby~ z_p~S0ZvLkoX$7+#;~TG&USR6{WP4*uo4AeK^eBJu0f@f=zbT=^aA{w50RKIn-mi$8 zzvsWuPu9JivFB^uR(AhD^pKOBnFV#Odt5gwF4;WW-3FbLN(}R;s5PSISEEQ{wqLb= zsBPEf4{_2#sz*B?nF_^uM6y3ETq|GX=~S00bcvPjQfW8ofqHd`>t~B?j7fx4v)lj2 zY)9QahRFC-n`?*<&--KRhj4u8|`iTFA3P#lU@uAmtZE&&4o39IYjPcf; znga`Kmwe$-=Ot0|-H490?VB4VKiA@2{2ik5y9u6`%{7^~>2!naY20@99Hu1AYPwk; z*4ize9Q$TGpI)~M9*Oq2>BIjeF($W&%KOH)iKNd-o8_dZ*qh|;`Poo@uALfzxI)vh z<@2Xwd^eh1O3_HAD9@dcB8zPD$fpd&lu#BqIjTsl)J9cmKfc3~&4oRQSDb0v;#<9ffxX1A$;Kkw*@c)5(0_@!gQSJ1y_lkL6AWyJwR8T zIHE~WgY3Z&Lz8K=>9j7QS+yk z6ovSP(ZCgm?MgfhJxEXh-uVV#|ay0|zTl>z(>F)9aR8;c1wj`ncjRMttB4q3`m43PmDcp+kq z96A6jmb?XS0JfDr3M(F90}6tJqlCy1p*2a<4hV#Yih&zXD94Eggn(k;`J4;H0U;A2 z=75FZ-~-~lwrOju78;Qj3RVbklw`y8wl6T=>BopU5gpAh?Vj~}R!gj!hG9ckFXS*Inq+!8P1V{-N<&(e?;0iD?aN=!X zN3)?aCtaq~qQV{zR9cu0o1^Dq@R@a@qYC|9gw|r80>Th+oM8YXirX~8R+Lt3Y`&5X zQ`f(-D)R6%MPQ3?^jh#_ak4hf*U)dM!o9;r+u>ZQ-eAy}ZSE&mrxA6B6C%1e=fs|D ze@$-GsI6 zhwju}j}D4&qK8k^Ub`}UO??eHd^_}k8h#XaEp_;v@LI(1$K+=z@7E^po-ZFaZ9m|7 zB#7U2?IF{>BOd>!otX9EQSRwI6N@$~e==DYhpI$>G=vMUc+mmj)$$hz|U$|=V? z(vPQHu5aFdVDw#H!T3Aav(BLW_Wc*;3Tr=*>;JU=toi%bRub|aoMC_Z)Cx)b+|#pb z(uo(}^5DiVFJBW^qRJ1R)6RIe+wcEs%Vi`U<1dSL^$(lw>dY5ckKQOeJA3#xe9^sd zFFE7t+gl(1b)_TA-!Z@w2LJ%qzE}1o-{0Bz8v>t8?EYcT-Hi}v4sExKaNhjbbl~Bo z9Pdl;{c_31i*WtQI(-uM+-!~+1h4K?5=_9}$-X~;V|R6Pk3+>h_C+6f?^WNMhl2b4 zcOy{suM7T}^e8;;s#1LO{ZIw!vS$1%H9 zo-zjYZbx2m6`3cr|C!7j03Zv)JT{$_v)U0f_SA2c@rr=mdg~5V|Ds{}0Y9k_${P9_b==~;CbQ!g1U2IZX zjaFK(4+22?WgwRWs*tW_dvbH-;ab*nfG;@tF~iTXa5`+-=7|p^PU%BdIV#`C%b03Znryy}R3Z zB~UjqfMhOhL-_v}#Qg8?-(;$JG?P}|V=ESHOMVDIZM6JwiUt8rMc}~_!*Oys)L{dc zw);=^6HsyDw!PYZ1 zH%(}98+0^f-n>bsK&M_7TQ$$97`J1^Wc)x3R0XX`fI3Dcu62=5zb3w_j=GL}=C&Pw za&6Dyu*rn3o*60Q~Q`GpV zs|?vShC|pCi<5J(iGxV{CNsi+EX*}>(yXl#QD4Zp2Cx|_pnfFOBgb&hb}K{N8wezk zX??ZpYy_D>moy7(B7G^xc5scZ#umB3R5m#?k_wyZHoK;7U#iz(yOmpWvsAQ}4la~; z;u$HDdROF(cc?uf6aLz8bJsCFaDgS#B|7f#?9Y8`$l>-Jq&$Q_0qf zb6mbVqJ!Ud88PjW?5MB9@fSpUn#NxH*o1}s zeKuK~`c44bmuVEJ*Ir|n28kgSV=y%L;k%zzk6{7^{ahm}#+QZR7Txl(>WF!mcCFvj z%r*#gC1WWiCn+YPs`#>NtykP6%M7_Gs|nLn7)4ia{604+V=@rQ$Y3hm3%5qotQtm| ziF0*T$dRO7QsRq=BzQ`g)49QP7p|uT&)L zC}vW>lq8oUI(qL?wUiTPlXmLuInveXe7oO7(k(BaZOZ-0yc2v_8nG{|tsz}zmx^{* zk$y}>V*h4oWt6d^^v0CgrqOIP>q#n?jG}0gL-|zWD4+KIv2T}H=jJYS>UQBqXKayE z-^&f74CLDOn3=EJ+ihAwQOhV*=sL_QJtJv-`eQiXl?P`Dm)gT5Ghl_@Rn1l>foyN> zpw4XLXucIZzdM*nx+$aw@%5b43ll(qY4<*&Yjs0&{v5~p?X)CbBHJT<@@!_OEcRGQ zZOc4yKf9zYo>CUJi{;-v6pwGAi62|H8X`_zkzOz^Wzc?29S=*HDExB~)i2pd+|mDE zKWPx;)Vyui*zr zDNdxikY=1qbU6Hj(xX2)bHE=>%)%kQkTQm;r!U#@7oWdiBrc?R6(%x z(jT20UvSY^u3BTz>yaywF64vXJIDPj_YM3-|2ELoP z?OjE6so)(AUE7`CRyoI}H(r>=5-EGoC9*zjMO_h@Uh2#!3OJdxeRMC6ueYr@^RcRH z-Rr8B6Q0_!*~+0>r?4xhNJ%Ob@*QaYdgMe`T5CCbO|`{#;ion5!cqGw_uU0=l&fTe zj06LA^=FcxXAjPPFsuA(2%-<^>MWDS5G_tFO3*Bw(>(ovdwBCwa!M^98xetGTS=m zT$In$WMNfuAzhb9$`3r0j*@ljkH&M-*DQ7vakjO-KHf7sg2i;E<@QQHFUV^oY&}Hr z=g;NNTuV>WM&R=?nOOx@ksw{r^RBbW^H5)t*SpRhMrTxQVX;1td?;ZoF^_~UTbicr zG!na zcc7dYp@WU>fp|u(A-cMaI_v*K1@#}m zgQtJ~v3Oono~q;Cs(O#({dJ!AR(HtlWMX-oZ+IH2rbA0|nT*7-4wbxWRTXKZu`zGF zLk{7gh7&kLtDoQiazUA+SZZpQ5HsmC=KRsH)(RDC$C!17K7zDYm9GkdL%L&bxG~{ZR_5usaIRN8w4`sjStHZZ#{NgQh#X z|3))t9Y~A-i6M5RF!ufphaY3NhN((t=TR3IEh}FHhj96NYidyfaSlYk&k<87UtCwG`1Ss@44k>f>3LpRKi;~c?$YyLZ!X@;+_GlO1x{i81XCg$J66dUpqKq6reIpqC?9;p=^~xMQ9KZkT8_2DFpI*GEwmo#czIn!)}1S=e_SXbkCkP-qIpgLS>R&H-H?Gp10W*W zRPh4iyS+Sn2c+`=cz9CZl|K2w4O?C*ER!o&n{U4Q{nlWZ-=4AJ?tME}7SqhDaH0($ zeU#bpPuU;!A@kU2aXquvlAix~uFdcopEhIH;c=#Q#qvtx$w^!`e#bKPefn3KtRa1R z=7y{I9k%L0Kdoynm1a~IwMA0e9<*7#C)`#a8?;e8+i#^A=F(h#dimh=-YZyr3&1zB zQO3x?-~gmu!t~W?Nw;@jw8TpvYKH$OAOEc|wYH0lZ7D6m+BylQj{O@BztStOJDtie zUj6OJ|0&L?XTR-zP?e2*=fk$)vlCWt`@k{bq)o52BLgP~;M#min4W=`SE6s&NB=@y zT7uReTYX^g0K6UIF1Zh08QDKg;;HxS`4RiVtaXyKs!55_aob}4{^-%h|6b;7dK-|N zYBaf9)#nKwt1-E6zz|omT0$LesHY9A;mRncM5Zui6>sF=bLefZ4nNqnLTu7W{4mpN zNwoSB4tK?#0)uq7j3Z)@I3fW@wrQD6$0C#Tg|Z+>InD3)7#ZY4+OLE24$Skp{0o#w ze=MJ$$P6_s+A~8RHgsp?z{iu=M6BV1-~5IJbD7_M*@HCUZ2DN(ea(~7r-M&RR8JmS z!d&T(_0Ni*4?Zt8K7&8zR*jI-o^x?0KlK*-QH9Np+<31>u6U-A0m2qauxW8^Zd~ z4)o^tV~4$t>YEz|@_63uTZ)5sE6#tIoB!EhrEQg|MsYNLRwkw@Q?cChLv!TyJ6zoQ&F|J(y$-fpJm0Oy{J9I+1r5yse&qAMp1$7Ss^+~k zU99WJ=JMaUe@|?$swlV0)=)QRd) z&2dy0GCR$;?T4fdd`s)Zdo_GEB_NSVOjJhTgr`L`|FkoM0)&qHtAtn2B|^Yoemwij zZp-=bh^X}%U(LuRBfD~5B{t;TriM*9fr@R#?9El8YSv~sLay9e%-nMS1K7f@>1MMO zr6TwmvxdWA)s%>MY&j@@o2sWzGnv$HXAcDMHw7e9Zb=e_kc`$KDX~>T*jN5xl;#&S z7dZ%A4w1->363IKQwtRusDCm3&poEtI(%f~rc)=kY#SQiQ+h=3?L^(0E#EY^z1z5< z?e%y6-Fo6DobUfXwLVm~xGa!+C}>LnXK_VnrRATR8vG%02Ivq5glU$4AUCQrc}*Di zm%L5C=d~(HUW4ii@}|VVcTxFzK8`n{#Awm=m;WJOFj@ z96+JL*7y_w^%xEtJg8ZYX_mJMld;8wREBr(f$<6Xk{<#Pp_|WzjX0a9&W@*bMg}nQ zlo^}mw<#Pdlyt8Xv@{%1t{sjBA2>#|N}Nh{D(D(*q`7HLn_NPQm${An0fTCvmU6EL7Tm1AGF>^EFW)mVp?b z<}^86o0ZLKM^ieL*Wh5vKAQq-i@!03?v|;1cg9u5+0mzg@!r8Hdb#S^Rgc}KsrOm} zyLpg2FfC(hRzn4k-CUD&rgCC5k6Ap4BNDZG@gQFOXG(2!waNTe>ZN8j@sw=7G9PPo zqvlK9bBq#7+|)@^*^T3a!M$5B9aG5No0eofVaEmWy#IZfgWA zt|sQVQmoCQH2Xg%Oq&%?(7Vf14BAvzJi_AL;!yxy`C=9sSae2(dDa`~EyYQ{B-4WV zXnN1@(V_A)`rBmLm4mYRf2mKgIaE=bTsqU6qg5|@)zq3Y)=c$uQYZVLy{pI+aOTFmL0(POsY~fHeIb3n?=O5m*|32OG&b*od7S{o!A}lh zwx8{?>+yjy7O>DGY+Bgo><#&O^x`qU+KsZpG&rnPFVQmi9082BKAbwjI`F@ zI=y#B#Vi$FMSk35X@5J`~Fk$Opi#^v39+nB17JVrRHV#$JgVi0@8_N;D*h%lm7uo$PupxW4>+sxgK> z5B+cS_32O3|9}4a3)od=&v4J_DgR8l<)!y8Gp;@%_3@W$Uiwn{Md`P`TJZ9XSH#zi zW?TXw1xVk&x51=w!wm71Q^f}+EwvR`|CNHkR9udhkSz0_X{$sKl*?d9wU|*2AtY95 z05hM(V#Y>0FYalNYqN+tgL^gQO>T7+RI65m1iA1oW>9co3AWGQ#3LTD-&lsQFD`@_ z8rolfdQ|2CRy^dehlM;wkJ7P_#lb@3RV~jSM!kjGHI2VuPBs>4ZNlT_VjQHy?l2dW zbKML56uN$#iok$s@$hiV+N9G0T`EnU%jRY+sspV9cj5D?*r@=0H%v1Od3D8aA)R#q z2oRt^fcU%nwRgDawiK~207ftC5Q%84LKLD^a2t6>62;OyjEfBUH5Hw%s?bvRSV6T0 z;g(c1d%wF4oRjmTxmGzwW(zl44I3=bV%BpN3e$+EH+ouH;#6^Cie5I;DZEl?Y%EdN zm7}c@tWj&CitcMYJ~bbcedhC5pheD)rLt=9gxBgDdfMxS(gT>5dvk?;_K|7Mh{swi ztC!40(!fzXezR+3 z>%8Y}EG+~ZRjMBF%K43OG}DEHxkHks2C%O4GQNIFKC<(g4St-!MU|)a5LY)8Qr#r3TH`VVaiNyjc*~#obdigdGvy zdxeyIwbXGP>6mSA(plSxYkbrPcH;73PTY6M8H0BXXhxnuQ_CZeKM^+cTQKRu^L=rK#u_l z!hN4Q_o*Fs&sbg(OvqjMTrC~>(FQpx7@IIxc%B7Mc4V&<3}R!HkZ(ju7#q@=pfO|mF5i1A22sv5zxw`YZcG?Qip9x(i}&YmFo;;h|ahO z1`MXU`e3og4Bu4qJa$*!hfZ0cb{Rr#B@3zZVg|JgS^%H7b)8WWkhBR=i#LoEWD$8< z1gFT7X4#$|^Te@V3Kt~eK5HWvaka49PKP7QN(PmTvOpE-4*ysE`$85%J3^^gJjRVkfm z9ea*3i7hNtJ5$PN_cp2cbVU2=po0G>jx81fl=Clw=rrGY`_s>Ox=%tC)ijrn^oG#i zYLu&|BPxDHbBvsy7m-SPwN+zoI^4MDHsr0dy})lxC9A?Op`f;)W>4N)TW2LfHU~61 z!tpyrf#s@B$JW@JC)I-W{d0T#*K5DjzG=6P=@_l6hH1 zV7Iv`4YK!5F+a`t=3PFfK*L_-dtMkMLo$iYUBlye7$?0?zu!QFC>bql`etX};H)YU zS7gJ3c{v=TDpE(Jsuc=qlFIrg3=a$zXR8H?w2EuTSV*OPuOu5wd(FtLUwAGZC0pZ@>_L z?;(F`sy7MkK%4#qgsdHpSb%Tm3C5`X{J);ZWcU&Fa7R zGMN0Pu>E(rf$hSyDIgrFn2N~}t?w#}a?Oo>&Y&-6EdEG;FHxJA%&l@<;`G_zO>f_7D{acCP_B2N6fLJ3)9bvI`V|56TL zBX5lXt~_|8kqc@G6BWN>WGMg&R;*VGEoPkpuf-v2evJLcNP>dQ;FbJpk$eSjuHPc# zO`H%-g-8Ic2PiUOK<5j(H(gMfsRAMh801|l0zkUZiB$~&lz@(nOpTa9yQgtPi`w%{ z_l4)sCQE1-&{Y&db3rA5Wv3p7R-$hW}-zBH?z9(1d%gcq zgRe^h^HjIcVg!3cym_}JGg}<~x%%Ux7QfeW!y?r7cNv8yLY3*>x`0Yrz>%CkzFPUH zp;3178ev1_Gp_Xf<7tMDNW(f;_O0QWNf>AZ#AM)sQ3OrgS@NDNCY?E_!q^Hdv}d10 zXk9nM_vFRZ(@f(TwSwz{6M`yiB|~1eLqJbEnq8(5mSYuUSc+u|@smO0e6zT+829H) zG82s9?^DIb2F403i%cEEYDFyntKINUr!hU1WrAr>g19<(Dvz*m35C_BN;4R7CICnw z%lXw+WvX9}@=Y3rK(oYq6U!lslNx%BZ0`E9I_vJR;Xo?Z+=M(`L3PFQ+m$s*BH{r4 zVI?wJ%YYr4iM-suGT-ci{6mUKmu0J0vQ;!rsqS=PV6c_$h+zz&oYG7Ft&*nWWN2SK zceS}?#P9~H33qb)%H(;tO*?rBnZQqSBz>z`B<0qow$_Hv(&E%jWTbG8^i0P=f|Lxn!Lr}n4zE-g zR}{Pe%(BOn>u>7p*C$YLDT*kBG#3O69@03yg$bGO(GyHRN6 zF|k3iRfaHNX)l%(&Hj3&);~PhlO7o9t718=Dm^t5AE>LEIY>8DI~XkI=639C@;CK> zupi(&&o_rKibCmU_xGDVgiH)QEj4+e(n3o@c%kNTInU=l{Cz$hbkM=p*kJTIMiE9r z|K%|15`$A91$g6u>eT!`*aEhrZNJ|e%Hr!+x^C{mehH9~(9ZpSq~KqG787>c5AMxw z;*B6rVCslM2Bu)jzXk%4B!y(lHI5ZUH;^>QFtjQ;1~2e@v&K?jNCx3WD8M!%at%{O zw2(nih6U(MnV!>|h-M3?p7aL*rLu?DM~BBpFP)zrGlV+2x-jng-jea_H>YNXPMth8 ziE-CBu+faTm}tki<#k2Hj*}<*Hmzvizk!Gxx6h~*atbpusVqUQ!}GVN6Xp>SGvFcG z(1dzaXG~63YSL{yjJ|!8&eum-%k#^`np!+$p&XTXRHU#T&4|K&`wWYji!Ca`m6|Pf z#PFx>9&Ooec(;LN^0QE@Etzddpbi+_w7Rgq%A<1=e{+gL2{?0v$KZX_$#c+Q1|caH zpaUX$PN$#n5a}DC0Gn}mMTogNy%sy%6)dIR87n1Yf_UdbEv(l{YbkAn0T~3-tBsx3 zuZNR#+amf{R#Y{vkU-p>no$eGD{sY#rZ|KcKZ ztg~KdCS~A`lx_V0i3A^?Y{Q-Hfx|5tZMvAa=EPfr{y~OYfQ9(J-p|kgKAv*?7#!HJ zMPN0H#XiRxAI>ATV+(Sy1zVD!M=zaKaox9UM<$fb2Ep-i5ETB`;N3!p3$!(x45NCQ z^_51_*-X2BjKa}?&QO}db2_$lEQX<}CWm7ZymXVLZLHd9GJeuF+7D%h-NY0jFy=dM z6bCM{FijDO-{{+ND-`c6Q&ao=R^eWOqhibKLY!15NA0qi`4KVv?&4u;W=S!V zUP#4-_>zT>in-wb3k`=pif3%Y6QhTAt>e^3-*hDwa#5ZijSoyM;u6}Z5KJPQjgF2V z*?kLwT1stP^_$#h8P=c z@V_{ktwQBqXQ^t_h~F^f8AWkWQ$*g#Dhrj8n=9Mq$XUh7T)0u9U6y%{@|wK<6;X=N zvdB_qu4oX-gPN{Q28gi($j0q-!n4pKnbDtm`!%l56?V31Au*X z&ZPN0{+3VY?0hI95QPO=1b(F9bZABjYJsdnMZz}<nqNY8YfVo zUN%mju5pbT);rx*#iNB9Mi!Z|CECNTE~3lJ396OcHzqvQg0DLq|Mi(R(Y>CDb?uwQ zu4TOzPG@RG=k5VtYXNUej)L!t+-F)(pxMJKam!CK5m91eRX(x_SVgE+ zERw2#Q-a8IoJ_b?E(Gb;dD%!}*U@|FDcj_*t*M}Sui$dZSqpi#7v z7t=PnKcN)-L1s|%Uh#+N<83`P1Rb_!xucX-T9TVcAiHo*+-h^#x%_tw}; zugMD*xNI^-8tG9c>9*nAEHf3(Wk!sO!9b5z+rDzVc6^QqlsMHPZz8CuWB+pQ)NZ+) zZ5ZiHI;kq5mz6I#mYpq>Gs$zMxX(!Dqm+{?;(e)efz@1E?KF3WU9;SL=tce9cbfPO z-ow3kTiy%gQ+A!xUC9=1bde)R=y}s0gO^?cE>{OrI?SHa=CE81h&?yPM;%jX$@ z?Oj~Ut=NZc6UDGqDS~DoXcJ0C{y%)96ll4U;r*f;Es)8E-D*w|DGuqJPWO6Q_Ko6# zDe*=#486r7thUJ@#@MVoH}pHQRzb#Wm7|-BLSFi6>UuxmGCADg5l?v*1Z}C|Wa)?} znOa(4qfj|wL-p^MuC6y3Z=)|7H9xIG?-$kYdw!>~Z@s^_joYhq?a2$>yirrR%S`7@W zwBt6s4tWAnLC$j>;ETb5iY&6p*5TsN59Gww5meX#Al&u)=@99%?Hi2iZZR zWDQXaBA!rS9J)Ka)ln$YaacLtk+P2uB7iMyFb+1b2^jn5jI`X52ehr8s)AvOyxj6u zKOzR}w)_vX63>S^+PkI`jK}&y8UD&*Pd(8k!jzEqa!|O`d{*J^Y&O#WKS~wLW$?SP zLoU8a+x)h!h)wE9nmo_fYD;J34MI`C%w3oq5sL^`1?k)qYnf=8UKy^?evv4$;1Xz= zs>kyMZXDd2^PE0smut+y9OyKAj-2bs>2lcThnh3!BKVtAl^l`<_r$RhpvSyz7a3#2_WJ%) zODB{-x#cR@kd3Bln%Yc7Y6|VZ(cNuZ6NNKPtWXgh+4h9FwZfo%uQeYL&m&xSZl4UFM4zfxy2_!du*=ej4t-t9T<_clR1+VD^l$vR-If zvIx&vF3i*vRrlsK16=P773?w=b{0JoGcL&>s8FWT+yp-{>nlvec8-C97>Dh(Lq#xfNqZg z_Z_GuhjA>7tl90XOp!d)QPa9;5#?(-K*cr4v^!0P)2i@+c$SI8T~9#nzTSdRgkk6NeW2E1OhaY&iKQ+EjE??C!9XtQPO9Ov_Qq<-}z+D%S(`g6s$uU z(xmQNh?7Wa6p88`P4hU#L3#DIso$M@ztd$Hw#;CbJ{=h7>p3_MN@Y{X&0-MqEm;_Q zwyvo%i`676jTwDYq=}O>BdQJ4Y_*OwMl%@Ssdb&-J{yx5#cg&^v=8OqZf*@{98qp_ z`q*83r&@XEG_c5~5Ze0Jr6MBxt?9q7Gb<@Aj!DqqtLLiv!Y)|BDupVgSlt#8rfn>i zE>O(Tby=)MUt#K_X@F$OazW|JV{hXQwsdsV3^hc z#4$V0YpsH++RT#5&lA=B${Zi>MpCU>Sz9h3`?x)yZ#IWoX;z%Z%;7%WbbPyy3ks$j z?y8d98xd#bZP&{d;?RxR3+hHz;Yz>=57AUbVJ@;IdL;~fek-Q-Q#Ykv;)G2Ynmy?S z(;+U-aU6w+k5~%4h`hWLa_g8WOqLY6;duS^Y{g49YhDVoP%GyhTJ*r1hjeBoVdki- zq*;j3O2KppBh4~i-29~+eU1p@suW9@2S3d}@U5JY_eKaNVJ3nxVO8rJS(Zqq)@*W| z$%!QWNSvXn3{z!DV36^zLAhL29pphTRlh!7tz%~>%|dB?y`*$o_?T4cUir&6db`{2 zd9nPOuA`&;BRWu{G`|Q)Gc}sjyYQK39 z)s9~Lw1j$Nf8aR7PlnXdG$~beVXmT)CC(-)qA0{J#S|^YNdG9>i9Z(6;L3Xv(tQWX1x(=GgHVT0nS=+)39}w}(?JhhY#i=*jm=C}HA29xpG* zX`|R3EcVHzkz3Dt)wpbGcSinv;1*YLn@xiVhCia=kD!m=Z}nTdM|7yLyx|CVsZtOa z4qN?X$Tm*M9S#?bP=zgEq<s=E|XHGWfUgU`j+;uDBZfzB=M<; zX15-$YcX%NxC?bscB*XB9DI*gl1cWn0~>$1ejYXzc^6GE4d2P zlNG8RsrnC4J!ArPlSo|zt~$$A1tk!SsnDQ-0or5GtRKd94I+DKiHMJ%+L7MBxEKS< z>e!}=T#0?p?2Wx6)BaBf+1Yy#GiQncSFX-{t zt*T+jHyDy^&1h1{FzYi4B)-;oroXlIlf!EtK;6df=P-VMH`V_+s8S`^Y`z{SAq86@ zUuL+r$Ht=8K-Q5Mp2i4Lg1+{p-WKaQYF<9)S3E`k&0?%QIv?1it;*4clZn7Ya*4c+ z^Z)JBeqgjM&ocF_>+@4YQEM)eI)o5LA&GKoJmh8&krqV#f}}}ecv2(`=fQ}n31)*vFv!{M#cVg?AbJNg19C(rJ){3WUA2hTnpwJ4Mm8OnUk9+_*Wy&l5Z69&Gq$s z?(cXy8vp)H6809(Tdf|zmRalGAe5!QTX$@8zZ4fGEYQVUXe=@c8bjN; zoJ|f~%E-6Ww<}kIni2E*(WW!ip@R|1K#u#fZH{X+db7SH*^c9SU_yo@3r>I-P#d%; zg~R}=MV%n4YBbKloN2=QY|>_M%j zD_jte+WPa0E$ImmXMJAaA?F|hBFsSm zx+7yD*PS?I>^U1aZw;8|G!|m$^ia(vA%Ytu5JBXd4OvxiZLL%&s#Gjh>ctQGGcf7f z;hugTO!X$W9c(be|Y~YfrIi7?l8nQeO24%?6d|zr)gnVrM zsfBvI4=-deJf8eOW_+}XW>Ym!fb75E?T;U0Wka5f zGXELH?fq<&ni_>oj7mO(eIC)@pv;8kP##Cphe80Qc$ue9d|M~sggQ4Rq23*ao^cTd@?*Od16+*H?owBa z?GcB0h(pu?OBaB=aa3?IGP>;Hk~Mc5$cUmrMkgd4lN)Y#N9JUwdsIAy5D+lL7Q-%M zQp$|ey%XSk*A1FbX1bu1KWeq~c@)O(REt!cvYE;|#p~#tc_{hDO89Cr!!I*1G;RgU zI0a^z_TOG)x&wk!1|`KG`W_Sn3?>^pA&kLqH7J$%{sjlq3*=}zJ^7}>Iud5xtwDO( zUvba|>zUe+cz@g9*FqEn)g9>pR-Pn^0xn0<{V<_rJ~;#w=UG;vI}c(r7+`j#S_Ds` zp#FsR%A(f^2hE#ZIIo8WdfgBmc3nrx59;X<%1tJVTmgk9!BR*V4J}b9@~40p(h?hh zWre*5S0S7F-Z#L~#a~O`=&8_Qqxa;bJ>u3{eR+6xlJ%xTd&hi104(B$m~6;^fQBIi zVdBZ66bl2NG0QE*ATW?!tAOcMU_`fo8`#GUdN zO+^luYRfW^qR6T&I}Vr@H%Ld=YEmV zZ_uB0Edtih)oYycLs4fR=cb7!0~Ha%d+{BZ)^XQ-A$?r7%%}344;9j;IJ9dRHh~JGec~s zYZIRe*})gLS;Os{*g-frtZa3ST1`{cKrw$WG>wbO@R4Y~9@ZBzGLQ$9`Kw`DTSeBHL%o9qA+$W6&6tt2k93+8N zj>32#=R-^_XRP1>ki}6p35?(0KlQ^BlKHlO^{NMS5|;y!XIk{{!HTd}{@U|cZcp;T zc1w_B+I`;1H`+V?mGDPrEm=R~9I42S9{8|Vj+%Y5Ew{7n(d5xigP63uMNt1?drd(` zmToDiCc-2u%kFk7%SI`K&csZDs6|+XQJ=&p>w%K6Ju^@$N1^yk<&Ihc1PT-gS-fUv zDvDJ~B7$&zl%Gkdl%TM3UQSqGLFka*v5O^m=Tpn!n{>|m=4ge3`m|`LQeTLCKv&Bu z!2pDBb8DCvA4uZax&h<`9?Y!*fj7Jn0B?Awyo=>nZn1USVmzU&d$k<4DhpuL;upex z&QE-I-O1T>^mr&1?XQrYB!3H*UOIiT3nKpb)bQ!CZ+W<_?!~i;TbV9r;}kjxKBTn} z*3PrMY$R~})hN^?=yGt1W&)?hEHwD89K}Y}z7wxWp%hB}KF8Ub3T#rv>&`F^iQ0-D z;}*yCfieds!q~^JKH9Ru(pQ)u2@Ed^bd_WkMTF!HhNP3dJUo)K>_D>fC76v>`;!P# z>9u@ryOu%nb%oS-?);S`-5q&YNb-rY_&G$GhnGiRUKGM1N-i^ zE95OJ`cm?o7xdp?kTTL$-8MAcZJ)FhMRWY(B1!qf7)AVt7{D22!K$JpG_7V27>+$H z&XhC;Px0eDPmShCkiUX~Lx!~Am+o9+Ekkx#qp)Nl)#MSVO#+b!MA)>QK!?rt3CJR% zRNQ!?cdoW4^;c_e7UflKv(|okWP9AZI-c-1nVYx%10Jao%S*4m4rSnKD_;IK8~N+2 z!rH#8+lPf@Eh;`};qS-bMaN-A zG5mA+sbesRS;{<@T(ma2ZPbH%Qk+n@bmjpTuWDdSP`%8OC>z#Lo zC-CPAJ=|+=;^WisWJ&FFll3A&;e zrSb_e&sB0^g}gl;idMCf9h_A{TW%T}@>u;yfMDqHWTpRM?$B?Hgl?juD8R;zE`6!H zObbwyWW;kUjW<^Mjhw@P%jujffMQc&igPW5MP&#n1qPpJ)yeTZ%>l2sG{!eumXoYJ z1T@lW#0I{vLA5NXs(H0bJl}QmkSw6d&?A$Z4oFTwDI3wl=#wE`-~~u91!L3^!es88 z+}~kaK-Hj8plkA^l_467un{qc4yN=>kt?po_(W{^ubjwKAWc`1WxA+m^RGShRzHwHo$FZe=aFOYRf|N2eBH03R6DSR7b@;>T~^Vkdc zkj1Bn<4ntnd+H6@BN^IFEB;z1R=Y6uRsK|cPk^9huUDcfUVlN@LK1gRSgE^p zZE1{|?y%`}sQ!Wct8nJd{DhA~I6bm|j6IBk8=W5AKd|>Q!%niy8S?w;L&-k=pOA%w zihB*(%Hip7{twldn-+Tb^uLgepMm$|0-Kqez~P==TEyzLDCKX4#cWE>P3qW~)^vpkAJnU!{IY||CMq5lT&=t7X{Fmzr@ z1`9aB3I1?`bKP`1gx0;77dfV}_Q@ncluG$}e(-N{!;0nXqD-undY5kAsAI%5;W4(i zA3m6vc<>->2Ye{`^VWyo-14@5ez0#B@MLH#8=Y2^Pt1LR1q%k{@nbodVDg1&s;#!L zf+lI028A1d){EaS-Ya0kp(Q86E*PzK^_&c#!ayj=$kf^dC3J-*` zs)yZs;(aO0&@=}u1_4rRb~Yi4F~JKpLR$zVaR8857ZDNC?1B+wYb`G8cZ=J z=ycvl>r2qGi-CC(`sBun8zo~ zsUT^(rpUS|$)+Uo97>pyD2NY)9OG&Co^by=pQ7rz4C9VbZc~_z8CpV**_a_X3ToCX zWwI6`%Ll6U1~cy4BiopP3>j9c$$%aizdZXy%E*f14{a83Af_S2L}#+WK)gh=38L(5 z%$msZ*)_UO8t+{`a5xP`k9LdQ&&n7*`yMpQ3Hi25;3c1&8TahS}p$*r$TgeybaKVZ^TIhAsr@aj+|1sIp?wOIel}L6qpB z8d{eOmNL9txz{#fAuH`_wvq~bmlj*5RDyBJ)QYO9#saofFybu69yiktS{m3{jgVu< zL=ihGXw*}8z~yo~x=%0r1C7Z}i1a-lfl=`7|C>?;{xQJx1<-~3i?rLa$2&Ykg1t7* zRgefBgB^(hbeKG~8LXmqI|Lx=s!bT3tkgwoQ&~loTZRkASOI(m{!Gn-?UI)c7y8h*HLQ-#*m3_AVItp#Wz6fYdrU zLSil#a|nf$cQd~#iT-9RfvI0H^OaKbmYUpLf2KIi*jNuF-_Ywda6yXvrtB)~V(DWR zk4cIg9{Z1V#|(N-%J#*;lL&9Li;T*;1F<}hyok?hHw);Z_h((TmYG9cxe>aeBPy@j!224UEbk^(o z0Cp-VM3yn3N*qut3LnLX20}Fju!Idwj=9KLuWJO9g(0$#g`LPkmelh>Qe02q88c{C zNJeJsr+B+=DksaXtI0@KE=ju=DROp42AK4SerI;oG(%_Np=TR1(?B9mkw!khUat2+ z3Mg}erib+Hbt$JB33HKSA6)vFT=KAo6iMOFo zu8`$=?DyxgbM_Hf&~j^1L5kz~{WN$eAP=-RWgD$H$V~HEDtvzoYTJpkOr}O0ltI!Z zCzAh6c5l;;^8YH-gSfcWZ1w~b_Q4F5wyCR3DUP!87`EA?NKI?!Qw8Xp;QPX`B#+zK ziq5glCeWJ+%%vbWn5fVqV8BN}+@ou?#O1zPvdqw;ipXw>Bki;gO2{zUNdtfg9mbqWGIk7*t>;@aUo)~@E7Bj?t83N3&U9)W2e)@mIW!&3mV+{iPdQdAKb zvZu33J{a0mB7zBRTbdPM4JYt59`;fM8pW}3BHEsUV2!@U@cO{$J0=JGzI@!P_ra0# zlA5%K@K08bZ!<=@sL2W%aX|SWzFPWHbd6lY2%eP^v+|sTk(Ebu^BTWigg8~7jnb38 z&U6fFkg`Z%t+`Q?1QFg85R&vfY-~Ref&)Ap;R@?9SAb$xp)d+@@t_RvE0E>AS{7!pXcXRi!y7D#Jts8C5Q1AU^&1P79rkTEM}KfB0yVE7*2d|&EZp{X0! z#0}Ot^|W_nK(V6+Ne9`Lg#itw4A2bG@fZ*hi%pD}Lk+y5##08E{niXD^c{Kxf2+Z!sSDzzr38M?|EnrdLyV>JTqBAI+yniXVLheJsze@nsXHIdQ{}BMf^;$ zHKlD4HVq1@>c>K@|6s8s&`R_mA5|6s>r5`ag4{hFL#}s@qJNgwMtBD|Ft!WG#CBXl zCd)h$ye|TVX-aj;%<#N$4NZkCt74XMyj(0-?TE2LjWw(lu=94%ZH5$2*LeIv1YQ`_ zK_NLJ)I+I90^@ncL>z7z#;BIRVDUD){3X`)Wqtl*!&WZGQ=b&qjB)Mj`kpmQCdDvJ z4wP&~>Uq37f!39y8&r5lo?^@7wDBbz55$xJ?%RIgJ2ih!i7*aIPirtR3K-7-MAJg^ zDmYr~syaC|gMvjQ`OaqUM@_@LsqXoQ(&_n3W`1KC^zx0+XKar|-+IYhbr<5_h+3#@ zZI4U@75u;e-Ve*)O#e^EAMLn#D@>^n)cCgR$vW!eFw%N;!aS!rU>cEl{9f4;;xlE2 z1dsf`aw#<9iFPv?%y$h-X2!D2YbdB;SyiFmkNb%dcErT;o?#~?=Q6Nvh7=B(ZmppK zWO0#IN1CHXLaBJ6=4uT6EUefX(!a|h@d>V!OiCP!qQG)eMJ!=7Sa*mPr);qu(>9A4 zCCn7fVFvIe$HTqzfbhr<-yv^OQ2pJqF8>v`15gIIThO@`U+q4fA7L0vS2Qr3`R_C*0r*H_Z)uxhH9~LBer@C|6w)9jF(8 zNoflsxtxZ?P}21i56sDB+0fR>VE1Gkyd#*&;Lob`%4^RKK%KZ(g&5#9_|-w+ zEmqbN3lJj?d|e`$&5*@+F?+Z^_DU$H*swt2i^lH;&WE-8j<2(j@Z(eU#vjQ#^-%|j zZJUN>n{FtI>jKZS?Fbec01im5Juj9R1Aqx~#k4c_>O2aWED9VaF!c<} zGk6_Y%ul$Qb=juSGKH=Zd7E2vh7jE&J3$zpZ$tkkCIi_3@>O)Tjjr0oB!z`0bK%&| zP1V}EQ%zVAM(HJ4 zm5jvpcLIi`dQ*%$Gj7_#^fon2^t8APebl3^tg35!Uc;UncWc@9K^MG~dTg=I5iq#S zml=jFkg&9a^U8-e;Xz9d?aH&``EoqtN&P1*`^pMzkjh-d#UMFfONmR`=p^);G#lDx zw#I{~HR@Dq=p)$&K)wNHq%>4nL|S~*u%l5#v!U!A0kssZ20qsgHx{pInKBN8T-^ z`#=s$Nh6+w#O@nQWsSOMA#tgd&sFUo9H-?6%$Gl(dMmO7%FiA;l>h}ijjYFV z(()hR1qS2k5PdwGPQT@X6!GJ$7o8QQo2Mj!=d%hu4@?@2FO6@%Yg#xgN6%U$f+^Z+ z`GaU$ML!OAEO+`#&AvGWUj#MgtLeIja;l&#wUwZ*KY$U!uq)MqA~WRDxwu45UC=_m zfI)uAzM#2K&ZHv9_rJSluHM~=x{ z$7?#1zwxjLM>rNE0^xF}8$*{w$W|qZqx5+<&X6R<^94bmYvrgUILqbe(#)HNnb!j%P6&RFRXSBdU+J^rjnBjdA+7Th?aUL*da z{_Rkxm5tMNt^MvVBm>uXn@5|D;3pvzXIfAn1t;J)&A-GE5@t`0y+9=gyQl=;&nr!x zxYtqj&a;y9U3C>sH;&O*Oq7LK$eCBnSLz@_9H#3h5@{aga2ysj3&No31ZuMX%;l@q z-4`zjAVw|F&VIU+O@d}Mo3xj61Yur2lckRia+FL%Ll=>WjN_OHLpXtgCO8WS2N*3X zBn7EuW{(UY5>txfB#ywcf^BAaUXW1nEUzS-j3Aq)j0By!EGXTUMNT@RT4V{B&kjA*A*gBq%6~%zR_bR2HIr z;mE>-o}wu!_EZYZ{jW$XRQg)mGAcRemw6sy)eIl;-o7rvMZU-+c_JI5*G69b-@ zL(FzFHp+@L7DeEa4J_2)7)ocJK{H}bnn5jER(d|l>P!6Jq06{wipS!5$iMv)tz3&c>OeRyeBOOW+pGu4Po5+K3W=U&WlaKc_wAD zc~+q=O8UBm{`tvXRE<&bWn`q|@L|`TUJy`~I`77|J8?KY!N+13N@WB6G%{YnV3Lvd z>|tpe*(5sQ9MZkOP@r0h3C^T+T*!;EVgrO^B|43o$%;AOV|P5cj1(x##IRyh_{@w& zs3f}CY}D%zlFfRxNh4sjx`L6zpj2=Y$D>(oVBPX1-MHgkt%3kWWVe!(G+kFw=>EZW zjaAbtnkq3gU8=0Df6b7{uIk^9ig_pct#g0M+fLVys+x(-UQZM3{RGd`B+ z+;atChB!%mOVjk9jSZ$l`;&N-AZt+S1j6|8<))6ek-j=#JEd){<*^cb>rWs5+*&xL z(k6vF&9x1Q_TfX!+WYO0%G}(7@_L1F37BMK0hIZLce5bv>;B%t2>XOc1~g~iiYP=JRam;MW#vXtx4+$eeK#SVoxgX(DLz?12G~%=*)DJxTya zFj||8#xHAFcRG;gA}1rq#oEbKj7p3QF&L7%&bVI!BV5iqE~FTzV=D{V&?y^>CiC*x zsqBRG!hW8}hJ`QLEecLAmyKv70!uE%mDFbJc8yoCf>84Ytln~XAMjj6;C$SFlg$Rr zkOWEN*cEXNO)-nR29$N0y)0|HpCN4zd3Uqap^(eC^yd$L`*}?8FeGCaVa&*RKN}~( zz|e%*J8({h(l-iu+@34izGO>qUO?Or)6vikqtK6&UGvKb+du#iI%B!U^orLoyy#+V z4CIP!sH|^lprTcfSs-Bi>p{mXr}7GM)!T!ckIkV8!OYR60DarorRVVXcDuPT%&hDB z1Y3Tpuc8$I|LwlPD!4@pwqBXwxp(&+z@aME$UGCKzCi6%! zEGp%f2m6d8h5_rP=l5?A>e|@lYt;>~9WB`ZuWts2MPz?;n?sl1yZ06#JpA>q|A1gh zaNA|t%Pfe5RmvAvs{*xR z7~oSqoQCJu8G9vJS`UeA3ltz} zU@EEMOCCm{x-F>mLg25rf>qrd{5qegd+_3CBOK26ub_nw=xTr?9x&li`%e*_X5xkX zD|h61pLZudzz4YlKMCcToEgvOF`NZj=hPVd=T*H6WJAdJ_CqkZd}jY@G_aembKRx^ zpg=(Z%24;f{p`7pU;xy2kPnc?$6zwv1YkZHn+4!t^91j7ozlIaRkwmFy%xNqw}90l zE^s=`uKxu?Is^Xc&EW6)AQXSy?Z7qXnX|~1=RWV)3F?m2A$NFPM-8?tXN{R|rfwc< z2Mc#YeDLa+X2$M+LAX)B#AVlfo)9GtZ!a!sD$rc(iv~Fqx;(26;;nZ>fmS5ME;oG=Tv5RH3 zJEAWRmxmw^66HG%Ap{2O;iB+&X^Jt98ySsZY%;zW@~wt18) zcAC>Oc!6m<-7owWo@8h2K8dlb+e?wQ9w3bA5-Niapt4G}$`Z+ge-54i&1D>C?J%S(|Em zd+U{2NN3PEW2xXN)YI9l%T6Yb!a+WTJjb*69EvDt!VT&dnrf-#sm(n5`ACSrL{!e_ zbIEuTm6SQ=w!w?HBWj&~QQ$cxY&IPMoplUObC)X|vF*n>#tF`F;o0#5%&JNmA0R%5 zKyW16h52dwfhIuo$T(B0GIi{Z;`WhLtkq^I3{G*WVZ|$18RZM#9$~gp3m&F(^R69H zppa9&z;j*8u;am@?sO1Gx)nm3ZCF8a%yGdf1f^(l0z0SDw9*MK*}qk&exi9InaQB8 zc4#S7abw>{mYsGwts^W%Qm=&Qa)9F;xyo_U>Zv3bE$o*<$}72pB&VgUB(^``Qzhzb zC`UhCQj$OakGh=|fOR*UtJQLSy#0?G6mEVRRo;tdTiJC*vRI${7rp z-MUSr!lr+QKa1Lcf)4Wb;RQ|J90cZaYH*hmcuIJu7k)WQ|Hs?G6((INe?5H+LG^}^ zO^8qFcRsx~!9mfYL($|(>A*Z8x{;@pJ#uFXk;`25Gz3)2wxetzST&hwa?E$FZ+R5Qg)7+1!hM zWZ~bwvH)OhNYnzTZrJ!mcZdunm_Ob%>E019!s20HEB zQ=^>r2lTCOSz}>4#$PPhoi!3PI12{>B=CLFj2ymH7K9JNC9U$_i$f{Ae}6EHiD;xC ztq`{y46Og|{U)86{ck#j4r^Mo?lt7TpXC*1!xp;ufV^*DJZ^~&_=7D2S5;( zUODI>4=40_Yqlr9H6KfVVQ}ksNXw-8{tQHF^XcZbo+RD2W_t3AE|ebQ_}W;yJ{#vq z+!V_0!z5#UQd_|0>h1IC!L;6q>C%=--~Z;ar#+fsR(~?FW~9} zN5AE>)2Hjfc+{AkaX9_%8p*V=tgV#oWqk~=3y$yiXlZ*xeTix{^XsJ=bX2jVkm@p| z8Dg?-ahT1arp;WzeO054Ct|21*c9Xn%{En$;XpMzvYd@fi)mj+HjOd+0B}?y0&;~C zsySC?%F`80`3h01h0$o&k}n^%(i0a?*6m#Zo7&n6rAIrp_+5b{gS0o8aXN5Sl8(Ak ztWYl7bTXVhj^nEWMSAkK&MNu4E?mvfRYr4l6Kco*?tFbn6?ht2W_mTMR5J>eBtfFo z<|`fBg)Bv(X2j`>qnlz4xx*4g5thlWpM9c+p5YWYMAj)0F{SUA>Z%r4S=x^lCt-0} z&r}Vg*m!h`B#Dw$q{tXP3lmF0B+I_$z4H zEIn7EaqqNW54ncAQ7aQf^-kZ-pjp&eTf3(IZ>z!;cutxhvWZGnUFujZR4+GGtaj_XilvHU_Od2X@hngqErI{T% H00000K--!s literal 0 HcmV?d00001 diff --git a/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 b/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..36d67487dcf5fbe3dc6d0a6b01cf4d29dc997765 GIT binary patch literal 16272 zcmV;BKX1TyPew8T0RR9106&lb6951J0Hgo_06!c61ONa400000000000000000000 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 G0RR9|PM1{x literal 0 HcmV?d00001 diff --git a/assets/inter-roman-greek.BBVDIX6e.woff2 b/assets/inter-roman-greek.BBVDIX6e.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2bed1e85e8b20cb3903206a6cace251c52bdd8c3 GIT binary patch literal 29920 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 literal 0 HcmV?d00001 diff --git a/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 b/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9a8d1e2b5ef22b97801781478d477685dd6119f3 GIT binary patch literal 110160 zcmV)XK&`)bPew8T0RR910j^L06951J1C_)80j=5q1ONa400000000000000000000 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 literal 0 HcmV?d00001 diff --git a/assets/inter-roman-latin.Di8DUHzh.woff2 b/assets/inter-roman-latin.Di8DUHzh.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..07d3c53aef14e7e3aec6b11684395f2833e0b3d5 GIT binary patch literal 67792 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 IZR%D40KZ@npa1{> literal 0 HcmV?d00001 diff --git a/assets/inter-roman-vietnamese.BjW4sHH5.woff2 b/assets/inter-roman-vietnamese.BjW4sHH5.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..57bdc22ae88555c6217307e4064a642f83d642b1 GIT binary patch literal 14072 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 literal 0 HcmV?d00001 diff --git a/assets/ja-jp_contribute_core.md.Dl6llQ1K.js b/assets/ja-jp_contribute_core.md.Dl6llQ1K.js new file mode 100644 index 00000000..782df053 --- /dev/null +++ b/assets/ja-jp_contribute_core.md.Dl6llQ1K.js @@ -0,0 +1,31 @@ +import{_ as a,c as e,a2 as i,o as t}from"./chunks/framework.C9NVOr0y.js";const k=JSON.parse('{"title":"asdf","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/contribute/core.md","filePath":"ja-jp/contribute/core.md","lastUpdated":1704890757000}'),n={name:"ja-jp/contribute/core.md"};function l(p,s,h,o,r,d){return t(),e("div",null,s[0]||(s[0]=[i(`

これは、asdfコアのコントリビューションガイドです。

初期セットアップ

GitHubでasdfをフォークするか、デフォルトのブランチをGitクローンしてください:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

コア開発用のツールは、このリポジトリの.tool-versionsで定義されています。asdf自身でこれらのツールを管理したい場合は、下記のようにプラグインを追加してください:

shell
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git

asdfの開発に必要なバージョンを、下記のようにインストールします:

shell
asdf install

開発ツールに影響を与える特定の機能を壊す可能性もあるため、ローカルマシンで開発する際は、asdfを使用しないほうが 良いかもしれません 。下記に、使用しているツールを列挙します:

  • bats-core: BashまたはPOSIX準拠のスクリプトを単体テストするための、Bash自動テストシステムです。
  • shellcheck: シェルスクリプトの静的解析ツールです。
  • shfmt: Bashをサポートするシェルパーサ、フォーマッタ、インタプリタです。

開発

インストール済みのasdfに変更を加えずに、あなたが開発した変更内容を試したいときは、$ASDF_DIR変数に、クローンしたリポジトリのパスを設定し、そのディレクトリのbinshimsディレクトリを一時的にパスの先頭へ追加します。

リモートにコミットまたはプッシュする前に、コードをローカルでフォーマット、Lint、およびテストすることを推奨します。その際は、次のスクリプト/コマンドを使用してください:

shell
# Lint
+./scripts/lint.bash --check
+
+# Fix & Format
+./scripts/lint.bash --fix
+
+# Test: all tests
+./scripts/test.bash
+
+# Test: for specific command
+bats test/list_commands.bash

ヒント

テストを作ってください! - 新機能にとってテストは必要不可欠であり、バグ修正のレビューをスピードアップさせることができます。プルリクエストを作成する前に、新しいコードをカバーするようなテストを作成してください。bats-coreのドキュメントもご覧ください。

Gitignore

下記は、asdf-vm/asdfリポジトリの.gitignoreファイルです。プロジェクト固有のファイルは無視をしています。使用しているOS、ツール、およびワークフロー固有のファイルは、グローバルな.gitignore構成で無視する必要があります。詳しくはこちらをご覧ください。

@Gitignoreコード

.git-blame-ignore-revs

asdfでは、.git-blame-ignore-revsを使用して、Blameを実行する際のノイズを減らしています。詳しくは、git blameのドキュメントをご覧ください。

git blameを実行するときは、下記のように、このファイルと共に使います:

sh
git blame --ignore-revs-file .git-blame-ignore-revs ./test/install_command.bats

毎回手動でファイルを指定しなくても、gitのオプションで、blameを呼び出すたびにこのファイルを使うように設定することもできます:

sh
git config blame.ignoreRevsFile .git-blame-ignore-revs

このファイルを使用するように、IDEを設定することもできます。例えば、VSCode(およびGitLens)を使う場合は、.vscode/settings.jsonに下記のように記述します:

json
{
+  "gitlens.advanced.blame.customArguments": [
+    "--ignore-revs-file",
+    ".git-blame-ignore-revs"
+  ]
+}

Batsテスト

ローカルでテストを実行するには、下記のようにテストを呼び出します:

shell
./scripts/test.bash

テストを作成する前に、下記項目を一通り参照してください:

Batsのヒント

Batsでのデバッグは、難しいことがあります。-tフラグを指定してTAP出力を有効にすると、テスト実行中に特殊なファイルディスクリプタ>&3を使用して出力を表示できるため、デバッグが簡単になります。例えば次のとおりです:

shell
# test/some_tests.bats
+
+printf "%s\\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\\n" "Will be printed during bats -t test/some_tests.bats" >&3

詳しくは、bats-coreドキュメント内のPrinting to the Terminalで説明されています。

プルリクエスト、リリース、Conventional Commits

asdfは、Release Pleaseという自動リリースツールを使用して、セマンティックバージョンを自動的に引き上げ、Changelogを生成しています。この情報は、前回のリリースからのコミット履歴を読み込むことで生成されます。

Conventional Commit messagesでは、デフォルトブランチでのコミットメッセージのフォーマットとなる、プルリクエストタイトルのフォーマットを定義しています。これは、GitHub Actionamannn/action-semantic-pull-requestで強制されます。

Conventional Commitは、下記のフォーマットに従います:

<type>[optional scope][optional !]: <description>
+
+<!-- examples -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change

<types>の種類は次のとおりです: featfixdocsstylerefactorperftestbuildcichorerevert

  • !: 破壊的変更を示します
  • fix: セマンティックバージョンのpatchを新しく作成します
  • feat: セマンティックバージョンのminorを新しく作成します
  • <type>!: セマンティックバージョンのmajorを新しく作成します

プルリクエストのタイトルは、このフォーマットに従う必要があります。

ヒント

プルリクエストのタイトルには、Conventional Commit messageのフォーマットを使用してください。

Dockerイメージ

asdf-alpineおよびasdf-ubuntuプロジェクトは、一部のasdfツールのDocker化されたイメージを提供する取り組みを継続的に行っています。これらのDockerイメージは、開発用サーバのベースとしたり、本番用アプリケーションの実行用途として使用することができます。

`,47)]))}const g=a(n,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/ja-jp_contribute_core.md.Dl6llQ1K.lean.js b/assets/ja-jp_contribute_core.md.Dl6llQ1K.lean.js new file mode 100644 index 00000000..782df053 --- /dev/null +++ b/assets/ja-jp_contribute_core.md.Dl6llQ1K.lean.js @@ -0,0 +1,31 @@ +import{_ as a,c as e,a2 as i,o as t}from"./chunks/framework.C9NVOr0y.js";const k=JSON.parse('{"title":"asdf","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/contribute/core.md","filePath":"ja-jp/contribute/core.md","lastUpdated":1704890757000}'),n={name:"ja-jp/contribute/core.md"};function l(p,s,h,o,r,d){return t(),e("div",null,s[0]||(s[0]=[i(`

asdf

これは、asdfコアのコントリビューションガイドです。

初期セットアップ

GitHubでasdfをフォークするか、デフォルトのブランチをGitクローンしてください:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

コア開発用のツールは、このリポジトリの.tool-versionsで定義されています。asdf自身でこれらのツールを管理したい場合は、下記のようにプラグインを追加してください:

shell
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git

asdfの開発に必要なバージョンを、下記のようにインストールします:

shell
asdf install

開発ツールに影響を与える特定の機能を壊す可能性もあるため、ローカルマシンで開発する際は、asdfを使用しないほうが 良いかもしれません 。下記に、使用しているツールを列挙します:

  • bats-core: BashまたはPOSIX準拠のスクリプトを単体テストするための、Bash自動テストシステムです。
  • shellcheck: シェルスクリプトの静的解析ツールです。
  • shfmt: Bashをサポートするシェルパーサ、フォーマッタ、インタプリタです。

開発

インストール済みのasdfに変更を加えずに、あなたが開発した変更内容を試したいときは、$ASDF_DIR変数に、クローンしたリポジトリのパスを設定し、そのディレクトリのbinshimsディレクトリを一時的にパスの先頭へ追加します。

リモートにコミットまたはプッシュする前に、コードをローカルでフォーマット、Lint、およびテストすることを推奨します。その際は、次のスクリプト/コマンドを使用してください:

shell
# Lint
+./scripts/lint.bash --check
+
+# Fix & Format
+./scripts/lint.bash --fix
+
+# Test: all tests
+./scripts/test.bash
+
+# Test: for specific command
+bats test/list_commands.bash

ヒント

テストを作ってください! - 新機能にとってテストは必要不可欠であり、バグ修正のレビューをスピードアップさせることができます。プルリクエストを作成する前に、新しいコードをカバーするようなテストを作成してください。bats-coreのドキュメントもご覧ください。

Gitignore

下記は、asdf-vm/asdfリポジトリの.gitignoreファイルです。プロジェクト固有のファイルは無視をしています。使用しているOS、ツール、およびワークフロー固有のファイルは、グローバルな.gitignore構成で無視する必要があります。詳しくはこちらをご覧ください。

@Gitignoreコード

.git-blame-ignore-revs

asdfでは、.git-blame-ignore-revsを使用して、Blameを実行する際のノイズを減らしています。詳しくは、git blameのドキュメントをご覧ください。

git blameを実行するときは、下記のように、このファイルと共に使います:

sh
git blame --ignore-revs-file .git-blame-ignore-revs ./test/install_command.bats

毎回手動でファイルを指定しなくても、gitのオプションで、blameを呼び出すたびにこのファイルを使うように設定することもできます:

sh
git config blame.ignoreRevsFile .git-blame-ignore-revs

このファイルを使用するように、IDEを設定することもできます。例えば、VSCode(およびGitLens)を使う場合は、.vscode/settings.jsonに下記のように記述します:

json
{
+  "gitlens.advanced.blame.customArguments": [
+    "--ignore-revs-file",
+    ".git-blame-ignore-revs"
+  ]
+}

Batsテスト

ローカルでテストを実行するには、下記のようにテストを呼び出します:

shell
./scripts/test.bash

テストを作成する前に、下記項目を一通り参照してください:

Batsのヒント

Batsでのデバッグは、難しいことがあります。-tフラグを指定してTAP出力を有効にすると、テスト実行中に特殊なファイルディスクリプタ>&3を使用して出力を表示できるため、デバッグが簡単になります。例えば次のとおりです:

shell
# test/some_tests.bats
+
+printf "%s\\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\\n" "Will be printed during bats -t test/some_tests.bats" >&3

詳しくは、bats-coreドキュメント内のPrinting to the Terminalで説明されています。

プルリクエスト、リリース、Conventional Commits

asdfは、Release Pleaseという自動リリースツールを使用して、セマンティックバージョンを自動的に引き上げ、Changelogを生成しています。この情報は、前回のリリースからのコミット履歴を読み込むことで生成されます。

Conventional Commit messagesでは、デフォルトブランチでのコミットメッセージのフォーマットとなる、プルリクエストタイトルのフォーマットを定義しています。これは、GitHub Actionamannn/action-semantic-pull-requestで強制されます。

Conventional Commitは、下記のフォーマットに従います:

<type>[optional scope][optional !]: <description>
+
+<!-- examples -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change

<types>の種類は次のとおりです: featfixdocsstylerefactorperftestbuildcichorerevert

  • !: 破壊的変更を示します
  • fix: セマンティックバージョンのpatchを新しく作成します
  • feat: セマンティックバージョンのminorを新しく作成します
  • <type>!: セマンティックバージョンのmajorを新しく作成します

プルリクエストのタイトルは、このフォーマットに従う必要があります。

ヒント

プルリクエストのタイトルには、Conventional Commit messageのフォーマットを使用してください。

Dockerイメージ

asdf-alpineおよびasdf-ubuntuプロジェクトは、一部のasdfツールのDocker化されたイメージを提供する取り組みを継続的に行っています。これらのDockerイメージは、開発用サーバのベースとしたり、本番用アプリケーションの実行用途として使用することができます。

`,47)]))}const g=a(n,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/ja-jp_contribute_documentation.md.DFrK7QhV.js b/assets/ja-jp_contribute_documentation.md.DFrK7QhV.js new file mode 100644 index 00000000..a019bfa8 --- /dev/null +++ b/assets/ja-jp_contribute_documentation.md.DFrK7QhV.js @@ -0,0 +1,42 @@ +import{_ as i,c as a,a2 as n,o as e}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"ドキュメント & サイト","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/contribute/documentation.md","filePath":"ja-jp/contribute/documentation.md","lastUpdated":1704890757000}'),t={name:"ja-jp/contribute/documentation.md"};function l(p,s,h,k,d,r){return e(),a("div",null,s[0]||(s[0]=[n(`

ドキュメント & サイト

これは、ドキュメントおよびサイトのコントリビューションガイドです。

初期セットアップ

GitHubでasdfをフォークするか、デフォルトのブランチをGitクローンしてください:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

ドキュメントサイト開発用のツールは、asdfによってdocs/.tool-versionsで管理されています。下記のようにプラグインを追加してください:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

開発に必要なバージョンを、下記のようにインストールします:

shell
asdf install
  • Node.js: ChromeのV8 JavaScriptエンジンをベースに構築されたJavaScriptランタイムです。

docs/package.jsonをもとに、Node.jsの依存関係をインストールしてください:

shell
npm install

開発

VitePress (v2)は、asdfドキュメントサイトを構築するために使用している静的サイトジェネレータ(SSG)です。類似ツールであるDocsify.jsやVuePressに代わってVitePressが採用されたのは、ユーザがJavaScriptを使用できない、または有効にしていない場合に、HTMLのみのフォールバックをサポートしたいからでした。これは、DocsifyとVitePressがVuePressに急速に取って代わっていた場合には不可能でした。これ以外の機能セットはほとんど同じで、最小限の構成でMarkdownファイルを書くことに重点を置いています。

package.jsonには、開発に必要なスクリプトが含まれています:

@package.jsonのコード

ローカルの開発サーバを起動するには、次のように実行します:

shell
npm run dev

コミットする前にコードをフォーマットするには、次のように実行します:

shell
npm run format

プルリクエスト、リリース、Conventional Commits

asdfは、プルリクエストタイトルのConventional Commitsに依存する自動リリースパイプラインを使用しています。詳しくは、コアのコントリビューションガイドのドキュメントに記述されています。

ドキュメントの変更に関するプルリクエストを作成する場合、プルリクエストのタイトルは、Conventional Commit typeをdocsとして、docs: <description>というフォーマットで作成するようにしてください。

Vitepress

サイトの構成設定は、構成を示すために使用されるJSオブジェクト含んだ、いくつかのTypeScriptファイルに記述されています。以下のとおりです:

  • docs/.vitepress/config.js: サイトのルート構成ファイルです。仕様については、VitePressのドキュメントをご覧ください。

ルート構成ファイルを簡素化するために、 Navバーサイドバー の構成を示す大きなJSオブジェクトについては、別ファイルに切り出されており、かつ、ロケールごとに分類されています。次の両方のファイルを参照してください:

  • docs/.vitepress/navbars.js
  • docs/.vitepress/sidebars.js

これらの構成設定に関する公式ドキュメントは、Default Theme Referenceをご覧ください。

I18n

VitePressは、国際化対応に関して最高のサポートを備えています。 ルート構成ファイルであるdocs/.vitepress/config.jsでは、サポートされているロケールとそのURL、ドロップメニューのタイトル、Navバー/サイドバーの構成への参照を定義しています。

Navバー/サイドバーの構成設定は前述の構成ファイルにキャプチャされ、ロケールごとに分類され、個別にエクスポートされます。

各ロケールのMarkdownコンテンツは、ルート構成ファイル内のlocales内のキーと同じ名前のディレクトリ配下に配置する必要があります。ルート構成が下記の場合:

js
// docs/.vitepress/config.js
+export default defineConfig({
+  ...
+  locales: {
+    root: {
+      label: "English",
+        lang: "en-US",
+        themeConfig: {
+        nav: navbars.en,
+          sidebar: sidebars.en,
+      },
+    },
+    "pt-br": {
+      label: "Brazilian Portuguese",
+        lang: "pr-br",
+        themeConfig: {
+        nav: navbars.pt_br,
+          sidebar: sidebars.pt_br,
+      },
+    },
+    "zh-hans": {
+      label: "简体中文",
+        lang: "zh-hans",
+        themeConfig: {
+        nav: navbars.zh_hans,
+          sidebar: sidebars.zh_hans,
+      },
+    },
+  },
+})

/pt-BR/を有効にするには、下記のように、docs/pt-BR/配下に同じMarkdownファイルのセットを配置する必要があります:

shell
docs
+├─ README.md
+├─ foo.md
+├─ nested
+  └─ README.md
+└─ pt-BR
+   ├─ README.md
+   ├─ foo.md
+   └─ nested
+      └─ README.md

公式のVitePress i18nドキュメントには、より詳細な説明が記述されています。

`,37)]))}const E=i(t,[["render",l]]);export{c as __pageData,E as default}; diff --git a/assets/ja-jp_contribute_documentation.md.DFrK7QhV.lean.js b/assets/ja-jp_contribute_documentation.md.DFrK7QhV.lean.js new file mode 100644 index 00000000..a019bfa8 --- /dev/null +++ b/assets/ja-jp_contribute_documentation.md.DFrK7QhV.lean.js @@ -0,0 +1,42 @@ +import{_ as i,c as a,a2 as n,o as e}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"ドキュメント & サイト","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/contribute/documentation.md","filePath":"ja-jp/contribute/documentation.md","lastUpdated":1704890757000}'),t={name:"ja-jp/contribute/documentation.md"};function l(p,s,h,k,d,r){return e(),a("div",null,s[0]||(s[0]=[n(`

ドキュメント & サイト

これは、ドキュメントおよびサイトのコントリビューションガイドです。

初期セットアップ

GitHubでasdfをフォークするか、デフォルトのブランチをGitクローンしてください:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

ドキュメントサイト開発用のツールは、asdfによってdocs/.tool-versionsで管理されています。下記のようにプラグインを追加してください:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

開発に必要なバージョンを、下記のようにインストールします:

shell
asdf install
  • Node.js: ChromeのV8 JavaScriptエンジンをベースに構築されたJavaScriptランタイムです。

docs/package.jsonをもとに、Node.jsの依存関係をインストールしてください:

shell
npm install

開発

VitePress (v2)は、asdfドキュメントサイトを構築するために使用している静的サイトジェネレータ(SSG)です。類似ツールであるDocsify.jsやVuePressに代わってVitePressが採用されたのは、ユーザがJavaScriptを使用できない、または有効にしていない場合に、HTMLのみのフォールバックをサポートしたいからでした。これは、DocsifyとVitePressがVuePressに急速に取って代わっていた場合には不可能でした。これ以外の機能セットはほとんど同じで、最小限の構成でMarkdownファイルを書くことに重点を置いています。

package.jsonには、開発に必要なスクリプトが含まれています:

@package.jsonのコード

ローカルの開発サーバを起動するには、次のように実行します:

shell
npm run dev

コミットする前にコードをフォーマットするには、次のように実行します:

shell
npm run format

プルリクエスト、リリース、Conventional Commits

asdfは、プルリクエストタイトルのConventional Commitsに依存する自動リリースパイプラインを使用しています。詳しくは、コアのコントリビューションガイドのドキュメントに記述されています。

ドキュメントの変更に関するプルリクエストを作成する場合、プルリクエストのタイトルは、Conventional Commit typeをdocsとして、docs: <description>というフォーマットで作成するようにしてください。

Vitepress

サイトの構成設定は、構成を示すために使用されるJSオブジェクト含んだ、いくつかのTypeScriptファイルに記述されています。以下のとおりです:

  • docs/.vitepress/config.js: サイトのルート構成ファイルです。仕様については、VitePressのドキュメントをご覧ください。

ルート構成ファイルを簡素化するために、 Navバーサイドバー の構成を示す大きなJSオブジェクトについては、別ファイルに切り出されており、かつ、ロケールごとに分類されています。次の両方のファイルを参照してください:

  • docs/.vitepress/navbars.js
  • docs/.vitepress/sidebars.js

これらの構成設定に関する公式ドキュメントは、Default Theme Referenceをご覧ください。

I18n

VitePressは、国際化対応に関して最高のサポートを備えています。 ルート構成ファイルであるdocs/.vitepress/config.jsでは、サポートされているロケールとそのURL、ドロップメニューのタイトル、Navバー/サイドバーの構成への参照を定義しています。

Navバー/サイドバーの構成設定は前述の構成ファイルにキャプチャされ、ロケールごとに分類され、個別にエクスポートされます。

各ロケールのMarkdownコンテンツは、ルート構成ファイル内のlocales内のキーと同じ名前のディレクトリ配下に配置する必要があります。ルート構成が下記の場合:

js
// docs/.vitepress/config.js
+export default defineConfig({
+  ...
+  locales: {
+    root: {
+      label: "English",
+        lang: "en-US",
+        themeConfig: {
+        nav: navbars.en,
+          sidebar: sidebars.en,
+      },
+    },
+    "pt-br": {
+      label: "Brazilian Portuguese",
+        lang: "pr-br",
+        themeConfig: {
+        nav: navbars.pt_br,
+          sidebar: sidebars.pt_br,
+      },
+    },
+    "zh-hans": {
+      label: "简体中文",
+        lang: "zh-hans",
+        themeConfig: {
+        nav: navbars.zh_hans,
+          sidebar: sidebars.zh_hans,
+      },
+    },
+  },
+})

/pt-BR/を有効にするには、下記のように、docs/pt-BR/配下に同じMarkdownファイルのセットを配置する必要があります:

shell
docs
+├─ README.md
+├─ foo.md
+├─ nested
+  └─ README.md
+└─ pt-BR
+   ├─ README.md
+   ├─ foo.md
+   └─ nested
+      └─ README.md

公式のVitePress i18nドキュメントには、より詳細な説明が記述されています。

`,37)]))}const E=i(t,[["render",l]]);export{c as __pageData,E as default}; diff --git a/assets/ja-jp_contribute_first-party-plugins.md.C-K_bFJd.js b/assets/ja-jp_contribute_first-party-plugins.md.C-K_bFJd.js new file mode 100644 index 00000000..5e02888f --- /dev/null +++ b/assets/ja-jp_contribute_first-party-plugins.md.C-K_bFJd.js @@ -0,0 +1 @@ +import{_ as a,c as r,a2 as t,o as i}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"公式プラグイン","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/contribute/first-party-plugins.md","filePath":"ja-jp/contribute/first-party-plugins.md","lastUpdated":1704890757000}'),s={name:"ja-jp/contribute/first-party-plugins.md"};function l(o,e,d,n,f,c){return i(),r("div",null,e[0]||(e[0]=[t('

公式プラグイン

asdfコアチームでは、日々のワークライフに関連するプラグインをいくつか作成しています。これらのプラグインのメンテナンスおよび改善にご協力いただける方を、いつでも歓迎しています。詳しくは、下記リンクから、それぞれのリポジトリを参照してください:

コミュニティプラグインについては、下記をご覧ください:

',5)]))}const h=a(s,[["render",l]]);export{u as __pageData,h as default}; diff --git a/assets/ja-jp_contribute_first-party-plugins.md.C-K_bFJd.lean.js b/assets/ja-jp_contribute_first-party-plugins.md.C-K_bFJd.lean.js new file mode 100644 index 00000000..5e02888f --- /dev/null +++ b/assets/ja-jp_contribute_first-party-plugins.md.C-K_bFJd.lean.js @@ -0,0 +1 @@ +import{_ as a,c as r,a2 as t,o as i}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"公式プラグイン","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/contribute/first-party-plugins.md","filePath":"ja-jp/contribute/first-party-plugins.md","lastUpdated":1704890757000}'),s={name:"ja-jp/contribute/first-party-plugins.md"};function l(o,e,d,n,f,c){return i(),r("div",null,e[0]||(e[0]=[t('

公式プラグイン

asdfコアチームでは、日々のワークライフに関連するプラグインをいくつか作成しています。これらのプラグインのメンテナンスおよび改善にご協力いただける方を、いつでも歓迎しています。詳しくは、下記リンクから、それぞれのリポジトリを参照してください:

コミュニティプラグインについては、下記をご覧ください:

',5)]))}const h=a(s,[["render",l]]);export{u as __pageData,h as default}; diff --git a/assets/ja-jp_contribute_github-actions.md.vwGbnpnK.js b/assets/ja-jp_contribute_github-actions.md.vwGbnpnK.js new file mode 100644 index 00000000..382b062f --- /dev/null +++ b/assets/ja-jp_contribute_github-actions.md.vwGbnpnK.js @@ -0,0 +1 @@ +import{_ as i,c as o,j as t,a,o as n}from"./chunks/framework.C9NVOr0y.js";const h=JSON.parse('{"title":"GitHub Actions","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/contribute/github-actions.md","filePath":"ja-jp/contribute/github-actions.md","lastUpdated":1704890757000}'),s={name:"ja-jp/contribute/github-actions.md"};function r(c,e,d,u,l,p){return n(),o("div",null,e[0]||(e[0]=[t("h1",{id:"github-actions",tabindex:"-1"},[a("GitHub Actions "),t("a",{class:"header-anchor",href:"#github-actions","aria-label":'Permalink to "GitHub Actions"'},"​")],-1),t("p",null,[a("ご興味を持っていただきありがとうございます。既存のイシュー、議論、コントリビューションガイドについては、"),t("a",{href:"https://github.com/asdf-vm/actions",target:"_blank",rel:"noreferrer"},"asdf actions リポジトリ"),a("をご覧ください。")],-1)]))}const f=i(s,[["render",r]]);export{h as __pageData,f as default}; diff --git a/assets/ja-jp_contribute_github-actions.md.vwGbnpnK.lean.js b/assets/ja-jp_contribute_github-actions.md.vwGbnpnK.lean.js new file mode 100644 index 00000000..382b062f --- /dev/null +++ b/assets/ja-jp_contribute_github-actions.md.vwGbnpnK.lean.js @@ -0,0 +1 @@ +import{_ as i,c as o,j as t,a,o as n}from"./chunks/framework.C9NVOr0y.js";const h=JSON.parse('{"title":"GitHub Actions","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/contribute/github-actions.md","filePath":"ja-jp/contribute/github-actions.md","lastUpdated":1704890757000}'),s={name:"ja-jp/contribute/github-actions.md"};function r(c,e,d,u,l,p){return n(),o("div",null,e[0]||(e[0]=[t("h1",{id:"github-actions",tabindex:"-1"},[a("GitHub Actions "),t("a",{class:"header-anchor",href:"#github-actions","aria-label":'Permalink to "GitHub Actions"'},"​")],-1),t("p",null,[a("ご興味を持っていただきありがとうございます。既存のイシュー、議論、コントリビューションガイドについては、"),t("a",{href:"https://github.com/asdf-vm/actions",target:"_blank",rel:"noreferrer"},"asdf actions リポジトリ"),a("をご覧ください。")],-1)]))}const f=i(s,[["render",r]]);export{h as __pageData,f as default}; diff --git a/assets/ja-jp_guide_getting-started.md.BOrg7Hf7.js b/assets/ja-jp_guide_getting-started.md.BOrg7Hf7.js new file mode 100644 index 00000000..8fb6dbdf --- /dev/null +++ b/assets/ja-jp_guide_getting-started.md.BOrg7Hf7.js @@ -0,0 +1,13 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const r=JSON.parse('{"title":"はじめよう","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/guide/getting-started.md","filePath":"ja-jp/guide/getting-started.md","lastUpdated":1704890757000}'),l={name:"ja-jp/guide/getting-started.md"};function h(p,s,n,d,k,o){return t(),a("div",null,s[0]||(s[0]=[e(`

はじめよう

asdfのインストールには次の手順が必要です:

  1. 依存関係のインストール
  2. asdfコアのダウンロード
  3. asdfのインストール
  4. 管理したいツール/ランタイムごとにプラグインをインストール
  5. ツール/ランタイムの特定バージョンをインストール
  6. .tool-versionsファイルで、グローバルまたはプロジェクトのバージョンをセット

1. 依存関係のインストール

asdfの動作にはgitおよびcurlが必要です。以下の表は、 あなたが使用している パッケージマネージャで実行するコマンドの 一部例 です(some might automatically install these tools in later steps)。

OSパッケージマネージャコマンド
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

備考

お使いのシステムの構成によっては、接頭にsudoが必要となる場合もあります。

2. asdfのダウンロード

公式ダウンロード

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.13.1

コミュニティがサポートするダウンロード方法

理由がない限り、gitコマンドを使用した公式ダウンロードの手順を使用することを強く推奨します。

方法コマンド
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si または好みのAURヘルパーを使用

3. asdfのインストール

あなたが使用しているシェル、OS、およびインストール方法によって、ここでの設定方法が変わります。最も適したものを選択してください。

masOSユーザの方は、この節の最後にあるpath_helperに関する警告を必ず参照してください。

Bash & Git

~/.bashrcに下記の行を追記します:

shell
. "$HOME/.asdf/asdf.sh"

コマンド補完が必要な場合は、.bashrcに下記の行を追記します:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

macOS Catalina以降を使用している場合、デフォルトのシェルはZSHです。Bashに変更していない限り、ZSHの手順を参照してください。

~/.bash_profileに下記の行を追記します:

shell
. "$HOME/.asdf/asdf.sh"

コマンド補完が必要な場合は、.bash_profileに下記の行を追記します:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

下記コマンドで、~/.bashrcasdf.shを追加します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bashrc

コマンド補完が必要な場合は、Homebrewのガイドに従って設定を完了させるか、下記コマンドを実行します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Bash & Homebrew (macOS)

macOS Catalina以降を使用している場合、デフォルトのシェルはZSHです。Bashに変更していない限り、ZSHの手順を参照してください。

下記コマンドで、~/.bash_profileasdf.shを追加します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bash_profile

コマンド補完が必要な場合は、Homebrewのガイドに従って設定を完了させるか、下記コマンドを実行します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Bash & Pacman

~/.bashrcに下記の行を追記します:

shell
. /opt/asdf-vm/asdf.sh

コマンド補完が必要な場合は、bash-completionをインストールします。

Fish & Git

~/.config/fish/config.fishに下記の行を追記します:

shell
source ~/.asdf/asdf.fish

コマンド補完が必要な場合は、下記コマンドを実行します:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

下記コマンドで、~/.config/fish/config.fishasdf.shを追加します:

shell
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

コマンド補完は、Fish shellのHomebrewが担います。親切ですね!

Fish & Pacman

~/.config/fish/config.fishに下記の行を追記します:

shell
source /opt/asdf-vm/asdf.fish

コマンド補完は、AURパッケージのインストール時に自動的に設定されます。

Elvish & Git

下記コマンドで、~/.config/elvish/rc.elvasdf.elvを追加します:

shell
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

コマンド補完は自動的に設定されます。

Elvish & Homebrew

下記コマンドで、~/.config/elvish/rc.elvasdf.elvを追加します:

shell
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

コマンド補完は自動的に設定されます。

Elvish & Pacman

下記コマンドで、~/.config/elvish/rc.elvasdf.elvを追加します:

shell
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

コマンド補完は自動的に設定されます。

ZSH & Git

~/.zshrcに下記の行を追記します:

shell
. "$HOME/.asdf/asdf.sh"

またはasdf for oh-my-zshのようなZSHフレームワークプラグインを使用して、このスクリプトをsourceし、コマンド補完をセットアップします。

コマンド補完は、ZSHフレームワークのasdfプラグインで設定するか、~/.zshrcに下記の行を追記することで設定できます:

shell
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • compinitのセットアップをカスタマイズしている場合は、asdf.shソース以下にcompinitがくるようにしてください。
  • ZSHフレームワークでcompinitのセットアップをカスタマイズしている場合は、フレームワークソース以下にcompinitがくるようにしてください。

警告

ZSHフレームワークを使用している場合、新しいZSHコマンド補完を使用するには、fpath経由で、関連するasdfプラグインの更新が必要となることがあります。Oh-My-ZSH asdfプラグインは、ohmyzsh/ohmyzsh#8837でご覧いただくと分かるとおり、まだ更新されていません。

ZSH & Homebrew

下記コマンドで、~/.zshrcasdf.shを追加します:

shell
echo -e "\\n. $(brew --prefix asdf)/libexec/asdf.sh" >> \${ZDOTDIR:-~}/.zshrc

OR use a ZSH Framework plugin like asdf for oh-my-zsh which will source this script and setup completions.

コマンド補完は、ZSHフレームワークasdfによって設定されるか、Homebrewの説明に従って設定必要があります。ZSHフレームワークを使用している場合、新しいZSHコマンド補完を使用するには、fpath経由で、関連するasdfプラグインの更新が必要となることがあります。Oh-My-ZSH asdfプラグインは、ohmyzsh/ohmyzsh#8837でご覧いただくと分かるとおり、まだ更新されていません。

ZSH & Pacman

~/.zshrcに下記の行を追記します:

shell
. /opt/asdf-vm/asdf.sh

コマンド補完は、ZSHに適した場所に配置されますが、オートコンプリートを使用するようにZSHを設定する必要があります

PowerShell Core & Git

~/.config/powershell/profile.ps1に下記の行を追記します:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

下記コマンドで、~/.config/powershell/profile.ps1asdf.shを追加します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

~/.config/powershell/profile.ps1に下記の行を追記します:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

下記コマンドで、~/.config/nushell/config.nuasdf.nuを追加します:

shell
"\\n$env.ASDF_NU_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

コマンド補完は自動的に設定されます。

Nushell & Homebrew

下記コマンドで、~/.config/nushell/config.nuasdf.nuを追加します:

shell
"\\n$env.ASDF_NU_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\\n source " +  (brew --prefix asdf | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path

コマンド補完は自動的に設定されます。

Nushell & Pacman

下記コマンドで、~/.config/nushell/config.nuasdf.nuを追加します:

shell
"\\n$env.ASDF_NU_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

コマンド補完は自動的に設定されます。

POSIX Shell & Git

~/.profileに下記の行を追記します:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

下記コマンドで、~/.profileasdf.shを追加します:

shell
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
POSIX Shell & Pacman

~/.profileに下記の行を追記します:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

asdfのスクリプトは、$PATHを設定したあと、かつ、使用中のフレームワーク(oh-my-zsh など)を呼び出したあとに記述する必要があります。

警告

macOSでは、BasgまたはZSHシェルを起動すると、自動的にpath_helperというユーティリティが呼び出されます。path_helperPATH(およびMANPATH)内の項目の順番を並び替えることができるため、特定の順序を必要とするツールの動作に、一貫性が無くなってしまいます。これを回避するため、macOSでasdfを利用するときは、強制的にPATHエントリの先頭に追加する(優先度を一番高くする)ようにしてください。これは、ASDF_FORCE_PREPEND環境変数で制御できます。

PATHの変更を反映するために、シェルを再起動してください。たいていの場合、ターミナルのタブを新たに開けばOKです。

コアのインストールが完了!

これで、asdfのコアのインストールは完了です🎉

しかし、asdfが役に立つようになるのは、プラグインをインストールしてからツールをインストールし、バージョンを管理するようになってからです。引き続き、ガイドを進めていきましょう。

4. プラグインのインストール

ここではデモとして、asdf-nodejsプラグインを使用してNode.jsをインストール・設定してみましょう。

プラグインの依存関係

各プラグインには依存関係があるため、プラグインのリポジトリを確認しておきましょう。asdf-nodejsの場合、必要なものは次のとおりです:

OS依存関係インストールコマンド
Debianapt-get install dirmngr gpg curl gawk
CentOS/ Rocky Linux/ AlmaLinuxyum install gnupg2 curl gawk
macOSbrew install gpg gawk

一部のプラグインではインストール後の事後処理でこれらの依存関係が必要となるため、あらかじめインストールしておきましょう。

プラグインのインストール

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. 特定のバージョンのインストール

Node.js用のプラグインをインストールしたので、このツールの特定のバージョンをインストールしましょう。

インストール可能なバージョンはasdf list all nodejsコマンドで確認できますし、特定のメジャーバージョンのサブセットはasdf list all nodejs 14コマンドで確認できます。

最新版をインストールするには、次のコマンドを実行します:

shell
asdf install nodejs latest

備考

asdfでは正確なバージョン番号を指定してください。latestは、現時点での最新バージョンを指定できるasdfのヘルパーです。

6. バージョンをセット

asdfは、カレントディレクトリから上位の$HOMEディレクトリまでに存在するすべての.tool-versionsファイルをもとに、ツールのバージョンを照会します。照会は、asdfで管理するツールを実行した際に、ジャストインタイムで行われます。

警告

ツールで指定されたバージョンが見つからない場合、エラーが発生します。asdf currentコマンドを実行すると、カレントディレクトリにおいてツールのバージョンを解決可能か確認できるため、どのツールが実行に失敗するか検証することができます。

グローバル

グローバルのデフォルト設定は、$HOME/.tool-versionsで管理されます。グローバルのバージョンをセットするには、次のコマンドを実行します:

shell
asdf global nodejs latest

すると、$HOME/.tool-versions内には次のように書き込まれます:

nodejs 16.5.0

一部のOSでは、pythonのように、asdfではなくシステムが管理するツールが既にインストールされていることがあります。それを使用する場合、asdfに対して、バージョン管理をシステムに委任するように指示する必要があります。詳しくは、バージョンのリファレンスをご覧ください。

ローカル

ローカルのバージョン設定は、$PWD/.tool-versionsファイル(カレントディレクトリ内)で定義されます。たいていの場合は、プロジェクトのGitリポジトリ内となるでしょう。対象となるディレクトリで、下記コマンドを実行します:

shell
asdf local nodejs latest

すると、$PWD/.tool-versions内には次のように書き込まれます:

nodejs 16.5.0

ツールごとに用意された既存バージョンファイルの利用

asdfは、他のバージョンマネージャ向けに作られた既存のバージョンファイル(例: rbenvの場合は.ruby-versionファイル)からの移行をサポートしています。これはプラグイン単位でのサポートです。

asdf-nodejsであれば、.nvmrcファイルと.node-versionファイルの両方に対応しています。このサポートを有効にするには、asdfの構成設定ファイルである$HOME/.asdfrc内に、下記の行を追記してください:

legacy_version_file = yes

構成設定でのその他のオプションについて詳しくは、構成設定のリファレンスをご覧ください。

入門完了!

以上で、asdfの入門は完了です🎉 ここまでで、プロジェクトでのnodejsのバージョン管理ができるようになりました。プロジェクトで使用するツールごとに、同様の手順を実施してください!

asdfには使いこなすと便利なコマンドが他にもいっぱいあり、asdf --helpコマンドまたは単にasdfコマンドを実行すれば、すべてのコマンドの説明を見ることができます。コマンドは大きく分けて3つのカテゴリに分けられます:

`,82)]))}const g=i(l,[["render",h]]);export{r as __pageData,g as default}; diff --git a/assets/ja-jp_guide_getting-started.md.BOrg7Hf7.lean.js b/assets/ja-jp_guide_getting-started.md.BOrg7Hf7.lean.js new file mode 100644 index 00000000..8fb6dbdf --- /dev/null +++ b/assets/ja-jp_guide_getting-started.md.BOrg7Hf7.lean.js @@ -0,0 +1,13 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const r=JSON.parse('{"title":"はじめよう","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/guide/getting-started.md","filePath":"ja-jp/guide/getting-started.md","lastUpdated":1704890757000}'),l={name:"ja-jp/guide/getting-started.md"};function h(p,s,n,d,k,o){return t(),a("div",null,s[0]||(s[0]=[e(`

はじめよう

asdfのインストールには次の手順が必要です:

  1. 依存関係のインストール
  2. asdfコアのダウンロード
  3. asdfのインストール
  4. 管理したいツール/ランタイムごとにプラグインをインストール
  5. ツール/ランタイムの特定バージョンをインストール
  6. .tool-versionsファイルで、グローバルまたはプロジェクトのバージョンをセット

1. 依存関係のインストール

asdfの動作にはgitおよびcurlが必要です。以下の表は、 あなたが使用している パッケージマネージャで実行するコマンドの 一部例 です(some might automatically install these tools in later steps)。

OSパッケージマネージャコマンド
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

備考

お使いのシステムの構成によっては、接頭にsudoが必要となる場合もあります。

2. asdfのダウンロード

公式ダウンロード

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.13.1

コミュニティがサポートするダウンロード方法

理由がない限り、gitコマンドを使用した公式ダウンロードの手順を使用することを強く推奨します。

方法コマンド
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si または好みのAURヘルパーを使用

3. asdfのインストール

あなたが使用しているシェル、OS、およびインストール方法によって、ここでの設定方法が変わります。最も適したものを選択してください。

masOSユーザの方は、この節の最後にあるpath_helperに関する警告を必ず参照してください。

Bash & Git

~/.bashrcに下記の行を追記します:

shell
. "$HOME/.asdf/asdf.sh"

コマンド補完が必要な場合は、.bashrcに下記の行を追記します:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

macOS Catalina以降を使用している場合、デフォルトのシェルはZSHです。Bashに変更していない限り、ZSHの手順を参照してください。

~/.bash_profileに下記の行を追記します:

shell
. "$HOME/.asdf/asdf.sh"

コマンド補完が必要な場合は、.bash_profileに下記の行を追記します:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

下記コマンドで、~/.bashrcasdf.shを追加します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bashrc

コマンド補完が必要な場合は、Homebrewのガイドに従って設定を完了させるか、下記コマンドを実行します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Bash & Homebrew (macOS)

macOS Catalina以降を使用している場合、デフォルトのシェルはZSHです。Bashに変更していない限り、ZSHの手順を参照してください。

下記コマンドで、~/.bash_profileasdf.shを追加します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bash_profile

コマンド補完が必要な場合は、Homebrewのガイドに従って設定を完了させるか、下記コマンドを実行します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Bash & Pacman

~/.bashrcに下記の行を追記します:

shell
. /opt/asdf-vm/asdf.sh

コマンド補完が必要な場合は、bash-completionをインストールします。

Fish & Git

~/.config/fish/config.fishに下記の行を追記します:

shell
source ~/.asdf/asdf.fish

コマンド補完が必要な場合は、下記コマンドを実行します:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

下記コマンドで、~/.config/fish/config.fishasdf.shを追加します:

shell
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

コマンド補完は、Fish shellのHomebrewが担います。親切ですね!

Fish & Pacman

~/.config/fish/config.fishに下記の行を追記します:

shell
source /opt/asdf-vm/asdf.fish

コマンド補完は、AURパッケージのインストール時に自動的に設定されます。

Elvish & Git

下記コマンドで、~/.config/elvish/rc.elvasdf.elvを追加します:

shell
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

コマンド補完は自動的に設定されます。

Elvish & Homebrew

下記コマンドで、~/.config/elvish/rc.elvasdf.elvを追加します:

shell
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

コマンド補完は自動的に設定されます。

Elvish & Pacman

下記コマンドで、~/.config/elvish/rc.elvasdf.elvを追加します:

shell
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

コマンド補完は自動的に設定されます。

ZSH & Git

~/.zshrcに下記の行を追記します:

shell
. "$HOME/.asdf/asdf.sh"

またはasdf for oh-my-zshのようなZSHフレームワークプラグインを使用して、このスクリプトをsourceし、コマンド補完をセットアップします。

コマンド補完は、ZSHフレームワークのasdfプラグインで設定するか、~/.zshrcに下記の行を追記することで設定できます:

shell
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • compinitのセットアップをカスタマイズしている場合は、asdf.shソース以下にcompinitがくるようにしてください。
  • ZSHフレームワークでcompinitのセットアップをカスタマイズしている場合は、フレームワークソース以下にcompinitがくるようにしてください。

警告

ZSHフレームワークを使用している場合、新しいZSHコマンド補完を使用するには、fpath経由で、関連するasdfプラグインの更新が必要となることがあります。Oh-My-ZSH asdfプラグインは、ohmyzsh/ohmyzsh#8837でご覧いただくと分かるとおり、まだ更新されていません。

ZSH & Homebrew

下記コマンドで、~/.zshrcasdf.shを追加します:

shell
echo -e "\\n. $(brew --prefix asdf)/libexec/asdf.sh" >> \${ZDOTDIR:-~}/.zshrc

OR use a ZSH Framework plugin like asdf for oh-my-zsh which will source this script and setup completions.

コマンド補完は、ZSHフレームワークasdfによって設定されるか、Homebrewの説明に従って設定必要があります。ZSHフレームワークを使用している場合、新しいZSHコマンド補完を使用するには、fpath経由で、関連するasdfプラグインの更新が必要となることがあります。Oh-My-ZSH asdfプラグインは、ohmyzsh/ohmyzsh#8837でご覧いただくと分かるとおり、まだ更新されていません。

ZSH & Pacman

~/.zshrcに下記の行を追記します:

shell
. /opt/asdf-vm/asdf.sh

コマンド補完は、ZSHに適した場所に配置されますが、オートコンプリートを使用するようにZSHを設定する必要があります

PowerShell Core & Git

~/.config/powershell/profile.ps1に下記の行を追記します:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

下記コマンドで、~/.config/powershell/profile.ps1asdf.shを追加します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

~/.config/powershell/profile.ps1に下記の行を追記します:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

下記コマンドで、~/.config/nushell/config.nuasdf.nuを追加します:

shell
"\\n$env.ASDF_NU_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

コマンド補完は自動的に設定されます。

Nushell & Homebrew

下記コマンドで、~/.config/nushell/config.nuasdf.nuを追加します:

shell
"\\n$env.ASDF_NU_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\\n source " +  (brew --prefix asdf | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path

コマンド補完は自動的に設定されます。

Nushell & Pacman

下記コマンドで、~/.config/nushell/config.nuasdf.nuを追加します:

shell
"\\n$env.ASDF_NU_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

コマンド補完は自動的に設定されます。

POSIX Shell & Git

~/.profileに下記の行を追記します:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

下記コマンドで、~/.profileasdf.shを追加します:

shell
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
POSIX Shell & Pacman

~/.profileに下記の行を追記します:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

asdfのスクリプトは、$PATHを設定したあと、かつ、使用中のフレームワーク(oh-my-zsh など)を呼び出したあとに記述する必要があります。

警告

macOSでは、BasgまたはZSHシェルを起動すると、自動的にpath_helperというユーティリティが呼び出されます。path_helperPATH(およびMANPATH)内の項目の順番を並び替えることができるため、特定の順序を必要とするツールの動作に、一貫性が無くなってしまいます。これを回避するため、macOSでasdfを利用するときは、強制的にPATHエントリの先頭に追加する(優先度を一番高くする)ようにしてください。これは、ASDF_FORCE_PREPEND環境変数で制御できます。

PATHの変更を反映するために、シェルを再起動してください。たいていの場合、ターミナルのタブを新たに開けばOKです。

コアのインストールが完了!

これで、asdfのコアのインストールは完了です🎉

しかし、asdfが役に立つようになるのは、プラグインをインストールしてからツールをインストールし、バージョンを管理するようになってからです。引き続き、ガイドを進めていきましょう。

4. プラグインのインストール

ここではデモとして、asdf-nodejsプラグインを使用してNode.jsをインストール・設定してみましょう。

プラグインの依存関係

各プラグインには依存関係があるため、プラグインのリポジトリを確認しておきましょう。asdf-nodejsの場合、必要なものは次のとおりです:

OS依存関係インストールコマンド
Debianapt-get install dirmngr gpg curl gawk
CentOS/ Rocky Linux/ AlmaLinuxyum install gnupg2 curl gawk
macOSbrew install gpg gawk

一部のプラグインではインストール後の事後処理でこれらの依存関係が必要となるため、あらかじめインストールしておきましょう。

プラグインのインストール

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. 特定のバージョンのインストール

Node.js用のプラグインをインストールしたので、このツールの特定のバージョンをインストールしましょう。

インストール可能なバージョンはasdf list all nodejsコマンドで確認できますし、特定のメジャーバージョンのサブセットはasdf list all nodejs 14コマンドで確認できます。

最新版をインストールするには、次のコマンドを実行します:

shell
asdf install nodejs latest

備考

asdfでは正確なバージョン番号を指定してください。latestは、現時点での最新バージョンを指定できるasdfのヘルパーです。

6. バージョンをセット

asdfは、カレントディレクトリから上位の$HOMEディレクトリまでに存在するすべての.tool-versionsファイルをもとに、ツールのバージョンを照会します。照会は、asdfで管理するツールを実行した際に、ジャストインタイムで行われます。

警告

ツールで指定されたバージョンが見つからない場合、エラーが発生します。asdf currentコマンドを実行すると、カレントディレクトリにおいてツールのバージョンを解決可能か確認できるため、どのツールが実行に失敗するか検証することができます。

グローバル

グローバルのデフォルト設定は、$HOME/.tool-versionsで管理されます。グローバルのバージョンをセットするには、次のコマンドを実行します:

shell
asdf global nodejs latest

すると、$HOME/.tool-versions内には次のように書き込まれます:

nodejs 16.5.0

一部のOSでは、pythonのように、asdfではなくシステムが管理するツールが既にインストールされていることがあります。それを使用する場合、asdfに対して、バージョン管理をシステムに委任するように指示する必要があります。詳しくは、バージョンのリファレンスをご覧ください。

ローカル

ローカルのバージョン設定は、$PWD/.tool-versionsファイル(カレントディレクトリ内)で定義されます。たいていの場合は、プロジェクトのGitリポジトリ内となるでしょう。対象となるディレクトリで、下記コマンドを実行します:

shell
asdf local nodejs latest

すると、$PWD/.tool-versions内には次のように書き込まれます:

nodejs 16.5.0

ツールごとに用意された既存バージョンファイルの利用

asdfは、他のバージョンマネージャ向けに作られた既存のバージョンファイル(例: rbenvの場合は.ruby-versionファイル)からの移行をサポートしています。これはプラグイン単位でのサポートです。

asdf-nodejsであれば、.nvmrcファイルと.node-versionファイルの両方に対応しています。このサポートを有効にするには、asdfの構成設定ファイルである$HOME/.asdfrc内に、下記の行を追記してください:

legacy_version_file = yes

構成設定でのその他のオプションについて詳しくは、構成設定のリファレンスをご覧ください。

入門完了!

以上で、asdfの入門は完了です🎉 ここまでで、プロジェクトでのnodejsのバージョン管理ができるようになりました。プロジェクトで使用するツールごとに、同様の手順を実施してください!

asdfには使いこなすと便利なコマンドが他にもいっぱいあり、asdf --helpコマンドまたは単にasdfコマンドを実行すれば、すべてのコマンドの説明を見ることができます。コマンドは大きく分けて3つのカテゴリに分けられます:

`,82)]))}const g=i(l,[["render",h]]);export{r as __pageData,g as default}; diff --git a/assets/ja-jp_guide_introduction.md.BiCZxaSp.js b/assets/ja-jp_guide_introduction.md.BiCZxaSp.js new file mode 100644 index 00000000..587fd8d3 --- /dev/null +++ b/assets/ja-jp_guide_introduction.md.BiCZxaSp.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as t}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"イントロダクション","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/guide/introduction.md","filePath":"ja-jp/guide/introduction.md","lastUpdated":1704890757000}'),d={name:"ja-jp/guide/introduction.md"};function n(i,e,c,s,h,l){return t(),o("div",null,e[0]||(e[0]=[r('

イントロダクション

asdfは、ツールのためのバージョンマネージャです。すべてのツールのバージョンは単一のファイル(.tool-versions)内で定義されるため、プロジェクトのGitリポジトリにチェックインして共有することで、チーム全員に同じーバージョンのツールを使ってもらえるようになります。

従来は、複数のCLIのバージョンマネージャを用意する必要があり、それぞれが異なるAPI、構成ファイル、および実装($PATHの操作、Shim、環境変数など)となっていました。asdfは、開発ワークフローを簡素化するための単一インターフェースと構成ファイルを提供しており、シンプルなプラグインインターフェースを使って、すべてのツール・ランタイムに拡張することができます。

どうやって動いているの

シェル上でasdfコアがセットアップすると、特定のツールを管理するためのプラグインをインストールすることができるようになります。プラグインによってツールがインストールされると、インストールされる実行ファイルごとにShimが作成されます。これらの実行ファイルを実行しようとすると、代わりにShimが実行され、.tool-versionsで定義されているバージョンをasdfが認識して、当該バージョンが実行されます。

関連プロジェクト

nvm / n / rbenv etc

nvmn、およびrbenvのようなツールはすべて、ツールによってインストールされる実行ファイルのShimを作成するシェルスクリプトです。

asdfはこれらのツールと非常に似ていて、ツール/ランタイムのバージョン管理という分野では競合しています。asdfはプラグインシステムを採用し、他のツールと差別化することで、ツール/ランタイムごとのマネージャ、マネージャごとの異なるコマンド、そしてリポジトリ内の様々な*-versionファイルといったものを排除しています。

direnv

シェルに、ディレクトリごとに環境変数をロード/アンロードできる機能を付け加えます。

asdfは環境変数を管理することはしませんが、direnvの動作をasdfに統合するasdf-direnvプラグインが存在します。

詳しくはdirenvのドキュメントをご覧ください。

Homebrew

macOS(またはLinux)のためのパッケージマネージャー

Homebrewは、パッケージとその上位の依存関係を管理します。asdfは上位の依存関係を管理することはしませんし、パッケージマネージャでもありません。それらの管理はユーザが負担することとなりますが、asdfはなるべく依存関係のリストを小さく保つように努めています。

詳しくはHomebrewのドキュメントをご覧ください。

NixOS

Nixは、パッケージ管理とシステム構成に独自のアプローチを取り入れたツールです。

NixOSは、各ツールの依存関係ツリー全体でパッケージのバージョンを正確に管理することで、真に再現可能な環境を構築することを目指しています。asdfでそのようなことはできません。NixOSは、独自のプログラミング言語、たくさんのCLIツール、そして60,000を超えるパッケージコレクションによって、それらの機能を支えています。

繰り返しになりますが、asdfは上位の依存関係を管理することはしませんし、パッケージマネージャでもありません。

詳しくはNixOSのドキュメントをご覧ください。

なぜasdfを使うの?

asdfは、プラグインシステムによって多くのツールをサポートしており、シェル構成にたった1行のシェルスクリプトを記述するだけで使えるというシンプルさ・親しみやすさによって、チームが確実に同じバージョンのツールを使用することを保証できます。

Note

asdfはシステムのパッケージマネージャになることを目指してはいません。あくまで、ツールのバージョンマネージャです。プラグインを作成することで、どのようなツールでもasdfで管理できるようになりますが、それがそのツールにとって最善の方法であるとは限りませんのでご注意ください。

',25)]))}const b=a(d,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/ja-jp_guide_introduction.md.BiCZxaSp.lean.js b/assets/ja-jp_guide_introduction.md.BiCZxaSp.lean.js new file mode 100644 index 00000000..587fd8d3 --- /dev/null +++ b/assets/ja-jp_guide_introduction.md.BiCZxaSp.lean.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as t}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"イントロダクション","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/guide/introduction.md","filePath":"ja-jp/guide/introduction.md","lastUpdated":1704890757000}'),d={name:"ja-jp/guide/introduction.md"};function n(i,e,c,s,h,l){return t(),o("div",null,e[0]||(e[0]=[r('

イントロダクション

asdfは、ツールのためのバージョンマネージャです。すべてのツールのバージョンは単一のファイル(.tool-versions)内で定義されるため、プロジェクトのGitリポジトリにチェックインして共有することで、チーム全員に同じーバージョンのツールを使ってもらえるようになります。

従来は、複数のCLIのバージョンマネージャを用意する必要があり、それぞれが異なるAPI、構成ファイル、および実装($PATHの操作、Shim、環境変数など)となっていました。asdfは、開発ワークフローを簡素化するための単一インターフェースと構成ファイルを提供しており、シンプルなプラグインインターフェースを使って、すべてのツール・ランタイムに拡張することができます。

どうやって動いているの

シェル上でasdfコアがセットアップすると、特定のツールを管理するためのプラグインをインストールすることができるようになります。プラグインによってツールがインストールされると、インストールされる実行ファイルごとにShimが作成されます。これらの実行ファイルを実行しようとすると、代わりにShimが実行され、.tool-versionsで定義されているバージョンをasdfが認識して、当該バージョンが実行されます。

関連プロジェクト

nvm / n / rbenv etc

nvmn、およびrbenvのようなツールはすべて、ツールによってインストールされる実行ファイルのShimを作成するシェルスクリプトです。

asdfはこれらのツールと非常に似ていて、ツール/ランタイムのバージョン管理という分野では競合しています。asdfはプラグインシステムを採用し、他のツールと差別化することで、ツール/ランタイムごとのマネージャ、マネージャごとの異なるコマンド、そしてリポジトリ内の様々な*-versionファイルといったものを排除しています。

direnv

シェルに、ディレクトリごとに環境変数をロード/アンロードできる機能を付け加えます。

asdfは環境変数を管理することはしませんが、direnvの動作をasdfに統合するasdf-direnvプラグインが存在します。

詳しくはdirenvのドキュメントをご覧ください。

Homebrew

macOS(またはLinux)のためのパッケージマネージャー

Homebrewは、パッケージとその上位の依存関係を管理します。asdfは上位の依存関係を管理することはしませんし、パッケージマネージャでもありません。それらの管理はユーザが負担することとなりますが、asdfはなるべく依存関係のリストを小さく保つように努めています。

詳しくはHomebrewのドキュメントをご覧ください。

NixOS

Nixは、パッケージ管理とシステム構成に独自のアプローチを取り入れたツールです。

NixOSは、各ツールの依存関係ツリー全体でパッケージのバージョンを正確に管理することで、真に再現可能な環境を構築することを目指しています。asdfでそのようなことはできません。NixOSは、独自のプログラミング言語、たくさんのCLIツール、そして60,000を超えるパッケージコレクションによって、それらの機能を支えています。

繰り返しになりますが、asdfは上位の依存関係を管理することはしませんし、パッケージマネージャでもありません。

詳しくはNixOSのドキュメントをご覧ください。

なぜasdfを使うの?

asdfは、プラグインシステムによって多くのツールをサポートしており、シェル構成にたった1行のシェルスクリプトを記述するだけで使えるというシンプルさ・親しみやすさによって、チームが確実に同じバージョンのツールを使用することを保証できます。

Note

asdfはシステムのパッケージマネージャになることを目指してはいません。あくまで、ツールのバージョンマネージャです。プラグインを作成することで、どのようなツールでもasdfで管理できるようになりますが、それがそのツールにとって最善の方法であるとは限りませんのでご注意ください。

',25)]))}const b=a(d,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/ja-jp_index.md.Nw2yHZ3B.js b/assets/ja-jp_index.md.Nw2yHZ3B.js new file mode 100644 index 00000000..6070fcb5 --- /dev/null +++ b/assets/ja-jp_index.md.Nw2yHZ3B.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as i}from"./chunks/framework.C9NVOr0y.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"asdf","text":"マルチランタイム
バージョンマネージャ","tagline":"1つのツールですべてのランタイムのバージョンを管理しましょう!","actions":[{"theme":"brand","text":"はじめよう","link":"/ja-jp/guide/getting-started"},{"theme":"alt","text":"asdfってなに?","link":"/ja-jp/guide/introduction"},{"theme":"alt","text":"GitHubをみる","link":"https://github.com/asdf-vm/asdf"}]},"features":[{"title":"単一ツール","details":"単体のCLIツールとコマンドインターフェースで、各プロジェクトのランタイムを管理できます。","icon":"🎉"},{"title":"プラグイン","details":"既存ランタイム・ツールを使用した大規模なエコシステムです。必要に応じて新しいツールをサポートできるシンプルなAPIを用意しています!","icon":"🔌"},{"title":"後方互換性","details":".nvmrc、.node-version、.ruby-versionといった既存構成ファイルから、スムーズに移行できます!","icon":"⏮"},{"title":"単一の構成ファイル","details":".tool-versionsを使用すると、すべてのツール、ランタイム、およびそれらのバージョンを、共有された単一の場所で管理できます。","icon":"📄"},{"title":"シェル","details":"Bash、ZSH、Fish、およびElvishをサポートし、コマンド補完にも対応しています。","icon":"🐚"},{"title":"GitHub Actions","details":"CI/CDワークフローで、.tool-versionsをインストールし利用するためのGitHub Actionを提供しています。","icon":"🤖"}]},"headers":[],"relativePath":"ja-jp/index.md","filePath":"ja-jp/index.md","lastUpdated":1704890757000}'),a={name:"ja-jp/index.md"};function n(o,s,d,l,r,c){return i(),e("div")}const h=t(a,[["render",n]]);export{m as __pageData,h as default}; diff --git a/assets/ja-jp_index.md.Nw2yHZ3B.lean.js b/assets/ja-jp_index.md.Nw2yHZ3B.lean.js new file mode 100644 index 00000000..6070fcb5 --- /dev/null +++ b/assets/ja-jp_index.md.Nw2yHZ3B.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as i}from"./chunks/framework.C9NVOr0y.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"asdf","text":"マルチランタイム
バージョンマネージャ","tagline":"1つのツールですべてのランタイムのバージョンを管理しましょう!","actions":[{"theme":"brand","text":"はじめよう","link":"/ja-jp/guide/getting-started"},{"theme":"alt","text":"asdfってなに?","link":"/ja-jp/guide/introduction"},{"theme":"alt","text":"GitHubをみる","link":"https://github.com/asdf-vm/asdf"}]},"features":[{"title":"単一ツール","details":"単体のCLIツールとコマンドインターフェースで、各プロジェクトのランタイムを管理できます。","icon":"🎉"},{"title":"プラグイン","details":"既存ランタイム・ツールを使用した大規模なエコシステムです。必要に応じて新しいツールをサポートできるシンプルなAPIを用意しています!","icon":"🔌"},{"title":"後方互換性","details":".nvmrc、.node-version、.ruby-versionといった既存構成ファイルから、スムーズに移行できます!","icon":"⏮"},{"title":"単一の構成ファイル","details":".tool-versionsを使用すると、すべてのツール、ランタイム、およびそれらのバージョンを、共有された単一の場所で管理できます。","icon":"📄"},{"title":"シェル","details":"Bash、ZSH、Fish、およびElvishをサポートし、コマンド補完にも対応しています。","icon":"🐚"},{"title":"GitHub Actions","details":"CI/CDワークフローで、.tool-versionsをインストールし利用するためのGitHub Actionを提供しています。","icon":"🤖"}]},"headers":[],"relativePath":"ja-jp/index.md","filePath":"ja-jp/index.md","lastUpdated":1704890757000}'),a={name:"ja-jp/index.md"};function n(o,s,d,l,r,c){return i(),e("div")}const h=t(a,[["render",n]]);export{m as __pageData,h as default}; diff --git a/assets/ja-jp_manage_commands.md.VPBtL-Un.js b/assets/ja-jp_manage_commands.md.VPBtL-Un.js new file mode 100644 index 00000000..08456245 --- /dev/null +++ b/assets/ja-jp_manage_commands.md.VPBtL-Un.js @@ -0,0 +1,66 @@ +import{_ as a,c as n,a2 as p,o as e}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"すべてのコマンド","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/manage/commands.md","filePath":"ja-jp/manage/commands.md","lastUpdated":1704890757000}'),l={name:"ja-jp/manage/commands.md"};function t(i,s,o,c,r,d){return e(),n("div",null,s[0]||(s[0]=[p(`

すべてのコマンド

asdfで利用可能なすべてのコマンドの一覧です。この一覧は、asdf helpコマンドで表示されるテキストです。

txt
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>]      Add a plugin from the plugin repo OR,
+                                        add a Git repo as a plugin by
+                                        specifying the name and repo url
+asdf plugin list [--urls] [--refs]      List installed plugins. Optionally show
+                                        git urls and git-ref
+asdf plugin list all                    List plugins registered on asdf-plugins
+                                        repository with URLs
+asdf plugin remove <name>               Remove plugin and package versions
+asdf plugin update <name> [<git-ref>]   Update a plugin to latest commit on
+                                        default branch or a particular git-ref
+asdf plugin update --all                Update all plugins to latest commit on
+                                        default branch
+
+
+MANAGE PACKAGES
+asdf current                            Display current version set or being
+                                        used for all packages
+asdf current <name>                     Display current version set or being
+                                        used for package
+asdf global <name> <version>            Set the package global version
+asdf global <name> latest[:<version>]   Set the package global version to the
+                                        latest provided version
+asdf help <name> [<version>]            Output documentation for plugin and tool
+asdf install                            Install all the package versions listed
+                                        in the .tool-versions file
+asdf install <name>                     Install one tool at the version
+                                        specified in the .tool-versions file
+asdf install <name> <version>           Install a specific version of a package
+asdf install <name> latest[:<version>]  Install the latest stable version of a
+                                        package, or with optional version,
+                                        install the latest stable version that
+                                        begins with the given string
+asdf latest <name> [<version>]          Show latest stable version of a package
+asdf latest --all                       Show latest stable version of all the
+                                        packages and if they are installed
+asdf list <name> [version]              List installed versions of a package and
+                                        optionally filter the versions
+asdf list all <name> [<version>]        List all versions of a package and
+                                        optionally filter the returned versions
+asdf local <name> <version>             Set the package local version
+asdf local <name> latest[:<version>]    Set the package local version to the
+                                        latest provided version
+asdf shell <name> <version>             Set the package version to
+                                        \`ASDF_\${LANG}_VERSION\` in the current shell
+asdf uninstall <name> <version>         Remove a specific version of a package
+asdf where <name> [<version>]           Display install path for an installed
+                                        or current version
+asdf which <command>                    Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...]           Executes the command shim for current version
+asdf env <command> [util]               Runs util (default: \`env\`) inside the
+                                        environment used for command shim execution.
+asdf info                               Print OS, Shell and ASDF debug information.
+asdf version                            Print the currently installed version of ASDF
+asdf reshim <name> <version>            Recreate shims for version of a package
+asdf shim-versions <command>            List the plugins and versions that
+                                        provide a command
+asdf update                             Update asdf to the latest stable release
+asdf update --head                      Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs:   https://asdf-vm.com
`,3)]))}const m=a(l,[["render",t]]);export{f as __pageData,m as default}; diff --git a/assets/ja-jp_manage_commands.md.VPBtL-Un.lean.js b/assets/ja-jp_manage_commands.md.VPBtL-Un.lean.js new file mode 100644 index 00000000..08456245 --- /dev/null +++ b/assets/ja-jp_manage_commands.md.VPBtL-Un.lean.js @@ -0,0 +1,66 @@ +import{_ as a,c as n,a2 as p,o as e}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"すべてのコマンド","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/manage/commands.md","filePath":"ja-jp/manage/commands.md","lastUpdated":1704890757000}'),l={name:"ja-jp/manage/commands.md"};function t(i,s,o,c,r,d){return e(),n("div",null,s[0]||(s[0]=[p(`

すべてのコマンド

asdfで利用可能なすべてのコマンドの一覧です。この一覧は、asdf helpコマンドで表示されるテキストです。

txt
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>]      Add a plugin from the plugin repo OR,
+                                        add a Git repo as a plugin by
+                                        specifying the name and repo url
+asdf plugin list [--urls] [--refs]      List installed plugins. Optionally show
+                                        git urls and git-ref
+asdf plugin list all                    List plugins registered on asdf-plugins
+                                        repository with URLs
+asdf plugin remove <name>               Remove plugin and package versions
+asdf plugin update <name> [<git-ref>]   Update a plugin to latest commit on
+                                        default branch or a particular git-ref
+asdf plugin update --all                Update all plugins to latest commit on
+                                        default branch
+
+
+MANAGE PACKAGES
+asdf current                            Display current version set or being
+                                        used for all packages
+asdf current <name>                     Display current version set or being
+                                        used for package
+asdf global <name> <version>            Set the package global version
+asdf global <name> latest[:<version>]   Set the package global version to the
+                                        latest provided version
+asdf help <name> [<version>]            Output documentation for plugin and tool
+asdf install                            Install all the package versions listed
+                                        in the .tool-versions file
+asdf install <name>                     Install one tool at the version
+                                        specified in the .tool-versions file
+asdf install <name> <version>           Install a specific version of a package
+asdf install <name> latest[:<version>]  Install the latest stable version of a
+                                        package, or with optional version,
+                                        install the latest stable version that
+                                        begins with the given string
+asdf latest <name> [<version>]          Show latest stable version of a package
+asdf latest --all                       Show latest stable version of all the
+                                        packages and if they are installed
+asdf list <name> [version]              List installed versions of a package and
+                                        optionally filter the versions
+asdf list all <name> [<version>]        List all versions of a package and
+                                        optionally filter the returned versions
+asdf local <name> <version>             Set the package local version
+asdf local <name> latest[:<version>]    Set the package local version to the
+                                        latest provided version
+asdf shell <name> <version>             Set the package version to
+                                        \`ASDF_\${LANG}_VERSION\` in the current shell
+asdf uninstall <name> <version>         Remove a specific version of a package
+asdf where <name> [<version>]           Display install path for an installed
+                                        or current version
+asdf which <command>                    Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...]           Executes the command shim for current version
+asdf env <command> [util]               Runs util (default: \`env\`) inside the
+                                        environment used for command shim execution.
+asdf info                               Print OS, Shell and ASDF debug information.
+asdf version                            Print the currently installed version of ASDF
+asdf reshim <name> <version>            Recreate shims for version of a package
+asdf shim-versions <command>            List the plugins and versions that
+                                        provide a command
+asdf update                             Update asdf to the latest stable release
+asdf update --head                      Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs:   https://asdf-vm.com
`,3)]))}const m=a(l,[["render",t]]);export{f as __pageData,m as default}; diff --git a/assets/ja-jp_manage_configuration.md.BoE7Ge6N.js b/assets/ja-jp_manage_configuration.md.BoE7Ge6N.js new file mode 100644 index 00000000..a0e2f877 --- /dev/null +++ b/assets/ja-jp_manage_configuration.md.BoE7Ge6N.js @@ -0,0 +1,9 @@ +import{_ as s,c as n,a2 as a,j as e,a as l,G as o,B as i,o as r}from"./chunks/framework.C9NVOr0y.js";const O=JSON.parse('{"title":"構成設定","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/manage/configuration.md","filePath":"ja-jp/manage/configuration.md","lastUpdated":1704890757000}'),c={name:"ja-jp/manage/configuration.md"},p={tabindex:"0"},f={style:{"text-align":"left"}},u={tabindex:"0"},g={style:{"text-align":"left"}},y={tabindex:"0"},b={style:{"text-align":"left"}},h={tabindex:"0"},x={style:{"text-align":"left"}},m={tabindex:"0"},v={style:{"text-align":"left"}};function _(k,t,D,A,F,E){const d=i("Badge");return r(),n("div",null,[t[32]||(t[32]=a(`

構成設定

asdfの構成設定には、他人と共有可能な.tool-versionsファイルと、.asdfrcや環境変数によってカスタマイズ可能なユーザ固有の設定とがあります。

.tool-versions

.tool-versionsファイルがディレクトリに存在する場合、当該ディレクトリおよびサブディレクトリで、ファイル内で宣言しているツールのバージョンが使用されます。

備考

グローバルのデフォルト値は、$HOME/.tool-versionsファイルで設定できます。

.tool-versionsファイル内は下記のような記述となっています:

ruby 2.5.3
+nodejs 10.15.0

コメントを含めることもできます:

ruby 2.5.3 # This is a comment
+# This is another comment
+nodejs 10.15.0

バージョンの表記は下記の形式があります:

  • 10.15.0 - 実バージョンの表記です。バイナリのダウンロードに対応しているプラグインの場合、バイナリがダウンロードされます。
  • ref:v1.0.2-a or ref:39cb398vb39 - 指定されたタグ/コミット/ブランチをgithubからダウンロードし、コンパイルされます。
  • path:~/src/elixir - 使用するツールをカスタムコンパイルしたバージョンへのパスです。言語開発者などが使用します。
  • system - このキーワードを指定した場合、asdfが管理していない、システム上のツールバージョンへパススルーします。

ヒント

スペースで区切れば、複数のバージョンを指定できます。例えば、Python 3.7.2を使用し、Python 2.7.15にフォールバックし、最終的にsystemのPythonにフォールバックさせるには、.tool-versionsに下記の行を追記します。

python 3.7.2 2.7.15 system

.tool-versionsファイルで定義されているすべてのツールをインストールするには、.tool-versionsファイルを含むディレクトリで、asdf installコマンドを引数を指定せずに実行します。

.tool-versionsファイルで定義されている単一のツールをインストールするには、.tool-versionsファイルを含むディレクトリで、asdf install <name>コマンドを実行します。ツールは、.tool-versionsファイルで指定されたバージョンでインストールされます。

ファイルは、直接編集するか、asdf localコマンド(またはasdf globalコマンド)を使用して更新してください。

.asdfrc

.asdfrcでは、ユーザのマシン固有の構成を設定します。

asdfはデフォルトで\${HOME}/.asdfrcに構成ファイルを配置します。ファイルの場所は、ASDF_CONFIG_FILE環境変数で設定できます。

下記は、構成に必要な項目とそのデフォルト値を示しています:

txt
legacy_version_file = no
+use_release_candidates = no
+always_keep_download = no
+plugin_repository_last_check_duration = 60
+disable_plugin_short_name_repository = no
+concurrency = auto

legacy_version_file

対応しているプラグインの場合、他のバージョンマネージャで使用されているバージョンファイルを読み込むことができます。例えば、Rubyのrbenvであれば.ruby-versionファイルを読み込みます。

`,22)),e("table",p,[t[4]||(t[4]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"オプション"),e("th",{style:{"text-align":"left"}},"説明")])],-1)),e("tbody",null,[e("tr",null,[e("td",f,[t[0]||(t[0]=e("code",null,"no",-1)),t[1]||(t[1]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"})]),t[2]||(t[2]=e("td",{style:{"text-align":"left"}},[l("バージョンの読み込みには"),e("code",null,".tool-versions"),l("を使用します")],-1))]),t[3]||(t[3]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},[l("利用可能なレガシーバージョンファイル("),e("code",null,".ruby-version"),l("など)がある場合、プラグインのフォールバックで使用します")])],-1))])]),t[33]||(t[33]=e("h3",{id:"use-release-candidates",tabindex:"-1"},[e("code",null,"use_release_candidates"),l(),e("a",{class:"header-anchor",href:"#use-release-candidates","aria-label":'Permalink to "`use_release_candidates`"'},"​")],-1)),t[34]||(t[34]=e("p",null,[e("code",null,"asdf update"),l("コマンドでasdfを更新する際に、最新リリースではなく、リリース候補版へ更新するか制御します。")],-1)),e("table",u,[t[9]||(t[9]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"オプション"),e("th",{style:{"text-align":"left"}},"説明")])],-1)),e("tbody",null,[e("tr",null,[e("td",g,[t[5]||(t[5]=e("code",null,"no",-1)),t[6]||(t[6]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"})]),t[7]||(t[7]=e("td",{style:{"text-align":"left"}},"最新リリースを使用します",-1))]),t[8]||(t[8]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"リリース候補版を使用します")],-1))])]),t[35]||(t[35]=e("h3",{id:"always-keep-download",tabindex:"-1"},[e("code",null,"always_keep_download"),l(),e("a",{class:"header-anchor",href:"#always-keep-download","aria-label":'Permalink to "`always_keep_download`"'},"​")],-1)),t[36]||(t[36]=e("p",null,[e("code",null,"asdf install"),l("コマンドでダウンロードしたソースコードやバイナリを、保持しておくか削除するかを制御します。")],-1)),e("table",y,[t[14]||(t[14]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"オプション"),e("th",{style:{"text-align":"left"}},"説明")])],-1)),e("tbody",null,[e("tr",null,[e("td",b,[t[10]||(t[10]=e("code",null,"no",-1)),t[11]||(t[11]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"})]),t[12]||(t[12]=e("td",{style:{"text-align":"left"}},"インストールが成功したら、ソースコードやバイナリを削除します",-1))]),t[13]||(t[13]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"インストール後も、ソースコードやバイナリを保持します")],-1))])]),t[37]||(t[37]=e("h3",{id:"plugin-repository-last-check-duration",tabindex:"-1"},[e("code",null,"plugin_repository_last_check_duration"),l(),e("a",{class:"header-anchor",href:"#plugin-repository-last-check-duration","aria-label":'Permalink to "`plugin_repository_last_check_duration`"'},"​")],-1)),t[38]||(t[38]=e("p",null,"asdfプラグインリポジトリの同期間隔(分)を制御します。何らかのトリガーイベントが発生した際に、最後に同期した時刻からの経過時間をチェックします。設定された間隔以上の時間が経過していた倍は、新たに同期が開始されます。",-1)),e("table",h,[t[26]||(t[26]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"オプション"),e("th",{style:{"text-align":"left"}},"説明")])],-1)),e("tbody",null,[e("tr",null,[e("td",x,[t[15]||(t[15]=e("code",null,"1",-1)),t[16]||(t[16]=l("から")),t[17]||(t[17]=e("code",null,"999999999",-1)),t[18]||(t[18]=l("までの整数値 ")),t[19]||(t[19]=e("br",null,null,-1)),t[20]||(t[20]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"}),t[21]||(t[21]=l("は")),t[22]||(t[22]=e("code",null,"60",-1))]),t[23]||(t[23]=e("td",{style:{"text-align":"left"}},"最後に同期した時刻から指定時間(分)以上経過していた場合、トリガーイベントで同期します",-1))]),t[24]||(t[24]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"0")]),e("td",{style:{"text-align":"left"}},"トリガーイベントのたびに同期します")],-1)),t[25]||(t[25]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"never")]),e("td",{style:{"text-align":"left"}},"同期しません")],-1))])]),t[39]||(t[39]=a('

同期は、以下のコマンドが実行されたときに発生します:

  • asdf plugin add <name>
  • asdf plugin list all

asdf plugin add <name> <git-url>コマンドでは、プラグインの同期はトリガーされません。

備考

値をneverにしても、プラグインリポジトリの初期同期は停止されません。この動作については、disable_plugin_short_name_repositoryの節をご覧ください。

disable_plugin_short_name_repository

asdfプラグインのショートネームリポジトリの同期を無効化します。ショートネームリポジトリが無効となっている場合、同期イベントはすぐに終了します。

',6)),e("table",m,[t[31]||(t[31]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"オプション"),e("th",{style:{"text-align":"left"}},"説明")])],-1)),e("tbody",null,[e("tr",null,[e("td",v,[t[27]||(t[27]=e("code",null,"no",-1)),t[28]||(t[28]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"})]),t[29]||(t[29]=e("td",{style:{"text-align":"left"}},"同期イベントが発生した際に、asdfプラグインリポジトリをクローンまたは更新します",-1))]),t[30]||(t[30]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"プラグインショートネームリポジトリを無効化します")],-1))])]),t[40]||(t[40]=a('

同期は、以下のコマンドが実行されたときに発生します:

  • asdf plugin add <name>
  • asdf plugin list all

asdf plugin add <name> <git-url>コマンドでは、プラグインの同期はトリガーされません。

備考

プラグインショートネームリポジトリを無効化しても、すでに同期されたリポジトリは削除されません。プラグインリポジトリを削除するには、rm --recursive --trash $ASDF_DATA_DIR/repositoryコマンドを実行してください。

また、プラグインショートネームリポジトリを無効化しても、以前にこのソースからインストールされたプラグインは削除されません。プラグインを削除するには、asdf plugin remove <name>コマンドを実行してください。プラグインを削除すると、そのプラグインでインストールされたすべてのツールバージョンが削除されます。

concurrency

コンパイル時に使用するデフォルトのコア数です。

OptionsDescription
整数値ソースコードのコンパイル時に使用するコア数です
autonprocsysctl hw.ncpu/proc/cpuinfo、または1、の優先順でコア数を計算します

備考: ASDF_CONCURRENCY環境変数が設定されている場合はそちらが優先されます。

環境変数

環境変数の設定値は、お使いのシステムやシェルによって異なります。デフォルトロケーションは、インストールした場所や方法(Gitクローン、Homebrew、AUR)によって異なります。

環境変数は通常、asdf.sh/asdf.fishなどをsourceする前に設定する必要があります。Elvishの場合は、use asdfの上側に設定します。

以下では、Bashシェルでの使用方法について説明します。

ASDF_CONFIG_FILE

.asdfrc構成ファイルへのパスです。任意の場所に設定できます。必ず絶対パスで設定してください。

  • 未設定の場合: $HOME/.asdfrcの値が使用されます。
  • 使用方法: export ASDF_CONFIG_FILE=/home/john_doe/.config/asdf/.asdfrc

ASDF_DEFAULT_TOOL_VERSIONS_FILENAME

ツール名とバージョンの情報を格納するファイルのファイル名です。有効なファイル名であれば何でも設定できます。通常、.tool-versionsファイルを無視したい場合を除き、この値を変更するべきではありません。

  • 未設定の場合: .tool-versionsの値が使用されます。
  • 使用方法: export ASDF_DEFAULT_TOOL_VERSIONS_FILENAME=tool_versions

ASDF_DIR

asdfのコアスクリプト場所です。任意の場所に設定できます。必ず絶対パスで設定してください。

  • 未設定の場合: bin/asdf実行ファイルの親ディレクトリが使用されます。
  • 使用方法: export ASDF_DIR=/home/john_doe/.config/asdf

ASDF_DATA_DIR

asdfがプラグイン、Shim、ツールのバージョンをインストールする場所です。任意の場所に設定できます。必ず絶対パスで設定してください。

  • 未設定の場合: $HOME/.asdfディレクトリが存在すればその場所、存在しない場合はASDF_DIRの値を使用します。
  • 使用方法: export ASDF_DATA_DIR=/home/john_doe/.asdf

ASDF_CONCURRENCY

ソースコードのコンパイル時に使用するコア数です。この環境変数の値は、asdf構成ファイルのconcurrencyの値よりも優先されます。

  • 未設定の場合: asdf構成ファイルのconcurrencyの値が使用されます。
  • 使用方法: export ASDF_CONCURRENCY=32

ASDF_FORCE_PREPEND

asdfのShimやパスのディレクトリをPATHの先頭(最高優先度)に追加するかどうかを設定します。

  • 未設定の場合: macOSでのデフォルト値はyes、その他のシステムでのデフォルト値はnoです。
  • yesの場合: asdfディレクトリを強制的にPATHの先頭に配置します。
  • yes以外の文字列を設定した場合: asdfディレクトリを強制的にPATHの先頭に配置することは しません
  • Usage: ASDF_FORCE_PREPEND=no . "<path-to-asdf-directory>/asdf.sh"

完全な構成の例

下記のように、asdfをシンプルにセットアップしたとします:

  • Bashシェル
  • インストール先は$HOME/.asdf
  • Git経由でインストール
  • 環境変数は何も設定していない
  • .asdfrcファイルは何もカスタマイズしていない

すると、結果として以下のような構成となります:

構成値がセットされる過程
config file location$HOME/.asdfrcASDF_CONFIG_FILEは空なので、$HOME/.asdfrcが使用されます。
default tool versions filename.tool-versionsASDF_DEFAULT_TOOL_VERSIONS_FILENAMEは空なので、.tool-versionsが使用されます。
asdf dir$HOME/.asdfASDF_DIRは空なので、bin/asdfの親ディレクトリが使用されます。
asdf data dir$HOME/.asdfASDF_DATA_DIRは空であり、$HOMEが存在するので、$HOME/.asdfが使用されます。
concurrencyautoASDF_CONCURRENCYは空なので、デフォルト構成concurrencyの値に依存します。
legacy_version_fileno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
use_release_candidatesno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
always_keep_downloadno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
plugin_repository_last_check_duration60.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
disable_plugin_short_name_repositoryno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。

内部構成

この節では、パッケージマネージャやインテグレータ向けのasdfの内部構成について記述しているため、ユーザが気にする必要はありません。

  • $ASDF_DIR/asdf_updates_disabled: このファイルが存在する場合、asdf updateコマンドによる更新は無効になります(ファイル内容は関係ありません)。これは、PacmanやHomebrewのようなパッケージマネージャによって使用され、特定のインストールに対して正しい更新方法を適用するようにします。
',38))])}const P=s(c,[["render",_]]);export{O as __pageData,P as default}; diff --git a/assets/ja-jp_manage_configuration.md.BoE7Ge6N.lean.js b/assets/ja-jp_manage_configuration.md.BoE7Ge6N.lean.js new file mode 100644 index 00000000..a0e2f877 --- /dev/null +++ b/assets/ja-jp_manage_configuration.md.BoE7Ge6N.lean.js @@ -0,0 +1,9 @@ +import{_ as s,c as n,a2 as a,j as e,a as l,G as o,B as i,o as r}from"./chunks/framework.C9NVOr0y.js";const O=JSON.parse('{"title":"構成設定","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/manage/configuration.md","filePath":"ja-jp/manage/configuration.md","lastUpdated":1704890757000}'),c={name:"ja-jp/manage/configuration.md"},p={tabindex:"0"},f={style:{"text-align":"left"}},u={tabindex:"0"},g={style:{"text-align":"left"}},y={tabindex:"0"},b={style:{"text-align":"left"}},h={tabindex:"0"},x={style:{"text-align":"left"}},m={tabindex:"0"},v={style:{"text-align":"left"}};function _(k,t,D,A,F,E){const d=i("Badge");return r(),n("div",null,[t[32]||(t[32]=a(`

構成設定

asdfの構成設定には、他人と共有可能な.tool-versionsファイルと、.asdfrcや環境変数によってカスタマイズ可能なユーザ固有の設定とがあります。

.tool-versions

.tool-versionsファイルがディレクトリに存在する場合、当該ディレクトリおよびサブディレクトリで、ファイル内で宣言しているツールのバージョンが使用されます。

備考

グローバルのデフォルト値は、$HOME/.tool-versionsファイルで設定できます。

.tool-versionsファイル内は下記のような記述となっています:

ruby 2.5.3
+nodejs 10.15.0

コメントを含めることもできます:

ruby 2.5.3 # This is a comment
+# This is another comment
+nodejs 10.15.0

バージョンの表記は下記の形式があります:

  • 10.15.0 - 実バージョンの表記です。バイナリのダウンロードに対応しているプラグインの場合、バイナリがダウンロードされます。
  • ref:v1.0.2-a or ref:39cb398vb39 - 指定されたタグ/コミット/ブランチをgithubからダウンロードし、コンパイルされます。
  • path:~/src/elixir - 使用するツールをカスタムコンパイルしたバージョンへのパスです。言語開発者などが使用します。
  • system - このキーワードを指定した場合、asdfが管理していない、システム上のツールバージョンへパススルーします。

ヒント

スペースで区切れば、複数のバージョンを指定できます。例えば、Python 3.7.2を使用し、Python 2.7.15にフォールバックし、最終的にsystemのPythonにフォールバックさせるには、.tool-versionsに下記の行を追記します。

python 3.7.2 2.7.15 system

.tool-versionsファイルで定義されているすべてのツールをインストールするには、.tool-versionsファイルを含むディレクトリで、asdf installコマンドを引数を指定せずに実行します。

.tool-versionsファイルで定義されている単一のツールをインストールするには、.tool-versionsファイルを含むディレクトリで、asdf install <name>コマンドを実行します。ツールは、.tool-versionsファイルで指定されたバージョンでインストールされます。

ファイルは、直接編集するか、asdf localコマンド(またはasdf globalコマンド)を使用して更新してください。

.asdfrc

.asdfrcでは、ユーザのマシン固有の構成を設定します。

asdfはデフォルトで\${HOME}/.asdfrcに構成ファイルを配置します。ファイルの場所は、ASDF_CONFIG_FILE環境変数で設定できます。

下記は、構成に必要な項目とそのデフォルト値を示しています:

txt
legacy_version_file = no
+use_release_candidates = no
+always_keep_download = no
+plugin_repository_last_check_duration = 60
+disable_plugin_short_name_repository = no
+concurrency = auto

legacy_version_file

対応しているプラグインの場合、他のバージョンマネージャで使用されているバージョンファイルを読み込むことができます。例えば、Rubyのrbenvであれば.ruby-versionファイルを読み込みます。

`,22)),e("table",p,[t[4]||(t[4]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"オプション"),e("th",{style:{"text-align":"left"}},"説明")])],-1)),e("tbody",null,[e("tr",null,[e("td",f,[t[0]||(t[0]=e("code",null,"no",-1)),t[1]||(t[1]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"})]),t[2]||(t[2]=e("td",{style:{"text-align":"left"}},[l("バージョンの読み込みには"),e("code",null,".tool-versions"),l("を使用します")],-1))]),t[3]||(t[3]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},[l("利用可能なレガシーバージョンファイル("),e("code",null,".ruby-version"),l("など)がある場合、プラグインのフォールバックで使用します")])],-1))])]),t[33]||(t[33]=e("h3",{id:"use-release-candidates",tabindex:"-1"},[e("code",null,"use_release_candidates"),l(),e("a",{class:"header-anchor",href:"#use-release-candidates","aria-label":'Permalink to "`use_release_candidates`"'},"​")],-1)),t[34]||(t[34]=e("p",null,[e("code",null,"asdf update"),l("コマンドでasdfを更新する際に、最新リリースではなく、リリース候補版へ更新するか制御します。")],-1)),e("table",u,[t[9]||(t[9]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"オプション"),e("th",{style:{"text-align":"left"}},"説明")])],-1)),e("tbody",null,[e("tr",null,[e("td",g,[t[5]||(t[5]=e("code",null,"no",-1)),t[6]||(t[6]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"})]),t[7]||(t[7]=e("td",{style:{"text-align":"left"}},"最新リリースを使用します",-1))]),t[8]||(t[8]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"リリース候補版を使用します")],-1))])]),t[35]||(t[35]=e("h3",{id:"always-keep-download",tabindex:"-1"},[e("code",null,"always_keep_download"),l(),e("a",{class:"header-anchor",href:"#always-keep-download","aria-label":'Permalink to "`always_keep_download`"'},"​")],-1)),t[36]||(t[36]=e("p",null,[e("code",null,"asdf install"),l("コマンドでダウンロードしたソースコードやバイナリを、保持しておくか削除するかを制御します。")],-1)),e("table",y,[t[14]||(t[14]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"オプション"),e("th",{style:{"text-align":"left"}},"説明")])],-1)),e("tbody",null,[e("tr",null,[e("td",b,[t[10]||(t[10]=e("code",null,"no",-1)),t[11]||(t[11]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"})]),t[12]||(t[12]=e("td",{style:{"text-align":"left"}},"インストールが成功したら、ソースコードやバイナリを削除します",-1))]),t[13]||(t[13]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"インストール後も、ソースコードやバイナリを保持します")],-1))])]),t[37]||(t[37]=e("h3",{id:"plugin-repository-last-check-duration",tabindex:"-1"},[e("code",null,"plugin_repository_last_check_duration"),l(),e("a",{class:"header-anchor",href:"#plugin-repository-last-check-duration","aria-label":'Permalink to "`plugin_repository_last_check_duration`"'},"​")],-1)),t[38]||(t[38]=e("p",null,"asdfプラグインリポジトリの同期間隔(分)を制御します。何らかのトリガーイベントが発生した際に、最後に同期した時刻からの経過時間をチェックします。設定された間隔以上の時間が経過していた倍は、新たに同期が開始されます。",-1)),e("table",h,[t[26]||(t[26]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"オプション"),e("th",{style:{"text-align":"left"}},"説明")])],-1)),e("tbody",null,[e("tr",null,[e("td",x,[t[15]||(t[15]=e("code",null,"1",-1)),t[16]||(t[16]=l("から")),t[17]||(t[17]=e("code",null,"999999999",-1)),t[18]||(t[18]=l("までの整数値 ")),t[19]||(t[19]=e("br",null,null,-1)),t[20]||(t[20]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"}),t[21]||(t[21]=l("は")),t[22]||(t[22]=e("code",null,"60",-1))]),t[23]||(t[23]=e("td",{style:{"text-align":"left"}},"最後に同期した時刻から指定時間(分)以上経過していた場合、トリガーイベントで同期します",-1))]),t[24]||(t[24]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"0")]),e("td",{style:{"text-align":"left"}},"トリガーイベントのたびに同期します")],-1)),t[25]||(t[25]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"never")]),e("td",{style:{"text-align":"left"}},"同期しません")],-1))])]),t[39]||(t[39]=a('

同期は、以下のコマンドが実行されたときに発生します:

  • asdf plugin add <name>
  • asdf plugin list all

asdf plugin add <name> <git-url>コマンドでは、プラグインの同期はトリガーされません。

備考

値をneverにしても、プラグインリポジトリの初期同期は停止されません。この動作については、disable_plugin_short_name_repositoryの節をご覧ください。

disable_plugin_short_name_repository

asdfプラグインのショートネームリポジトリの同期を無効化します。ショートネームリポジトリが無効となっている場合、同期イベントはすぐに終了します。

',6)),e("table",m,[t[31]||(t[31]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"オプション"),e("th",{style:{"text-align":"left"}},"説明")])],-1)),e("tbody",null,[e("tr",null,[e("td",v,[t[27]||(t[27]=e("code",null,"no",-1)),t[28]||(t[28]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"})]),t[29]||(t[29]=e("td",{style:{"text-align":"left"}},"同期イベントが発生した際に、asdfプラグインリポジトリをクローンまたは更新します",-1))]),t[30]||(t[30]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"プラグインショートネームリポジトリを無効化します")],-1))])]),t[40]||(t[40]=a('

同期は、以下のコマンドが実行されたときに発生します:

  • asdf plugin add <name>
  • asdf plugin list all

asdf plugin add <name> <git-url>コマンドでは、プラグインの同期はトリガーされません。

備考

プラグインショートネームリポジトリを無効化しても、すでに同期されたリポジトリは削除されません。プラグインリポジトリを削除するには、rm --recursive --trash $ASDF_DATA_DIR/repositoryコマンドを実行してください。

また、プラグインショートネームリポジトリを無効化しても、以前にこのソースからインストールされたプラグインは削除されません。プラグインを削除するには、asdf plugin remove <name>コマンドを実行してください。プラグインを削除すると、そのプラグインでインストールされたすべてのツールバージョンが削除されます。

concurrency

コンパイル時に使用するデフォルトのコア数です。

OptionsDescription
整数値ソースコードのコンパイル時に使用するコア数です
autonprocsysctl hw.ncpu/proc/cpuinfo、または1、の優先順でコア数を計算します

備考: ASDF_CONCURRENCY環境変数が設定されている場合はそちらが優先されます。

環境変数

環境変数の設定値は、お使いのシステムやシェルによって異なります。デフォルトロケーションは、インストールした場所や方法(Gitクローン、Homebrew、AUR)によって異なります。

環境変数は通常、asdf.sh/asdf.fishなどをsourceする前に設定する必要があります。Elvishの場合は、use asdfの上側に設定します。

以下では、Bashシェルでの使用方法について説明します。

ASDF_CONFIG_FILE

.asdfrc構成ファイルへのパスです。任意の場所に設定できます。必ず絶対パスで設定してください。

  • 未設定の場合: $HOME/.asdfrcの値が使用されます。
  • 使用方法: export ASDF_CONFIG_FILE=/home/john_doe/.config/asdf/.asdfrc

ASDF_DEFAULT_TOOL_VERSIONS_FILENAME

ツール名とバージョンの情報を格納するファイルのファイル名です。有効なファイル名であれば何でも設定できます。通常、.tool-versionsファイルを無視したい場合を除き、この値を変更するべきではありません。

  • 未設定の場合: .tool-versionsの値が使用されます。
  • 使用方法: export ASDF_DEFAULT_TOOL_VERSIONS_FILENAME=tool_versions

ASDF_DIR

asdfのコアスクリプト場所です。任意の場所に設定できます。必ず絶対パスで設定してください。

  • 未設定の場合: bin/asdf実行ファイルの親ディレクトリが使用されます。
  • 使用方法: export ASDF_DIR=/home/john_doe/.config/asdf

ASDF_DATA_DIR

asdfがプラグイン、Shim、ツールのバージョンをインストールする場所です。任意の場所に設定できます。必ず絶対パスで設定してください。

  • 未設定の場合: $HOME/.asdfディレクトリが存在すればその場所、存在しない場合はASDF_DIRの値を使用します。
  • 使用方法: export ASDF_DATA_DIR=/home/john_doe/.asdf

ASDF_CONCURRENCY

ソースコードのコンパイル時に使用するコア数です。この環境変数の値は、asdf構成ファイルのconcurrencyの値よりも優先されます。

  • 未設定の場合: asdf構成ファイルのconcurrencyの値が使用されます。
  • 使用方法: export ASDF_CONCURRENCY=32

ASDF_FORCE_PREPEND

asdfのShimやパスのディレクトリをPATHの先頭(最高優先度)に追加するかどうかを設定します。

  • 未設定の場合: macOSでのデフォルト値はyes、その他のシステムでのデフォルト値はnoです。
  • yesの場合: asdfディレクトリを強制的にPATHの先頭に配置します。
  • yes以外の文字列を設定した場合: asdfディレクトリを強制的にPATHの先頭に配置することは しません
  • Usage: ASDF_FORCE_PREPEND=no . "<path-to-asdf-directory>/asdf.sh"

完全な構成の例

下記のように、asdfをシンプルにセットアップしたとします:

  • Bashシェル
  • インストール先は$HOME/.asdf
  • Git経由でインストール
  • 環境変数は何も設定していない
  • .asdfrcファイルは何もカスタマイズしていない

すると、結果として以下のような構成となります:

構成値がセットされる過程
config file location$HOME/.asdfrcASDF_CONFIG_FILEは空なので、$HOME/.asdfrcが使用されます。
default tool versions filename.tool-versionsASDF_DEFAULT_TOOL_VERSIONS_FILENAMEは空なので、.tool-versionsが使用されます。
asdf dir$HOME/.asdfASDF_DIRは空なので、bin/asdfの親ディレクトリが使用されます。
asdf data dir$HOME/.asdfASDF_DATA_DIRは空であり、$HOMEが存在するので、$HOME/.asdfが使用されます。
concurrencyautoASDF_CONCURRENCYは空なので、デフォルト構成concurrencyの値に依存します。
legacy_version_fileno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
use_release_candidatesno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
always_keep_downloadno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
plugin_repository_last_check_duration60.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
disable_plugin_short_name_repositoryno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。

内部構成

この節では、パッケージマネージャやインテグレータ向けのasdfの内部構成について記述しているため、ユーザが気にする必要はありません。

  • $ASDF_DIR/asdf_updates_disabled: このファイルが存在する場合、asdf updateコマンドによる更新は無効になります(ファイル内容は関係ありません)。これは、PacmanやHomebrewのようなパッケージマネージャによって使用され、特定のインストールに対して正しい更新方法を適用するようにします。
',38))])}const P=s(c,[["render",_]]);export{O as __pageData,P as default}; diff --git a/assets/ja-jp_manage_core.md.B1eqmXXm.js b/assets/ja-jp_manage_core.md.B1eqmXXm.js new file mode 100644 index 00000000..6d0767ac --- /dev/null +++ b/assets/ja-jp_manage_core.md.B1eqmXXm.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as l,o as t}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"コア","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/manage/core.md","filePath":"ja-jp/manage/core.md","lastUpdated":1704890757000}'),h={name:"ja-jp/manage/core.md"};function e(n,s,p,k,d,o){return t(),a("div",null,s[0]||(s[0]=[l(`

コア

コアとなるasdfのコマンドはかなり少量ですが、多くのワークフローを円滑に進めることができます。

インストール & セットアップ

はじめようのガイドで説明されています。

実行

shell
asdf exec <command> [args...]

現在のバージョンのShimでコマンドを実行します。

環境変数

shell
asdf env <command> [util]

情報

shell
asdf info

OS、シェル、およびasdfのデバッグ情報を表示するヘルパーコマンドです。バグレポート作成時に共有してください。

Shimの再作成

shell
asdf reshim <name> <version>

特定のパッケージ・バージョンのShimを再作成します。デフォルトでは、Shimはプラグインによってツールのインストール中に作成されます。npm CLIなどのツールは、実行ファイルをグローバルインストールができます(例:npm install -g yarnコマンドでYarnをインストール)が、これらの実行ファイルはプラグインのライフサイクルを通してインストールされないため、Shimはまだ存在しません。そのような時に、例えばasdf reshim nodejs <version>を実行すると、nodejs<version>に対して、yarnのような新しい実行ファイルのShimを強制的に再作成させることができます。

Shimのバージョン

shell
asdf shim-versions <command>

<command>のShimを提供するプラグインおよびバージョンを一覧で表示します。

例えば、Node.jsにはnodenpmという2つの実行ファイルが提供されています。asdf-nodejsプラグインで、複数のバージョンのツールがインストールされている場合、shim-versionsは下記のような一覧を返します:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

更新

asdfには、Git依存のアップデートコマンドが用意されています(推奨されるインストール方法を使用した場合)。別の方法でインストールした場合、その方法の手順に従ってください:

方法最新の安定リリースmasterブランチの最新コミット
asdf (Git経由)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
Pacman新しいPKGBUILDをダウンロードしてリビルド、
または好みのAURヘルパーを使用

アンインストール

asdfをアンインストールするには以下の手順に従ってください:

Bash & Git
  1. ~/.bashrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. ~/.bash_profileで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. ~/.bashrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

コマンド補完については、Homebrewで説明されている方法で設定されている可能性があるため、そちらのガイドに従って削除する行を見つけてください。

  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

macOS Catalina以降では、デフォルトのシェルがZSHに変更されました。もし、~/.bash_profileに設定が見つからない場合は、~/.zshrcにある可能性があります。その場合は、ZSHの手順をご覧ください。

  1. ~/.bash_profileで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

コマンド補完については、Homebrewで説明されている方法で設定されている可能性があるため、そちらのガイドに従って削除する行を見つけてください。

  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. ~/.bashrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. /opt/asdf-vm/asdf.sh
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. ~/.config/fish/config.fishで、asdf.fishをsourceしている行を削除します:
shell
source ~/.asdf/asdf.fish

そして、次のコマンドで、コマンド補完を削除します:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. ~/.config/fish/config.fishで、asdf.fishをsourceしている行を削除します:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. ~/.config/fish/config.fishで、asdf.fishをsourceしている行を削除します:
shell
source /opt/asdf-vm/asdf.fish
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. ~/.config/elvish/rc.elvで、asdfモジュールを使用している行を削除します:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

そして、次のコマンドで、asdfモジュールを削除します:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. $HOME/.asdfディレクトリを削除します:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. ~/.config/elvish/rc.elvで、asdfモジュールを使用している行を削除します:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

そして、次のコマンドで、asdfモジュールを削除します:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. ~/.config/elvish/rc.elvで、asdfモジュールを使用している行を削除します:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

そして、次のコマンドで、asdfモジュールを削除します:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. ~/.zshrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

または、ZSHフレームワークプラグインを使用します。

  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. ~/.zshrcで、asdf.shをsourceしている行を削除します:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force && brew autoremove
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. ~/.zshrcで、asdf.shをsourceしている行を削除します:
shell
. /opt/asdf-vm/asdf.sh
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"

たったこれだけです! 🎉

`,41)]))}const F=i(h,[["render",e]]);export{c as __pageData,F as default}; diff --git a/assets/ja-jp_manage_core.md.B1eqmXXm.lean.js b/assets/ja-jp_manage_core.md.B1eqmXXm.lean.js new file mode 100644 index 00000000..6d0767ac --- /dev/null +++ b/assets/ja-jp_manage_core.md.B1eqmXXm.lean.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as l,o as t}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"コア","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/manage/core.md","filePath":"ja-jp/manage/core.md","lastUpdated":1704890757000}'),h={name:"ja-jp/manage/core.md"};function e(n,s,p,k,d,o){return t(),a("div",null,s[0]||(s[0]=[l(`

コア

コアとなるasdfのコマンドはかなり少量ですが、多くのワークフローを円滑に進めることができます。

インストール & セットアップ

はじめようのガイドで説明されています。

実行

shell
asdf exec <command> [args...]

現在のバージョンのShimでコマンドを実行します。

環境変数

shell
asdf env <command> [util]

情報

shell
asdf info

OS、シェル、およびasdfのデバッグ情報を表示するヘルパーコマンドです。バグレポート作成時に共有してください。

Shimの再作成

shell
asdf reshim <name> <version>

特定のパッケージ・バージョンのShimを再作成します。デフォルトでは、Shimはプラグインによってツールのインストール中に作成されます。npm CLIなどのツールは、実行ファイルをグローバルインストールができます(例:npm install -g yarnコマンドでYarnをインストール)が、これらの実行ファイルはプラグインのライフサイクルを通してインストールされないため、Shimはまだ存在しません。そのような時に、例えばasdf reshim nodejs <version>を実行すると、nodejs<version>に対して、yarnのような新しい実行ファイルのShimを強制的に再作成させることができます。

Shimのバージョン

shell
asdf shim-versions <command>

<command>のShimを提供するプラグインおよびバージョンを一覧で表示します。

例えば、Node.jsにはnodenpmという2つの実行ファイルが提供されています。asdf-nodejsプラグインで、複数のバージョンのツールがインストールされている場合、shim-versionsは下記のような一覧を返します:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

更新

asdfには、Git依存のアップデートコマンドが用意されています(推奨されるインストール方法を使用した場合)。別の方法でインストールした場合、その方法の手順に従ってください:

方法最新の安定リリースmasterブランチの最新コミット
asdf (Git経由)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
Pacman新しいPKGBUILDをダウンロードしてリビルド、
または好みのAURヘルパーを使用

アンインストール

asdfをアンインストールするには以下の手順に従ってください:

Bash & Git
  1. ~/.bashrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. ~/.bash_profileで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. ~/.bashrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

コマンド補完については、Homebrewで説明されている方法で設定されている可能性があるため、そちらのガイドに従って削除する行を見つけてください。

  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

macOS Catalina以降では、デフォルトのシェルがZSHに変更されました。もし、~/.bash_profileに設定が見つからない場合は、~/.zshrcにある可能性があります。その場合は、ZSHの手順をご覧ください。

  1. ~/.bash_profileで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

コマンド補完については、Homebrewで説明されている方法で設定されている可能性があるため、そちらのガイドに従って削除する行を見つけてください。

  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. ~/.bashrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. /opt/asdf-vm/asdf.sh
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. ~/.config/fish/config.fishで、asdf.fishをsourceしている行を削除します:
shell
source ~/.asdf/asdf.fish

そして、次のコマンドで、コマンド補完を削除します:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. ~/.config/fish/config.fishで、asdf.fishをsourceしている行を削除します:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. ~/.config/fish/config.fishで、asdf.fishをsourceしている行を削除します:
shell
source /opt/asdf-vm/asdf.fish
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. ~/.config/elvish/rc.elvで、asdfモジュールを使用している行を削除します:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

そして、次のコマンドで、asdfモジュールを削除します:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. $HOME/.asdfディレクトリを削除します:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. ~/.config/elvish/rc.elvで、asdfモジュールを使用している行を削除します:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

そして、次のコマンドで、asdfモジュールを削除します:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. ~/.config/elvish/rc.elvで、asdfモジュールを使用している行を削除します:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

そして、次のコマンドで、asdfモジュールを削除します:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. ~/.zshrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

または、ZSHフレームワークプラグインを使用します。

  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. ~/.zshrcで、asdf.shをsourceしている行を削除します:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force && brew autoremove
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. ~/.zshrcで、asdf.shをsourceしている行を削除します:
shell
. /opt/asdf-vm/asdf.sh
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"

たったこれだけです! 🎉

`,41)]))}const F=i(h,[["render",e]]);export{c as __pageData,F as default}; diff --git a/assets/ja-jp_manage_plugins.md.Cbru-sBo.js b/assets/ja-jp_manage_plugins.md.Cbru-sBo.js new file mode 100644 index 00000000..f762586d --- /dev/null +++ b/assets/ja-jp_manage_plugins.md.Cbru-sBo.js @@ -0,0 +1,11 @@ +import{_ as a,c as i,a2 as l,o as e}from"./chunks/framework.C9NVOr0y.js";const g=JSON.parse('{"title":"プラグイン","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/manage/plugins.md","filePath":"ja-jp/manage/plugins.md","lastUpdated":1704890757000}'),t={name:"ja-jp/manage/plugins.md"};function n(h,s,p,d,k,r){return e(),i("div",null,s[0]||(s[0]=[l(`

プラグイン

プラグインは、asdfがNode.jsやRuby、Elixirなどの様々なツールを取り扱えるようにするためのものです。

様々なツールをサポートするために使用されるプラグインAPIについては、プラグインの作成をご覧ください。

追加

下記コマンドでは、GitのURLからプラグインを追加します:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

または下記のコマンドで、プラグインリポジトリのショートネームを指定して追加します:

shell
asdf plugin add <name>
+# asdf plugin add erlang

推奨

リポジトリのショートネームに依存しないために、git-urlを使用することを推奨します。

インストール済みプラグイン一覧

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

全プラグインのショートネーム一覧

shell
asdf plugin list all

全プラグインのショートネーム一覧については、プラグインショートネームの一覧もご覧ください。

更新

shell
asdf plugin update --all

特定のプラグインパッケージを更新したい場合は、下記のように指定してください。

shell
asdf plugin update <name>
+# asdf plugin update erlang

この更新コマンドは、プラグインリポジトリの originデフォルトブランチ における 最新コミット を取得します。バージョニングされたプラグインの更新機能については、現在開発中です(#916)。

削除

bash
asdf plugin remove <name>
+# asdf plugin remove erlang

プラグインを削除すると、当該プラグインでインストールされたすべてのツールが削除されます。これは、各ツールの未使用バージョンを手っ取り早くクリーンアップ/プルーニングするのに有用です。

ショートネームリポジトリの同期

ショートネームリポジトリはローカルマシンに同期され、定期的に更新されます。同期のタイミングの条件は、次のとおりです:

  • 同期イベントは、下記コマンドによってトリガーされます:
    • asdf plugin add <name>
    • asdf plugin list all
  • 構成設定のdisable_plugin_short_name_repositoryオプションがyesの場合、同期は中止されます。詳しくはasdfの構成設定のリファレンスをご覧ください。
  • もし、過去X分の間に同期が行われていない場合、同期が開始されます。
    • Xのデフォルト値は60ですが、.asdfrcファイルのplugin_repository_last_check_durationオプションで変更することができます。詳しくはasdfの構成設定のリファレンスをご覧ください。
`,26)]))}const c=a(t,[["render",n]]);export{g as __pageData,c as default}; diff --git a/assets/ja-jp_manage_plugins.md.Cbru-sBo.lean.js b/assets/ja-jp_manage_plugins.md.Cbru-sBo.lean.js new file mode 100644 index 00000000..f762586d --- /dev/null +++ b/assets/ja-jp_manage_plugins.md.Cbru-sBo.lean.js @@ -0,0 +1,11 @@ +import{_ as a,c as i,a2 as l,o as e}from"./chunks/framework.C9NVOr0y.js";const g=JSON.parse('{"title":"プラグイン","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/manage/plugins.md","filePath":"ja-jp/manage/plugins.md","lastUpdated":1704890757000}'),t={name:"ja-jp/manage/plugins.md"};function n(h,s,p,d,k,r){return e(),i("div",null,s[0]||(s[0]=[l(`

プラグイン

プラグインは、asdfがNode.jsやRuby、Elixirなどの様々なツールを取り扱えるようにするためのものです。

様々なツールをサポートするために使用されるプラグインAPIについては、プラグインの作成をご覧ください。

追加

下記コマンドでは、GitのURLからプラグインを追加します:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

または下記のコマンドで、プラグインリポジトリのショートネームを指定して追加します:

shell
asdf plugin add <name>
+# asdf plugin add erlang

推奨

リポジトリのショートネームに依存しないために、git-urlを使用することを推奨します。

インストール済みプラグイン一覧

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

全プラグインのショートネーム一覧

shell
asdf plugin list all

全プラグインのショートネーム一覧については、プラグインショートネームの一覧もご覧ください。

更新

shell
asdf plugin update --all

特定のプラグインパッケージを更新したい場合は、下記のように指定してください。

shell
asdf plugin update <name>
+# asdf plugin update erlang

この更新コマンドは、プラグインリポジトリの originデフォルトブランチ における 最新コミット を取得します。バージョニングされたプラグインの更新機能については、現在開発中です(#916)。

削除

bash
asdf plugin remove <name>
+# asdf plugin remove erlang

プラグインを削除すると、当該プラグインでインストールされたすべてのツールが削除されます。これは、各ツールの未使用バージョンを手っ取り早くクリーンアップ/プルーニングするのに有用です。

ショートネームリポジトリの同期

ショートネームリポジトリはローカルマシンに同期され、定期的に更新されます。同期のタイミングの条件は、次のとおりです:

  • 同期イベントは、下記コマンドによってトリガーされます:
    • asdf plugin add <name>
    • asdf plugin list all
  • 構成設定のdisable_plugin_short_name_repositoryオプションがyesの場合、同期は中止されます。詳しくはasdfの構成設定のリファレンスをご覧ください。
  • もし、過去X分の間に同期が行われていない場合、同期が開始されます。
    • Xのデフォルト値は60ですが、.asdfrcファイルのplugin_repository_last_check_durationオプションで変更することができます。詳しくはasdfの構成設定のリファレンスをご覧ください。
`,26)]))}const c=a(t,[["render",n]]);export{g as __pageData,c as default}; diff --git a/assets/ja-jp_manage_versions.md.Dxk0G51J.js b/assets/ja-jp_manage_versions.md.Dxk0G51J.js new file mode 100644 index 00000000..3ab74973 --- /dev/null +++ b/assets/ja-jp_manage_versions.md.Dxk0G51J.js @@ -0,0 +1,30 @@ +import{_ as i,c as a,a2 as l,o as h}from"./chunks/framework.C9NVOr0y.js";const o=JSON.parse('{"title":"バージョン","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/manage/versions.md","filePath":"ja-jp/manage/versions.md","lastUpdated":1704890757000}'),t={name:"ja-jp/manage/versions.md"};function n(e,s,p,k,d,r){return h(),a("div",null,s[0]||(s[0]=[l(`

バージョン

バージョンのインストール

shell
asdf install <name> <version>
+# asdf install erlang 17.3

プラグインが、ソースコードからのダウンロード・コンパイルをサポートしている場合、ref:fooの形式(fooは特定のブランチ、タグ、またはコミット)でバージョンを指定できます。アンインストールするときも、同じ名前とバージョンを指定する必要があります。

最新安定バージョンのインストール

shell
asdf install <name> latest
+# asdf install erlang latest

下記のように、特定のプレフィックスでの最新安定バージョンをインストールすることもできます。

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

インストール済みバージョン一覧

shell
asdf list <name>
+# asdf list erlang

下記のように、特定のプレフィックスでのバージョンでフィルタすることもできます。

shell
asdf list <name> <version>
+# asdf list erlang 17

インストール可能な全バージョン一覧

shell
asdf list all <name>
+# asdf list all erlang

下記のように、特定のプレフィックスでのバージョンでフィルタすることもできます。

shell
asdf list all <name> <version>
+# asdf list all erlang 17

最新安定バージョンの表示

shell
asdf latest <name>
+# asdf latest erlang

下記のように、特定のプレフィックスでの最新安定バージョンで表示することもできます。

shell
asdf latest <name> <version>
+# asdf latest erlang 17

カレントバージョンのセット

shell
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest

globalの場合、バージョンは$HOME/.tool-versionsファイルに書き込まれます。

shellの場合、バージョンはASDF_\${TOOL}_VERSIONという環境変数に設定され、現在のシェルセッションでのみ有効となります。

localの場合、バージョンは$PWD/.tool-versionsファイルに書き込まれます。存在しない場合は作成されます。

.tool-versionsファイルについて詳しくは、構成設定のリファレンスをご覧ください。

代替手段

現在のシェルセッションでのみバージョンを設定したい場合、 または、特定のツールバージョンでコマンドを実行するだけのためにバージョンを設定したい場合は、 ASDF_\${TOOL}_VERSIONという環境変数で設定することができます。

下記の例では、バージョン1.4.0のElixirプロジェクトに対して、テストを実行させています。 バージョンの表記形式は、.tool-versionsファイルでサポートされているものと同じです。

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

システムバージョンへの委任

asdfで管理されているバージョンではなく、<name>で指定されたツールのシステムバージョンを使用するには、バージョンとしてsystemを指定します。

カレントバージョンのセットと同様の方法で、globallocal、またはshellのいずれかにsystemをセットしてください。

shell
asdf local <name> system
+# asdf local python system

カレントバージョンの表示

shell
asdf current
+# asdf current
+# erlang          17.3          /Users/kim/.tool-versions
+# nodejs          6.11.5        /Users/kim/cool-node-project/.tool-versions
+
+asdf current <name>
+# asdf current erlang
+# erlang          17.3          /Users/kim/.tool-versions

バージョンのアンインストール

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

Shims

asdfがパッケージをインストールすると、そのパッケージに含まれるすべての実行プログラムのShimが$ASDF_DATA_DIR/shimsディレクトリ(デフォルトは~/.asdf/shims)に作成されます。このディレクトリが(asdf.shasdf.fishなどによって)$PATHに設定されることで、インストールされているプログラムが当該環境で利用できるようになります。

Shim自体は非常に単純なラッパーであり、asdf execというヘルパープログラムに、プラグイン名と、Shimがラップしているインストール済みパッケージの実行ファイルのパスを渡して、execします。

asdf execヘルパーは、使用するパッケージのバージョン(.tool-versionsファイルで指定されたもの、またはasdf local ...asdf global ...で指定されたもの)、パッケージのインストールディレクトリにある実行ファイルの完全パス(プラグインのexec-pathコールバックで操作可能)、および実行環境(プラグインのexec-envスクリプトで提供)を決定し、実行します。

備考

本システムはexec呼び出しを使用するため、シェルによってsourceされるパッケージ内のスクリプトは、Shimラッパーを経由させずに直接アクセスする必要があります。asdfで用意されているwhichおよびwhereコマンドは、下記のように、インストールされたパッケージへのパスを返すため、この状況を解決するのに役立ちます:

shell
# returns path to main executable in current version
+source $(asdf which \${PLUGIN})/../script.sh
+
+# returns path to the package installation directory
+source $(asdf where \${PLUGIN})/bin/script.sh

asdfのShimのバイパス

何らかの理由でasdfのShimをバイパスしたい場合や、プロジェクトのディレクトリに移動した際に自動的に環境変数を設定したい場合は、asdf-direnvプラグインが役に立ちます。詳細はREADMEをご確認ください。

`,45)]))}const c=i(t,[["render",n]]);export{o as __pageData,c as default}; diff --git a/assets/ja-jp_manage_versions.md.Dxk0G51J.lean.js b/assets/ja-jp_manage_versions.md.Dxk0G51J.lean.js new file mode 100644 index 00000000..3ab74973 --- /dev/null +++ b/assets/ja-jp_manage_versions.md.Dxk0G51J.lean.js @@ -0,0 +1,30 @@ +import{_ as i,c as a,a2 as l,o as h}from"./chunks/framework.C9NVOr0y.js";const o=JSON.parse('{"title":"バージョン","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/manage/versions.md","filePath":"ja-jp/manage/versions.md","lastUpdated":1704890757000}'),t={name:"ja-jp/manage/versions.md"};function n(e,s,p,k,d,r){return h(),a("div",null,s[0]||(s[0]=[l(`

バージョン

バージョンのインストール

shell
asdf install <name> <version>
+# asdf install erlang 17.3

プラグインが、ソースコードからのダウンロード・コンパイルをサポートしている場合、ref:fooの形式(fooは特定のブランチ、タグ、またはコミット)でバージョンを指定できます。アンインストールするときも、同じ名前とバージョンを指定する必要があります。

最新安定バージョンのインストール

shell
asdf install <name> latest
+# asdf install erlang latest

下記のように、特定のプレフィックスでの最新安定バージョンをインストールすることもできます。

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

インストール済みバージョン一覧

shell
asdf list <name>
+# asdf list erlang

下記のように、特定のプレフィックスでのバージョンでフィルタすることもできます。

shell
asdf list <name> <version>
+# asdf list erlang 17

インストール可能な全バージョン一覧

shell
asdf list all <name>
+# asdf list all erlang

下記のように、特定のプレフィックスでのバージョンでフィルタすることもできます。

shell
asdf list all <name> <version>
+# asdf list all erlang 17

最新安定バージョンの表示

shell
asdf latest <name>
+# asdf latest erlang

下記のように、特定のプレフィックスでの最新安定バージョンで表示することもできます。

shell
asdf latest <name> <version>
+# asdf latest erlang 17

カレントバージョンのセット

shell
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest

globalの場合、バージョンは$HOME/.tool-versionsファイルに書き込まれます。

shellの場合、バージョンはASDF_\${TOOL}_VERSIONという環境変数に設定され、現在のシェルセッションでのみ有効となります。

localの場合、バージョンは$PWD/.tool-versionsファイルに書き込まれます。存在しない場合は作成されます。

.tool-versionsファイルについて詳しくは、構成設定のリファレンスをご覧ください。

代替手段

現在のシェルセッションでのみバージョンを設定したい場合、 または、特定のツールバージョンでコマンドを実行するだけのためにバージョンを設定したい場合は、 ASDF_\${TOOL}_VERSIONという環境変数で設定することができます。

下記の例では、バージョン1.4.0のElixirプロジェクトに対して、テストを実行させています。 バージョンの表記形式は、.tool-versionsファイルでサポートされているものと同じです。

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

システムバージョンへの委任

asdfで管理されているバージョンではなく、<name>で指定されたツールのシステムバージョンを使用するには、バージョンとしてsystemを指定します。

カレントバージョンのセットと同様の方法で、globallocal、またはshellのいずれかにsystemをセットしてください。

shell
asdf local <name> system
+# asdf local python system

カレントバージョンの表示

shell
asdf current
+# asdf current
+# erlang          17.3          /Users/kim/.tool-versions
+# nodejs          6.11.5        /Users/kim/cool-node-project/.tool-versions
+
+asdf current <name>
+# asdf current erlang
+# erlang          17.3          /Users/kim/.tool-versions

バージョンのアンインストール

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

Shims

asdfがパッケージをインストールすると、そのパッケージに含まれるすべての実行プログラムのShimが$ASDF_DATA_DIR/shimsディレクトリ(デフォルトは~/.asdf/shims)に作成されます。このディレクトリが(asdf.shasdf.fishなどによって)$PATHに設定されることで、インストールされているプログラムが当該環境で利用できるようになります。

Shim自体は非常に単純なラッパーであり、asdf execというヘルパープログラムに、プラグイン名と、Shimがラップしているインストール済みパッケージの実行ファイルのパスを渡して、execします。

asdf execヘルパーは、使用するパッケージのバージョン(.tool-versionsファイルで指定されたもの、またはasdf local ...asdf global ...で指定されたもの)、パッケージのインストールディレクトリにある実行ファイルの完全パス(プラグインのexec-pathコールバックで操作可能)、および実行環境(プラグインのexec-envスクリプトで提供)を決定し、実行します。

備考

本システムはexec呼び出しを使用するため、シェルによってsourceされるパッケージ内のスクリプトは、Shimラッパーを経由させずに直接アクセスする必要があります。asdfで用意されているwhichおよびwhereコマンドは、下記のように、インストールされたパッケージへのパスを返すため、この状況を解決するのに役立ちます:

shell
# returns path to main executable in current version
+source $(asdf which \${PLUGIN})/../script.sh
+
+# returns path to the package installation directory
+source $(asdf where \${PLUGIN})/bin/script.sh

asdfのShimのバイパス

何らかの理由でasdfのShimをバイパスしたい場合や、プロジェクトのディレクトリに移動した際に自動的に環境変数を設定したい場合は、asdf-direnvプラグインが役に立ちます。詳細はREADMEをご確認ください。

`,45)]))}const c=i(t,[["render",n]]);export{o as __pageData,c as default}; diff --git a/assets/ja-jp_more_community-projects.md.Drt5Trip.js b/assets/ja-jp_more_community-projects.md.Drt5Trip.js new file mode 100644 index 00000000..127c93ca --- /dev/null +++ b/assets/ja-jp_more_community-projects.md.Drt5Trip.js @@ -0,0 +1 @@ +import{_ as t,c as a,a2 as o,o as r}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"コミュニティプロジェクト","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/more/community-projects.md","filePath":"ja-jp/more/community-projects.md","lastUpdated":1704890757000}'),s={name:"ja-jp/more/community-projects.md"};function c(n,e,i,d,l,p){return r(),a("div",null,e[0]||(e[0]=[o('

コミュニティプロジェクト

asdfに関連するコミュニティプロジェクトをいくつか紹介します:

  • asdf-community: asdfプラグインの長期的なメンテナンスを目的とした コミュニティ主導の共同プロジェクトです。
  • asdf dev container: GitHub Codespacesでasdfによるツール管理をサポートする、 GitHub Dev Container です。

備考

asdfコアチームは、これらのプロジェクトやコードを所有していません。 asdfコアでは、ここに掲載されているものに関連する品質やセキュリティについては責任を負いません。

',4)]))}const u=t(s,[["render",c]]);export{f as __pageData,u as default}; diff --git a/assets/ja-jp_more_community-projects.md.Drt5Trip.lean.js b/assets/ja-jp_more_community-projects.md.Drt5Trip.lean.js new file mode 100644 index 00000000..127c93ca --- /dev/null +++ b/assets/ja-jp_more_community-projects.md.Drt5Trip.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,a2 as o,o as r}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"コミュニティプロジェクト","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/more/community-projects.md","filePath":"ja-jp/more/community-projects.md","lastUpdated":1704890757000}'),s={name:"ja-jp/more/community-projects.md"};function c(n,e,i,d,l,p){return r(),a("div",null,e[0]||(e[0]=[o('

コミュニティプロジェクト

asdfに関連するコミュニティプロジェクトをいくつか紹介します:

  • asdf-community: asdfプラグインの長期的なメンテナンスを目的とした コミュニティ主導の共同プロジェクトです。
  • asdf dev container: GitHub Codespacesでasdfによるツール管理をサポートする、 GitHub Dev Container です。

備考

asdfコアチームは、これらのプロジェクトやコードを所有していません。 asdfコアでは、ここに掲載されているものに関連する品質やセキュリティについては責任を負いません。

',4)]))}const u=t(s,[["render",c]]);export{f as __pageData,u as default}; diff --git a/assets/ja-jp_more_faq.md.DWV2Lkfg.js b/assets/ja-jp_more_faq.md.DWV2Lkfg.js new file mode 100644 index 00000000..a352caf9 --- /dev/null +++ b/assets/ja-jp_more_faq.md.DWV2Lkfg.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as t}from"./chunks/framework.C9NVOr0y.js";const p=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/more/faq.md","filePath":"ja-jp/more/faq.md","lastUpdated":1704890757000}'),s={name:"ja-jp/more/faq.md"};function i(d,e,n,c,h,l){return t(),o("div",null,e[0]||(e[0]=[r('

FAQ

ここでは、asdfに関するよくある質問を紹介します。

WSL1をサポートしていますか?

WSL1 (Windows Subsystem for Linux 1)は公式にはサポートしていません。asdfは正常に動作しない可能性があります。WSL1を公式にサポートする予定はありません。

WSL2をサポートしていますか?

WSL2 (Windows Subsystem for Linux 2)では、あなたが選択したWSLディストリビューションに基づいて、セットアップと依存関係の解決を済ませれば、動作するはずです。

重要なのは、WSL2が正常に動作するのは、カレントワークディレクトリがWindowsドライブではなくUnixドライブである場合に 限られる ということです。

GitHub Actionsでホストランナーのサポートが可能になれば、WSL2でテストスイートを実行する予定ですが、現時点ではそうではないようです。

新しくインストールした実行ファイルが実行できないのですが?

npm install -g yarnを実行したにも関わらず、yarnが実行できません。どうなっているの?

asdfShimを使って実行ファイルを管理しています。プラグインによってインストールされるものは、自動的にShimが作成されますが、asdfが管理しているツールによって実行ファイルがインストールされた場合は、Shimを作成しなければならないということをasdfに通知する必要があります。上記の例では、YarnのShimを作成しなければいけません。詳しくは、asdf reshimコマンドのドキュメントをご覧ください。

シェルが、新しくインストールされたShimを検知してくれないのですが?

asdf reshimコマンドを実行しても問題が解決しない場合、asdf.shasdf.fishのsourceが、シェルの構成ファイル(.bash_profile.zshrcconfig.fishなど)の一番下にないことが原因である可能性があります。$PATHを設定した、そしてフレームワーク(oh-my-zshなど)を使用しているのれあればそれをsourceしたに、sourceする必要があります。

',13)]))}const m=a(s,[["render",i]]);export{p as __pageData,m as default}; diff --git a/assets/ja-jp_more_faq.md.DWV2Lkfg.lean.js b/assets/ja-jp_more_faq.md.DWV2Lkfg.lean.js new file mode 100644 index 00000000..a352caf9 --- /dev/null +++ b/assets/ja-jp_more_faq.md.DWV2Lkfg.lean.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as t}from"./chunks/framework.C9NVOr0y.js";const p=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/more/faq.md","filePath":"ja-jp/more/faq.md","lastUpdated":1704890757000}'),s={name:"ja-jp/more/faq.md"};function i(d,e,n,c,h,l){return t(),o("div",null,e[0]||(e[0]=[r('

FAQ

ここでは、asdfに関するよくある質問を紹介します。

WSL1をサポートしていますか?

WSL1 (Windows Subsystem for Linux 1)は公式にはサポートしていません。asdfは正常に動作しない可能性があります。WSL1を公式にサポートする予定はありません。

WSL2をサポートしていますか?

WSL2 (Windows Subsystem for Linux 2)では、あなたが選択したWSLディストリビューションに基づいて、セットアップと依存関係の解決を済ませれば、動作するはずです。

重要なのは、WSL2が正常に動作するのは、カレントワークディレクトリがWindowsドライブではなくUnixドライブである場合に 限られる ということです。

GitHub Actionsでホストランナーのサポートが可能になれば、WSL2でテストスイートを実行する予定ですが、現時点ではそうではないようです。

新しくインストールした実行ファイルが実行できないのですが?

npm install -g yarnを実行したにも関わらず、yarnが実行できません。どうなっているの?

asdfShimを使って実行ファイルを管理しています。プラグインによってインストールされるものは、自動的にShimが作成されますが、asdfが管理しているツールによって実行ファイルがインストールされた場合は、Shimを作成しなければならないということをasdfに通知する必要があります。上記の例では、YarnのShimを作成しなければいけません。詳しくは、asdf reshimコマンドのドキュメントをご覧ください。

シェルが、新しくインストールされたShimを検知してくれないのですが?

asdf reshimコマンドを実行しても問題が解決しない場合、asdf.shasdf.fishのsourceが、シェルの構成ファイル(.bash_profile.zshrcconfig.fishなど)の一番下にないことが原因である可能性があります。$PATHを設定した、そしてフレームワーク(oh-my-zshなど)を使用しているのれあればそれをsourceしたに、sourceする必要があります。

',13)]))}const m=a(s,[["render",i]]);export{p as __pageData,m as default}; diff --git a/assets/ja-jp_more_thanks.md.DgZpeSyP.js b/assets/ja-jp_more_thanks.md.DgZpeSyP.js new file mode 100644 index 00000000..f4e87cb7 --- /dev/null +++ b/assets/ja-jp_more_thanks.md.DgZpeSyP.js @@ -0,0 +1 @@ +import{_ as e,c as r,a2 as t,o as h}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"謝辞","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/more/thanks.md","filePath":"ja-jp/more/thanks.md","lastUpdated":1704890757000}'),o={name:"ja-jp/more/thanks.md"};function l(s,a,n,i,d,p){return h(),r("div",null,a[0]||(a[0]=[t('

謝辞

このページを借りて、asdfのオーサーおよびコントリビューターの皆様に感謝を申し上げます!

クレジット

私 (@HashNuke)、高熱、風邪、咳。

コピーライト 2014年から今まで (MIT License)

メンテナー

コントリビューター

GitHubのコントリビューターリスト🙏をご覧ください。

',9)]))}const u=e(o,[["render",l]]);export{f as __pageData,u as default}; diff --git a/assets/ja-jp_more_thanks.md.DgZpeSyP.lean.js b/assets/ja-jp_more_thanks.md.DgZpeSyP.lean.js new file mode 100644 index 00000000..f4e87cb7 --- /dev/null +++ b/assets/ja-jp_more_thanks.md.DgZpeSyP.lean.js @@ -0,0 +1 @@ +import{_ as e,c as r,a2 as t,o as h}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"謝辞","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/more/thanks.md","filePath":"ja-jp/more/thanks.md","lastUpdated":1704890757000}'),o={name:"ja-jp/more/thanks.md"};function l(s,a,n,i,d,p){return h(),r("div",null,a[0]||(a[0]=[t('

謝辞

このページを借りて、asdfのオーサーおよびコントリビューターの皆様に感謝を申し上げます!

クレジット

私 (@HashNuke)、高熱、風邪、咳。

コピーライト 2014年から今まで (MIT License)

メンテナー

コントリビューター

GitHubのコントリビューターリスト🙏をご覧ください。

',9)]))}const u=e(o,[["render",l]]);export{f as __pageData,u as default}; diff --git a/assets/ja-jp_plugins_create.md.CF7Jmvco.js b/assets/ja-jp_plugins_create.md.CF7Jmvco.js new file mode 100644 index 00000000..c0407b0a --- /dev/null +++ b/assets/ja-jp_plugins_create.md.CF7Jmvco.js @@ -0,0 +1,35 @@ +import{_ as n,c as p,a2 as e,j as i,a,G as l,B as d,o}from"./chunks/framework.C9NVOr0y.js";const x=JSON.parse('{"title":"プラグインの作成","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/plugins/create.md","filePath":"ja-jp/plugins/create.md","lastUpdated":1704890757000}'),h={name:"ja-jp/plugins/create.md"},r={tabindex:"0"},k={style:{"text-align":"left"}},g={style:{"text-align":"left"}},c={style:{"text-align":"left"}},u={style:{"text-align":"left"}},b={id:"bin-list-all",tabindex:"-1"},F={id:"bin-download",tabindex:"-1"},E={id:"bin-install",tabindex:"-1"},y={id:"bin-latest-stable",tabindex:"-1"},m={id:"asdf-cliの拡張コマンド",tabindex:"-1"},f={id:"カスタムshimテンプレート",tabindex:"-1"};function v(A,s,_,C,S,D){const t=d("Badge");return o(),p("div",null,[s[48]||(s[48]=e('

プラグインの作成

プラグインとは、 言語/ツールのバージョン管理をサポートするための実行スクリプトを含めたGitリポジトリのことです。 これらのスクリプトは、asdf list-all <name>asdf install <name> <version>などの機能をサポートするコマンドを使って、 asdfによって実行されます。

クイックスタート

オリジナルのプラグインを作成するには、次の2つの方法があります:

  1. asdf-vm/asdf-plugin-templateリポジトリを使用し、 デフォルトのスクリプトが実装されたプラグインリポジトリ(名前はasdf-<tool_name>)を 生成 します。 生成できたら、 そのリポジトリをクローンしてsetup.bashのスクリプトを実行し、 テンプレートを対話的に更新していきます。
  2. asdf-<tool_name>という名前のリポジトリを自分で立ち上げ、 以降に記載されている必要なスクリプトを実装します。

プラグインスクリプトの鉄則

  • スクリプト内で他のasdfコマンドを呼び出してはいけません
  • シェルのツール/コマンドへの依存関係を小さく保つようにしてください。
  • 移植性のないツールやコマンドフラグの使用は避けてください。 例えば、sort -Vなどです。 asdfコアの禁止コマンド一覧もご覧ください。

スクリプトの概要

以下は、asdfから呼び出せるスクリプトの全リストです。

',9)),i("table",r,[s[25]||(s[25]=i("thead",null,[i("tr",null,[i("th",{style:{"text-align":"left"}},"スクリプト"),i("th",{style:{"text-align":"left"}},"説明")])],-1)),i("tbody",null,[i("tr",null,[i("td",k,[s[0]||(s[0]=i("a",{href:"#bin-list-all"},"bin/list-all",-1)),s[1]||(s[1]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"})]),s[2]||(s[2]=i("td",{style:{"text-align":"left"}},"インストール可能なすべてのバージョンをリストします。",-1))]),i("tr",null,[i("td",g,[s[3]||(s[3]=i("a",{href:"#bin-download"},"bin/download",-1)),s[4]||(s[4]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"})]),s[5]||(s[5]=i("td",{style:{"text-align":"left"}},"ツールの特定バージョンのソースコードまたはバイナリをダウンロードします。",-1))]),i("tr",null,[i("td",c,[s[6]||(s[6]=i("a",{href:"#bin-install"},"bin/install",-1)),s[7]||(s[7]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"})]),s[8]||(s[8]=i("td",{style:{"text-align":"left"}},"ツールの特定バージョンをインストールします。",-1))]),i("tr",null,[i("td",u,[s[9]||(s[9]=i("a",{href:"#bin-latest-stable"},"bin/latest-stable",-1)),s[10]||(s[10]=a()),l(t,{type:"warning",text:"推奨",vertical:"middle"})]),s[11]||(s[11]=i("td",{style:{"text-align":"left"}},"指定されたツールの最新安定バージョンをリストします。",-1))]),s[12]||(s[12]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-help.overview"},"bin/help.overview")]),i("td",{style:{"text-align":"left"}},"プラグインおよびツールに関する概要説明を出力します。")],-1)),s[13]||(s[13]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-help.deps"},"bin/help.deps")]),i("td",{style:{"text-align":"left"}},"オペレーティングシステムに合わせた依存関係のリストを出力します。")],-1)),s[14]||(s[14]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-help.config"},"bin/help.config")]),i("td",{style:{"text-align":"left"}},"プラグインおよびツールの構成設定一覧を出力します。")],-1)),s[15]||(s[15]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-help.links"},"bin/help.links")]),i("td",{style:{"text-align":"left"}},"プラグインとツールに関連するリンクリストを出力します。")],-1)),s[16]||(s[16]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-list-bin-paths"},"bin/list-bin-paths")]),i("td",{style:{"text-align":"left"}},"Shimを作成するバイナリが存在するディレクトリへの相対パスの一覧を出力します。")],-1)),s[17]||(s[17]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-exec-env"},"bin/exec-env")]),i("td",{style:{"text-align":"left"}},"ツールのバイナリのShimを実行する前に環境を準備します。")],-1)),s[18]||(s[18]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-exec-path"},"bin/exec-path")]),i("td",{style:{"text-align":"left"}},"ツールの特定バージョンの実行ファイルパスを出力します。")],-1)),s[19]||(s[19]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-uninstall"},"bin/uninstall")]),i("td",{style:{"text-align":"left"}},"ツールの特定バージョンをアンインストールします。")],-1)),s[20]||(s[20]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-list-legacy-filenames"},"bin/list-legacy-filenames")]),i("td",{style:{"text-align":"left"}},[i("code",null,".ruby-version"),a("のような、レガシー構成ファイルのリストを出力します。")])],-1)),s[21]||(s[21]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-parse-legacy-file"},"bin/parse-legacy-file")]),i("td",{style:{"text-align":"left"}},"レガシーバージョンファイルのカスタムパーサーです。")],-1)),s[22]||(s[22]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-post-plugin-add"},"bin/post-plugin-add")]),i("td",{style:{"text-align":"left"}},"プラグインが追加された後に実行されるフックです。")],-1)),s[23]||(s[23]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-post-plugin-update"},"bin/post-plugin-update")]),i("td",{style:{"text-align":"left"}},"プラグインが更新された後に実行されるフックです。")],-1)),s[24]||(s[24]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-pre-plugin-remove"},"bin/pre-plugin-remove")]),i("td",{style:{"text-align":"left"}},"プラグインが削除される前に実行されるフックです。")],-1))])]),s[49]||(s[49]=e('

どのコマンドがどのスクリプトを呼び出すかについては、 各スクリプトの詳細なドキュメントを参照してください。

環境変数の概要

以下は、すべてのスクリプトで使用される環境変数の全リストです。

環境変数説明
ASDF_INSTALL_TYPEversionまたはrefです。
ASDF_INSTALL_VERSIONASDF_INSTALL_TYPEに応じてフルバージョンナンバーまたはGit Refの値が入ります。
ASDF_INSTALL_PATHツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。
ASDF_CONCURRENCYソースコードのコンパイル時に使用するコア数です。make -jのようなフラグを設定する際に便利です。
ASDF_DOWNLOAD_PATHbin/downloadによってソースコードまたはバイナリがダウンロードされる場所へのパスです。
ASDF_PLUGIN_PATHプラグインがインストールされている場所へのパスです。
ASDF_PLUGIN_SOURCE_URLプラグインソースのURLです。
ASDF_PLUGIN_PREV_REFプラグインの以前のgit-refです。
ASDF_PLUGIN_POST_REF更新後のプラグインのgit-refです。
ASDF_CMD_FILEソースとなるファイルのフルパスに解決されます。

備考

すべてのスクリプトですべての環境変数が使用できるわけではありません。 以下の各スクリプトのドキュメントで、そのスクリプトで利用可能な環境変数を確認してください。

必須スクリプト

',6)),i("h3",b,[s[26]||(s[26]=i("code",null,"bin/list-all",-1)),s[27]||(s[27]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"}),s[28]||(s[28]=a()),s[29]||(s[29]=i("a",{class:"header-anchor",href:"#bin-list-all","aria-label":'Permalink to "`bin/list-all` "'},"​",-1))]),s[50]||(s[50]=e('

説明

インストール可能なすべてのバージョンをリストします。

出力フォーマット

スペース区切りのバージョンリストの文字列を出力する必要があります。例えば次のとおりです:

txt
1.0.1 1.0.2 1.3.0 1.4

最新バージョンが末尾にくる必要があります。

asdfコアは各バージョンを1行ずつ表示するため、 いくつかのバージョンは画面外にはみ出る場合があります。

並べ替え

ウェブサイト上のリリースページからバージョンを取得する場合、 提供されている順序は正しいリリース順となっていることが多いため、 そのままの順序を使用することを推奨します。 逆順にしたければ、tscをパイプで通すだけで十分です。

どうしても並べ替えが避けられない場合、sort -Vは移植性が無いため、次のいずれかの方法を使用することを推奨します:

スクリプトで使用できる環境変数

このスクリプトに環境変数は提供されません。

このスクリプトを呼び出すコマンド

  • asdf list all <name> [version]
  • asdf list all nodejs: このスクリプトで返されるすべてのバージョンを、 1行ずつリストします。
  • asdf list all nodejs 18: このスクリプトで返されるすべてのバージョンから、 18で始まるバージョンのみフィルタし、1行ずつリストします。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/list-all"

',19)),i("h3",F,[s[30]||(s[30]=i("code",null,"bin/download",-1)),s[31]||(s[31]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"}),s[32]||(s[32]=a()),s[33]||(s[33]=i("a",{class:"header-anchor",href:"#bin-download","aria-label":'Permalink to "`bin/download` "'},"​",-1))]),s[51]||(s[51]=e('

説明

ツールの特定バージョンのソースコードまたはバイナリを、指定された場所にダウンロードします。

実装内容

  • スクリプトは、ASDF_DOWNLOAD_PATHで指定されたディレクトリに、ソースコードまたはバイナリをダウンロードする必要があります。
  • 解凍されたソースコードまたはバイナリのみを、ASDF_DOWNLOAD_PATHディレクトリに配置する必要があります。
  • 失敗した場合、ASDF_DOWNLOAD_PATHディレクトリ内に何もファイルを配置しないようにしてください。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。

レガシープラグイン

このスクリプトはすべてのプラグインで 必須 とされていますが、このスクリプトが導入される以前の"レガシー"プラグインでは、 オプション となっていました。

このスクリプトが存在しない場合、asdfはbin/installスクリプトがあると想定して、バージョンのダウンロード、かつ、インストールが実行されます。

レガシープラグインのサポートは最終的に削除される予定のため、今後作成するすべてのプラグインでこのスクリプトを含めるようにしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。
  • ASDF_DOWNLOAD_PATH: ソースコードまたはバイナリのダウンロード先のパスです。

このスクリプトを呼び出すコマンド

  • asdf install <tool> [version]
  • asdf install <tool> latest[:version]
  • asdf install nodejs 18.0.0: Node.jsのバージョン18.0.0のソースコードまたはバイナリをダウンロードし、ASDF_DOWNLOAD_PATHディレクトリに配置します。 そしてbin/installスクリプトを実行します。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}"/bin/download

',16)),i("h3",E,[s[34]||(s[34]=i("code",null,"bin/install",-1)),s[35]||(s[35]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"}),s[36]||(s[36]=a()),s[37]||(s[37]=i("a",{class:"header-anchor",href:"#bin-install","aria-label":'Permalink to "`bin/install` "'},"​",-1))]),s[52]||(s[52]=e('

説明

ツールの特定バージョンを指定された場所にインストールします。

実装内容

  • スクリプトは、指定されたバージョンをASDF_INSTALL_PATHのパスのディレクトリにインストールする必要があります。
  • Shimはデフォルトで、$ASDF_INSTALL_PATH/bin内にあるファイルに対して作成されます。 この動作は、オプションのbin/list-bin-pathsスクリプトでカスタマイズできます。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。
  • TOCTOU (Time-of-Check-to-Time-of-Use)の問題を避けるために、ツールのビルドとインストールが成功したとみなされた場合にのみ、ASDF_INSTALL_PATHにファイルを配置するようなスクリプトとしてください。

レガシープラグイン

bin/downloadスクリプトが存在しない場合、このスクリプトでは、指定されたバージョンをダウンロード、かつ、インストールをする必要があります。

0.7._以前と0.8._以降のasdfコアの互換性を保つために、ASDF_DOWNLOAD_PATH環境変数が設定されているかを確認してください。 設定されている場合は、bin/downloadスクリプトがすでにバージョンをダウンロードしていると想定し、設定されていない場合は、bin/installでソースコードをダウンロードするようにしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。
  • ASDF_CONCURRENCY: ソースコードのコンパイル時に使用するコア数です。make -jのようなフラグを設定する際に便利です。
  • ASDF_DOWNLOAD_PATH: ソースコードまたはバイナリのダウンロード先のパスです。

このスクリプトを呼び出すコマンド

  • asdf install
  • asdf install <tool>
  • asdf install <tool> [version]
  • asdf install <tool> latest[:version]
  • asdf install nodejs 18.0.0: ASDF_INSTALL_PATHディレクトリに、 Node.jsのバージョン18.0.0をインストールします。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}"/bin/install

オプションスクリプト

',15)),i("h3",y,[s[38]||(s[38]=i("code",null,"bin/latest-stable",-1)),s[39]||(s[39]=a()),l(t,{type:"warning",text:"推奨",vertical:"middle"}),s[40]||(s[40]=a()),s[41]||(s[41]=i("a",{class:"header-anchor",href:"#bin-latest-stable","aria-label":'Permalink to "`bin/latest-stable` "'},"​",-1))]),s[53]||(s[53]=e('

説明

ツールの最新安定バージョンを判定します。このスクリプトが存在しない場合、asdfコアはbin/list-allの出力をtailした結果をもとに判定しますが、ツールによってはこれが望ましくないことがあります。

実装内容

  • スクリプトは、ツールの最新安定バージョンを標準出力する必要があります。
  • 非安定版やリリース候補版は除外されるべきです。
  • フィルタクエリは、スクリプトの第1引数で提供されます。このクエリは、バージョン番号やツールプロバイダによる出力をフィルタするために使用されるべきです。
    • 例えば、rubyプラグインでのasdf list all rubyの出力は、jrubyrbxtrufflerubyなどの多くのプロバイダのRubyバージョンをリストアップします。ユーザが提供したフィルタは、セマンティックバージョンやプロバイダをフィルタするために、プラグインで使用できます。
      > asdf latest ruby\n3.2.2\n> asdf latest ruby 2\n2.7.8\n> asdf latest ruby truffleruby\ntruffleruby+graalvm-22.3.1
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf global <tool> latest: ツールのグローバルバージョンとして、当該ツールの最新安定バージョンにセットします。
  • asdf local <name> latest: ツールのローカルバージョンとして、当該ツールの最新安定バージョンにセットします。
  • asdf install <tool> latest: ツールの最新安定バージョンをインストールします。
  • asdf latest <tool> [<version>]: オプションのフィルタに基づいて、ツールの最新バージョンを出力します。
  • asdf latest --all: asdfによって管理されているすべてのツールの最新バージョンと、それらがインストールされているかどうかを出力します。

asdfからの呼び出しシグネチャ

このスクリプトは、フィルタクエリという1つの引数を受け取ります。

bash
"${plugin_path}"/bin/latest-stable "$query"

bin/help.overview

説明

プラグインおよび管理されているツールに関する概要説明を出力します。

実装内容

  • このスクリプトは、プラグインのヘルプを表示するために必要です。
  • ヘッダはasdfコア側で表示するため、スクリプト内では表示しないでください。
  • 自由な形式のテキストで出力して構いませんが、短い1段落程度の説明が理想です。
  • コアとなるasdf-vmドキュメントですでに説明されている情報は出力しないでください。
  • オペレーティングシステムと、インストールされているツールのバージョンに合わせて出力を調整する必要があります(必要に応じて、ASDF_INSTALL_VERSIONおよびASDF_INSTALL_TYPE環境変数の値を使用してください)。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf help <name> [<version>]: プラグインおよびツールのドキュメントを出力します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.overview

bin/help.deps

説明

オペレーティングシステムに合わせた依存関係のリストを出力します。依存関係を1行ごとに出力します。

bash
git\ncurl\nsed

実装内容

  • このスクリプトの出力を考慮するために、bin/help.overviewを用意する必要があります。
  • オペレーティングシステムと、インストールされているツールのバージョンに合わせて出力を調整する必要があります(必要に応じて、ASDF_INSTALL_VERSIONおよびASDF_INSTALL_TYPE環境変数の値を使用してください)。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf help <name> [<version>]: プラグインおよびツールのドキュメントを出力します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.deps

bin/help.config

説明

プラグインおよびツールで設定必須または任意設定可能な構成設定一覧を出力します。例えば、ツールのインストール・コンパイルに必要な環境変数やその他フラグについて説明します。

実装内容

  • このスクリプトの出力を考慮するために、bin/help.overviewを用意する必要があります。
  • 自由な形式のテキストで出力できます。
  • オペレーティングシステムと、インストールされているツールのバージョンに合わせて出力を調整する必要があります(必要に応じて、ASDF_INSTALL_VERSIONおよびASDF_INSTALL_TYPE環境変数の値を使用してください)。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf help <name> [<version>]: プラグインおよびツールのドキュメントを出力します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.config

説明

プラグインとツールに関連するリンクリストを出力します。リンクを1行ごとに出力します。

bash
Git Repository:	https://github.com/vlang/v\nDocumentation:	https://vlang.io

実装内容

  • このスクリプトの出力を考慮するために、bin/help.overviewを用意する必要があります。
  • リンクを1行ごとに出力してください。
  • 形式は以下のいずれかである必要があります:
    • <title>: <link>
    • または<link>のみ
  • オペレーティングシステムと、インストールされているツールのバージョンに合わせて出力を調整する必要があります(必要に応じて、ASDF_INSTALL_VERSIONおよびASDF_INSTALL_TYPE環境変数の値を使用してください)。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf help <name> [<version>]: プラグインおよびツールのドキュメントを出力します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.links

bin/list-bin-paths

説明

ツールの特定バージョンにおける、実行ファイルが含まれるディレクトリの一覧を出力します。

実装内容

  • このスクリプトが存在しない場合、asdfは"${ASDF_INSTALL_PATH}"/binディレクトリ内にあるバイナリを探し、そのバイナリ向けのShimを作成します。
  • 実行ファイルが含まれるディレクトリのパスをスペース区切りで出力してください。
  • パスはASDF_INSTALL_PATHからの相対パスである必要があります。例えば、次のような出力となります:
bash
bin tools veggies

以上の場合、下記ディレクトリ内のファイルへのShimを作成するよう、asdfへ指示されます:

  • "${ASDF_INSTALL_PATH}"/bin
  • "${ASDF_INSTALL_PATH}"/tools
  • "${ASDF_INSTALL_PATH}"/veggies

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf install <tool> [version]: バイナリへのShimを初期作成します。
  • asdf reshim <tool> <version>: バイナリへのShimを再作成します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}/bin/list-bin-paths"

bin/exec-env

説明

ツールのバイナリのShimを実行する前に環境を準備します。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf which <command>: 実行ファイルのパスを表示します。
  • asdf exec <command> [args...]: 現在のバージョンでShimコマンドを実行します。
  • asdf env <command> [util]: Shimコマンドの実行時に使用される環境において、util(デフォルト: env)を実行します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}/bin/exec-env"

bin/exec-path

ツールの特定バージョンの実行ファイルパスを取得します。 実行ファイルへの相対パスを文字列で出力する必要があります。 これにより、プラグインはShimで指定された実行ファイルパスを条件付きで上書きして返すか、 そうでなければ、Shimで指定されたデフォルトのパスを返すことができます。

説明

ツールの特定バージョンの実行ファイルパスを取得します。

実装内容

  • 実行ファイルへの相対パスを文字列で出力する必要があります。
  • Shimで指定された実行ファイルパスを条件付きで上書きして返すか、そうでなければ、Shimで指定されたデフォルトのパスを返してください。
shell
Usage:\n  plugin/bin/exec-path <install-path> <command> <executable-path>\n\nExample Call:\n  ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"\n\nOutput:\n  bin/foox

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf which <command>: 実行ファイルのパスを表示します。
  • asdf exec <command> [args...]: 現在のバージョンでShimコマンドを実行します。
  • asdf env <command> [util]: Shimコマンドの実行時に使用される環境において、util(デフォルト: env)を実行します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}/bin/exec-path" "$install_path" "$cmd" "$relative_path"

bin/uninstall

説明

ツールの特定バージョンをアンインストールします。

出力フォーマット

ユーザへの出力は、stdoutまたはstderrへ適切に送信してください。後続のコア実行によってこれらの出力が読み取られることはありません。

スクリプトで使用できる環境変数

このスクリプトに環境変数は提供されません。

このスクリプトを呼び出すコマンド

  • asdf list all <name> <version>
  • asdf uninstall nodejs 18.15.0: nodejsのバージョン18.15.0をアンインストールし、npm i -gでグローバルにインストールしたものを含むすべてのShimを削除します。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/uninstall"

bin/list-legacy-filenames

説明

ツールのバージョンを決定するために使用されるレガシー構成ファイルのリストを出力します。

実装内容

  • スペース区切りのファイル名リストを出力してください。
    bash
    .ruby-version .rvmrc
  • この内容は、"${HOME}"/.asdfrc内のlegacy_version_fileオプションを有効にしたユーザにのみ適用されます。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

ツールのバージョンを読み込むすべてのコマンドから呼び出されます。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/list-legacy-filenames"

bin/parse-legacy-file

説明

asdfによって発見されたレガシーファイルをパースして、ツールのバージョンを決定します。JavaScriptのpackage.jsonや、Go言語のgo.modのようなファイルから、バージョン番号を抽出するのに役立ちます。

実装内容

  • このスクリプトが存在しない場合、asdfは単純にレガシーファイルをcatしてバージョンを決定します。
  • 決定論的で、常に正確で同じバージョンを返す必要があります:
    • 同じレガシーファイルを解析したら、同じバージョンを返すようにしてください。
    • マシンに何がインストールされているか、また、レガシーバージョンが有効で完全かどうかは関係ありません。一部のレガシーファイルのフォーマットは適切でないときもあります。
  • 下記のように、バージョン番号を1行で出力してください:
    bash
    1.2.3

スクリプトで使用できる環境変数

このスクリプトが呼び出される前に、環境変数が設定されることはありません。

このスクリプトを呼び出すコマンド

ツールのバージョンを読み込むすべてのコマンドから呼び出されます。

asdfからの呼び出しシグネチャ

このスクリプトは、レガシーファイルの内容を読み込むために、レガシーファイルのパスという1つの引数を受け取ります。

bash
"${plugin_path}/bin/parse-legacy-file" "$file_path"

bin/post-plugin-add

説明

このスクリプトは、asdfのasdf plugin add <tool>コマンドで、プラグインが 追加 された 後に 呼び出されます。

関連するコマンドフックについても参照してください:

  • pre_asdf_plugin_add
  • pre_asdf_plugin_add_${plugin_name}
  • post_asdf_plugin_add
  • post_asdf_plugin_add_${plugin_name}

スクリプトで使用できる環境変数

  • ASDF_PLUGIN_PATH: プラグインがインストールされている場所へのパスです。
  • ASDF_PLUGIN_SOURCE_URL: プラグインソースのURLです。ローカルディレクトリパスを指定することもできます。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/post-plugin-add"

bin/post-plugin-update

説明

このスクリプトは、asdfのasdf plugin update <tool> [<git-ref>]コマンドで、 更新 されたプラグインがダウンロードされた 後に 呼び出されます。

関連するコマンドフックについても参照してください:

  • pre_asdf_plugin_updated
  • pre_asdf_plugin_updated_${plugin_name}
  • post_asdf_plugin_updated
  • post_asdf_plugin_updated_${plugin_name}

スクリプトで使用できる環境変数

  • ASDF_PLUGIN_PATH: プラグインがインストールされている場所へのパスです。
  • ASDF_PLUGIN_PREV_REF: プラグインの以前のgit-refです。
  • ASDF_PLUGIN_POST_REF: 更新後のプラグインのgit-refです。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/post-plugin-update"

bin/pre-plugin-remove

説明

このスクリプトは、asdfのasdf plugin remove <tool>コマンドで、プラグインが 削除 される 前に 呼び出されます。

関連するコマンドフックについても参照してください:

  • pre_asdf_plugin_remove
  • pre_asdf_plugin_remove_${plugin_name}
  • post_asdf_plugin_remove
  • post_asdf_plugin_remove_${plugin_name}

スクリプトで使用できる環境変数

  • ASDF_PLUGIN_PATH: プラグインがインストールされている場所へのパスです。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/pre-plugin-remove"
',172)),i("h2",m,[s[42]||(s[42]=a("asdf CLIの拡張コマンド ")),l(t,{type:"danger",text:"高度",vertical:"middle"}),s[43]||(s[43]=a()),s[44]||(s[44]=i("a",{class:"header-anchor",href:"#asdf-cliの拡張コマンド","aria-label":'Permalink to "asdf CLIの拡張コマンド "'},"​",-1))]),s[54]||(s[54]=e('

プラグイン名をサブコマンドとして使用し、 asdfコマンドラインインターフェースを通して呼び出すことのできるlib/commands/command*.bashスクリプトまたは実行ファイルを用意することで、 新しいasdfコマンドを定義することができます。

例えば、fooというプラグインがあるとすると:

shell
foo/\n  lib/commands/\n    command.bash\n    command-bat.bash\n    command-bat-man.bash\n    command-help.bash

ユーザは下記コマンドが実行できるようになります:

shell
$ asdf foo         # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash`\n$ asdf foo bar     # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar`\n$ asdf foo help    # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash`\n$ asdf foo bat man # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash`\n$ asdf foo bat baz # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz`

プラグイン開発者はこの機能を使って、ツールに関連するユーティリティを提供したり、 asdf自体のコマンド拡張プラグインを作成したりすることができます。

実行可能ビット(executable bit)が付与されている場合、 asdfの実行に代わって、当該スクリプトが実行されます。

実行可能ビット(executable bit)が付与されていない場合、asdfは当該スクリプトをBashスクリプトとしてsourceします。

$ASDF_CMD_FILE環境変数は、ソースとなるファイルのフルパスに解決されます。

haxeは、 この機能使ったプラグインの素晴らしい例です。 このプラグインは、asdf haxe neko-dylibs-linkを提供しており、 Haxeの実行ファイルが実行ディレクトリから相対的に動的ライブラリを見つけようとしてしまう問題を修正します。

プラグインのREADMEには、asdf拡張コマンドに関することを必ず記載するようにしてください。

',11)),i("h2",f,[s[45]||(s[45]=a("カスタムShimテンプレート ")),l(t,{type:"danger",text:"高度",vertical:"middle"}),s[46]||(s[46]=a()),s[47]||(s[47]=i("a",{class:"header-anchor",href:"#カスタムshimテンプレート","aria-label":'Permalink to "カスタムShimテンプレート "'},"​",-1))]),s[55]||(s[55]=e(`

警告

どうしても必要な場合にのみ使用してください。

asdfでは、カスタムShimテンプレートを使用することができます。 fooという実行ファイルに対して、プラグイン内にshims/fooファイルが存在すれば、 asdfは標準Shimテンプレートを使用する代わりに、そのファイルをコピーします。

この機能は賢く使う必要があります。

asdfコアチームが把握している限り、 この機能は公式プラグインであるElixirプラグインでのみ使用されています。 実行ファイルは、実行ファイルであると同時に、Elixirファイルとしても読み込まれます。 そのため、標準的なBashのShimを使用できないのです。

テスト

asdfでは、プラグインをテストするためのplugin-testコマンドを用意しており、下記のように使用できます:

shell
asdf plugin test <plugin_name> <plugin_url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git_ref>] [test_command...]
  • <plugin_name><plugin_url>は必須です。
  • オプションで[--asdf-tool-version <version>]を指定すると、そのバージョンのツールがインストールされます。 デフォルトは、asdf latest <plugin-name>です。
  • オプションで[--asdf-plugin-gitref <git_ref>]を指定すると、 そのコミット/ブランチ/タグでプラグイン自体をチェックアウトします。 これは、プラグインのCIにおいて、プルリクエストをテストする際に便利です。
  • オプションの[test_command...]パラメータは、インストールしたツールが正しく動作するかを確認するために実行するコマンドです。 通常は、<tool> --versionまたは<tool> --helpとなります。 例えば、NodeJSプラグインをテストするときは、次のように実行します:
    shell
    # asdf plugin test <plugin_name>  <plugin_url>                               [test_command]
    +  asdf plugin test nodejs         https://github.com/asdf-vm/asdf-nodejs.git node --version

備考

LinuxとmacOSの両方のCI環境でテストすることを推奨します。

GitHub Action

asdf-vm/actionsリポジトリでは、 GitHub上でホストされているプラグインをテストするためのGitHub Actionを提供しています。 \`.github/workflows/test.yamlのActionsワークフローの例は以下のとおりです:

yaml
name: Test
+on:
+  push:
+    branches:
+      - main
+  pull_request:
+
+jobs:
+  plugin_test:
+    name: asdf plugin test
+    strategy:
+      matrix:
+        os:
+          - ubuntu-latest
+          - macos-latest
+    runs-on: \${{ matrix.os }}
+    steps:
+      - name: asdf_plugin_test
+        uses: asdf-vm/actions/plugin-test@v2
+        with:
+          command: "<MY_TOOL> --version"

TravisCI 構成設定

以下は、.travis.ymlファイルの例です。必要に応じてカスタマイズしてください:

yaml
language: c
+script: asdf plugin test <MY_TOOL> $TRAVIS_BUILD_DIR '<MY_TOOL> --version'
+before_script:
+  - git clone https://github.com/asdf-vm/asdf.git asdf
+  - . asdf/asdf.sh
+os:
+  - linux
+  - osx

備考

他のCIを使用する場合、 プラグインの場所への相対パスを渡す必要がある場合があります:

shell
asdf plugin test <tool_name> <path> '<tool_command> --version'

APIレート制限

bin/list-allbin/latest-stableのように、コマンドが外部APIへのアクセスに依存している場合、 自動テスト中にレート制限が発生することがあります。 これを軽減するため、環境変数経由で認証トークンを提供するコードパスがあることを確認してください。 以下に例を示します:

shell
cmd="curl --silent"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"

GITHUB_API_TOKEN

GITHUB_API_TOKENを利用する際は、 まず、 public_repoアクセスのみをもつ新しいパーソナルトークンを作成してください。

次に、このトークンをCIパイプライン環境変数に追加してください。

警告

認証トークンをコードリポジトリで公開してはいけません。

プラグインショートネームインデックス

ヒント

推奨されるプラグインのインストール方法は、URLをもとに直接インストールする方法です:

shell
# asdf plugin add <name> <git_url>
+  asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

asdfの各種コマンドでgit_urlが指定されなかった場合、 asdfは正確なgit_urlを決定するために、 ショートネームインデックスリポジトリを使用します。

このリポジトリの指示に従うことで、 あなたが作成したプラグインを、 ショートネームインデックスに追加することができます。

`,27))])}const B=n(h,[["render",v]]);export{x as __pageData,B as default}; diff --git a/assets/ja-jp_plugins_create.md.CF7Jmvco.lean.js b/assets/ja-jp_plugins_create.md.CF7Jmvco.lean.js new file mode 100644 index 00000000..c0407b0a --- /dev/null +++ b/assets/ja-jp_plugins_create.md.CF7Jmvco.lean.js @@ -0,0 +1,35 @@ +import{_ as n,c as p,a2 as e,j as i,a,G as l,B as d,o}from"./chunks/framework.C9NVOr0y.js";const x=JSON.parse('{"title":"プラグインの作成","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/plugins/create.md","filePath":"ja-jp/plugins/create.md","lastUpdated":1704890757000}'),h={name:"ja-jp/plugins/create.md"},r={tabindex:"0"},k={style:{"text-align":"left"}},g={style:{"text-align":"left"}},c={style:{"text-align":"left"}},u={style:{"text-align":"left"}},b={id:"bin-list-all",tabindex:"-1"},F={id:"bin-download",tabindex:"-1"},E={id:"bin-install",tabindex:"-1"},y={id:"bin-latest-stable",tabindex:"-1"},m={id:"asdf-cliの拡張コマンド",tabindex:"-1"},f={id:"カスタムshimテンプレート",tabindex:"-1"};function v(A,s,_,C,S,D){const t=d("Badge");return o(),p("div",null,[s[48]||(s[48]=e('

プラグインの作成

プラグインとは、 言語/ツールのバージョン管理をサポートするための実行スクリプトを含めたGitリポジトリのことです。 これらのスクリプトは、asdf list-all <name>asdf install <name> <version>などの機能をサポートするコマンドを使って、 asdfによって実行されます。

クイックスタート

オリジナルのプラグインを作成するには、次の2つの方法があります:

  1. asdf-vm/asdf-plugin-templateリポジトリを使用し、 デフォルトのスクリプトが実装されたプラグインリポジトリ(名前はasdf-<tool_name>)を 生成 します。 生成できたら、 そのリポジトリをクローンしてsetup.bashのスクリプトを実行し、 テンプレートを対話的に更新していきます。
  2. asdf-<tool_name>という名前のリポジトリを自分で立ち上げ、 以降に記載されている必要なスクリプトを実装します。

プラグインスクリプトの鉄則

  • スクリプト内で他のasdfコマンドを呼び出してはいけません
  • シェルのツール/コマンドへの依存関係を小さく保つようにしてください。
  • 移植性のないツールやコマンドフラグの使用は避けてください。 例えば、sort -Vなどです。 asdfコアの禁止コマンド一覧もご覧ください。

スクリプトの概要

以下は、asdfから呼び出せるスクリプトの全リストです。

',9)),i("table",r,[s[25]||(s[25]=i("thead",null,[i("tr",null,[i("th",{style:{"text-align":"left"}},"スクリプト"),i("th",{style:{"text-align":"left"}},"説明")])],-1)),i("tbody",null,[i("tr",null,[i("td",k,[s[0]||(s[0]=i("a",{href:"#bin-list-all"},"bin/list-all",-1)),s[1]||(s[1]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"})]),s[2]||(s[2]=i("td",{style:{"text-align":"left"}},"インストール可能なすべてのバージョンをリストします。",-1))]),i("tr",null,[i("td",g,[s[3]||(s[3]=i("a",{href:"#bin-download"},"bin/download",-1)),s[4]||(s[4]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"})]),s[5]||(s[5]=i("td",{style:{"text-align":"left"}},"ツールの特定バージョンのソースコードまたはバイナリをダウンロードします。",-1))]),i("tr",null,[i("td",c,[s[6]||(s[6]=i("a",{href:"#bin-install"},"bin/install",-1)),s[7]||(s[7]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"})]),s[8]||(s[8]=i("td",{style:{"text-align":"left"}},"ツールの特定バージョンをインストールします。",-1))]),i("tr",null,[i("td",u,[s[9]||(s[9]=i("a",{href:"#bin-latest-stable"},"bin/latest-stable",-1)),s[10]||(s[10]=a()),l(t,{type:"warning",text:"推奨",vertical:"middle"})]),s[11]||(s[11]=i("td",{style:{"text-align":"left"}},"指定されたツールの最新安定バージョンをリストします。",-1))]),s[12]||(s[12]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-help.overview"},"bin/help.overview")]),i("td",{style:{"text-align":"left"}},"プラグインおよびツールに関する概要説明を出力します。")],-1)),s[13]||(s[13]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-help.deps"},"bin/help.deps")]),i("td",{style:{"text-align":"left"}},"オペレーティングシステムに合わせた依存関係のリストを出力します。")],-1)),s[14]||(s[14]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-help.config"},"bin/help.config")]),i("td",{style:{"text-align":"left"}},"プラグインおよびツールの構成設定一覧を出力します。")],-1)),s[15]||(s[15]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-help.links"},"bin/help.links")]),i("td",{style:{"text-align":"left"}},"プラグインとツールに関連するリンクリストを出力します。")],-1)),s[16]||(s[16]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-list-bin-paths"},"bin/list-bin-paths")]),i("td",{style:{"text-align":"left"}},"Shimを作成するバイナリが存在するディレクトリへの相対パスの一覧を出力します。")],-1)),s[17]||(s[17]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-exec-env"},"bin/exec-env")]),i("td",{style:{"text-align":"left"}},"ツールのバイナリのShimを実行する前に環境を準備します。")],-1)),s[18]||(s[18]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-exec-path"},"bin/exec-path")]),i("td",{style:{"text-align":"left"}},"ツールの特定バージョンの実行ファイルパスを出力します。")],-1)),s[19]||(s[19]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-uninstall"},"bin/uninstall")]),i("td",{style:{"text-align":"left"}},"ツールの特定バージョンをアンインストールします。")],-1)),s[20]||(s[20]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-list-legacy-filenames"},"bin/list-legacy-filenames")]),i("td",{style:{"text-align":"left"}},[i("code",null,".ruby-version"),a("のような、レガシー構成ファイルのリストを出力します。")])],-1)),s[21]||(s[21]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-parse-legacy-file"},"bin/parse-legacy-file")]),i("td",{style:{"text-align":"left"}},"レガシーバージョンファイルのカスタムパーサーです。")],-1)),s[22]||(s[22]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-post-plugin-add"},"bin/post-plugin-add")]),i("td",{style:{"text-align":"left"}},"プラグインが追加された後に実行されるフックです。")],-1)),s[23]||(s[23]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-post-plugin-update"},"bin/post-plugin-update")]),i("td",{style:{"text-align":"left"}},"プラグインが更新された後に実行されるフックです。")],-1)),s[24]||(s[24]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-pre-plugin-remove"},"bin/pre-plugin-remove")]),i("td",{style:{"text-align":"left"}},"プラグインが削除される前に実行されるフックです。")],-1))])]),s[49]||(s[49]=e('

どのコマンドがどのスクリプトを呼び出すかについては、 各スクリプトの詳細なドキュメントを参照してください。

環境変数の概要

以下は、すべてのスクリプトで使用される環境変数の全リストです。

環境変数説明
ASDF_INSTALL_TYPEversionまたはrefです。
ASDF_INSTALL_VERSIONASDF_INSTALL_TYPEに応じてフルバージョンナンバーまたはGit Refの値が入ります。
ASDF_INSTALL_PATHツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。
ASDF_CONCURRENCYソースコードのコンパイル時に使用するコア数です。make -jのようなフラグを設定する際に便利です。
ASDF_DOWNLOAD_PATHbin/downloadによってソースコードまたはバイナリがダウンロードされる場所へのパスです。
ASDF_PLUGIN_PATHプラグインがインストールされている場所へのパスです。
ASDF_PLUGIN_SOURCE_URLプラグインソースのURLです。
ASDF_PLUGIN_PREV_REFプラグインの以前のgit-refです。
ASDF_PLUGIN_POST_REF更新後のプラグインのgit-refです。
ASDF_CMD_FILEソースとなるファイルのフルパスに解決されます。

備考

すべてのスクリプトですべての環境変数が使用できるわけではありません。 以下の各スクリプトのドキュメントで、そのスクリプトで利用可能な環境変数を確認してください。

必須スクリプト

',6)),i("h3",b,[s[26]||(s[26]=i("code",null,"bin/list-all",-1)),s[27]||(s[27]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"}),s[28]||(s[28]=a()),s[29]||(s[29]=i("a",{class:"header-anchor",href:"#bin-list-all","aria-label":'Permalink to "`bin/list-all` "'},"​",-1))]),s[50]||(s[50]=e('

説明

インストール可能なすべてのバージョンをリストします。

出力フォーマット

スペース区切りのバージョンリストの文字列を出力する必要があります。例えば次のとおりです:

txt
1.0.1 1.0.2 1.3.0 1.4

最新バージョンが末尾にくる必要があります。

asdfコアは各バージョンを1行ずつ表示するため、 いくつかのバージョンは画面外にはみ出る場合があります。

並べ替え

ウェブサイト上のリリースページからバージョンを取得する場合、 提供されている順序は正しいリリース順となっていることが多いため、 そのままの順序を使用することを推奨します。 逆順にしたければ、tscをパイプで通すだけで十分です。

どうしても並べ替えが避けられない場合、sort -Vは移植性が無いため、次のいずれかの方法を使用することを推奨します:

スクリプトで使用できる環境変数

このスクリプトに環境変数は提供されません。

このスクリプトを呼び出すコマンド

  • asdf list all <name> [version]
  • asdf list all nodejs: このスクリプトで返されるすべてのバージョンを、 1行ずつリストします。
  • asdf list all nodejs 18: このスクリプトで返されるすべてのバージョンから、 18で始まるバージョンのみフィルタし、1行ずつリストします。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/list-all"

',19)),i("h3",F,[s[30]||(s[30]=i("code",null,"bin/download",-1)),s[31]||(s[31]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"}),s[32]||(s[32]=a()),s[33]||(s[33]=i("a",{class:"header-anchor",href:"#bin-download","aria-label":'Permalink to "`bin/download` "'},"​",-1))]),s[51]||(s[51]=e('

説明

ツールの特定バージョンのソースコードまたはバイナリを、指定された場所にダウンロードします。

実装内容

  • スクリプトは、ASDF_DOWNLOAD_PATHで指定されたディレクトリに、ソースコードまたはバイナリをダウンロードする必要があります。
  • 解凍されたソースコードまたはバイナリのみを、ASDF_DOWNLOAD_PATHディレクトリに配置する必要があります。
  • 失敗した場合、ASDF_DOWNLOAD_PATHディレクトリ内に何もファイルを配置しないようにしてください。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。

レガシープラグイン

このスクリプトはすべてのプラグインで 必須 とされていますが、このスクリプトが導入される以前の"レガシー"プラグインでは、 オプション となっていました。

このスクリプトが存在しない場合、asdfはbin/installスクリプトがあると想定して、バージョンのダウンロード、かつ、インストールが実行されます。

レガシープラグインのサポートは最終的に削除される予定のため、今後作成するすべてのプラグインでこのスクリプトを含めるようにしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。
  • ASDF_DOWNLOAD_PATH: ソースコードまたはバイナリのダウンロード先のパスです。

このスクリプトを呼び出すコマンド

  • asdf install <tool> [version]
  • asdf install <tool> latest[:version]
  • asdf install nodejs 18.0.0: Node.jsのバージョン18.0.0のソースコードまたはバイナリをダウンロードし、ASDF_DOWNLOAD_PATHディレクトリに配置します。 そしてbin/installスクリプトを実行します。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}"/bin/download

',16)),i("h3",E,[s[34]||(s[34]=i("code",null,"bin/install",-1)),s[35]||(s[35]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"}),s[36]||(s[36]=a()),s[37]||(s[37]=i("a",{class:"header-anchor",href:"#bin-install","aria-label":'Permalink to "`bin/install` "'},"​",-1))]),s[52]||(s[52]=e('

説明

ツールの特定バージョンを指定された場所にインストールします。

実装内容

  • スクリプトは、指定されたバージョンをASDF_INSTALL_PATHのパスのディレクトリにインストールする必要があります。
  • Shimはデフォルトで、$ASDF_INSTALL_PATH/bin内にあるファイルに対して作成されます。 この動作は、オプションのbin/list-bin-pathsスクリプトでカスタマイズできます。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。
  • TOCTOU (Time-of-Check-to-Time-of-Use)の問題を避けるために、ツールのビルドとインストールが成功したとみなされた場合にのみ、ASDF_INSTALL_PATHにファイルを配置するようなスクリプトとしてください。

レガシープラグイン

bin/downloadスクリプトが存在しない場合、このスクリプトでは、指定されたバージョンをダウンロード、かつ、インストールをする必要があります。

0.7._以前と0.8._以降のasdfコアの互換性を保つために、ASDF_DOWNLOAD_PATH環境変数が設定されているかを確認してください。 設定されている場合は、bin/downloadスクリプトがすでにバージョンをダウンロードしていると想定し、設定されていない場合は、bin/installでソースコードをダウンロードするようにしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。
  • ASDF_CONCURRENCY: ソースコードのコンパイル時に使用するコア数です。make -jのようなフラグを設定する際に便利です。
  • ASDF_DOWNLOAD_PATH: ソースコードまたはバイナリのダウンロード先のパスです。

このスクリプトを呼び出すコマンド

  • asdf install
  • asdf install <tool>
  • asdf install <tool> [version]
  • asdf install <tool> latest[:version]
  • asdf install nodejs 18.0.0: ASDF_INSTALL_PATHディレクトリに、 Node.jsのバージョン18.0.0をインストールします。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}"/bin/install

オプションスクリプト

',15)),i("h3",y,[s[38]||(s[38]=i("code",null,"bin/latest-stable",-1)),s[39]||(s[39]=a()),l(t,{type:"warning",text:"推奨",vertical:"middle"}),s[40]||(s[40]=a()),s[41]||(s[41]=i("a",{class:"header-anchor",href:"#bin-latest-stable","aria-label":'Permalink to "`bin/latest-stable` "'},"​",-1))]),s[53]||(s[53]=e('

説明

ツールの最新安定バージョンを判定します。このスクリプトが存在しない場合、asdfコアはbin/list-allの出力をtailした結果をもとに判定しますが、ツールによってはこれが望ましくないことがあります。

実装内容

  • スクリプトは、ツールの最新安定バージョンを標準出力する必要があります。
  • 非安定版やリリース候補版は除外されるべきです。
  • フィルタクエリは、スクリプトの第1引数で提供されます。このクエリは、バージョン番号やツールプロバイダによる出力をフィルタするために使用されるべきです。
    • 例えば、rubyプラグインでのasdf list all rubyの出力は、jrubyrbxtrufflerubyなどの多くのプロバイダのRubyバージョンをリストアップします。ユーザが提供したフィルタは、セマンティックバージョンやプロバイダをフィルタするために、プラグインで使用できます。
      > asdf latest ruby\n3.2.2\n> asdf latest ruby 2\n2.7.8\n> asdf latest ruby truffleruby\ntruffleruby+graalvm-22.3.1
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf global <tool> latest: ツールのグローバルバージョンとして、当該ツールの最新安定バージョンにセットします。
  • asdf local <name> latest: ツールのローカルバージョンとして、当該ツールの最新安定バージョンにセットします。
  • asdf install <tool> latest: ツールの最新安定バージョンをインストールします。
  • asdf latest <tool> [<version>]: オプションのフィルタに基づいて、ツールの最新バージョンを出力します。
  • asdf latest --all: asdfによって管理されているすべてのツールの最新バージョンと、それらがインストールされているかどうかを出力します。

asdfからの呼び出しシグネチャ

このスクリプトは、フィルタクエリという1つの引数を受け取ります。

bash
"${plugin_path}"/bin/latest-stable "$query"

bin/help.overview

説明

プラグインおよび管理されているツールに関する概要説明を出力します。

実装内容

  • このスクリプトは、プラグインのヘルプを表示するために必要です。
  • ヘッダはasdfコア側で表示するため、スクリプト内では表示しないでください。
  • 自由な形式のテキストで出力して構いませんが、短い1段落程度の説明が理想です。
  • コアとなるasdf-vmドキュメントですでに説明されている情報は出力しないでください。
  • オペレーティングシステムと、インストールされているツールのバージョンに合わせて出力を調整する必要があります(必要に応じて、ASDF_INSTALL_VERSIONおよびASDF_INSTALL_TYPE環境変数の値を使用してください)。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf help <name> [<version>]: プラグインおよびツールのドキュメントを出力します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.overview

bin/help.deps

説明

オペレーティングシステムに合わせた依存関係のリストを出力します。依存関係を1行ごとに出力します。

bash
git\ncurl\nsed

実装内容

  • このスクリプトの出力を考慮するために、bin/help.overviewを用意する必要があります。
  • オペレーティングシステムと、インストールされているツールのバージョンに合わせて出力を調整する必要があります(必要に応じて、ASDF_INSTALL_VERSIONおよびASDF_INSTALL_TYPE環境変数の値を使用してください)。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf help <name> [<version>]: プラグインおよびツールのドキュメントを出力します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.deps

bin/help.config

説明

プラグインおよびツールで設定必須または任意設定可能な構成設定一覧を出力します。例えば、ツールのインストール・コンパイルに必要な環境変数やその他フラグについて説明します。

実装内容

  • このスクリプトの出力を考慮するために、bin/help.overviewを用意する必要があります。
  • 自由な形式のテキストで出力できます。
  • オペレーティングシステムと、インストールされているツールのバージョンに合わせて出力を調整する必要があります(必要に応じて、ASDF_INSTALL_VERSIONおよびASDF_INSTALL_TYPE環境変数の値を使用してください)。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf help <name> [<version>]: プラグインおよびツールのドキュメントを出力します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.config

説明

プラグインとツールに関連するリンクリストを出力します。リンクを1行ごとに出力します。

bash
Git Repository:	https://github.com/vlang/v\nDocumentation:	https://vlang.io

実装内容

  • このスクリプトの出力を考慮するために、bin/help.overviewを用意する必要があります。
  • リンクを1行ごとに出力してください。
  • 形式は以下のいずれかである必要があります:
    • <title>: <link>
    • または<link>のみ
  • オペレーティングシステムと、インストールされているツールのバージョンに合わせて出力を調整する必要があります(必要に応じて、ASDF_INSTALL_VERSIONおよびASDF_INSTALL_TYPE環境変数の値を使用してください)。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf help <name> [<version>]: プラグインおよびツールのドキュメントを出力します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.links

bin/list-bin-paths

説明

ツールの特定バージョンにおける、実行ファイルが含まれるディレクトリの一覧を出力します。

実装内容

  • このスクリプトが存在しない場合、asdfは"${ASDF_INSTALL_PATH}"/binディレクトリ内にあるバイナリを探し、そのバイナリ向けのShimを作成します。
  • 実行ファイルが含まれるディレクトリのパスをスペース区切りで出力してください。
  • パスはASDF_INSTALL_PATHからの相対パスである必要があります。例えば、次のような出力となります:
bash
bin tools veggies

以上の場合、下記ディレクトリ内のファイルへのShimを作成するよう、asdfへ指示されます:

  • "${ASDF_INSTALL_PATH}"/bin
  • "${ASDF_INSTALL_PATH}"/tools
  • "${ASDF_INSTALL_PATH}"/veggies

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf install <tool> [version]: バイナリへのShimを初期作成します。
  • asdf reshim <tool> <version>: バイナリへのShimを再作成します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}/bin/list-bin-paths"

bin/exec-env

説明

ツールのバイナリのShimを実行する前に環境を準備します。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf which <command>: 実行ファイルのパスを表示します。
  • asdf exec <command> [args...]: 現在のバージョンでShimコマンドを実行します。
  • asdf env <command> [util]: Shimコマンドの実行時に使用される環境において、util(デフォルト: env)を実行します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}/bin/exec-env"

bin/exec-path

ツールの特定バージョンの実行ファイルパスを取得します。 実行ファイルへの相対パスを文字列で出力する必要があります。 これにより、プラグインはShimで指定された実行ファイルパスを条件付きで上書きして返すか、 そうでなければ、Shimで指定されたデフォルトのパスを返すことができます。

説明

ツールの特定バージョンの実行ファイルパスを取得します。

実装内容

  • 実行ファイルへの相対パスを文字列で出力する必要があります。
  • Shimで指定された実行ファイルパスを条件付きで上書きして返すか、そうでなければ、Shimで指定されたデフォルトのパスを返してください。
shell
Usage:\n  plugin/bin/exec-path <install-path> <command> <executable-path>\n\nExample Call:\n  ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"\n\nOutput:\n  bin/foox

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf which <command>: 実行ファイルのパスを表示します。
  • asdf exec <command> [args...]: 現在のバージョンでShimコマンドを実行します。
  • asdf env <command> [util]: Shimコマンドの実行時に使用される環境において、util(デフォルト: env)を実行します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}/bin/exec-path" "$install_path" "$cmd" "$relative_path"

bin/uninstall

説明

ツールの特定バージョンをアンインストールします。

出力フォーマット

ユーザへの出力は、stdoutまたはstderrへ適切に送信してください。後続のコア実行によってこれらの出力が読み取られることはありません。

スクリプトで使用できる環境変数

このスクリプトに環境変数は提供されません。

このスクリプトを呼び出すコマンド

  • asdf list all <name> <version>
  • asdf uninstall nodejs 18.15.0: nodejsのバージョン18.15.0をアンインストールし、npm i -gでグローバルにインストールしたものを含むすべてのShimを削除します。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/uninstall"

bin/list-legacy-filenames

説明

ツールのバージョンを決定するために使用されるレガシー構成ファイルのリストを出力します。

実装内容

  • スペース区切りのファイル名リストを出力してください。
    bash
    .ruby-version .rvmrc
  • この内容は、"${HOME}"/.asdfrc内のlegacy_version_fileオプションを有効にしたユーザにのみ適用されます。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

ツールのバージョンを読み込むすべてのコマンドから呼び出されます。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/list-legacy-filenames"

bin/parse-legacy-file

説明

asdfによって発見されたレガシーファイルをパースして、ツールのバージョンを決定します。JavaScriptのpackage.jsonや、Go言語のgo.modのようなファイルから、バージョン番号を抽出するのに役立ちます。

実装内容

  • このスクリプトが存在しない場合、asdfは単純にレガシーファイルをcatしてバージョンを決定します。
  • 決定論的で、常に正確で同じバージョンを返す必要があります:
    • 同じレガシーファイルを解析したら、同じバージョンを返すようにしてください。
    • マシンに何がインストールされているか、また、レガシーバージョンが有効で完全かどうかは関係ありません。一部のレガシーファイルのフォーマットは適切でないときもあります。
  • 下記のように、バージョン番号を1行で出力してください:
    bash
    1.2.3

スクリプトで使用できる環境変数

このスクリプトが呼び出される前に、環境変数が設定されることはありません。

このスクリプトを呼び出すコマンド

ツールのバージョンを読み込むすべてのコマンドから呼び出されます。

asdfからの呼び出しシグネチャ

このスクリプトは、レガシーファイルの内容を読み込むために、レガシーファイルのパスという1つの引数を受け取ります。

bash
"${plugin_path}/bin/parse-legacy-file" "$file_path"

bin/post-plugin-add

説明

このスクリプトは、asdfのasdf plugin add <tool>コマンドで、プラグインが 追加 された 後に 呼び出されます。

関連するコマンドフックについても参照してください:

  • pre_asdf_plugin_add
  • pre_asdf_plugin_add_${plugin_name}
  • post_asdf_plugin_add
  • post_asdf_plugin_add_${plugin_name}

スクリプトで使用できる環境変数

  • ASDF_PLUGIN_PATH: プラグインがインストールされている場所へのパスです。
  • ASDF_PLUGIN_SOURCE_URL: プラグインソースのURLです。ローカルディレクトリパスを指定することもできます。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/post-plugin-add"

bin/post-plugin-update

説明

このスクリプトは、asdfのasdf plugin update <tool> [<git-ref>]コマンドで、 更新 されたプラグインがダウンロードされた 後に 呼び出されます。

関連するコマンドフックについても参照してください:

  • pre_asdf_plugin_updated
  • pre_asdf_plugin_updated_${plugin_name}
  • post_asdf_plugin_updated
  • post_asdf_plugin_updated_${plugin_name}

スクリプトで使用できる環境変数

  • ASDF_PLUGIN_PATH: プラグインがインストールされている場所へのパスです。
  • ASDF_PLUGIN_PREV_REF: プラグインの以前のgit-refです。
  • ASDF_PLUGIN_POST_REF: 更新後のプラグインのgit-refです。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/post-plugin-update"

bin/pre-plugin-remove

説明

このスクリプトは、asdfのasdf plugin remove <tool>コマンドで、プラグインが 削除 される 前に 呼び出されます。

関連するコマンドフックについても参照してください:

  • pre_asdf_plugin_remove
  • pre_asdf_plugin_remove_${plugin_name}
  • post_asdf_plugin_remove
  • post_asdf_plugin_remove_${plugin_name}

スクリプトで使用できる環境変数

  • ASDF_PLUGIN_PATH: プラグインがインストールされている場所へのパスです。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/pre-plugin-remove"
',172)),i("h2",m,[s[42]||(s[42]=a("asdf CLIの拡張コマンド ")),l(t,{type:"danger",text:"高度",vertical:"middle"}),s[43]||(s[43]=a()),s[44]||(s[44]=i("a",{class:"header-anchor",href:"#asdf-cliの拡張コマンド","aria-label":'Permalink to "asdf CLIの拡張コマンド "'},"​",-1))]),s[54]||(s[54]=e('

プラグイン名をサブコマンドとして使用し、 asdfコマンドラインインターフェースを通して呼び出すことのできるlib/commands/command*.bashスクリプトまたは実行ファイルを用意することで、 新しいasdfコマンドを定義することができます。

例えば、fooというプラグインがあるとすると:

shell
foo/\n  lib/commands/\n    command.bash\n    command-bat.bash\n    command-bat-man.bash\n    command-help.bash

ユーザは下記コマンドが実行できるようになります:

shell
$ asdf foo         # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash`\n$ asdf foo bar     # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar`\n$ asdf foo help    # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash`\n$ asdf foo bat man # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash`\n$ asdf foo bat baz # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz`

プラグイン開発者はこの機能を使って、ツールに関連するユーティリティを提供したり、 asdf自体のコマンド拡張プラグインを作成したりすることができます。

実行可能ビット(executable bit)が付与されている場合、 asdfの実行に代わって、当該スクリプトが実行されます。

実行可能ビット(executable bit)が付与されていない場合、asdfは当該スクリプトをBashスクリプトとしてsourceします。

$ASDF_CMD_FILE環境変数は、ソースとなるファイルのフルパスに解決されます。

haxeは、 この機能使ったプラグインの素晴らしい例です。 このプラグインは、asdf haxe neko-dylibs-linkを提供しており、 Haxeの実行ファイルが実行ディレクトリから相対的に動的ライブラリを見つけようとしてしまう問題を修正します。

プラグインのREADMEには、asdf拡張コマンドに関することを必ず記載するようにしてください。

',11)),i("h2",f,[s[45]||(s[45]=a("カスタムShimテンプレート ")),l(t,{type:"danger",text:"高度",vertical:"middle"}),s[46]||(s[46]=a()),s[47]||(s[47]=i("a",{class:"header-anchor",href:"#カスタムshimテンプレート","aria-label":'Permalink to "カスタムShimテンプレート "'},"​",-1))]),s[55]||(s[55]=e(`

警告

どうしても必要な場合にのみ使用してください。

asdfでは、カスタムShimテンプレートを使用することができます。 fooという実行ファイルに対して、プラグイン内にshims/fooファイルが存在すれば、 asdfは標準Shimテンプレートを使用する代わりに、そのファイルをコピーします。

この機能は賢く使う必要があります。

asdfコアチームが把握している限り、 この機能は公式プラグインであるElixirプラグインでのみ使用されています。 実行ファイルは、実行ファイルであると同時に、Elixirファイルとしても読み込まれます。 そのため、標準的なBashのShimを使用できないのです。

テスト

asdfでは、プラグインをテストするためのplugin-testコマンドを用意しており、下記のように使用できます:

shell
asdf plugin test <plugin_name> <plugin_url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git_ref>] [test_command...]
  • <plugin_name><plugin_url>は必須です。
  • オプションで[--asdf-tool-version <version>]を指定すると、そのバージョンのツールがインストールされます。 デフォルトは、asdf latest <plugin-name>です。
  • オプションで[--asdf-plugin-gitref <git_ref>]を指定すると、 そのコミット/ブランチ/タグでプラグイン自体をチェックアウトします。 これは、プラグインのCIにおいて、プルリクエストをテストする際に便利です。
  • オプションの[test_command...]パラメータは、インストールしたツールが正しく動作するかを確認するために実行するコマンドです。 通常は、<tool> --versionまたは<tool> --helpとなります。 例えば、NodeJSプラグインをテストするときは、次のように実行します:
    shell
    # asdf plugin test <plugin_name>  <plugin_url>                               [test_command]
    +  asdf plugin test nodejs         https://github.com/asdf-vm/asdf-nodejs.git node --version

備考

LinuxとmacOSの両方のCI環境でテストすることを推奨します。

GitHub Action

asdf-vm/actionsリポジトリでは、 GitHub上でホストされているプラグインをテストするためのGitHub Actionを提供しています。 \`.github/workflows/test.yamlのActionsワークフローの例は以下のとおりです:

yaml
name: Test
+on:
+  push:
+    branches:
+      - main
+  pull_request:
+
+jobs:
+  plugin_test:
+    name: asdf plugin test
+    strategy:
+      matrix:
+        os:
+          - ubuntu-latest
+          - macos-latest
+    runs-on: \${{ matrix.os }}
+    steps:
+      - name: asdf_plugin_test
+        uses: asdf-vm/actions/plugin-test@v2
+        with:
+          command: "<MY_TOOL> --version"

TravisCI 構成設定

以下は、.travis.ymlファイルの例です。必要に応じてカスタマイズしてください:

yaml
language: c
+script: asdf plugin test <MY_TOOL> $TRAVIS_BUILD_DIR '<MY_TOOL> --version'
+before_script:
+  - git clone https://github.com/asdf-vm/asdf.git asdf
+  - . asdf/asdf.sh
+os:
+  - linux
+  - osx

備考

他のCIを使用する場合、 プラグインの場所への相対パスを渡す必要がある場合があります:

shell
asdf plugin test <tool_name> <path> '<tool_command> --version'

APIレート制限

bin/list-allbin/latest-stableのように、コマンドが外部APIへのアクセスに依存している場合、 自動テスト中にレート制限が発生することがあります。 これを軽減するため、環境変数経由で認証トークンを提供するコードパスがあることを確認してください。 以下に例を示します:

shell
cmd="curl --silent"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"

GITHUB_API_TOKEN

GITHUB_API_TOKENを利用する際は、 まず、 public_repoアクセスのみをもつ新しいパーソナルトークンを作成してください。

次に、このトークンをCIパイプライン環境変数に追加してください。

警告

認証トークンをコードリポジトリで公開してはいけません。

プラグインショートネームインデックス

ヒント

推奨されるプラグインのインストール方法は、URLをもとに直接インストールする方法です:

shell
# asdf plugin add <name> <git_url>
+  asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

asdfの各種コマンドでgit_urlが指定されなかった場合、 asdfは正確なgit_urlを決定するために、 ショートネームインデックスリポジトリを使用します。

このリポジトリの指示に従うことで、 あなたが作成したプラグインを、 ショートネームインデックスに追加することができます。

`,27))])}const B=n(h,[["render",v]]);export{x as __pageData,B as default}; diff --git a/assets/manage_commands.md.BSbw1HQ9.js b/assets/manage_commands.md.BSbw1HQ9.js new file mode 100644 index 00000000..78d7c5b1 --- /dev/null +++ b/assets/manage_commands.md.BSbw1HQ9.js @@ -0,0 +1,66 @@ +import{_ as a,c as n,a2 as e,o as l}from"./chunks/framework.C9NVOr0y.js";const m=JSON.parse('{"title":"All Commands","description":"","frontmatter":{},"headers":[],"relativePath":"manage/commands.md","filePath":"manage/commands.md","lastUpdated":1687069487000}'),p={name:"manage/commands.md"};function t(i,s,o,c,r,d){return l(),n("div",null,s[0]||(s[0]=[e(`

All Commands

The list of all commands available in asdf. This list is the asdf help command text.

txt
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>]      Add a plugin from the plugin repo OR,
+                                        add a Git repo as a plugin by
+                                        specifying the name and repo url
+asdf plugin list [--urls] [--refs]      List installed plugins. Optionally show
+                                        git urls and git-ref
+asdf plugin list all                    List plugins registered on asdf-plugins
+                                        repository with URLs
+asdf plugin remove <name>               Remove plugin and package versions
+asdf plugin update <name> [<git-ref>]   Update a plugin to latest commit on
+                                        default branch or a particular git-ref
+asdf plugin update --all                Update all plugins to latest commit on
+                                        default branch
+
+
+MANAGE PACKAGES
+asdf current                            Display current version set or being
+                                        used for all packages
+asdf current <name>                     Display current version set or being
+                                        used for package
+asdf global <name> <version>            Set the package global version
+asdf global <name> latest[:<version>]   Set the package global version to the
+                                        latest provided version
+asdf help <name> [<version>]            Output documentation for plugin and tool
+asdf install                            Install all the package versions listed
+                                        in the .tool-versions file
+asdf install <name>                     Install one tool at the version
+                                        specified in the .tool-versions file
+asdf install <name> <version>           Install a specific version of a package
+asdf install <name> latest[:<version>]  Install the latest stable version of a
+                                        package, or with optional version,
+                                        install the latest stable version that
+                                        begins with the given string
+asdf latest <name> [<version>]          Show latest stable version of a package
+asdf latest --all                       Show latest stable version of all the
+                                        packages and if they are installed
+asdf list <name> [version]              List installed versions of a package and
+                                        optionally filter the versions
+asdf list all <name> [<version>]        List all versions of a package and
+                                        optionally filter the returned versions
+asdf local <name> <version>             Set the package local version
+asdf local <name> latest[:<version>]    Set the package local version to the
+                                        latest provided version
+asdf shell <name> <version>             Set the package version to
+                                        \`ASDF_\${LANG}_VERSION\` in the current shell
+asdf uninstall <name> <version>         Remove a specific version of a package
+asdf where <name> [<version>]           Display install path for an installed
+                                        or current version
+asdf which <command>                    Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...]           Executes the command shim for current version
+asdf env <command> [util]               Runs util (default: \`env\`) inside the
+                                        environment used for command shim execution.
+asdf info                               Print OS, Shell and ASDF debug information.
+asdf version                            Print the currently installed version of ASDF
+asdf reshim <name> <version>            Recreate shims for version of a package
+asdf shim-versions <command>            List the plugins and versions that
+                                        provide a command
+asdf update                             Update asdf to the latest stable release
+asdf update --head                      Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs:   https://asdf-vm.com
`,3)]))}const f=a(p,[["render",t]]);export{m as __pageData,f as default}; diff --git a/assets/manage_commands.md.BSbw1HQ9.lean.js b/assets/manage_commands.md.BSbw1HQ9.lean.js new file mode 100644 index 00000000..78d7c5b1 --- /dev/null +++ b/assets/manage_commands.md.BSbw1HQ9.lean.js @@ -0,0 +1,66 @@ +import{_ as a,c as n,a2 as e,o as l}from"./chunks/framework.C9NVOr0y.js";const m=JSON.parse('{"title":"All Commands","description":"","frontmatter":{},"headers":[],"relativePath":"manage/commands.md","filePath":"manage/commands.md","lastUpdated":1687069487000}'),p={name:"manage/commands.md"};function t(i,s,o,c,r,d){return l(),n("div",null,s[0]||(s[0]=[e(`

All Commands

The list of all commands available in asdf. This list is the asdf help command text.

txt
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>]      Add a plugin from the plugin repo OR,
+                                        add a Git repo as a plugin by
+                                        specifying the name and repo url
+asdf plugin list [--urls] [--refs]      List installed plugins. Optionally show
+                                        git urls and git-ref
+asdf plugin list all                    List plugins registered on asdf-plugins
+                                        repository with URLs
+asdf plugin remove <name>               Remove plugin and package versions
+asdf plugin update <name> [<git-ref>]   Update a plugin to latest commit on
+                                        default branch or a particular git-ref
+asdf plugin update --all                Update all plugins to latest commit on
+                                        default branch
+
+
+MANAGE PACKAGES
+asdf current                            Display current version set or being
+                                        used for all packages
+asdf current <name>                     Display current version set or being
+                                        used for package
+asdf global <name> <version>            Set the package global version
+asdf global <name> latest[:<version>]   Set the package global version to the
+                                        latest provided version
+asdf help <name> [<version>]            Output documentation for plugin and tool
+asdf install                            Install all the package versions listed
+                                        in the .tool-versions file
+asdf install <name>                     Install one tool at the version
+                                        specified in the .tool-versions file
+asdf install <name> <version>           Install a specific version of a package
+asdf install <name> latest[:<version>]  Install the latest stable version of a
+                                        package, or with optional version,
+                                        install the latest stable version that
+                                        begins with the given string
+asdf latest <name> [<version>]          Show latest stable version of a package
+asdf latest --all                       Show latest stable version of all the
+                                        packages and if they are installed
+asdf list <name> [version]              List installed versions of a package and
+                                        optionally filter the versions
+asdf list all <name> [<version>]        List all versions of a package and
+                                        optionally filter the returned versions
+asdf local <name> <version>             Set the package local version
+asdf local <name> latest[:<version>]    Set the package local version to the
+                                        latest provided version
+asdf shell <name> <version>             Set the package version to
+                                        \`ASDF_\${LANG}_VERSION\` in the current shell
+asdf uninstall <name> <version>         Remove a specific version of a package
+asdf where <name> [<version>]           Display install path for an installed
+                                        or current version
+asdf which <command>                    Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...]           Executes the command shim for current version
+asdf env <command> [util]               Runs util (default: \`env\`) inside the
+                                        environment used for command shim execution.
+asdf info                               Print OS, Shell and ASDF debug information.
+asdf version                            Print the currently installed version of ASDF
+asdf reshim <name> <version>            Recreate shims for version of a package
+asdf shim-versions <command>            List the plugins and versions that
+                                        provide a command
+asdf update                             Update asdf to the latest stable release
+asdf update --head                      Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs:   https://asdf-vm.com
`,3)]))}const f=a(p,[["render",t]]);export{m as __pageData,f as default}; diff --git a/assets/manage_configuration.md.BTxM-Kga.js b/assets/manage_configuration.md.BTxM-Kga.js new file mode 100644 index 00000000..1718e978 --- /dev/null +++ b/assets/manage_configuration.md.BTxM-Kga.js @@ -0,0 +1,9 @@ +import{_ as n,c as i,a2 as s,j as e,a as o,G as a,B as d,o as r}from"./chunks/framework.C9NVOr0y.js";const S=JSON.parse('{"title":"Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"manage/configuration.md","filePath":"manage/configuration.md","lastUpdated":1699489504000}'),c={name:"manage/configuration.md"},u={tabindex:"0"},p={style:{"text-align":"left"}},f={tabindex:"0"},h={style:{"text-align":"left"}},g={tabindex:"0"},m={style:{"text-align":"left"}},y={tabindex:"0"},b={style:{"text-align":"left"}},v={tabindex:"0"},x={style:{"text-align":"left"}};function _(k,t,w,D,E,F){const l=d("Badge");return r(),i("div",null,[t[33]||(t[33]=s(`

Configuration

Configuration of asdf encompasses both the sharable .tool-versions files as well as user specific customisations with .asdfrc and Environment Variables.

.tool-versions

Whenever .tool-versions file is present in a directory, the tool versions it declares will be used in that directory and any subdirectories.

Note

Global defaults can be set in the file $HOME/.tool-versions

This is what a .tool-versions file looks like:

ruby 2.5.3
+nodejs 10.15.0

You can also include comments:

ruby 2.5.3 # This is a comment
+# This is another comment
+nodejs 10.15.0

The versions can be in the following format:

  • 10.15.0 - an actual version. Plugins that support downloading binaries, will download binaries.
  • ref:v1.0.2-a or ref:39cb398vb39 - tag/commit/branch to download from github and compile
  • path:~/src/elixir - a path to custom compiled version of a tool to use. For use by language developers and such.
  • system - this keyword causes asdf to passthrough to the version of the tool on the system that is not managed by asdf.

TIP

Multiple versions can be set by separating them with a space. For example, to use Python 3.7.2, fallback to Python 2.7.15 and finally to the system Python, the following line can be added to .tool-versions.

python 3.7.2 2.7.15 system

To install all the tools defined in a .tool-versions file run asdf install with no other arguments in the directory containing the .tool-versions file.

To install a single tool defined in a .tool-versions file run asdf install <name> in the directory containing the .tool-versions file. The tool will be installed at the version specified in the .tool-versions file.

Edit the file directly or use asdf local (or asdf global) which updates it.

.asdfrc

The .asdfrc file defines the user's machine specific configuration.

\${HOME}/.asdfrc is the default location used by asdf. This can be set with the Environment Variable ASDF_CONFIG_FILE.

The below file shows the required format with the default values:

txt
legacy_version_file = no
+use_release_candidates = no
+always_keep_download = no
+plugin_repository_last_check_duration = 60
+disable_plugin_short_name_repository = no
+concurrency = auto

legacy_version_file

Plugins with support can read the versions files used by other version managers, for example, .ruby-version in the case of Ruby's rbenv.

`,22)),e("table",u,[t[4]||(t[4]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"Options"),e("th",{style:{"text-align":"left"}},"Description")])],-1)),e("tbody",null,[e("tr",null,[e("td",p,[t[0]||(t[0]=e("code",null,"no",-1)),t[1]||(t[1]=o()),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[2]||(t[2]=e("td",{style:{"text-align":"left"}},[o("Use "),e("code",null,".tool-versions"),o(" to read versions")],-1))]),t[3]||(t[3]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},[o("Use plugin fallback to legacy version files ("),e("code",null,".ruby-version"),o(") if available")])],-1))])]),t[34]||(t[34]=e("h3",{id:"use-release-candidates",tabindex:"-1"},[e("code",null,"use_release_candidates"),o(),e("a",{class:"header-anchor",href:"#use-release-candidates","aria-label":'Permalink to "`use_release_candidates`"'},"​")],-1)),t[35]||(t[35]=e("p",null,[o("Configure the "),e("code",null,"asdf update"),o(" command to upgrade to the latest Release Candidate instead of the latest Semantic Version.")],-1)),e("table",f,[t[9]||(t[9]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"Options"),e("th",{style:{"text-align":"left"}},"Description")])],-1)),e("tbody",null,[e("tr",null,[e("td",h,[t[5]||(t[5]=e("code",null,"no",-1)),t[6]||(t[6]=o()),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[7]||(t[7]=e("td",{style:{"text-align":"left"}},"Semantic Version is used",-1))]),t[8]||(t[8]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"Release Candidate is used")],-1))])]),t[36]||(t[36]=e("h3",{id:"always-keep-download",tabindex:"-1"},[e("code",null,"always_keep_download"),o(),e("a",{class:"header-anchor",href:"#always-keep-download","aria-label":'Permalink to "`always_keep_download`"'},"​")],-1)),t[37]||(t[37]=e("p",null,[o("Configure the "),e("code",null,"asdf install"),o(" command to keep or delete the source code or binary it downloads.")],-1)),e("table",g,[t[14]||(t[14]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"Options"),e("th",{style:{"text-align":"left"}},"Description")])],-1)),e("tbody",null,[e("tr",null,[e("td",m,[t[10]||(t[10]=e("code",null,"no",-1)),t[11]||(t[11]=o()),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[12]||(t[12]=e("td",{style:{"text-align":"left"}},"Delete source code or binary after successful install",-1))]),t[13]||(t[13]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"Keep source code or binary after install")],-1))])]),t[38]||(t[38]=e("h3",{id:"plugin-repository-last-check-duration",tabindex:"-1"},[e("code",null,"plugin_repository_last_check_duration"),o(),e("a",{class:"header-anchor",href:"#plugin-repository-last-check-duration","aria-label":'Permalink to "`plugin_repository_last_check_duration`"'},"​")],-1)),t[39]||(t[39]=e("p",null,"Configure the duration (in minutes) between asdf plugin repository syncs. Trigger events result in a check of the duration. If more time has elapsed since the last sync than specified in the duration, a new sync occurs.",-1)),e("table",y,[t[27]||(t[27]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"Options"),e("th",{style:{"text-align":"left"}},"Description")])],-1)),e("tbody",null,[e("tr",null,[e("td",b,[t[15]||(t[15]=o("integer in range ")),t[16]||(t[16]=e("code",null,"1",-1)),t[17]||(t[17]=o(" to ")),t[18]||(t[18]=e("code",null,"999999999",-1)),t[19]||(t[19]=o()),t[20]||(t[20]=e("br",null,null,-1)),t[21]||(t[21]=o()),t[22]||(t[22]=e("code",null,"60",-1)),t[23]||(t[23]=o(" is ")),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[24]||(t[24]=e("td",{style:{"text-align":"left"}},"Sync on trigger event if duration (in minutes) since last sync has been exceeded",-1))]),t[25]||(t[25]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"0")]),e("td",{style:{"text-align":"left"}},"Sync on each trigger event")],-1)),t[26]||(t[26]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"never")]),e("td",{style:{"text-align":"left"}},"Never sync")],-1))])]),t[40]||(t[40]=s('

Sync events occur when the following commands are executed:

  • asdf plugin add <name>
  • asdf plugin list all

asdf plugin add <name> <git-url> does NOT trigger a plugin sync.

Note

Setting the value to never does not stop the plugin repository from being initially synced, for that behaviour see disable_plugin_short_name_repository.

disable_plugin_short_name_repository

Disable synchronization of the asdf plugin short-name repository. Sync events will exit early if the short-name repository is disabled.

',6)),e("table",v,[t[32]||(t[32]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"Options"),e("th",{style:{"text-align":"left"}},"Description")])],-1)),e("tbody",null,[e("tr",null,[e("td",x,[t[28]||(t[28]=e("code",null,"no",-1)),t[29]||(t[29]=o()),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[30]||(t[30]=e("td",{style:{"text-align":"left"}},"Clone or update the asdf plugin repository on sync events",-1))]),t[31]||(t[31]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"Disable the plugin short-name repository")],-1))])]),t[41]||(t[41]=s('

Sync events occur when the following commands are executed:

  • asdf plugin add <name>
  • asdf plugin list all

asdf plugin add <name> <git-url> does NOT trigger a plugin sync.

Note

Disabling the plugin short-name repository does not remove the repository if it has already synced. Remove the plugin repo with rm --recursive --trash $ASDF_DATA_DIR/repository.

Disabling the plugin short-name repository does not remove plugins previously installed from this source. Plugins can be removed with asdf plugin remove <name>. Removing a plugin will remove all installed versions of the managed tool.

concurrency

The default number of cores to use during compilation.

OptionsDescription
integerNumber of cores to use when compiling the source code
autoCalculate the number of cores using nproc, then sysctl hw.ncpu, then /proc/cpuinfo or else 1

Note: the environment variable ASDF_CONCURRENCY take precedence if set.

Plugin Hooks

It is possible to execute custom code:

  • Before or after a plugin is installed, reshimed, updated, or uninstalled
  • Before or after a plugin command is executed

For example, if a plugin called foo is installed and provides a bar executable, then the following hooks can be used to execute custom code first:

text
pre_foo_bar = echo Executing with args: $@

The following patterns are supported:

  • pre_<plugin_name>_<command>
  • pre_asdf_download_<plugin_name>
  • {pre,post}_asdf_{install,reshim,uninstall}_<plugin_name>
    • $1: full version
  • {pre,post}_asdf_plugin_{add,update,remove,reshim}
    • $1: plugin name
  • {pre,post}_asdf_plugin_{add,update,remove}_<plugin_name>

See Create a Plugin for specifics on what command hooks are ran before or after what commands.

Environment Variables

Setting environment variables varies depending on your system and Shell. Default locations depend upon your installation location and method (Git clone, Homebrew, AUR).

Environment variables should generally be set before sourcing asdf.sh/asdf.fish etc. For Elvish set above use asdf.

The following describe usage with a Bash Shell.

ASDF_CONFIG_FILE

Path to the .asdfrc configuration file. Can be set to any location. Must be an absolute path.

  • If Unset: $HOME/.asdfrc will be used.
  • Usage: export ASDF_CONFIG_FILE=/home/john_doe/.config/asdf/.asdfrc

ASDF_DEFAULT_TOOL_VERSIONS_FILENAME

The filename of the file storing the tool names and versions. Can be any valid filename. Typically, you should not set this value unless you want to ignore .tool-versions files.

  • If Unset: .tool-versions will be used.
  • Usage: export ASDF_DEFAULT_TOOL_VERSIONS_FILENAME=tool_versions

ASDF_DIR

The location of asdf core scripts. Can be set to any location. Must be an absolute path.

  • If Unset: the parent directory of the bin/asdf executable is used.
  • Usage: export ASDF_DIR=/home/john_doe/.config/asdf

ASDF_DATA_DIR

The location where asdf will install plugins, shims and tool versions. Can be set to any location. Must be an absolute path.

  • If Unset: $HOME/.asdf if it exists, or else the value of ASDF_DIR
  • Usage: export ASDF_DATA_DIR=/home/john_doe/.asdf

ASDF_CONCURRENCY

Number of cores to use when compiling the source code. If set, this value takes precedence over the asdf config concurrency value.

  • If Unset: the asdf config concurrency value is used.
  • Usage: export ASDF_CONCURRENCY=32

ASDF_FORCE_PREPEND

Whether or not to prepend the asdf shims and path directories to the front-most (highest-priority) part of the PATH.

  • If Unset: On macOS, defaults to yes; but on other systems, defaults to no
  • If yes: Force asdf directories to the front of the PATH
  • If set to any string other than yes: Do not force asdf directories to the front of the PATH
  • Usage: ASDF_FORCE_PREPEND=no . "<path-to-asdf-directory>/asdf.sh"

Full Configuration Example

Following a simple asdf setup with:

  • a Bash Shell
  • an installation location of $HOME/.asdf
  • installed via Git
  • NO environment variables set
  • NO custom .asdfrc file

would result in the following outcomes:

ConfigurationValueCalculated by
config file location$HOME/.asdfrcASDF_CONFIG_FILE is empty, so use $HOME/.asdfrc
default tool versions filename.tool-versionsASDF_DEFAULT_TOOL_VERSIONS_FILENAME is empty, so use .tool-versions
asdf dir$HOME/.asdfASDF_DIR is empty, so use parent dir of bin/asdf
asdf data dir$HOME/.asdfASDF_DATA_DIR is empty so use $HOME/.asdf as $HOME exists.
concurrencyautoASDF_CONCURRENCY is empty, so rely on concurrency value from the default configuration
legacy_version_filenoNo custom .asdfrc, so use the default configuration
use_release_candidatesnoNo custom .asdfrc, so use the default configuration
always_keep_downloadnoNo custom .asdfrc, so use the default configuration
plugin_repository_last_check_duration60No custom .asdfrc, so use the default configuration
disable_plugin_short_name_repositorynoNo custom .asdfrc, so use the default configuration

Internal Configuration

Users should not worry about this section as it describes configuration internal to asdf useful for Package Managers and integrators.

  • $ASDF_DIR/asdf_updates_disabled: Updates via the asdf update command are disabled when this file is present (content irrelevant). This is used by package managers like Pacman or Homebrew to ensure the correct update method is used for the particular installation.
',46))])}const A=n(c,[["render",_]]);export{S as __pageData,A as default}; diff --git a/assets/manage_configuration.md.BTxM-Kga.lean.js b/assets/manage_configuration.md.BTxM-Kga.lean.js new file mode 100644 index 00000000..1718e978 --- /dev/null +++ b/assets/manage_configuration.md.BTxM-Kga.lean.js @@ -0,0 +1,9 @@ +import{_ as n,c as i,a2 as s,j as e,a as o,G as a,B as d,o as r}from"./chunks/framework.C9NVOr0y.js";const S=JSON.parse('{"title":"Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"manage/configuration.md","filePath":"manage/configuration.md","lastUpdated":1699489504000}'),c={name:"manage/configuration.md"},u={tabindex:"0"},p={style:{"text-align":"left"}},f={tabindex:"0"},h={style:{"text-align":"left"}},g={tabindex:"0"},m={style:{"text-align":"left"}},y={tabindex:"0"},b={style:{"text-align":"left"}},v={tabindex:"0"},x={style:{"text-align":"left"}};function _(k,t,w,D,E,F){const l=d("Badge");return r(),i("div",null,[t[33]||(t[33]=s(`

Configuration

Configuration of asdf encompasses both the sharable .tool-versions files as well as user specific customisations with .asdfrc and Environment Variables.

.tool-versions

Whenever .tool-versions file is present in a directory, the tool versions it declares will be used in that directory and any subdirectories.

Note

Global defaults can be set in the file $HOME/.tool-versions

This is what a .tool-versions file looks like:

ruby 2.5.3
+nodejs 10.15.0

You can also include comments:

ruby 2.5.3 # This is a comment
+# This is another comment
+nodejs 10.15.0

The versions can be in the following format:

  • 10.15.0 - an actual version. Plugins that support downloading binaries, will download binaries.
  • ref:v1.0.2-a or ref:39cb398vb39 - tag/commit/branch to download from github and compile
  • path:~/src/elixir - a path to custom compiled version of a tool to use. For use by language developers and such.
  • system - this keyword causes asdf to passthrough to the version of the tool on the system that is not managed by asdf.

TIP

Multiple versions can be set by separating them with a space. For example, to use Python 3.7.2, fallback to Python 2.7.15 and finally to the system Python, the following line can be added to .tool-versions.

python 3.7.2 2.7.15 system

To install all the tools defined in a .tool-versions file run asdf install with no other arguments in the directory containing the .tool-versions file.

To install a single tool defined in a .tool-versions file run asdf install <name> in the directory containing the .tool-versions file. The tool will be installed at the version specified in the .tool-versions file.

Edit the file directly or use asdf local (or asdf global) which updates it.

.asdfrc

The .asdfrc file defines the user's machine specific configuration.

\${HOME}/.asdfrc is the default location used by asdf. This can be set with the Environment Variable ASDF_CONFIG_FILE.

The below file shows the required format with the default values:

txt
legacy_version_file = no
+use_release_candidates = no
+always_keep_download = no
+plugin_repository_last_check_duration = 60
+disable_plugin_short_name_repository = no
+concurrency = auto

legacy_version_file

Plugins with support can read the versions files used by other version managers, for example, .ruby-version in the case of Ruby's rbenv.

`,22)),e("table",u,[t[4]||(t[4]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"Options"),e("th",{style:{"text-align":"left"}},"Description")])],-1)),e("tbody",null,[e("tr",null,[e("td",p,[t[0]||(t[0]=e("code",null,"no",-1)),t[1]||(t[1]=o()),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[2]||(t[2]=e("td",{style:{"text-align":"left"}},[o("Use "),e("code",null,".tool-versions"),o(" to read versions")],-1))]),t[3]||(t[3]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},[o("Use plugin fallback to legacy version files ("),e("code",null,".ruby-version"),o(") if available")])],-1))])]),t[34]||(t[34]=e("h3",{id:"use-release-candidates",tabindex:"-1"},[e("code",null,"use_release_candidates"),o(),e("a",{class:"header-anchor",href:"#use-release-candidates","aria-label":'Permalink to "`use_release_candidates`"'},"​")],-1)),t[35]||(t[35]=e("p",null,[o("Configure the "),e("code",null,"asdf update"),o(" command to upgrade to the latest Release Candidate instead of the latest Semantic Version.")],-1)),e("table",f,[t[9]||(t[9]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"Options"),e("th",{style:{"text-align":"left"}},"Description")])],-1)),e("tbody",null,[e("tr",null,[e("td",h,[t[5]||(t[5]=e("code",null,"no",-1)),t[6]||(t[6]=o()),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[7]||(t[7]=e("td",{style:{"text-align":"left"}},"Semantic Version is used",-1))]),t[8]||(t[8]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"Release Candidate is used")],-1))])]),t[36]||(t[36]=e("h3",{id:"always-keep-download",tabindex:"-1"},[e("code",null,"always_keep_download"),o(),e("a",{class:"header-anchor",href:"#always-keep-download","aria-label":'Permalink to "`always_keep_download`"'},"​")],-1)),t[37]||(t[37]=e("p",null,[o("Configure the "),e("code",null,"asdf install"),o(" command to keep or delete the source code or binary it downloads.")],-1)),e("table",g,[t[14]||(t[14]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"Options"),e("th",{style:{"text-align":"left"}},"Description")])],-1)),e("tbody",null,[e("tr",null,[e("td",m,[t[10]||(t[10]=e("code",null,"no",-1)),t[11]||(t[11]=o()),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[12]||(t[12]=e("td",{style:{"text-align":"left"}},"Delete source code or binary after successful install",-1))]),t[13]||(t[13]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"Keep source code or binary after install")],-1))])]),t[38]||(t[38]=e("h3",{id:"plugin-repository-last-check-duration",tabindex:"-1"},[e("code",null,"plugin_repository_last_check_duration"),o(),e("a",{class:"header-anchor",href:"#plugin-repository-last-check-duration","aria-label":'Permalink to "`plugin_repository_last_check_duration`"'},"​")],-1)),t[39]||(t[39]=e("p",null,"Configure the duration (in minutes) between asdf plugin repository syncs. Trigger events result in a check of the duration. If more time has elapsed since the last sync than specified in the duration, a new sync occurs.",-1)),e("table",y,[t[27]||(t[27]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"Options"),e("th",{style:{"text-align":"left"}},"Description")])],-1)),e("tbody",null,[e("tr",null,[e("td",b,[t[15]||(t[15]=o("integer in range ")),t[16]||(t[16]=e("code",null,"1",-1)),t[17]||(t[17]=o(" to ")),t[18]||(t[18]=e("code",null,"999999999",-1)),t[19]||(t[19]=o()),t[20]||(t[20]=e("br",null,null,-1)),t[21]||(t[21]=o()),t[22]||(t[22]=e("code",null,"60",-1)),t[23]||(t[23]=o(" is ")),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[24]||(t[24]=e("td",{style:{"text-align":"left"}},"Sync on trigger event if duration (in minutes) since last sync has been exceeded",-1))]),t[25]||(t[25]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"0")]),e("td",{style:{"text-align":"left"}},"Sync on each trigger event")],-1)),t[26]||(t[26]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"never")]),e("td",{style:{"text-align":"left"}},"Never sync")],-1))])]),t[40]||(t[40]=s('

Sync events occur when the following commands are executed:

  • asdf plugin add <name>
  • asdf plugin list all

asdf plugin add <name> <git-url> does NOT trigger a plugin sync.

Note

Setting the value to never does not stop the plugin repository from being initially synced, for that behaviour see disable_plugin_short_name_repository.

disable_plugin_short_name_repository

Disable synchronization of the asdf plugin short-name repository. Sync events will exit early if the short-name repository is disabled.

',6)),e("table",v,[t[32]||(t[32]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"Options"),e("th",{style:{"text-align":"left"}},"Description")])],-1)),e("tbody",null,[e("tr",null,[e("td",x,[t[28]||(t[28]=e("code",null,"no",-1)),t[29]||(t[29]=o()),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[30]||(t[30]=e("td",{style:{"text-align":"left"}},"Clone or update the asdf plugin repository on sync events",-1))]),t[31]||(t[31]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"Disable the plugin short-name repository")],-1))])]),t[41]||(t[41]=s('

Sync events occur when the following commands are executed:

  • asdf plugin add <name>
  • asdf plugin list all

asdf plugin add <name> <git-url> does NOT trigger a plugin sync.

Note

Disabling the plugin short-name repository does not remove the repository if it has already synced. Remove the plugin repo with rm --recursive --trash $ASDF_DATA_DIR/repository.

Disabling the plugin short-name repository does not remove plugins previously installed from this source. Plugins can be removed with asdf plugin remove <name>. Removing a plugin will remove all installed versions of the managed tool.

concurrency

The default number of cores to use during compilation.

OptionsDescription
integerNumber of cores to use when compiling the source code
autoCalculate the number of cores using nproc, then sysctl hw.ncpu, then /proc/cpuinfo or else 1

Note: the environment variable ASDF_CONCURRENCY take precedence if set.

Plugin Hooks

It is possible to execute custom code:

  • Before or after a plugin is installed, reshimed, updated, or uninstalled
  • Before or after a plugin command is executed

For example, if a plugin called foo is installed and provides a bar executable, then the following hooks can be used to execute custom code first:

text
pre_foo_bar = echo Executing with args: $@

The following patterns are supported:

  • pre_<plugin_name>_<command>
  • pre_asdf_download_<plugin_name>
  • {pre,post}_asdf_{install,reshim,uninstall}_<plugin_name>
    • $1: full version
  • {pre,post}_asdf_plugin_{add,update,remove,reshim}
    • $1: plugin name
  • {pre,post}_asdf_plugin_{add,update,remove}_<plugin_name>

See Create a Plugin for specifics on what command hooks are ran before or after what commands.

Environment Variables

Setting environment variables varies depending on your system and Shell. Default locations depend upon your installation location and method (Git clone, Homebrew, AUR).

Environment variables should generally be set before sourcing asdf.sh/asdf.fish etc. For Elvish set above use asdf.

The following describe usage with a Bash Shell.

ASDF_CONFIG_FILE

Path to the .asdfrc configuration file. Can be set to any location. Must be an absolute path.

  • If Unset: $HOME/.asdfrc will be used.
  • Usage: export ASDF_CONFIG_FILE=/home/john_doe/.config/asdf/.asdfrc

ASDF_DEFAULT_TOOL_VERSIONS_FILENAME

The filename of the file storing the tool names and versions. Can be any valid filename. Typically, you should not set this value unless you want to ignore .tool-versions files.

  • If Unset: .tool-versions will be used.
  • Usage: export ASDF_DEFAULT_TOOL_VERSIONS_FILENAME=tool_versions

ASDF_DIR

The location of asdf core scripts. Can be set to any location. Must be an absolute path.

  • If Unset: the parent directory of the bin/asdf executable is used.
  • Usage: export ASDF_DIR=/home/john_doe/.config/asdf

ASDF_DATA_DIR

The location where asdf will install plugins, shims and tool versions. Can be set to any location. Must be an absolute path.

  • If Unset: $HOME/.asdf if it exists, or else the value of ASDF_DIR
  • Usage: export ASDF_DATA_DIR=/home/john_doe/.asdf

ASDF_CONCURRENCY

Number of cores to use when compiling the source code. If set, this value takes precedence over the asdf config concurrency value.

  • If Unset: the asdf config concurrency value is used.
  • Usage: export ASDF_CONCURRENCY=32

ASDF_FORCE_PREPEND

Whether or not to prepend the asdf shims and path directories to the front-most (highest-priority) part of the PATH.

  • If Unset: On macOS, defaults to yes; but on other systems, defaults to no
  • If yes: Force asdf directories to the front of the PATH
  • If set to any string other than yes: Do not force asdf directories to the front of the PATH
  • Usage: ASDF_FORCE_PREPEND=no . "<path-to-asdf-directory>/asdf.sh"

Full Configuration Example

Following a simple asdf setup with:

  • a Bash Shell
  • an installation location of $HOME/.asdf
  • installed via Git
  • NO environment variables set
  • NO custom .asdfrc file

would result in the following outcomes:

ConfigurationValueCalculated by
config file location$HOME/.asdfrcASDF_CONFIG_FILE is empty, so use $HOME/.asdfrc
default tool versions filename.tool-versionsASDF_DEFAULT_TOOL_VERSIONS_FILENAME is empty, so use .tool-versions
asdf dir$HOME/.asdfASDF_DIR is empty, so use parent dir of bin/asdf
asdf data dir$HOME/.asdfASDF_DATA_DIR is empty so use $HOME/.asdf as $HOME exists.
concurrencyautoASDF_CONCURRENCY is empty, so rely on concurrency value from the default configuration
legacy_version_filenoNo custom .asdfrc, so use the default configuration
use_release_candidatesnoNo custom .asdfrc, so use the default configuration
always_keep_downloadnoNo custom .asdfrc, so use the default configuration
plugin_repository_last_check_duration60No custom .asdfrc, so use the default configuration
disable_plugin_short_name_repositorynoNo custom .asdfrc, so use the default configuration

Internal Configuration

Users should not worry about this section as it describes configuration internal to asdf useful for Package Managers and integrators.

  • $ASDF_DIR/asdf_updates_disabled: Updates via the asdf update command are disabled when this file is present (content irrelevant). This is used by package managers like Pacman or Homebrew to ensure the correct update method is used for the particular installation.
',46))])}const A=n(c,[["render",_]]);export{S as __pageData,A as default}; diff --git a/assets/manage_core.md.BUHLaRG4.js b/assets/manage_core.md.BUHLaRG4.js new file mode 100644 index 00000000..89e7d3ce --- /dev/null +++ b/assets/manage_core.md.BUHLaRG4.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as t,o as l}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"Core","description":"","frontmatter":{},"headers":[],"relativePath":"manage/core.md","filePath":"manage/core.md","lastUpdated":1687069487000}'),e={name:"manage/core.md"};function h(n,s,p,k,d,o){return l(),a("div",null,s[0]||(s[0]=[t(`

Core

The core asdf command list is rather small, but can facilitate many workflows.

Installation & Setup

Covered in the Getting Started guide.

Exec

shell
asdf exec <command> [args...]

Executes the command shim for the current version.

Env

shell
asdf env <command> [util]

Info

shell
asdf info

A helper command to print the OS, Shell and asdf debug information. Share this when making a bug report.

Reshim

shell
asdf reshim <name> <version>

This recreates the shims for the current version of a package. By default, shims are created by plugins during installation of a tool. Some tools like the npm CLI allow global installation of executables, for example, installing Yarn via npm install -g yarn. Since this executable was not installed via the plugin lifecycle, no shim exists for it yet. asdf reshim nodejs <version> will force recalculation of shims for any new executables, like yarn, for <version> of nodejs .

Shim-versions

shell
asdf shim-versions <command>

Lists the plugins and versions that provide shims for a command.

As an example, Node.js ships with two executables, node and npm. When many versions of the tools are installed with asdf-nodejs shim-versions can return:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

Update

asdf has a built in command to update which relies on Git (our recommended installation method). If you installed using a different method you should follow the steps for that method:

MethodLatest Stable ReleaseLatest commit on master
asdf (via Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
PacmanDownload a new PKGBUILD & rebuild
or use your preferred AUR helper

Uninstall

To uninstall asdf follow these steps:

Bash & Git
  1. In your ~/.bashrc remove the lines that source asdf.sh and the completions:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. In your ~/.bash_profile remove the lines that source asdf.sh and the completions:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. In your ~/.bashrc remove the lines that source asdf.sh and the completions:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

Completions may have been configured as per Homebrew's instructions so follow their guide to find out what to remove.

  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

If using macOS Catalina or newer, the default shell has changed to ZSH. If you can't find any config in your ~/.bash_profile it may be in a ~/.zshrc in which case please follow the ZSH instructions.

  1. In your ~/.bash_profile remove the lines that source asdf.sh and the completions:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

Completions may have been configured as per Homebrew's instructions so follow their guide to find out what to remove.

  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. In your ~/.bashrc remove the lines that source asdf.sh and the completions:
shell
. /opt/asdf-vm/asdf.sh
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. In your ~/.config/fish/config.fish remove the lines that source asdf.fish:
shell
source ~/.asdf/asdf.fish

and remove completions with this command:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. Remove the $HOME/.asdf dir:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. In your ~/.config/fish/config.fish remove the lines that source asdf.fish:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. In your ~/.config/fish/config.fish remove the lines that source asdf.fish:
shell
source /opt/asdf-vm/asdf.fish
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. In your ~/.config/elvish/rc.elv remove the lines that use the asdf module:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

and uninstall the asdf module with this command:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Remove the $HOME/.asdf dir:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. In your ~/.config/elvish/rc.elv remove the lines that use the asdf module:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

and uninstall the asdf module with this command:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. In your ~/.config/elvish/rc.elv remove the lines that use the asdf module:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

and uninstall the asdf module with this command:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. In your ~/.zshrc remove the lines that source asdf.sh and completions:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

OR the ZSH Framework plugin if used.

  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. In your ~/.zshrc remove the lines that source asdf.sh:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. Uninstall with your package manager:
shell
brew uninstall asdf --force && brew autoremove
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. In your ~/.zshrc remove the lines that source asdf.sh:
shell
. /opt/asdf-vm/asdf.sh
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"

That's it! 🎉

`,41)]))}const g=i(e,[["render",h]]);export{c as __pageData,g as default}; diff --git a/assets/manage_core.md.BUHLaRG4.lean.js b/assets/manage_core.md.BUHLaRG4.lean.js new file mode 100644 index 00000000..89e7d3ce --- /dev/null +++ b/assets/manage_core.md.BUHLaRG4.lean.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as t,o as l}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"Core","description":"","frontmatter":{},"headers":[],"relativePath":"manage/core.md","filePath":"manage/core.md","lastUpdated":1687069487000}'),e={name:"manage/core.md"};function h(n,s,p,k,d,o){return l(),a("div",null,s[0]||(s[0]=[t(`

Core

The core asdf command list is rather small, but can facilitate many workflows.

Installation & Setup

Covered in the Getting Started guide.

Exec

shell
asdf exec <command> [args...]

Executes the command shim for the current version.

Env

shell
asdf env <command> [util]

Info

shell
asdf info

A helper command to print the OS, Shell and asdf debug information. Share this when making a bug report.

Reshim

shell
asdf reshim <name> <version>

This recreates the shims for the current version of a package. By default, shims are created by plugins during installation of a tool. Some tools like the npm CLI allow global installation of executables, for example, installing Yarn via npm install -g yarn. Since this executable was not installed via the plugin lifecycle, no shim exists for it yet. asdf reshim nodejs <version> will force recalculation of shims for any new executables, like yarn, for <version> of nodejs .

Shim-versions

shell
asdf shim-versions <command>

Lists the plugins and versions that provide shims for a command.

As an example, Node.js ships with two executables, node and npm. When many versions of the tools are installed with asdf-nodejs shim-versions can return:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

Update

asdf has a built in command to update which relies on Git (our recommended installation method). If you installed using a different method you should follow the steps for that method:

MethodLatest Stable ReleaseLatest commit on master
asdf (via Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
PacmanDownload a new PKGBUILD & rebuild
or use your preferred AUR helper

Uninstall

To uninstall asdf follow these steps:

Bash & Git
  1. In your ~/.bashrc remove the lines that source asdf.sh and the completions:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. In your ~/.bash_profile remove the lines that source asdf.sh and the completions:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. In your ~/.bashrc remove the lines that source asdf.sh and the completions:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

Completions may have been configured as per Homebrew's instructions so follow their guide to find out what to remove.

  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

If using macOS Catalina or newer, the default shell has changed to ZSH. If you can't find any config in your ~/.bash_profile it may be in a ~/.zshrc in which case please follow the ZSH instructions.

  1. In your ~/.bash_profile remove the lines that source asdf.sh and the completions:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

Completions may have been configured as per Homebrew's instructions so follow their guide to find out what to remove.

  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. In your ~/.bashrc remove the lines that source asdf.sh and the completions:
shell
. /opt/asdf-vm/asdf.sh
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. In your ~/.config/fish/config.fish remove the lines that source asdf.fish:
shell
source ~/.asdf/asdf.fish

and remove completions with this command:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. Remove the $HOME/.asdf dir:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. In your ~/.config/fish/config.fish remove the lines that source asdf.fish:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. In your ~/.config/fish/config.fish remove the lines that source asdf.fish:
shell
source /opt/asdf-vm/asdf.fish
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. In your ~/.config/elvish/rc.elv remove the lines that use the asdf module:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

and uninstall the asdf module with this command:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Remove the $HOME/.asdf dir:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. In your ~/.config/elvish/rc.elv remove the lines that use the asdf module:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

and uninstall the asdf module with this command:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. In your ~/.config/elvish/rc.elv remove the lines that use the asdf module:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

and uninstall the asdf module with this command:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. In your ~/.zshrc remove the lines that source asdf.sh and completions:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

OR the ZSH Framework plugin if used.

  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. In your ~/.zshrc remove the lines that source asdf.sh:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. Uninstall with your package manager:
shell
brew uninstall asdf --force && brew autoremove
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. In your ~/.zshrc remove the lines that source asdf.sh:
shell
. /opt/asdf-vm/asdf.sh
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"

That's it! 🎉

`,41)]))}const g=i(e,[["render",h]]);export{c as __pageData,g as default}; diff --git a/assets/manage_plugins.md.BOsG6k4O.js b/assets/manage_plugins.md.BOsG6k4O.js new file mode 100644 index 00000000..f3e41889 --- /dev/null +++ b/assets/manage_plugins.md.BOsG6k4O.js @@ -0,0 +1,11 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const g=JSON.parse('{"title":"Plugins","description":"","frontmatter":{},"headers":[],"relativePath":"manage/plugins.md","filePath":"manage/plugins.md","lastUpdated":1687069487000}'),l={name:"manage/plugins.md"};function n(h,s,p,d,o,r){return t(),a("div",null,s[0]||(s[0]=[e(`

Plugins

Plugins are how asdf knows to handle different tools like Node.js, Ruby, Elixir etc.

See Creating Plugins for the plugin API used to support more tools.

Add

Add plugins via their Git URL:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

or via the short-name association in the plugins repository:

shell
asdf plugin add <name>
+# asdf plugin add erlang

Recommendation

Prefer the longer git-url method as it is independent of the short-name repo.

List Installed

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

List All in Short-name Repository

shell
asdf plugin list all

See Plugins Shortname Index for the entire short-name list of plugins.

Update

shell
asdf plugin update --all

If you want to update a specific package, just say so.

shell
asdf plugin update <name>
+# asdf plugin update erlang

This update will fetch the latest commit on the default branch of the origin of the plugin repository. Versioned plugins and updates are currently being developed (#916)

Remove

bash
asdf plugin remove <name>
+# asdf plugin remove erlang

Removing a plugin will remove all installations of the tool made with the plugin. This can be used as a shorthand for cleaning/pruning many unused versions of a tool.

Syncing the asdf Short-name Repository

The short-name repo is synced to your local machine and periodically refreshed. This method to determine a sync is as follows:

  • sync events are triggered by commands:
    • asdf plugin add <name>
    • asdf plugin list all
  • if configuration option disable_plugin_short_name_repository is set to yes, then sync is aborted early. See the asdf config docs for more.
  • if there has not been a synchronization in the last X minutes then the sync will occur.
    • X defaults to 60, but can be configured in your .asdfrc via the plugin_repository_last_check_duration option. See the asdf config docs for more.
`,26)]))}const c=i(l,[["render",n]]);export{g as __pageData,c as default}; diff --git a/assets/manage_plugins.md.BOsG6k4O.lean.js b/assets/manage_plugins.md.BOsG6k4O.lean.js new file mode 100644 index 00000000..f3e41889 --- /dev/null +++ b/assets/manage_plugins.md.BOsG6k4O.lean.js @@ -0,0 +1,11 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const g=JSON.parse('{"title":"Plugins","description":"","frontmatter":{},"headers":[],"relativePath":"manage/plugins.md","filePath":"manage/plugins.md","lastUpdated":1687069487000}'),l={name:"manage/plugins.md"};function n(h,s,p,d,o,r){return t(),a("div",null,s[0]||(s[0]=[e(`

Plugins

Plugins are how asdf knows to handle different tools like Node.js, Ruby, Elixir etc.

See Creating Plugins for the plugin API used to support more tools.

Add

Add plugins via their Git URL:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

or via the short-name association in the plugins repository:

shell
asdf plugin add <name>
+# asdf plugin add erlang

Recommendation

Prefer the longer git-url method as it is independent of the short-name repo.

List Installed

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

List All in Short-name Repository

shell
asdf plugin list all

See Plugins Shortname Index for the entire short-name list of plugins.

Update

shell
asdf plugin update --all

If you want to update a specific package, just say so.

shell
asdf plugin update <name>
+# asdf plugin update erlang

This update will fetch the latest commit on the default branch of the origin of the plugin repository. Versioned plugins and updates are currently being developed (#916)

Remove

bash
asdf plugin remove <name>
+# asdf plugin remove erlang

Removing a plugin will remove all installations of the tool made with the plugin. This can be used as a shorthand for cleaning/pruning many unused versions of a tool.

Syncing the asdf Short-name Repository

The short-name repo is synced to your local machine and periodically refreshed. This method to determine a sync is as follows:

  • sync events are triggered by commands:
    • asdf plugin add <name>
    • asdf plugin list all
  • if configuration option disable_plugin_short_name_repository is set to yes, then sync is aborted early. See the asdf config docs for more.
  • if there has not been a synchronization in the last X minutes then the sync will occur.
    • X defaults to 60, but can be configured in your .asdfrc via the plugin_repository_last_check_duration option. See the asdf config docs for more.
`,26)]))}const c=i(l,[["render",n]]);export{g as __pageData,c as default}; diff --git a/assets/manage_versions.md.CAp-N8AZ.js b/assets/manage_versions.md.CAp-N8AZ.js new file mode 100644 index 00000000..669d576f --- /dev/null +++ b/assets/manage_versions.md.CAp-N8AZ.js @@ -0,0 +1,30 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const g=JSON.parse('{"title":"Versions","description":"","frontmatter":{},"headers":[],"relativePath":"manage/versions.md","filePath":"manage/versions.md","lastUpdated":1687069487000}'),n={name:"manage/versions.md"};function l(h,s,p,k,r,d){return t(),a("div",null,s[0]||(s[0]=[e(`

Versions

Install Version

shell
asdf install <name> <version>
+# asdf install erlang 17.3

If a plugin supports downloading & compiling from source, you can specify ref:foo where foo is a specific branch, tag, or commit. You'll need to use the same name and reference when uninstalling too.

Install Latest Stable Version

shell
asdf install <name> latest
+# asdf install erlang latest

Install latest stable version that begins with a given string.

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

List Installed Versions

shell
asdf list <name>
+# asdf list erlang

Filter versions to those that begin with a given string.

shell
asdf list <name> <version>
+# asdf list erlang 17

List All Available Versions

shell
asdf list all <name>
+# asdf list all erlang

Filter versions to those that begin with a given string.

shell
asdf list all <name> <version>
+# asdf list all erlang 17

Show Latest Stable Version

shell
asdf latest <name>
+# asdf latest erlang

Show latest stable version that begins with a given string.

shell
asdf latest <name> <version>
+# asdf latest erlang 17

Set Current Version

shell
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest

global writes the version to $HOME/.tool-versions.

shell set the version to an environment variable named ASDF_\${TOOL}_VERSION, for the current shell session only.

local writes the version to $PWD/.tool-versions, creating it if needed.

See the .tool-versions file in the Configuration section for details.

Alternatively

If you want to set a version only for the current shell session or for executing just a command under a particular tool version, you can set an environment variable like ASDF_\${TOOL}_VERSION.

The following example runs tests on an Elixir project with version 1.4.0. The version format is the same supported by the .tool-versions file.

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

Fallback to System Version

To use the system version of tool <name> instead of an asdf managed version you can set the version for the tool to system.

Set system with either global, local or shell as outlined in Set Current Version section above.

shell
asdf local <name> system
+# asdf local python system

View Current Version

shell
asdf current
+# asdf current
+# erlang          17.3          /Users/kim/.tool-versions
+# nodejs          6.11.5        /Users/kim/cool-node-project/.tool-versions
+
+asdf current <name>
+# asdf current erlang
+# erlang          17.3          /Users/kim/.tool-versions

Uninstall Version

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

Shims

When asdf installs a package it creates shims for every executable program in that package in a $ASDF_DATA_DIR/shims directory (default ~/.asdf/shims). This directory being on the $PATH (by means of asdf.sh, asdf.fish, etc) is how the installed programs are made available in the environment.

The shims themselves are really simple wrappers that exec a helper program asdf exec passing it the name of the plugin and path to the executable in the installed package that the shim is wrapping.

The asdf exec helper determines the version of the package to use (as specified in .tool-versions file, selected by asdf local ... or asdf global ...), the final path to the executable in the package installation directory (this can be manipulated by the exec-path callback in the plugin) and the environment to execute in (also provided by the plugin - exec-env script), and finally it executes it.

Note

Because this system uses exec calls, any scripts in the package that are meant to be sourced by the shell instead of executed need to be accessed directly instead of via the shim wrapper. The two asdf commands: which and where can help with this by returning the path to the installed package:

shell
# returns path to main executable in current version
+source $(asdf which \${PLUGIN})/../script.sh
+
+# returns path to the package installation directory
+source $(asdf where \${PLUGIN})/bin/script.sh

By-passing asdf shims

If for some reason you want to by-pass asdf shims or want your environment variables automatically set upon entering your project's directory, the asdf-direnv plugin can be helpful. Be sure to check its README for more details.

`,45)]))}const c=i(n,[["render",l]]);export{g as __pageData,c as default}; diff --git a/assets/manage_versions.md.CAp-N8AZ.lean.js b/assets/manage_versions.md.CAp-N8AZ.lean.js new file mode 100644 index 00000000..669d576f --- /dev/null +++ b/assets/manage_versions.md.CAp-N8AZ.lean.js @@ -0,0 +1,30 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const g=JSON.parse('{"title":"Versions","description":"","frontmatter":{},"headers":[],"relativePath":"manage/versions.md","filePath":"manage/versions.md","lastUpdated":1687069487000}'),n={name:"manage/versions.md"};function l(h,s,p,k,r,d){return t(),a("div",null,s[0]||(s[0]=[e(`

Versions

Install Version

shell
asdf install <name> <version>
+# asdf install erlang 17.3

If a plugin supports downloading & compiling from source, you can specify ref:foo where foo is a specific branch, tag, or commit. You'll need to use the same name and reference when uninstalling too.

Install Latest Stable Version

shell
asdf install <name> latest
+# asdf install erlang latest

Install latest stable version that begins with a given string.

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

List Installed Versions

shell
asdf list <name>
+# asdf list erlang

Filter versions to those that begin with a given string.

shell
asdf list <name> <version>
+# asdf list erlang 17

List All Available Versions

shell
asdf list all <name>
+# asdf list all erlang

Filter versions to those that begin with a given string.

shell
asdf list all <name> <version>
+# asdf list all erlang 17

Show Latest Stable Version

shell
asdf latest <name>
+# asdf latest erlang

Show latest stable version that begins with a given string.

shell
asdf latest <name> <version>
+# asdf latest erlang 17

Set Current Version

shell
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest

global writes the version to $HOME/.tool-versions.

shell set the version to an environment variable named ASDF_\${TOOL}_VERSION, for the current shell session only.

local writes the version to $PWD/.tool-versions, creating it if needed.

See the .tool-versions file in the Configuration section for details.

Alternatively

If you want to set a version only for the current shell session or for executing just a command under a particular tool version, you can set an environment variable like ASDF_\${TOOL}_VERSION.

The following example runs tests on an Elixir project with version 1.4.0. The version format is the same supported by the .tool-versions file.

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

Fallback to System Version

To use the system version of tool <name> instead of an asdf managed version you can set the version for the tool to system.

Set system with either global, local or shell as outlined in Set Current Version section above.

shell
asdf local <name> system
+# asdf local python system

View Current Version

shell
asdf current
+# asdf current
+# erlang          17.3          /Users/kim/.tool-versions
+# nodejs          6.11.5        /Users/kim/cool-node-project/.tool-versions
+
+asdf current <name>
+# asdf current erlang
+# erlang          17.3          /Users/kim/.tool-versions

Uninstall Version

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

Shims

When asdf installs a package it creates shims for every executable program in that package in a $ASDF_DATA_DIR/shims directory (default ~/.asdf/shims). This directory being on the $PATH (by means of asdf.sh, asdf.fish, etc) is how the installed programs are made available in the environment.

The shims themselves are really simple wrappers that exec a helper program asdf exec passing it the name of the plugin and path to the executable in the installed package that the shim is wrapping.

The asdf exec helper determines the version of the package to use (as specified in .tool-versions file, selected by asdf local ... or asdf global ...), the final path to the executable in the package installation directory (this can be manipulated by the exec-path callback in the plugin) and the environment to execute in (also provided by the plugin - exec-env script), and finally it executes it.

Note

Because this system uses exec calls, any scripts in the package that are meant to be sourced by the shell instead of executed need to be accessed directly instead of via the shim wrapper. The two asdf commands: which and where can help with this by returning the path to the installed package:

shell
# returns path to main executable in current version
+source $(asdf which \${PLUGIN})/../script.sh
+
+# returns path to the package installation directory
+source $(asdf where \${PLUGIN})/bin/script.sh

By-passing asdf shims

If for some reason you want to by-pass asdf shims or want your environment variables automatically set upon entering your project's directory, the asdf-direnv plugin can be helpful. Be sure to check its README for more details.

`,45)]))}const c=i(n,[["render",l]]);export{g as __pageData,c as default}; diff --git a/assets/more_community-projects.md.B9Jb3CEv.js b/assets/more_community-projects.md.B9Jb3CEv.js new file mode 100644 index 00000000..25cd5d2b --- /dev/null +++ b/assets/more_community-projects.md.B9Jb3CEv.js @@ -0,0 +1 @@ +import{_ as t,c as o,a2 as r,o as a}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"Community Projects","description":"","frontmatter":{},"headers":[],"relativePath":"more/community-projects.md","filePath":"more/community-projects.md","lastUpdated":1687069487000}'),s={name:"more/community-projects.md"};function c(n,e,i,m,d,l){return a(),o("div",null,e[0]||(e[0]=[r('

Community Projects

Here are some community projects related to asdf:

Note

asdf core team do not own these projects or their code. asdf core are not responsible for the quality or security as they relate to those listed here.

',4)]))}const f=t(s,[["render",c]]);export{u as __pageData,f as default}; diff --git a/assets/more_community-projects.md.B9Jb3CEv.lean.js b/assets/more_community-projects.md.B9Jb3CEv.lean.js new file mode 100644 index 00000000..25cd5d2b --- /dev/null +++ b/assets/more_community-projects.md.B9Jb3CEv.lean.js @@ -0,0 +1 @@ +import{_ as t,c as o,a2 as r,o as a}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"Community Projects","description":"","frontmatter":{},"headers":[],"relativePath":"more/community-projects.md","filePath":"more/community-projects.md","lastUpdated":1687069487000}'),s={name:"more/community-projects.md"};function c(n,e,i,m,d,l){return a(),o("div",null,e[0]||(e[0]=[r('

Community Projects

Here are some community projects related to asdf:

Note

asdf core team do not own these projects or their code. asdf core are not responsible for the quality or security as they relate to those listed here.

',4)]))}const f=t(s,[["render",c]]);export{u as __pageData,f as default}; diff --git a/assets/more_faq.md.BjmX8xoH.js b/assets/more_faq.md.BjmX8xoH.js new file mode 100644 index 00000000..6abd27f8 --- /dev/null +++ b/assets/more_faq.md.BjmX8xoH.js @@ -0,0 +1 @@ +import{_ as o,c as t,a2 as a,o as n}from"./chunks/framework.C9NVOr0y.js";const p=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"more/faq.md","filePath":"more/faq.md","lastUpdated":1671778129000}'),r={name:"more/faq.md"};function s(i,e,d,l,c,h){return n(),t("div",null,e[0]||(e[0]=[a('

FAQ

Here are some common questions regarding asdf.

WSL1 support?

WSL1 (Windows Subsystem for Linux 1) is not officially supported. Some aspects of asdf may not work properly. We do not intend to add official support for WSL1.

WSL2 support?

WSL2 (Windows Subsystem for Linux 2) should work using the setup & dependency instructions for you chosen WSL distro.

Importantly, WSL2 is only expected to work properly when the current working directory is a Unix drive and not a bound Windows drive.

We intend to run out test suite on WSL2 when host runner support is available on GitHub Actions, currently this does not appear to be the case.

Newly installed executable not running?

I just npm install -g yarn, but cannot execute yarn. What gives?

asdf uses shims to manage executables. Those installed by plugins have shims automatically created, whereas installing executables via an asdf managed tool will require you to notify asdf of the need to create shims. In this instance, to create a shim for Yarn. See the asdf reshim command docs.

Shell not detecting newly installed shims?

If asdf reshim is not resolving your issue, then it is most-likely due to the sourcing of asdf.sh or asdf.fish not being at the BOTTOM of your Shell config file (.bash_profile, .zshrc, config.fish etc). It needs to be sourced AFTER you have set your $PATH and AFTER you have sourced your framework (oh-my-zsh etc) if any.

',13)]))}const f=o(r,[["render",s]]);export{p as __pageData,f as default}; diff --git a/assets/more_faq.md.BjmX8xoH.lean.js b/assets/more_faq.md.BjmX8xoH.lean.js new file mode 100644 index 00000000..6abd27f8 --- /dev/null +++ b/assets/more_faq.md.BjmX8xoH.lean.js @@ -0,0 +1 @@ +import{_ as o,c as t,a2 as a,o as n}from"./chunks/framework.C9NVOr0y.js";const p=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"more/faq.md","filePath":"more/faq.md","lastUpdated":1671778129000}'),r={name:"more/faq.md"};function s(i,e,d,l,c,h){return n(),t("div",null,e[0]||(e[0]=[a('

FAQ

Here are some common questions regarding asdf.

WSL1 support?

WSL1 (Windows Subsystem for Linux 1) is not officially supported. Some aspects of asdf may not work properly. We do not intend to add official support for WSL1.

WSL2 support?

WSL2 (Windows Subsystem for Linux 2) should work using the setup & dependency instructions for you chosen WSL distro.

Importantly, WSL2 is only expected to work properly when the current working directory is a Unix drive and not a bound Windows drive.

We intend to run out test suite on WSL2 when host runner support is available on GitHub Actions, currently this does not appear to be the case.

Newly installed executable not running?

I just npm install -g yarn, but cannot execute yarn. What gives?

asdf uses shims to manage executables. Those installed by plugins have shims automatically created, whereas installing executables via an asdf managed tool will require you to notify asdf of the need to create shims. In this instance, to create a shim for Yarn. See the asdf reshim command docs.

Shell not detecting newly installed shims?

If asdf reshim is not resolving your issue, then it is most-likely due to the sourcing of asdf.sh or asdf.fish not being at the BOTTOM of your Shell config file (.bash_profile, .zshrc, config.fish etc). It needs to be sourced AFTER you have set your $PATH and AFTER you have sourced your framework (oh-my-zsh etc) if any.

',13)]))}const f=o(r,[["render",s]]);export{p as __pageData,f as default}; diff --git a/assets/more_thanks.md.C4xnnmzS.js b/assets/more_thanks.md.C4xnnmzS.js new file mode 100644 index 00000000..3e4b73f1 --- /dev/null +++ b/assets/more_thanks.md.C4xnnmzS.js @@ -0,0 +1 @@ +import{_ as a,c as t,a2 as r,o}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"Thanks","description":"","frontmatter":{},"headers":[],"relativePath":"more/thanks.md","filePath":"more/thanks.md","lastUpdated":1671778129000}'),s={name:"more/thanks.md"};function n(h,e,i,l,u,c){return o(),t("div",null,e[0]||(e[0]=[r('

Thanks

Thank you page to the asdf authors & contributors!

Credits

Me (@HashNuke), High-fever, cold, cough.

Copyright 2014 to the end of time (MIT License)

Maintainers

Contributors

See the list of contributors 🙏 on GitHub

',9)]))}const b=a(s,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/more_thanks.md.C4xnnmzS.lean.js b/assets/more_thanks.md.C4xnnmzS.lean.js new file mode 100644 index 00000000..3e4b73f1 --- /dev/null +++ b/assets/more_thanks.md.C4xnnmzS.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,a2 as r,o}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"Thanks","description":"","frontmatter":{},"headers":[],"relativePath":"more/thanks.md","filePath":"more/thanks.md","lastUpdated":1671778129000}'),s={name:"more/thanks.md"};function n(h,e,i,l,u,c){return o(),t("div",null,e[0]||(e[0]=[r('

Thanks

Thank you page to the asdf authors & contributors!

Credits

Me (@HashNuke), High-fever, cold, cough.

Copyright 2014 to the end of time (MIT License)

Maintainers

Contributors

See the list of contributors 🙏 on GitHub

',9)]))}const b=a(s,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/plugins_create.md.Ba4Peca-.js b/assets/plugins_create.md.Ba4Peca-.js new file mode 100644 index 00000000..0a519495 --- /dev/null +++ b/assets/plugins_create.md.Ba4Peca-.js @@ -0,0 +1,35 @@ +import{_ as n,c as o,a2 as l,j as s,a as e,G as a,B as p,o as d}from"./chunks/framework.C9NVOr0y.js";const T=JSON.parse('{"title":"Create a Plugin","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/create.md","filePath":"plugins/create.md","lastUpdated":1704804447000}'),r={name:"plugins/create.md"},h={tabindex:"0"},c={style:{"text-align":"left"}},g={style:{"text-align":"left"}},u={style:{"text-align":"left"}},k={style:{"text-align":"left"}},b={id:"bin-list-all",tabindex:"-1"},m={id:"bin-download",tabindex:"-1"},f={id:"bin-install",tabindex:"-1"},y={id:"bin-latest-stable",tabindex:"-1"},F={id:"extension-commands-for-asdf-cli",tabindex:"-1"},v={id:"custom-shim-templates",tabindex:"-1"};function E(A,i,C,x,_,S){const t=p("Badge");return d(),o("div",null,[i[48]||(i[48]=l('

Create a Plugin

A plugin is a Git repo with some executable scripts to support versioning a language / tool. These scripts are run by asdf using specific commands to support features such as asdf list-all <name>, asdf install <name> <version> etc.

Quickstart

There are two options to get started with creating your own plugin:

  1. use the asdf-vm/asdf-plugin-template repository to generate a plugin repo (named asdf-<tool_name>) with default scripts implemented. Once generated, clone the repo and run the setup.bash script to interactively update the template.
  2. start your own repo called asdf-<tool_name> and implement the required scripts as listed in the documentation below.

Golden Rules for Plugin Scripts

  • scripts should NOT call other asdf commands
  • keep your dependency list of Shell tools/commands small
  • avoid non-portable tools or command flags. For example, sort -V. See our asdf core list of banned commands

Scripts Overview

The full list of scripts callable from asdf.

',9)),s("table",h,[i[25]||(i[25]=s("thead",null,[s("tr",null,[s("th",{style:{"text-align":"left"}},"Script"),s("th",{style:{"text-align":"left"}},"Description")])],-1)),s("tbody",null,[s("tr",null,[s("td",c,[i[0]||(i[0]=s("a",{href:"#bin-list-all"},"bin/list-all",-1)),i[1]||(i[1]=e()),a(t,{type:"tip",text:"required",vertical:"middle"})]),i[2]||(i[2]=s("td",{style:{"text-align":"left"}},"List all installable versions",-1))]),s("tr",null,[s("td",g,[i[3]||(i[3]=s("a",{href:"#bin-download"},"bin/download",-1)),i[4]||(i[4]=e()),a(t,{type:"tip",text:"required",vertical:"middle"})]),i[5]||(i[5]=s("td",{style:{"text-align":"left"}},"Download source code or binary for the specified version",-1))]),s("tr",null,[s("td",u,[i[6]||(i[6]=s("a",{href:"#bin-install"},"bin/install",-1)),i[7]||(i[7]=e()),a(t,{type:"tip",text:"required",vertical:"middle"})]),i[8]||(i[8]=s("td",{style:{"text-align":"left"}},"Installs the specified version",-1))]),s("tr",null,[s("td",k,[i[9]||(i[9]=s("a",{href:"#bin-latest-stable"},"bin/latest-stable",-1)),i[10]||(i[10]=e()),a(t,{type:"warning",text:"recommended",vertical:"middle"})]),i[11]||(i[11]=s("td",{style:{"text-align":"left"}},"List the latest stable version of the specified tool",-1))]),i[12]||(i[12]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-help.overview"},"bin/help.overview")]),s("td",{style:{"text-align":"left"}},"Output a general description about the plugin & tool")],-1)),i[13]||(i[13]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-help.deps"},"bin/help.deps")]),s("td",{style:{"text-align":"left"}},"Output a list of dependencies per Operating System")],-1)),i[14]||(i[14]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-help.config"},"bin/help.config")]),s("td",{style:{"text-align":"left"}},"Output plugin or tool configuration information")],-1)),i[15]||(i[15]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-help.links"},"bin/help.links")]),s("td",{style:{"text-align":"left"}},"Output a list of links for the plugin or tool")],-1)),i[16]||(i[16]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-list-bin-paths"},"bin/list-bin-paths")]),s("td",{style:{"text-align":"left"}},"List relative paths to directories with binaries to create shims")],-1)),i[17]||(i[17]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-exec-env"},"bin/exec-env")]),s("td",{style:{"text-align":"left"}},"Prepare the environment for running the binaries")],-1)),i[18]||(i[18]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-exec-path"},"bin/exec-path")]),s("td",{style:{"text-align":"left"}},"Output the executable path for a version of a tool")],-1)),i[19]||(i[19]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-uninstall"},"bin/uninstall")]),s("td",{style:{"text-align":"left"}},"Uninstall a specific version of a tool")],-1)),i[20]||(i[20]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-list-legacy-filenames"},"bin/list-legacy-filenames")]),s("td",{style:{"text-align":"left"}},[e("Output filenames of legacy version files: "),s("code",null,".ruby-version")])],-1)),i[21]||(i[21]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-parse-legacy-file"},"bin/parse-legacy-file")]),s("td",{style:{"text-align":"left"}},"Custom parser for legacy version files")],-1)),i[22]||(i[22]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-post-plugin-add"},"bin/post-plugin-add")]),s("td",{style:{"text-align":"left"}},"Hook to execute after a plugin has been added")],-1)),i[23]||(i[23]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-post-plugin-update"},"bin/post-plugin-update")]),s("td",{style:{"text-align":"left"}},"Hook to execute after a plugin has been updated")],-1)),i[24]||(i[24]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-pre-plugin-remove"},"bin/pre-plugin-remove")]),s("td",{style:{"text-align":"left"}},"Hook to execute before a plugin is removed")],-1))])]),i[49]||(i[49]=l('

To see which commands invoke which scripts, see the detailed documentation for each script.

Environment Variables Overview

The full list of Environment Variables used throughout all scripts.

Environment VariablesDescription
ASDF_INSTALL_TYPEversion or ref
ASDF_INSTALL_VERSIONfull version number or Git Ref depending on ASDF_INSTALL_TYPE
ASDF_INSTALL_PATHthe path to where the tool should, or has been installed
ASDF_CONCURRENCYthe number of cores to use when compiling the source code. Useful for setting make -j
ASDF_DOWNLOAD_PATHthe path to where the source code or binary was downloaded to by bin/download
ASDF_PLUGIN_PATHthe path the plugin was installed
ASDF_PLUGIN_SOURCE_URLthe source URL of the plugin
ASDF_PLUGIN_PREV_REFprevous git-ref of the plugin repo
ASDF_PLUGIN_POST_REFupdated git-ref of the plugin repo
ASDF_CMD_FILEresolves to the full path of the file being sourced

NOTE

Not all environment variables are available in all scripts. Check the documentation for each script below to see which env vars are available to it.

Required Scripts

',6)),s("h3",b,[i[26]||(i[26]=s("code",null,"bin/list-all",-1)),i[27]||(i[27]=e()),a(t,{type:"tip",text:"required",vertical:"middle"}),i[28]||(i[28]=e()),i[29]||(i[29]=s("a",{class:"header-anchor",href:"#bin-list-all","aria-label":'Permalink to "`bin/list-all` "'},"​",-1))]),i[50]||(i[50]=l('

Description

List all installable versions.

Output Format

Must print a string with a space-separated list of versions. For example:

txt
1.0.1 1.0.2 1.3.0 1.4

Newest version should be last.

asdf core will print each version on its own line, potentially pushing some versions offscreen.

Sorting

If versions are being pulled from releases page on a website it's recommended to leave the versions in the provided order as they are often already in the correct order. If they are in reverse order piping them through tac should suffice.

If sorting is unavoidable, sort -V is not portable, so we suggest either:

Environment Variables available to script

No environment variables are provided to this script.

Commands that invoke this script

  • asdf list all <name> [version]
  • asdf list all nodejs: lists all versions as returned by this script, one on each line.
  • asdf list all nodejs 18: lists all versions as returned by this script, one on each line, with a filter matching any version beginning with 18 applied.

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}/bin/list-all"

',19)),s("h3",m,[i[30]||(i[30]=s("code",null,"bin/download",-1)),i[31]||(i[31]=e()),a(t,{type:"tip",text:"required",vertical:"middle"}),i[32]||(i[32]=e()),i[33]||(i[33]=s("a",{class:"header-anchor",href:"#bin-download","aria-label":'Permalink to "`bin/download` "'},"​",-1))]),i[51]||(i[51]=l('

Description

Download the source code or binary for a specific version of a tool to a specified location.

Implementation Details

  • The script must download the source or binary to the directory specified by ASDF_DOWNLOAD_PATH.
  • Only the decompressed source code or binary should be placed in the ASDF_DOWNLOAD_PATH directory.
  • On failure, no files should be placed in ASDF_DOWNLOAD_PATH.
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Legacy Plugins

Though this script is marked as required for all plugins, it is optional for "legacy" plugins which predate its introduction.

If this script is absent, asdf will assume that the bin/install script is present and will download and install the version.

All plugins must include this script as support for legacy plugins will eventually be removed.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.
  • ASDF_DOWNLOAD_PATH: The path to where the source code or binary was downloaded to.

Commands that invoke this script

  • asdf install <tool> [version]
  • asdf install <tool> latest[:version]
  • asdf install nodejs 18.0.0: downloads the source code or binary for Node.js version 18.0.0 and places it in the ASDF_DOWNLOAD_PATH directory. Then runs the bin/install script.

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}"/bin/download

',16)),s("h3",f,[i[34]||(i[34]=s("code",null,"bin/install",-1)),i[35]||(i[35]=e()),a(t,{type:"tip",text:"required",vertical:"middle"}),i[36]||(i[36]=e()),i[37]||(i[37]=s("a",{class:"header-anchor",href:"#bin-install","aria-label":'Permalink to "`bin/install` "'},"​",-1))]),i[52]||(i[52]=l('

Description

Install a specific version of a tool to a specified location.

Implementation Details

  • The script should install the specified version in the path ASDF_INSTALL_PATH.
  • Shims will be created by default for any files in $ASDF_INSTALL_PATH/bin. This behaviour can be customised with the optional bin/list-bin-paths script.
  • Success should exit with 0.
  • Failure should exit with a non-zero status.
  • To avoid TOCTOU (Time-of-Check-to-Time-of-Use) issues, ensure the script only places files in ASDF_INSTALL_PATH once the build and installation of the tool is deemed a success.

Legacy Plugins

If the bin/download script is absent, this script should download and install the specified version.

For compatibility with versions of the asdf core earlier than 0.7._ and newer than 0.8._, check for the presence of the ASDF_DOWNLOAD_PATH environment variable. If set, assume the bin/download script already downloaded the version, else download the source code in the bin/install script.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.
  • ASDF_CONCURRENCY: The number of cores to use when compiling source code. Useful for setting flags like make -j.
  • ASDF_DOWNLOAD_PATH: The path where the source code or binary was downloaded to.

Commands that invoke this script

  • asdf install
  • asdf install <tool>
  • asdf install <tool> [version]
  • asdf install <tool> latest[:version]
  • asdf install nodejs 18.0.0: installs Node.js version 18.0.0 in the ASDF_INSTALL_PATH directory.

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}"/bin/install

Optional Scripts

',15)),s("h3",y,[i[38]||(i[38]=s("code",null,"bin/latest-stable",-1)),i[39]||(i[39]=e()),a(t,{type:"warning",text:"recommended",vertical:"middle"}),i[40]||(i[40]=e()),i[41]||(i[41]=s("a",{class:"header-anchor",href:"#bin-latest-stable","aria-label":'Permalink to "`bin/latest-stable` "'},"​",-1))]),i[53]||(i[53]=l('

Description

Determine the latest stable version of a tool. If absent, the asdf core will tail the bin/list-all output which may be undesirable.

Implementation Details

  • The script should print the latest stable version of the tool to stdout.
  • Non-stable or release candidate versions should be omitted.
  • A filter query is provided as the first argument to the script. This should be used to filter the output by version number or tool provider.
    • For instance, the output of asdf list all ruby from the ruby plugin lists versions of Ruby from many providers: jruby, rbx & truffleruby amongst others. The user provided filter could be used by the plugin to filter the semver versions and/or provider.
      > asdf latest ruby\n3.2.2\n> asdf latest ruby 2\n2.7.8\n> asdf latest ruby truffleruby\ntruffleruby+graalvm-22.3.1
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf global <tool> latest: set the global version of a tool to the latest stable version for that tool.
  • asdf local <name> latest: set the local version of a tool to the latest stable version for that tool.
  • asdf install <tool> latest: installs the latest version of a tool.
  • asdf latest <tool> [<version>]: outputs the latest version of a tool based on the optional filter.
  • asdf latest --all: outputs the latest version of all tools managed by asdf and whether they are installed.

Call signature from asdf core

The script should accept a single argument, the filter query.

bash
"${plugin_path}"/bin/latest-stable "$query"

bin/help.overview

Description

Output a general description about the plugin and the tool being managed.

Implementation Details

  • This script is required for any help output to be displayed for the plugin.
  • No heading should be printed as asdf core will print headings.
  • Output may be free-form text but ideally only one short paragraph.
  • Must not output any information that is already covered in the core asdf-vm documentation.
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf help <name> [<version>]: Output documentation for plugin and tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.overview

bin/help.deps

Description

Output the list of dependencies tailored to the operating system. One dependency per line.

bash
git\ncurl\nsed

Implementation Details

  • This script requires bin/help.overview for its output to be considered.
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf help <name> [<version>]: Output documentation for plugin and tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.deps

bin/help.config

Description

Output any required or optional configuration for the plugin and tool. For example, describe any environment variables or other flags needed to install or compile the tool.

Implementation Details

  • This script requires bin/help.overview for its output to be considered.
  • Output can be free-form text.
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf help <name> [<version>]: Output documentation for plugin and tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.config

Description

Output a list of links relevant to the plugin and tool. One link per line.

bash
Git Repository:	https://github.com/vlang/v\nDocumentation:	https://vlang.io

Implementation Details

  • This script requires bin/help.overview for its output to be considered.
  • One link per line.
  • Format must be either:
    • <title>: <link>
    • or just <link>
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf help <name> [<version>]: Output documentation for plugin and tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.links

bin/list-bin-paths

Description

List directories containing executables for the specified version of the tool.

Implementation Details

  • If this script is not present, asdf will look for binaries in the "${ASDF_INSTALL_PATH}"/bin directory & create shims for those.
  • Output a space-separated list of paths containing executables.
  • Paths must be relative to ASDF_INSTALL_PATH. Example output would be:
bash
bin tools veggies

This will instruct asdf to create shims for the files in:

  • "${ASDF_INSTALL_PATH}"/bin
  • "${ASDF_INSTALL_PATH}"/tools
  • "${ASDF_INSTALL_PATH}"/veggies

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf install <tool> [version]: initially create shims for binaries.
  • asdf reshim <tool> <version>: recreate shims for binaries.

Call signature from asdf core

bash
"${plugin_path}/bin/list-bin-paths"

bin/exec-env

Description

Prepare the environment before executing the shims for the binaries for the tool.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf which <command>: Display the path to an executable
  • asdf exec <command> [args...]: Executes the command shim for current version
  • asdf env <command> [util]: Runs util (default: env) inside the environment used for command shim execution.

Call signature from asdf core

bash
"${plugin_path}/bin/exec-env"

bin/exec-path

Get the executable path for the specified version of the tool. Must print a string with the relative executable path. This allows the plugin to conditionally override the shim's specified executable path, otherwise return the default path specified by the shim.

Description

Get the executable path for the specified version of the tool.

Implementation Details

  • Must print a string with the relative executable path.
  • Conditionally override the shim's specified executable path, otherwise return the default path specified by the shim.
shell
Usage:\n  plugin/bin/exec-path <install-path> <command> <executable-path>\n\nExample Call:\n  ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"\n\nOutput:\n  bin/foox

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf which <command>: Display the path to an executable
  • asdf exec <command> [args...]: Executes the command shim for current version
  • asdf env <command> [util]: Runs util (default: env) inside the environment used for command shim execution.

Call signature from asdf core

bash
"${plugin_path}/bin/exec-path" "$install_path" "$cmd" "$relative_path"

bin/uninstall

Description

Uninstall the provided version of a tool.

Output Format

Output should be sent to stdout or stderr as appropriate for the user. No output is read by subsequent execution in the core.

Environment Variables available to script

No environment variables are provided to this script.

Commands that invoke this script

  • asdf list all <name> <version>
  • asdf uninstall nodejs 18.15.0: Uninstalls the version 18.15.0 of nodejs, removing all shims including those installed global with npm i -g

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}/bin/uninstall"

bin/list-legacy-filenames

Description

List legacy configuration filenames for determining the specified version of the tool.

Implementation Details

  • Output a space-separated list of filenames.
    bash
    .ruby-version .rvmrc
  • Only applies for users who have enabled the legacy_version_file option in their "${HOME}"/.asdfrc.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

Any command which reads a tool version.

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}/bin/list-legacy-filenames"

bin/parse-legacy-file

Description

Parse the legacy file found by asdf to determine the version of the tool. Useful to extract version numbers from files like JavaScript's package.json or Golangs go.mod.

Implementation Details

  • If not present, asdf will simply cat the legacy file to determine the version.
  • Should be deterministic and always return the same exact version:
    • when parsing the same legacy file.
    • regardless of what is installed on the machine or whether the legacy version is valid or complete. Some legacy file formats may not be suitable.
  • Output a single line with the version:
    bash
    1.2.3

Environment Variables available to script

No environment variables specifically set before this script is called.

Commands that invoke this script

Any command which reads a tool version.

Call signature from asdf core

The script should accept a single argument, the path to the legacy file for reading its contents.

bash
"${plugin_path}/bin/parse-legacy-file" "$file_path"

bin/post-plugin-add

Description

Execute this callback script after the plugin has been added to asdf with asdf plugin add <tool>.

See also the related command hooks:

  • pre_asdf_plugin_add
  • pre_asdf_plugin_add_${plugin_name}
  • post_asdf_plugin_add
  • post_asdf_plugin_add_${plugin_name}

Environment Variables available to script

  • ASDF_PLUGIN_PATH: path where the plugin was installed.
  • ASDF_PLUGIN_SOURCE_URL: URL of the plugin source. Can be a local directory path.

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}/bin/post-plugin-add"

bin/post-plugin-update

Description

Execute this callback script after asdf has downloaded the update plugin with asdf plugin update <tool> [<git-ref>].

See also the related command hooks:

  • pre_asdf_plugin_update
  • pre_asdf_plugin_update_${plugin_name}
  • post_asdf_plugin_update
  • post_asdf_plugin_update_${plugin_name}

Environment Variables available to script

  • ASDF_PLUGIN_PATH: path where the plugin was installed.
  • ASDF_PLUGIN_PREV_REF: the plugin's previous git-ref
  • ASDF_PLUGIN_POST_REF: the plugin's updated git-ref

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}/bin/post-plugin-update"

bin/pre-plugin-remove

Description

Execute this callback script before asdf has removed the plugin with asdf plugin remove <tool>.

See also the related command hooks:

  • pre_asdf_plugin_remove
  • pre_asdf_plugin_remove_${plugin_name}
  • post_asdf_plugin_remove
  • post_asdf_plugin_remove_${plugin_name}

Environment Variables available to script

  • ASDF_PLUGIN_PATH: path where the plugin was installed.

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}/bin/pre-plugin-remove"
',172)),s("h2",F,[i[42]||(i[42]=e("Extension Commands for asdf CLI ")),a(t,{type:"danger",text:"advanced",vertical:"middle"}),i[43]||(i[43]=e()),i[44]||(i[44]=s("a",{class:"header-anchor",href:"#extension-commands-for-asdf-cli","aria-label":'Permalink to "Extension Commands for asdf CLI "'},"​",-1))]),i[54]||(i[54]=l('

It's possible for plugins to define new asdf commands by providing lib/commands/command*.bash scripts or executables that will be callable using the asdf command line interface by using the plugin name as a subcommand.

For example, suppose a foo plugin has:

shell
foo/\n  lib/commands/\n    command.bash\n    command-bat.bash\n    command-bat-man.bash\n    command-help.bash

Users can now execute:

shell
$ asdf foo         # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash`\n$ asdf foo bar     # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar`\n$ asdf foo help    # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash`\n$ asdf foo bat man # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash`\n$ asdf foo bat baz # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz`

Plugin authors can use this feature to provide utilities related to their tools, or even create plugins that are just new command extensions of asdf itself.

If the executable bit is set, the script is executed, replacing the asdf execution.

If the executable bit is not set, asdf will source the scripts as Bash scripts.

$ASDF_CMD_FILE resolves to the full path of the file being sourced.

haxe is a great example of a plugin which uses this feature. It provides the asdf haxe neko-dylibs-link to fix an issue where Haxe executables expect to find dynamic libraries relative to the executable directory.

Be sure to list your asdf Extension Commands in your plugins README.

',11)),s("h2",v,[i[45]||(i[45]=e("Custom Shim Templates ")),a(t,{type:"danger",text:"advanced",vertical:"middle"}),i[46]||(i[46]=e()),i[47]||(i[47]=s("a",{class:"header-anchor",href:"#custom-shim-templates","aria-label":'Permalink to "Custom Shim Templates "'},"​",-1))]),i[55]||(i[55]=l(`

WARNING

Please only use if absolutely required

asdf allows custom shim templates. For an executable called foo, if there's a shims/foo file in the plugin, then asdf will copy that file instead of using its standard shim template.

This must be used wisely.

As far as the asdf core team is aware, this feature is only in use in the first-party Elixir plugin. This is because an executable is also read as an Elixir file in addition to being an executable. This makes it not possible to use the standard Bash shim.

Testing

asdf contains the plugin-test command to test your plugin:

shell
asdf plugin test <plugin_name> <plugin_url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git_ref>] [test_command...]
  • <plugin_name> & <plugin_url> are required
  • If optional [--asdf-tool-version <version>] is specified, the tool will be installed with that specific version. Defaults to asdf latest <plugin-name>
  • If optional [--asdf-plugin-gitref <git_ref>] is specified, the plugin itself is checked out at that commit/branch/tag. This is useful for testing a pull-request on your plugin's CI. Defaults to the default branch of the plugin's repository.
  • Optional parameter [test_command...] is the command to execute to validate the installed tool works correctly. Typically <tool> --version or <tool> --help. For example, to test the NodeJS plugin, we could run
    shell
    # asdf plugin test <plugin_name>  <plugin_url>                               [test_command]
    +  asdf plugin test nodejs         https://github.com/asdf-vm/asdf-nodejs.git node --version

Note

We recommend testing in both Linux & macOS CI environments

GitHub Action

The asdf-vm/actions repo provides a GitHub Action for testing your plugins hosted on GitHub. A sample .github/workflows/test.yaml Actions Workflow:

yaml
name: Test
+on:
+  push:
+    branches:
+      - main
+  pull_request:
+
+jobs:
+  plugin_test:
+    name: asdf plugin test
+    strategy:
+      matrix:
+        os:
+          - ubuntu-latest
+          - macos-latest
+    runs-on: \${{ matrix.os }}
+    steps:
+      - name: asdf_plugin_test
+        uses: asdf-vm/actions/plugin-test@v2
+        with:
+          command: "<MY_TOOL> --version"

TravisCI Config

A sample .travis.yml file, customize it to your needs

yaml
language: c
+script: asdf plugin test <MY_TOOL> $TRAVIS_BUILD_DIR '<MY_TOOL> --version'
+before_script:
+  - git clone https://github.com/asdf-vm/asdf.git asdf
+  - . asdf/asdf.sh
+os:
+  - linux
+  - osx

NOTE

When using another CI you may need to pass a relative path to the plugin location:

shell
asdf plugin test <tool_name> <path> '<tool_command> --version'

API Rate Limiting

If a command depends on accessing an external API, like bin/list-all or bin/latest-stable, it may experience rate limiting during automated testing. To mitigate this, ensure there is a code-path which provides an authentication token via an environment variable. For example:

shell
cmd="curl --silent"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"

GITHUB_API_TOKEN

To utilise the GITHUB_API_TOKEN, create a new personal token with only public_repo access.

Then add this to your CI pipeline environment variables.

WARNING

NEVER publish your authentication tokens in your code repository

Plugin Shortname Index

TIP

The recommended installation method for a plugin is via direct URL installation:

shell
# asdf plugin add <name> <git_url>
+  asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

If the git_url is not provided, asdf will use the Shortname Index repository to determine the exact git_url to use.

You can add your plugin to the Shortname Index by following the instructions in that repo.

`,27))])}const L=n(r,[["render",E]]);export{T as __pageData,L as default}; diff --git a/assets/plugins_create.md.Ba4Peca-.lean.js b/assets/plugins_create.md.Ba4Peca-.lean.js new file mode 100644 index 00000000..0a519495 --- /dev/null +++ b/assets/plugins_create.md.Ba4Peca-.lean.js @@ -0,0 +1,35 @@ +import{_ as n,c as o,a2 as l,j as s,a as e,G as a,B as p,o as d}from"./chunks/framework.C9NVOr0y.js";const T=JSON.parse('{"title":"Create a Plugin","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/create.md","filePath":"plugins/create.md","lastUpdated":1704804447000}'),r={name:"plugins/create.md"},h={tabindex:"0"},c={style:{"text-align":"left"}},g={style:{"text-align":"left"}},u={style:{"text-align":"left"}},k={style:{"text-align":"left"}},b={id:"bin-list-all",tabindex:"-1"},m={id:"bin-download",tabindex:"-1"},f={id:"bin-install",tabindex:"-1"},y={id:"bin-latest-stable",tabindex:"-1"},F={id:"extension-commands-for-asdf-cli",tabindex:"-1"},v={id:"custom-shim-templates",tabindex:"-1"};function E(A,i,C,x,_,S){const t=p("Badge");return d(),o("div",null,[i[48]||(i[48]=l('

Create a Plugin

A plugin is a Git repo with some executable scripts to support versioning a language / tool. These scripts are run by asdf using specific commands to support features such as asdf list-all <name>, asdf install <name> <version> etc.

Quickstart

There are two options to get started with creating your own plugin:

  1. use the asdf-vm/asdf-plugin-template repository to generate a plugin repo (named asdf-<tool_name>) with default scripts implemented. Once generated, clone the repo and run the setup.bash script to interactively update the template.
  2. start your own repo called asdf-<tool_name> and implement the required scripts as listed in the documentation below.

Golden Rules for Plugin Scripts

  • scripts should NOT call other asdf commands
  • keep your dependency list of Shell tools/commands small
  • avoid non-portable tools or command flags. For example, sort -V. See our asdf core list of banned commands

Scripts Overview

The full list of scripts callable from asdf.

',9)),s("table",h,[i[25]||(i[25]=s("thead",null,[s("tr",null,[s("th",{style:{"text-align":"left"}},"Script"),s("th",{style:{"text-align":"left"}},"Description")])],-1)),s("tbody",null,[s("tr",null,[s("td",c,[i[0]||(i[0]=s("a",{href:"#bin-list-all"},"bin/list-all",-1)),i[1]||(i[1]=e()),a(t,{type:"tip",text:"required",vertical:"middle"})]),i[2]||(i[2]=s("td",{style:{"text-align":"left"}},"List all installable versions",-1))]),s("tr",null,[s("td",g,[i[3]||(i[3]=s("a",{href:"#bin-download"},"bin/download",-1)),i[4]||(i[4]=e()),a(t,{type:"tip",text:"required",vertical:"middle"})]),i[5]||(i[5]=s("td",{style:{"text-align":"left"}},"Download source code or binary for the specified version",-1))]),s("tr",null,[s("td",u,[i[6]||(i[6]=s("a",{href:"#bin-install"},"bin/install",-1)),i[7]||(i[7]=e()),a(t,{type:"tip",text:"required",vertical:"middle"})]),i[8]||(i[8]=s("td",{style:{"text-align":"left"}},"Installs the specified version",-1))]),s("tr",null,[s("td",k,[i[9]||(i[9]=s("a",{href:"#bin-latest-stable"},"bin/latest-stable",-1)),i[10]||(i[10]=e()),a(t,{type:"warning",text:"recommended",vertical:"middle"})]),i[11]||(i[11]=s("td",{style:{"text-align":"left"}},"List the latest stable version of the specified tool",-1))]),i[12]||(i[12]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-help.overview"},"bin/help.overview")]),s("td",{style:{"text-align":"left"}},"Output a general description about the plugin & tool")],-1)),i[13]||(i[13]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-help.deps"},"bin/help.deps")]),s("td",{style:{"text-align":"left"}},"Output a list of dependencies per Operating System")],-1)),i[14]||(i[14]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-help.config"},"bin/help.config")]),s("td",{style:{"text-align":"left"}},"Output plugin or tool configuration information")],-1)),i[15]||(i[15]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-help.links"},"bin/help.links")]),s("td",{style:{"text-align":"left"}},"Output a list of links for the plugin or tool")],-1)),i[16]||(i[16]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-list-bin-paths"},"bin/list-bin-paths")]),s("td",{style:{"text-align":"left"}},"List relative paths to directories with binaries to create shims")],-1)),i[17]||(i[17]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-exec-env"},"bin/exec-env")]),s("td",{style:{"text-align":"left"}},"Prepare the environment for running the binaries")],-1)),i[18]||(i[18]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-exec-path"},"bin/exec-path")]),s("td",{style:{"text-align":"left"}},"Output the executable path for a version of a tool")],-1)),i[19]||(i[19]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-uninstall"},"bin/uninstall")]),s("td",{style:{"text-align":"left"}},"Uninstall a specific version of a tool")],-1)),i[20]||(i[20]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-list-legacy-filenames"},"bin/list-legacy-filenames")]),s("td",{style:{"text-align":"left"}},[e("Output filenames of legacy version files: "),s("code",null,".ruby-version")])],-1)),i[21]||(i[21]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-parse-legacy-file"},"bin/parse-legacy-file")]),s("td",{style:{"text-align":"left"}},"Custom parser for legacy version files")],-1)),i[22]||(i[22]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-post-plugin-add"},"bin/post-plugin-add")]),s("td",{style:{"text-align":"left"}},"Hook to execute after a plugin has been added")],-1)),i[23]||(i[23]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-post-plugin-update"},"bin/post-plugin-update")]),s("td",{style:{"text-align":"left"}},"Hook to execute after a plugin has been updated")],-1)),i[24]||(i[24]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-pre-plugin-remove"},"bin/pre-plugin-remove")]),s("td",{style:{"text-align":"left"}},"Hook to execute before a plugin is removed")],-1))])]),i[49]||(i[49]=l('

To see which commands invoke which scripts, see the detailed documentation for each script.

Environment Variables Overview

The full list of Environment Variables used throughout all scripts.

Environment VariablesDescription
ASDF_INSTALL_TYPEversion or ref
ASDF_INSTALL_VERSIONfull version number or Git Ref depending on ASDF_INSTALL_TYPE
ASDF_INSTALL_PATHthe path to where the tool should, or has been installed
ASDF_CONCURRENCYthe number of cores to use when compiling the source code. Useful for setting make -j
ASDF_DOWNLOAD_PATHthe path to where the source code or binary was downloaded to by bin/download
ASDF_PLUGIN_PATHthe path the plugin was installed
ASDF_PLUGIN_SOURCE_URLthe source URL of the plugin
ASDF_PLUGIN_PREV_REFprevous git-ref of the plugin repo
ASDF_PLUGIN_POST_REFupdated git-ref of the plugin repo
ASDF_CMD_FILEresolves to the full path of the file being sourced

NOTE

Not all environment variables are available in all scripts. Check the documentation for each script below to see which env vars are available to it.

Required Scripts

',6)),s("h3",b,[i[26]||(i[26]=s("code",null,"bin/list-all",-1)),i[27]||(i[27]=e()),a(t,{type:"tip",text:"required",vertical:"middle"}),i[28]||(i[28]=e()),i[29]||(i[29]=s("a",{class:"header-anchor",href:"#bin-list-all","aria-label":'Permalink to "`bin/list-all` "'},"​",-1))]),i[50]||(i[50]=l('

Description

List all installable versions.

Output Format

Must print a string with a space-separated list of versions. For example:

txt
1.0.1 1.0.2 1.3.0 1.4

Newest version should be last.

asdf core will print each version on its own line, potentially pushing some versions offscreen.

Sorting

If versions are being pulled from releases page on a website it's recommended to leave the versions in the provided order as they are often already in the correct order. If they are in reverse order piping them through tac should suffice.

If sorting is unavoidable, sort -V is not portable, so we suggest either:

Environment Variables available to script

No environment variables are provided to this script.

Commands that invoke this script

  • asdf list all <name> [version]
  • asdf list all nodejs: lists all versions as returned by this script, one on each line.
  • asdf list all nodejs 18: lists all versions as returned by this script, one on each line, with a filter matching any version beginning with 18 applied.

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}/bin/list-all"

',19)),s("h3",m,[i[30]||(i[30]=s("code",null,"bin/download",-1)),i[31]||(i[31]=e()),a(t,{type:"tip",text:"required",vertical:"middle"}),i[32]||(i[32]=e()),i[33]||(i[33]=s("a",{class:"header-anchor",href:"#bin-download","aria-label":'Permalink to "`bin/download` "'},"​",-1))]),i[51]||(i[51]=l('

Description

Download the source code or binary for a specific version of a tool to a specified location.

Implementation Details

  • The script must download the source or binary to the directory specified by ASDF_DOWNLOAD_PATH.
  • Only the decompressed source code or binary should be placed in the ASDF_DOWNLOAD_PATH directory.
  • On failure, no files should be placed in ASDF_DOWNLOAD_PATH.
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Legacy Plugins

Though this script is marked as required for all plugins, it is optional for "legacy" plugins which predate its introduction.

If this script is absent, asdf will assume that the bin/install script is present and will download and install the version.

All plugins must include this script as support for legacy plugins will eventually be removed.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.
  • ASDF_DOWNLOAD_PATH: The path to where the source code or binary was downloaded to.

Commands that invoke this script

  • asdf install <tool> [version]
  • asdf install <tool> latest[:version]
  • asdf install nodejs 18.0.0: downloads the source code or binary for Node.js version 18.0.0 and places it in the ASDF_DOWNLOAD_PATH directory. Then runs the bin/install script.

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}"/bin/download

',16)),s("h3",f,[i[34]||(i[34]=s("code",null,"bin/install",-1)),i[35]||(i[35]=e()),a(t,{type:"tip",text:"required",vertical:"middle"}),i[36]||(i[36]=e()),i[37]||(i[37]=s("a",{class:"header-anchor",href:"#bin-install","aria-label":'Permalink to "`bin/install` "'},"​",-1))]),i[52]||(i[52]=l('

Description

Install a specific version of a tool to a specified location.

Implementation Details

  • The script should install the specified version in the path ASDF_INSTALL_PATH.
  • Shims will be created by default for any files in $ASDF_INSTALL_PATH/bin. This behaviour can be customised with the optional bin/list-bin-paths script.
  • Success should exit with 0.
  • Failure should exit with a non-zero status.
  • To avoid TOCTOU (Time-of-Check-to-Time-of-Use) issues, ensure the script only places files in ASDF_INSTALL_PATH once the build and installation of the tool is deemed a success.

Legacy Plugins

If the bin/download script is absent, this script should download and install the specified version.

For compatibility with versions of the asdf core earlier than 0.7._ and newer than 0.8._, check for the presence of the ASDF_DOWNLOAD_PATH environment variable. If set, assume the bin/download script already downloaded the version, else download the source code in the bin/install script.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.
  • ASDF_CONCURRENCY: The number of cores to use when compiling source code. Useful for setting flags like make -j.
  • ASDF_DOWNLOAD_PATH: The path where the source code or binary was downloaded to.

Commands that invoke this script

  • asdf install
  • asdf install <tool>
  • asdf install <tool> [version]
  • asdf install <tool> latest[:version]
  • asdf install nodejs 18.0.0: installs Node.js version 18.0.0 in the ASDF_INSTALL_PATH directory.

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}"/bin/install

Optional Scripts

',15)),s("h3",y,[i[38]||(i[38]=s("code",null,"bin/latest-stable",-1)),i[39]||(i[39]=e()),a(t,{type:"warning",text:"recommended",vertical:"middle"}),i[40]||(i[40]=e()),i[41]||(i[41]=s("a",{class:"header-anchor",href:"#bin-latest-stable","aria-label":'Permalink to "`bin/latest-stable` "'},"​",-1))]),i[53]||(i[53]=l('

Description

Determine the latest stable version of a tool. If absent, the asdf core will tail the bin/list-all output which may be undesirable.

Implementation Details

  • The script should print the latest stable version of the tool to stdout.
  • Non-stable or release candidate versions should be omitted.
  • A filter query is provided as the first argument to the script. This should be used to filter the output by version number or tool provider.
    • For instance, the output of asdf list all ruby from the ruby plugin lists versions of Ruby from many providers: jruby, rbx & truffleruby amongst others. The user provided filter could be used by the plugin to filter the semver versions and/or provider.
      > asdf latest ruby\n3.2.2\n> asdf latest ruby 2\n2.7.8\n> asdf latest ruby truffleruby\ntruffleruby+graalvm-22.3.1
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf global <tool> latest: set the global version of a tool to the latest stable version for that tool.
  • asdf local <name> latest: set the local version of a tool to the latest stable version for that tool.
  • asdf install <tool> latest: installs the latest version of a tool.
  • asdf latest <tool> [<version>]: outputs the latest version of a tool based on the optional filter.
  • asdf latest --all: outputs the latest version of all tools managed by asdf and whether they are installed.

Call signature from asdf core

The script should accept a single argument, the filter query.

bash
"${plugin_path}"/bin/latest-stable "$query"

bin/help.overview

Description

Output a general description about the plugin and the tool being managed.

Implementation Details

  • This script is required for any help output to be displayed for the plugin.
  • No heading should be printed as asdf core will print headings.
  • Output may be free-form text but ideally only one short paragraph.
  • Must not output any information that is already covered in the core asdf-vm documentation.
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf help <name> [<version>]: Output documentation for plugin and tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.overview

bin/help.deps

Description

Output the list of dependencies tailored to the operating system. One dependency per line.

bash
git\ncurl\nsed

Implementation Details

  • This script requires bin/help.overview for its output to be considered.
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf help <name> [<version>]: Output documentation for plugin and tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.deps

bin/help.config

Description

Output any required or optional configuration for the plugin and tool. For example, describe any environment variables or other flags needed to install or compile the tool.

Implementation Details

  • This script requires bin/help.overview for its output to be considered.
  • Output can be free-form text.
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf help <name> [<version>]: Output documentation for plugin and tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.config

Description

Output a list of links relevant to the plugin and tool. One link per line.

bash
Git Repository:	https://github.com/vlang/v\nDocumentation:	https://vlang.io

Implementation Details

  • This script requires bin/help.overview for its output to be considered.
  • One link per line.
  • Format must be either:
    • <title>: <link>
    • or just <link>
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf help <name> [<version>]: Output documentation for plugin and tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.links

bin/list-bin-paths

Description

List directories containing executables for the specified version of the tool.

Implementation Details

  • If this script is not present, asdf will look for binaries in the "${ASDF_INSTALL_PATH}"/bin directory & create shims for those.
  • Output a space-separated list of paths containing executables.
  • Paths must be relative to ASDF_INSTALL_PATH. Example output would be:
bash
bin tools veggies

This will instruct asdf to create shims for the files in:

  • "${ASDF_INSTALL_PATH}"/bin
  • "${ASDF_INSTALL_PATH}"/tools
  • "${ASDF_INSTALL_PATH}"/veggies

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf install <tool> [version]: initially create shims for binaries.
  • asdf reshim <tool> <version>: recreate shims for binaries.

Call signature from asdf core

bash
"${plugin_path}/bin/list-bin-paths"

bin/exec-env

Description

Prepare the environment before executing the shims for the binaries for the tool.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf which <command>: Display the path to an executable
  • asdf exec <command> [args...]: Executes the command shim for current version
  • asdf env <command> [util]: Runs util (default: env) inside the environment used for command shim execution.

Call signature from asdf core

bash
"${plugin_path}/bin/exec-env"

bin/exec-path

Get the executable path for the specified version of the tool. Must print a string with the relative executable path. This allows the plugin to conditionally override the shim's specified executable path, otherwise return the default path specified by the shim.

Description

Get the executable path for the specified version of the tool.

Implementation Details

  • Must print a string with the relative executable path.
  • Conditionally override the shim's specified executable path, otherwise return the default path specified by the shim.
shell
Usage:\n  plugin/bin/exec-path <install-path> <command> <executable-path>\n\nExample Call:\n  ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"\n\nOutput:\n  bin/foox

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf which <command>: Display the path to an executable
  • asdf exec <command> [args...]: Executes the command shim for current version
  • asdf env <command> [util]: Runs util (default: env) inside the environment used for command shim execution.

Call signature from asdf core

bash
"${plugin_path}/bin/exec-path" "$install_path" "$cmd" "$relative_path"

bin/uninstall

Description

Uninstall the provided version of a tool.

Output Format

Output should be sent to stdout or stderr as appropriate for the user. No output is read by subsequent execution in the core.

Environment Variables available to script

No environment variables are provided to this script.

Commands that invoke this script

  • asdf list all <name> <version>
  • asdf uninstall nodejs 18.15.0: Uninstalls the version 18.15.0 of nodejs, removing all shims including those installed global with npm i -g

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}/bin/uninstall"

bin/list-legacy-filenames

Description

List legacy configuration filenames for determining the specified version of the tool.

Implementation Details

  • Output a space-separated list of filenames.
    bash
    .ruby-version .rvmrc
  • Only applies for users who have enabled the legacy_version_file option in their "${HOME}"/.asdfrc.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

Any command which reads a tool version.

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}/bin/list-legacy-filenames"

bin/parse-legacy-file

Description

Parse the legacy file found by asdf to determine the version of the tool. Useful to extract version numbers from files like JavaScript's package.json or Golangs go.mod.

Implementation Details

  • If not present, asdf will simply cat the legacy file to determine the version.
  • Should be deterministic and always return the same exact version:
    • when parsing the same legacy file.
    • regardless of what is installed on the machine or whether the legacy version is valid or complete. Some legacy file formats may not be suitable.
  • Output a single line with the version:
    bash
    1.2.3

Environment Variables available to script

No environment variables specifically set before this script is called.

Commands that invoke this script

Any command which reads a tool version.

Call signature from asdf core

The script should accept a single argument, the path to the legacy file for reading its contents.

bash
"${plugin_path}/bin/parse-legacy-file" "$file_path"

bin/post-plugin-add

Description

Execute this callback script after the plugin has been added to asdf with asdf plugin add <tool>.

See also the related command hooks:

  • pre_asdf_plugin_add
  • pre_asdf_plugin_add_${plugin_name}
  • post_asdf_plugin_add
  • post_asdf_plugin_add_${plugin_name}

Environment Variables available to script

  • ASDF_PLUGIN_PATH: path where the plugin was installed.
  • ASDF_PLUGIN_SOURCE_URL: URL of the plugin source. Can be a local directory path.

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}/bin/post-plugin-add"

bin/post-plugin-update

Description

Execute this callback script after asdf has downloaded the update plugin with asdf plugin update <tool> [<git-ref>].

See also the related command hooks:

  • pre_asdf_plugin_update
  • pre_asdf_plugin_update_${plugin_name}
  • post_asdf_plugin_update
  • post_asdf_plugin_update_${plugin_name}

Environment Variables available to script

  • ASDF_PLUGIN_PATH: path where the plugin was installed.
  • ASDF_PLUGIN_PREV_REF: the plugin's previous git-ref
  • ASDF_PLUGIN_POST_REF: the plugin's updated git-ref

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}/bin/post-plugin-update"

bin/pre-plugin-remove

Description

Execute this callback script before asdf has removed the plugin with asdf plugin remove <tool>.

See also the related command hooks:

  • pre_asdf_plugin_remove
  • pre_asdf_plugin_remove_${plugin_name}
  • post_asdf_plugin_remove
  • post_asdf_plugin_remove_${plugin_name}

Environment Variables available to script

  • ASDF_PLUGIN_PATH: path where the plugin was installed.

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}/bin/pre-plugin-remove"
',172)),s("h2",F,[i[42]||(i[42]=e("Extension Commands for asdf CLI ")),a(t,{type:"danger",text:"advanced",vertical:"middle"}),i[43]||(i[43]=e()),i[44]||(i[44]=s("a",{class:"header-anchor",href:"#extension-commands-for-asdf-cli","aria-label":'Permalink to "Extension Commands for asdf CLI "'},"​",-1))]),i[54]||(i[54]=l('

It's possible for plugins to define new asdf commands by providing lib/commands/command*.bash scripts or executables that will be callable using the asdf command line interface by using the plugin name as a subcommand.

For example, suppose a foo plugin has:

shell
foo/\n  lib/commands/\n    command.bash\n    command-bat.bash\n    command-bat-man.bash\n    command-help.bash

Users can now execute:

shell
$ asdf foo         # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash`\n$ asdf foo bar     # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar`\n$ asdf foo help    # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash`\n$ asdf foo bat man # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash`\n$ asdf foo bat baz # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz`

Plugin authors can use this feature to provide utilities related to their tools, or even create plugins that are just new command extensions of asdf itself.

If the executable bit is set, the script is executed, replacing the asdf execution.

If the executable bit is not set, asdf will source the scripts as Bash scripts.

$ASDF_CMD_FILE resolves to the full path of the file being sourced.

haxe is a great example of a plugin which uses this feature. It provides the asdf haxe neko-dylibs-link to fix an issue where Haxe executables expect to find dynamic libraries relative to the executable directory.

Be sure to list your asdf Extension Commands in your plugins README.

',11)),s("h2",v,[i[45]||(i[45]=e("Custom Shim Templates ")),a(t,{type:"danger",text:"advanced",vertical:"middle"}),i[46]||(i[46]=e()),i[47]||(i[47]=s("a",{class:"header-anchor",href:"#custom-shim-templates","aria-label":'Permalink to "Custom Shim Templates "'},"​",-1))]),i[55]||(i[55]=l(`

WARNING

Please only use if absolutely required

asdf allows custom shim templates. For an executable called foo, if there's a shims/foo file in the plugin, then asdf will copy that file instead of using its standard shim template.

This must be used wisely.

As far as the asdf core team is aware, this feature is only in use in the first-party Elixir plugin. This is because an executable is also read as an Elixir file in addition to being an executable. This makes it not possible to use the standard Bash shim.

Testing

asdf contains the plugin-test command to test your plugin:

shell
asdf plugin test <plugin_name> <plugin_url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git_ref>] [test_command...]
  • <plugin_name> & <plugin_url> are required
  • If optional [--asdf-tool-version <version>] is specified, the tool will be installed with that specific version. Defaults to asdf latest <plugin-name>
  • If optional [--asdf-plugin-gitref <git_ref>] is specified, the plugin itself is checked out at that commit/branch/tag. This is useful for testing a pull-request on your plugin's CI. Defaults to the default branch of the plugin's repository.
  • Optional parameter [test_command...] is the command to execute to validate the installed tool works correctly. Typically <tool> --version or <tool> --help. For example, to test the NodeJS plugin, we could run
    shell
    # asdf plugin test <plugin_name>  <plugin_url>                               [test_command]
    +  asdf plugin test nodejs         https://github.com/asdf-vm/asdf-nodejs.git node --version

Note

We recommend testing in both Linux & macOS CI environments

GitHub Action

The asdf-vm/actions repo provides a GitHub Action for testing your plugins hosted on GitHub. A sample .github/workflows/test.yaml Actions Workflow:

yaml
name: Test
+on:
+  push:
+    branches:
+      - main
+  pull_request:
+
+jobs:
+  plugin_test:
+    name: asdf plugin test
+    strategy:
+      matrix:
+        os:
+          - ubuntu-latest
+          - macos-latest
+    runs-on: \${{ matrix.os }}
+    steps:
+      - name: asdf_plugin_test
+        uses: asdf-vm/actions/plugin-test@v2
+        with:
+          command: "<MY_TOOL> --version"

TravisCI Config

A sample .travis.yml file, customize it to your needs

yaml
language: c
+script: asdf plugin test <MY_TOOL> $TRAVIS_BUILD_DIR '<MY_TOOL> --version'
+before_script:
+  - git clone https://github.com/asdf-vm/asdf.git asdf
+  - . asdf/asdf.sh
+os:
+  - linux
+  - osx

NOTE

When using another CI you may need to pass a relative path to the plugin location:

shell
asdf plugin test <tool_name> <path> '<tool_command> --version'

API Rate Limiting

If a command depends on accessing an external API, like bin/list-all or bin/latest-stable, it may experience rate limiting during automated testing. To mitigate this, ensure there is a code-path which provides an authentication token via an environment variable. For example:

shell
cmd="curl --silent"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"

GITHUB_API_TOKEN

To utilise the GITHUB_API_TOKEN, create a new personal token with only public_repo access.

Then add this to your CI pipeline environment variables.

WARNING

NEVER publish your authentication tokens in your code repository

Plugin Shortname Index

TIP

The recommended installation method for a plugin is via direct URL installation:

shell
# asdf plugin add <name> <git_url>
+  asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

If the git_url is not provided, asdf will use the Shortname Index repository to determine the exact git_url to use.

You can add your plugin to the Shortname Index by following the instructions in that repo.

`,27))])}const L=n(r,[["render",E]]);export{T as __pageData,L as default}; diff --git a/assets/pt-br_contribute_core.md.BB7joZcW.js b/assets/pt-br_contribute_core.md.BB7joZcW.js new file mode 100644 index 00000000..28873348 --- /dev/null +++ b/assets/pt-br_contribute_core.md.BB7joZcW.js @@ -0,0 +1,25 @@ +import{_ as s,c as a,a2 as i,o as t}from"./chunks/framework.C9NVOr0y.js";const k=JSON.parse('{"title":"asdf","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/contribute/core.md","filePath":"pt-br/contribute/core.md","lastUpdated":1687069487000}'),n={name:"pt-br/contribute/core.md"};function o(l,e,r,p,d,c){return t(),a("div",null,e[0]||(e[0]=[i(`

asdf

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

guia de contribuição principal asdf.

Configuração inicial

Fork asdf no GitHub e/ou Git clone o branch padrão:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

As ferramentas para o desenvolvimento do núcleo estão em .tool-versions deste repositório. Se você deseja gerenciar com o próprio asdf, adicione os plugins:

shell
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git

Instale as versões para desenvolver asdf com:

shell
asdf install

pode ser útil não usar asdf para gerenciar as ferramentas durante o desenvolvimento em sua máquina local, pois você pode precisar quebrar funcionalidades que, então, quebrariam suas ferramentas de desenvolvimento. Aqui está a lista bruta de ferramentas:

  • bats-core: Bash Automated Testing System, para testes unitários de scripts compatíveis com Bash ou POSIX.
  • shellcheck: Ferramenta de análise estática para scripts de shell.
  • shfmt: Um analisador, formatador e interpretador de shell com suporte a bash; inclui shfmt

Desenvolvimento

Se você quiser testar suas alterações sem fazer alterações em seu asdf instalado, você pode definir a variável $ASDF_DIR para o caminho onde você clonou o repositório e anexar temporariamente o diretório bin e shims do diretório para o seu caminho.

É melhor formatar, lint e testar seu código localmente antes de confirmar ou enviar para o controle remoto. Use os seguintes scripts/comandos:

shell
# Shellcheck
+./scripts/shellcheck.bash
+
+# Format
+./scripts/shfmt.bash
+
+# Test: all tests
+bats test/
+# Test: for specific command
+bats test/list_commands.bash

TIP

Adicione testes! - Os testes são necessários para novos recursos e aceleram a revisão de correções de bugs. Por favor, cubra novos caminhos de código antes de criar um Pull Request. Consulte documentação do bats-core

Teste de BATS

É fortemente recomendado examinar o conjunto de testes existente e a documentação do bats-core antes de escrever os testes.

A depuração de BATs pode ser difícil às vezes. Usar a saída TAP com o sinalizador -t permitirá que você imprima saídas com o descritor de arquivo especial >&3 durante a execução do teste, simplificando a depuração. Como um exemplo:

shell
# test/some_tests.bats
+
+printf "%s\\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\\n" "Will be printed during bats -t test/some_tests.bats" >&3

Isso está documentado em bats-core Imprimindo no Terminal.

Pull Requests, Releases e Commits Convencionais

O asdf está usando uma ferramenta de lançamento automatizada chamada Release Please para aumentar automaticamente a versão SemVer e gerar a Changelog. Essas informações são determinadas lendo o histórico de confirmação desde a última versão.

Mensagens de confirmação convencionais definem o formato do título da solicitação pull que se torna o formato da mensagem de confirmação na ramificação padrão. Isso é aplicado com GitHub Action amannn/action-semantic-pull-request.

O Commit Convencional segue este formato:

<type>[optional scope][optional !]: <description>
+
+<!-- examples -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change

A lista completa de <types> é: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert.

O ! indica uma mudança de ruptura.

fix: will create a new SemVer patchfeat: will create a new SemVer minor<type>!: will create a new SemVer major

O título da solicitação pull deve seguir este formato.

TIP

Use o formato de mensagem de confirmação convencional para seu título de solicitação de pull.

Imagens Docker

Os projetos asdf-alpine e asdf-ubuntu são um esforço contínuo para fornecer imagens de algumas ferramentas asdf. Você pode usar essas imagens docker como base para seus servidores de desenvolvimento ou para executar seus aplicativos de produção.

`,34)]))}const m=s(n,[["render",o]]);export{k as __pageData,m as default}; diff --git a/assets/pt-br_contribute_core.md.BB7joZcW.lean.js b/assets/pt-br_contribute_core.md.BB7joZcW.lean.js new file mode 100644 index 00000000..28873348 --- /dev/null +++ b/assets/pt-br_contribute_core.md.BB7joZcW.lean.js @@ -0,0 +1,25 @@ +import{_ as s,c as a,a2 as i,o as t}from"./chunks/framework.C9NVOr0y.js";const k=JSON.parse('{"title":"asdf","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/contribute/core.md","filePath":"pt-br/contribute/core.md","lastUpdated":1687069487000}'),n={name:"pt-br/contribute/core.md"};function o(l,e,r,p,d,c){return t(),a("div",null,e[0]||(e[0]=[i(`

asdf

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

guia de contribuição principal asdf.

Configuração inicial

Fork asdf no GitHub e/ou Git clone o branch padrão:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

As ferramentas para o desenvolvimento do núcleo estão em .tool-versions deste repositório. Se você deseja gerenciar com o próprio asdf, adicione os plugins:

shell
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git

Instale as versões para desenvolver asdf com:

shell
asdf install

pode ser útil não usar asdf para gerenciar as ferramentas durante o desenvolvimento em sua máquina local, pois você pode precisar quebrar funcionalidades que, então, quebrariam suas ferramentas de desenvolvimento. Aqui está a lista bruta de ferramentas:

  • bats-core: Bash Automated Testing System, para testes unitários de scripts compatíveis com Bash ou POSIX.
  • shellcheck: Ferramenta de análise estática para scripts de shell.
  • shfmt: Um analisador, formatador e interpretador de shell com suporte a bash; inclui shfmt

Desenvolvimento

Se você quiser testar suas alterações sem fazer alterações em seu asdf instalado, você pode definir a variável $ASDF_DIR para o caminho onde você clonou o repositório e anexar temporariamente o diretório bin e shims do diretório para o seu caminho.

É melhor formatar, lint e testar seu código localmente antes de confirmar ou enviar para o controle remoto. Use os seguintes scripts/comandos:

shell
# Shellcheck
+./scripts/shellcheck.bash
+
+# Format
+./scripts/shfmt.bash
+
+# Test: all tests
+bats test/
+# Test: for specific command
+bats test/list_commands.bash

TIP

Adicione testes! - Os testes são necessários para novos recursos e aceleram a revisão de correções de bugs. Por favor, cubra novos caminhos de código antes de criar um Pull Request. Consulte documentação do bats-core

Teste de BATS

É fortemente recomendado examinar o conjunto de testes existente e a documentação do bats-core antes de escrever os testes.

A depuração de BATs pode ser difícil às vezes. Usar a saída TAP com o sinalizador -t permitirá que você imprima saídas com o descritor de arquivo especial >&3 durante a execução do teste, simplificando a depuração. Como um exemplo:

shell
# test/some_tests.bats
+
+printf "%s\\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\\n" "Will be printed during bats -t test/some_tests.bats" >&3

Isso está documentado em bats-core Imprimindo no Terminal.

Pull Requests, Releases e Commits Convencionais

O asdf está usando uma ferramenta de lançamento automatizada chamada Release Please para aumentar automaticamente a versão SemVer e gerar a Changelog. Essas informações são determinadas lendo o histórico de confirmação desde a última versão.

Mensagens de confirmação convencionais definem o formato do título da solicitação pull que se torna o formato da mensagem de confirmação na ramificação padrão. Isso é aplicado com GitHub Action amannn/action-semantic-pull-request.

O Commit Convencional segue este formato:

<type>[optional scope][optional !]: <description>
+
+<!-- examples -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change

A lista completa de <types> é: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert.

O ! indica uma mudança de ruptura.

fix: will create a new SemVer patchfeat: will create a new SemVer minor<type>!: will create a new SemVer major

O título da solicitação pull deve seguir este formato.

TIP

Use o formato de mensagem de confirmação convencional para seu título de solicitação de pull.

Imagens Docker

Os projetos asdf-alpine e asdf-ubuntu são um esforço contínuo para fornecer imagens de algumas ferramentas asdf. Você pode usar essas imagens docker como base para seus servidores de desenvolvimento ou para executar seus aplicativos de produção.

`,34)]))}const m=s(n,[["render",o]]);export{k as __pageData,m as default}; diff --git a/assets/pt-br_contribute_documentation.md.D_CeZJ9y.js b/assets/pt-br_contribute_documentation.md.D_CeZJ9y.js new file mode 100644 index 00000000..d63042f8 --- /dev/null +++ b/assets/pt-br_contribute_documentation.md.D_CeZJ9y.js @@ -0,0 +1,29 @@ +import{_ as a,c as i,a2 as e,o as n}from"./chunks/framework.C9NVOr0y.js";const k=JSON.parse('{"title":"Docs & Site","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/contribute/documentation.md","filePath":"pt-br/contribute/documentation.md","lastUpdated":1687069487000}'),t={name:"pt-br/contribute/documentation.md"};function o(l,s,p,r,d,h){return n(),i("div",null,s[0]||(s[0]=[e(`

Docs & Site

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

Documentação e guia de contribuição do site.

Configuração inicial

Fork asdf no GitHub e/ou Git clone o branch padrão:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

As ferramentas para desenvolvimento de sites Docs são gerenciadas com asdf em docs/.tool-versions. Adicione os plugins com:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

Instale a(s) versão(ões) da ferramenta com:

shell
asdf install
  • Node.js: tempo de execução JavaScript criado no mecanismo JavaScript V8 do Chrome.

Instale as dependências do Node.js do docs/package.json:

shell
npm install

Desenvolvimento

Vuepress (v2) é o Static Site Generator (SSG) que usamos para construir o site de documentação do asdf. Foi escolhido para substituir Docsify.js, pois gostaríamos de oferecer suporte a um substituto somente HTML quando os usuários não tiverem JavaScript disponível ou ativado. Isso não era possível com o Docsify. Fora isso, o conjunto de recursos é basicamente o mesmo, com foco em escrever arquivos Markdown com configuração mínima.

package.json contém os scripts necessários para o desenvolvimento:

@code json{3-5}

Para iniciar o servidor de desenvolvimento local:

shell
npm run dev

Formate o código antes de confirmar:

shell
npm run format

Pull Requests, Releases e Commits Convencionais

asdf está usando um pipeline de lançamento automatizado que depende de Commits Convencionais em títulos de PR. Documentação detalhada encontrada no guia de contribuição principal.

Ao criar um PR para alterações na documentação, por favor, faça o título do PR com o tipo de Commit Convencional docs no formato docs: <description>.

Vuepress

A configuração do site está contida em alguns arquivos JavaScript com objetos JS usados para representar a configuração. Eles estão:

  • docs/.vuepress/config.js: o arquivo de configuração raiz do site. Leia a documentação do Vuepress para obter as especificações.

Para simplificar a configuração raiz, os objetos JS maiores que representam a configuração navbar e sidebar foram extraídos e separados por sua localidade. Veja os dois em:

  • docs/.vuepress/navbar.js
  • docs/.vuepress/sidebar.js

Com a documentação oficial para essas configurações vivendo na Referência de tema padrão.

I18n

Vuepress tem suporte de primeira classe para internacionalização. O root config docs/.vuepress/config.js define os locais suportados com sua URL, título no menu suspenso de seleção e referências de configurações navbar/sidebar.

As configurações da barra de navegação/barra lateral são capturadas nos arquivos de configuração mencionados acima, separadas por localidade e exportadas individualmente.

O conteúdo de markdown para cada localidade deve estar em uma pasta com o mesmo nome das chaves para locales na configuração raiz. Isso é:

js
{
+  ...
+  themeConfig: {
+    locales: {
+      "/": {
+        selectLanguageName: "English (US)",
+        sidebar: sidebar.en,
+        navbar: navbar.en
+      },
+      "/pt-BR/": {
+        selectLanguageName: "Brazilian Portuguese",
+        sidebar: sidebar.pt_br,
+        navbar: navbar.pt_br
+      }
+    }
+  }
+}

/pt-BR/ exigirá o mesmo conjunto de arquivos markdown localizados em docs/pt-BR/, assim:

shell
docs
+├─ README.md
+├─ foo.md
+├─ nested
+  └─ README.md
+└─ pt-BR
+   ├─ README.md
+   ├─ foo.md
+   └─ nested
+      └─ README.md

A documentação oficial do Vuepress i18n entra em mais detalhes.

`,38)]))}const u=a(t,[["render",o]]);export{k as __pageData,u as default}; diff --git a/assets/pt-br_contribute_documentation.md.D_CeZJ9y.lean.js b/assets/pt-br_contribute_documentation.md.D_CeZJ9y.lean.js new file mode 100644 index 00000000..d63042f8 --- /dev/null +++ b/assets/pt-br_contribute_documentation.md.D_CeZJ9y.lean.js @@ -0,0 +1,29 @@ +import{_ as a,c as i,a2 as e,o as n}from"./chunks/framework.C9NVOr0y.js";const k=JSON.parse('{"title":"Docs & Site","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/contribute/documentation.md","filePath":"pt-br/contribute/documentation.md","lastUpdated":1687069487000}'),t={name:"pt-br/contribute/documentation.md"};function o(l,s,p,r,d,h){return n(),i("div",null,s[0]||(s[0]=[e(`

Docs & Site

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

Documentação e guia de contribuição do site.

Configuração inicial

Fork asdf no GitHub e/ou Git clone o branch padrão:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

As ferramentas para desenvolvimento de sites Docs são gerenciadas com asdf em docs/.tool-versions. Adicione os plugins com:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

Instale a(s) versão(ões) da ferramenta com:

shell
asdf install
  • Node.js: tempo de execução JavaScript criado no mecanismo JavaScript V8 do Chrome.

Instale as dependências do Node.js do docs/package.json:

shell
npm install

Desenvolvimento

Vuepress (v2) é o Static Site Generator (SSG) que usamos para construir o site de documentação do asdf. Foi escolhido para substituir Docsify.js, pois gostaríamos de oferecer suporte a um substituto somente HTML quando os usuários não tiverem JavaScript disponível ou ativado. Isso não era possível com o Docsify. Fora isso, o conjunto de recursos é basicamente o mesmo, com foco em escrever arquivos Markdown com configuração mínima.

package.json contém os scripts necessários para o desenvolvimento:

@code json{3-5}

Para iniciar o servidor de desenvolvimento local:

shell
npm run dev

Formate o código antes de confirmar:

shell
npm run format

Pull Requests, Releases e Commits Convencionais

asdf está usando um pipeline de lançamento automatizado que depende de Commits Convencionais em títulos de PR. Documentação detalhada encontrada no guia de contribuição principal.

Ao criar um PR para alterações na documentação, por favor, faça o título do PR com o tipo de Commit Convencional docs no formato docs: <description>.

Vuepress

A configuração do site está contida em alguns arquivos JavaScript com objetos JS usados para representar a configuração. Eles estão:

  • docs/.vuepress/config.js: o arquivo de configuração raiz do site. Leia a documentação do Vuepress para obter as especificações.

Para simplificar a configuração raiz, os objetos JS maiores que representam a configuração navbar e sidebar foram extraídos e separados por sua localidade. Veja os dois em:

  • docs/.vuepress/navbar.js
  • docs/.vuepress/sidebar.js

Com a documentação oficial para essas configurações vivendo na Referência de tema padrão.

I18n

Vuepress tem suporte de primeira classe para internacionalização. O root config docs/.vuepress/config.js define os locais suportados com sua URL, título no menu suspenso de seleção e referências de configurações navbar/sidebar.

As configurações da barra de navegação/barra lateral são capturadas nos arquivos de configuração mencionados acima, separadas por localidade e exportadas individualmente.

O conteúdo de markdown para cada localidade deve estar em uma pasta com o mesmo nome das chaves para locales na configuração raiz. Isso é:

js
{
+  ...
+  themeConfig: {
+    locales: {
+      "/": {
+        selectLanguageName: "English (US)",
+        sidebar: sidebar.en,
+        navbar: navbar.en
+      },
+      "/pt-BR/": {
+        selectLanguageName: "Brazilian Portuguese",
+        sidebar: sidebar.pt_br,
+        navbar: navbar.pt_br
+      }
+    }
+  }
+}

/pt-BR/ exigirá o mesmo conjunto de arquivos markdown localizados em docs/pt-BR/, assim:

shell
docs
+├─ README.md
+├─ foo.md
+├─ nested
+  └─ README.md
+└─ pt-BR
+   ├─ README.md
+   ├─ foo.md
+   └─ nested
+      └─ README.md

A documentação oficial do Vuepress i18n entra em mais detalhes.

`,38)]))}const u=a(t,[["render",o]]);export{k as __pageData,u as default}; diff --git a/assets/pt-br_contribute_first-party-plugins.md.TUKlMnR4.js b/assets/pt-br_contribute_first-party-plugins.md.TUKlMnR4.js new file mode 100644 index 00000000..0ce717ac --- /dev/null +++ b/assets/pt-br_contribute_first-party-plugins.md.TUKlMnR4.js @@ -0,0 +1 @@ +import{_ as a,c as t,a2 as r,o as i}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"First-Party Plugins","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/contribute/first-party-plugins.md","filePath":"pt-br/contribute/first-party-plugins.md","lastUpdated":1650978118000}'),o={name:"pt-br/contribute/first-party-plugins.md"};function s(l,e,n,d,p,u){return i(),t("div",null,e[0]||(e[0]=[r('

First-Party Plugins

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

A equipe principal do asdf criou alguns plugins relevantes para sua vida profissional diária. A ajuda é sempre bem-vinda na manutenção e melhoria desses plugins. Veja o repositório associado para cada link abaixo:

Para plugins da comunidade, consulte:

',6)]))}const g=a(o,[["render",s]]);export{f as __pageData,g as default}; diff --git a/assets/pt-br_contribute_first-party-plugins.md.TUKlMnR4.lean.js b/assets/pt-br_contribute_first-party-plugins.md.TUKlMnR4.lean.js new file mode 100644 index 00000000..0ce717ac --- /dev/null +++ b/assets/pt-br_contribute_first-party-plugins.md.TUKlMnR4.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,a2 as r,o as i}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"First-Party Plugins","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/contribute/first-party-plugins.md","filePath":"pt-br/contribute/first-party-plugins.md","lastUpdated":1650978118000}'),o={name:"pt-br/contribute/first-party-plugins.md"};function s(l,e,n,d,p,u){return i(),t("div",null,e[0]||(e[0]=[r('

First-Party Plugins

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

A equipe principal do asdf criou alguns plugins relevantes para sua vida profissional diária. A ajuda é sempre bem-vinda na manutenção e melhoria desses plugins. Veja o repositório associado para cada link abaixo:

Para plugins da comunidade, consulte:

',6)]))}const g=a(o,[["render",s]]);export{f as __pageData,g as default}; diff --git a/assets/pt-br_contribute_github-actions.md.BpD2TMaX.js b/assets/pt-br_contribute_github-actions.md.BpD2TMaX.js new file mode 100644 index 00000000..a883c2c0 --- /dev/null +++ b/assets/pt-br_contribute_github-actions.md.BpD2TMaX.js @@ -0,0 +1 @@ +import{_ as o,c as s,j as e,a as t,o as i}from"./chunks/framework.C9NVOr0y.js";const h=JSON.parse('{"title":"GitHub Actions","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/contribute/github-actions.md","filePath":"pt-br/contribute/github-actions.md","lastUpdated":1650978118000}'),r={name:"pt-br/contribute/github-actions.md"};function n(c,a,l,d,u,p){return i(),s("div",null,a[0]||(a[0]=[e("h1",{id:"github-actions",tabindex:"-1"},[t("GitHub Actions "),e("a",{class:"header-anchor",href:"#github-actions","aria-label":'Permalink to "GitHub Actions"'},"​")],-1),e("blockquote",null,[e("p",null,`Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.`)],-1),e("p",null,[t("Obrigado pelo seu interesse, consulte o "),e("a",{href:"https://github.com/asdf-vm/actions",target:"_blank",rel:"noreferrer"},"repositório de ações asdf"),t(" para ver os problemas, conversas e diretrizes de contribuição existentes.")],-1)]))}const m=o(r,[["render",n]]);export{h as __pageData,m as default}; diff --git a/assets/pt-br_contribute_github-actions.md.BpD2TMaX.lean.js b/assets/pt-br_contribute_github-actions.md.BpD2TMaX.lean.js new file mode 100644 index 00000000..a883c2c0 --- /dev/null +++ b/assets/pt-br_contribute_github-actions.md.BpD2TMaX.lean.js @@ -0,0 +1 @@ +import{_ as o,c as s,j as e,a as t,o as i}from"./chunks/framework.C9NVOr0y.js";const h=JSON.parse('{"title":"GitHub Actions","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/contribute/github-actions.md","filePath":"pt-br/contribute/github-actions.md","lastUpdated":1650978118000}'),r={name:"pt-br/contribute/github-actions.md"};function n(c,a,l,d,u,p){return i(),s("div",null,a[0]||(a[0]=[e("h1",{id:"github-actions",tabindex:"-1"},[t("GitHub Actions "),e("a",{class:"header-anchor",href:"#github-actions","aria-label":'Permalink to "GitHub Actions"'},"​")],-1),e("blockquote",null,[e("p",null,`Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.`)],-1),e("p",null,[t("Obrigado pelo seu interesse, consulte o "),e("a",{href:"https://github.com/asdf-vm/actions",target:"_blank",rel:"noreferrer"},"repositório de ações asdf"),t(" para ver os problemas, conversas e diretrizes de contribuição existentes.")],-1)]))}const m=o(r,[["render",n]]);export{h as __pageData,m as default}; diff --git a/assets/pt-br_guide_getting-started.md.Bxtluukf.js b/assets/pt-br_guide_getting-started.md.Bxtluukf.js new file mode 100644 index 00000000..89cd9998 --- /dev/null +++ b/assets/pt-br_guide_getting-started.md.Bxtluukf.js @@ -0,0 +1,13 @@ +import{_ as a,c as i,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const k=JSON.parse('{"title":"Começando","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/guide/getting-started.md","filePath":"pt-br/guide/getting-started.md","lastUpdated":1724080713000}'),l={name:"pt-br/guide/getting-started.md"};function n(o,s,h,d,p,r){return t(),i("div",null,s[0]||(s[0]=[e(`

Começando

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

A instalação do asdf envolve:

  1. Instalar as dependências
  2. Instalar o núcleo do asdf
  3. Adicionar o asdf ao seu shell
  4. Instalar um plugin para cada ferramenta que você gostaria de gerenciar
  5. Instalar uma versão desta ferramenta
  6. Definir uma versão global e uma versão local através do arquivo de configuração .tool-versions

Você pode também acompanhar o passo a passo da instalação através deste vídeo.

1. Instalando as dependências

asdf primarily requires git & curl. Here is a non-exhaustive list of commands to run for your package manager (some might automatically install these tools in later steps).

OSPackage ManagerCommand
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

Note

sudo may be required depending on your system configuration.

2. Download asdf

Official Download

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1

Community Supported Download Methods

We highly recommend using the official git method.

MethodCommand
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper

3. Adicionando ao seu shell

Existem diversas combinações de shells, sistemas operacionais e métodos de instalação que podem impactar a configuração. Abaixo, expanda a seção que se adeque mais com o seu sistema:

Bash & Git

Adicione esta linha ao seu ~/.bashrc:

shell
. "$HOME/.asdf/asdf.sh"

O auto completar deve ser configurado manualmente a partir da adição da seguinte linha ao .bashrc:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

Se você estiver usando o macOS Catalina ou mais recente, o shell padrão mudou para o ZSH. A não ser que você tenha voltado para o bash, siga as instruções de instalação para o ZSH.

Adicione esta linha ao seu ~/.bash_profile:

shell
. "$HOME/.asdf/asdf.sh"

O auto completar deve ser configurado manualmente a partir da adição da seguinte linha ao .bash_profile:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

Adicione asdf.sh ao ~/.bashrc através do comando:

shell
echo -e "\\n. $(brew --prefix asdf)/asdf.sh" >> ~/.bashrc

O auto completar deve ser configurado seguindo as instruções da Homebrew, ou as seguintes:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Bash & Homebrew (macOS)

Se você estiver usando o macOS Catalina ou mais recente, o shell padrão mudou para o ZSH. A não ser que você tenha voltado para o bash, siga as instruções de instalação para o ZSH.

Adicione asdf.sh ao ~/.bash_profile através do comando:

shell
echo -e "\\n. $(brew --prefix asdf)/asdf.sh" >> ~/.bash_profile

O auto completar deve ser configurado seguindo as instruções da Homebrew, ou as seguintes:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Bash & Pacman

Adicione a seguinte linha ao seu ~/.bashrc:

shell
. /opt/asdf-vm/asdf.sh

O pacote bash-completion precisa ser instalado para o auto completar funcionar.

Fish & Git

Adicione a seguinte linha ao seu ~/.config/fish/config.fish:

shell
source ~/.asdf/asdf.fish

O auto completar deve ser configurado manualmente através do seguinte comando:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

Adicione asdf.fish ao seu ~/.config/fish/config.fish através do comando:

shell
echo -e "\\nsource "(brew --prefix asdf)"/asdf.fish" >> ~/.config/fish/config.fish

O auto completar é configurado pela Homebrew para o fish shell.

Fish & Pacman

Adicione a seguinte linha ao seu ~/.config/fish/config.fish:

shell
source /opt/asdf-vm/asdf.fish

O auto completar é configurado automaticamente durante a instalação do pacote AUR.

Elvish & Git

Adicione asdf.elv ao ~/.config/elvish/rc.elv através do comando:

shell
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

Ao concluir atualizará automaticamente

Elvish & Homebrew

Adicione asdf.elv ao ~/.config/elvish/rc.elv através do comando:

shell
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

Ao concluir atualizará automaticamente

Elvish & Pacman

Adicione asdf.elv ao ~/.config/elvish/rc.elv através do comando:

shell
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

Ao concluir atualizará automaticamente

ZSH & Git

Adicione a seguinte linha ao seu ~/.zshrc:

shell
. "$HOME/.asdf/asdf.sh"

OU utilize um framework para ZSH, como asdf para oh-my-zsh que irá adicionar o script e o auto completar.

O auto completar pode ser configurado ou pelo plugin do asdf para framework para ZSH, ou através da adição das seguintes linhas ao seu .zshrc:

shell
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • Se você está utilizando uma configuração compinit customizada, garanta que compinit esteja abaixo chamada asdf.sh
  • Se você está utilizando uma configuração compinit customizada com um framework para ZSH, garanta que compinit esteja abaixo da chamada do framework.

Aviso

Se você está utilizando um framework para ZSH, o plugin do asdf pode precisar ser atualizado para utilização adequada do novo auto completar do ZSH através do fpath. O plugin do asdf para o oh-my-zsh ainda não foi atualizado, veja: ohmyzsh/ohmyzsh#8837.

ZSH & Homebrew

Adicione asdf.sh ao seu ~/.zshrc através do comando:

shell
echo -e "\\n. $(brew --prefix asdf)/asdf.sh" >> \${ZDOTDIR:-~}/.zshrc

OU utilize um framework para ZSH, como asdf para oh-my-zsh que irá adicionar o script e o auto completar.

O auto completar pode ser configurado ou pelo framework para ZSH, ou de acordo com as instruções da Homebrew. Se você está usando um framework para ZSH, pode ser que seja necessário atualizar o plugin do asdf para que o novo auto completar funcione adequadamente através do fpath. O plugin do asdf para o Oh-My-ZSH ainda será atualizado, veja: ohmyzsh/ohmyzsh#8837.

ZSH & Pacman

Adicione a seguinte linha ao seu ~/.zshrc:

shell
. /opt/asdf-vm/asdf.sh
PowerShell Core & Git

Adicione a seguinte linha ao seu ~/.config/powershell/profile.ps1:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

Adicione asdf.ps1 ao seu ~/.config/powershell/profile.ps1 através do comando:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

Adicione a seguinte linha ao seu ~/.config/powershell/profile.ps1:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

Adicione asdf.nu ao seu ~/.config/nushell/config.nu através do comando:

shell
"\\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

Ao concluir atualizará automaticamente

Nushell & Homebrew

Adicione asdf.nu ao seu ~/.config/nushell/config.nu através do comando:

shell
"\\n$env.ASDF_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\\n source " +  (brew --prefix asdf | str trim | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path

Ao concluir atualizará automaticamente

Nushell & Pacman

Adicione asdf.nu ao seu ~/.config/nushell/config.nu através do comando:

shell
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

Ao concluir atualizará automaticamente

POSIX Shell & Git

Adicione a seguinte linha ao seu ~/.profile:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

Adicione asdf.sh ao ~/.profile através do comando:

shell
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
POSIX Shell & Pacman

Adicione a seguinte linha ao seu ~/.profile:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

O auto completar é colocado em um local familiar para o ZSH, mas o ZSH deve ser configurado para conseguir utilizá-lo. :::

Os scripts do asdf precisam ser chamados depois de ter configurado a sua variável $PATH e depois de ter chamado o seu framework para ZSH (oh-my-zsh etc).

Reinicie seu shell para que as mudanças na variável PATH tenham efeito. Abrir uma nova janela/sessão de terminal o fará.

4. Instalando um plugin

Para demonstração, vamos instalar e configurar o Node.js através do plugin asdf-nodejs.

Dependências dos plugins

Cada plugin possui algumas dependências, por isso precisamos checar no repositório onde elas estão listadas. Por exemplo, para o asdf-nodejs são:

SOInstalação de dependencia
Linux (Debian)apt-get install dirmngr gpg curl gawk
macOSbrew install gpg gawk

Devemos instalar instalar as dependências primeiro, pois alguns plugins exigem algumas ações após a instalação.

Instalando o plugin

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. Instalando uma versão

Agora temos o plugin para o Node.js, nós podemos instalar uma versão desta ferramenta.

Podemos ver quais versões tão disponíveis através do comando asdf list all nodejs, ou uma lista específica de versões com asdf list all nodejs 14

Vamos instalar somente a última versão disponível, utilizando a tag latest:

shell
asdf install nodejs latest

Nota

asdf exige versões exatas. A palavra latest resulta na instalação da versão atual na data da execução.

6. Definindo uma versão

asdf executa uma verificação das versões das ferramentas a serem utilizadas através do arquivo .tool-versions presente desde diretório atual, até o diretório $HOME. A varredura ocorre no momento em que você executa uma ferramenta que o asdf gerencia.

WARNING

Se uma versão não for especificada para uma ferramenta, ao executá-la resultará em erro. asdf current mostrará a ferramenta e sua versão, ou então a falta dela no seu diretório atual para que você possa observar quais ferramentas falharão ao serem executadas.

Versões globais

Os padrões globais são gerenciados em $HOME/.tool-versions. Defina uma versão global através do comando:

shell
asdf global nodejs latest

$HOME/.tool-versions ficará assim:

nodejs 16.5.0

Alguns sistemas operacionais vêm por padrão com ferramentas que são gerenciadas pelo próprio sistema e não pelo asdf, python é um exemplo. Você precisa indicar para o asdf para devolver o gerenciamento para o sistema. A seção de referência de versões irá guiá-lo.

Versões locais

Versões locais são definidas no arquivo $PWD/.tool-versions (seu diretório atual). Geralmente, será um repositório Git para um projeto. Quando estiver no diretório desejado, execute:

shell
asdf local nodejs latest

$PWD/.tool-versions ficará assim:

nodejs 16.5.0

Usando arquivos de versão existentes

asdf suporta a migração de arquivos de versão provenientes de outros gerenciadores de versão. Por exemplo: .ruby-version para o rbenv. Essa funcionalidade é baseada no plugin de cada ferramenta.

O asdf-nodejs suporta tanto arquivos .nvmrc quanto .node-version. Para ativar essa funcionalidade, adicione a seguinte linha ao seu arquivo de configuração do asdf - $HOME/.asdfrc:

legacy_version_file = yes

Veja a página de refencia da configuração para mais opções de configuração.

Setup finalizado!

A configuração inicial do asdf foi finalizada 🎉. Agora, você pode gerenciar versões do nodejs para o seus projetos. Siga passos semelhantes para cada ferramenta do seu projeto.

O asdf possui diversos outros comandos para se acustomar ainda, você pode ver todos eles através do comando asdf --help ou simplesmente asdf. Eles estão divididos em três categorias:

`,79)]))}const g=a(l,[["render",n]]);export{k as __pageData,g as default}; diff --git a/assets/pt-br_guide_getting-started.md.Bxtluukf.lean.js b/assets/pt-br_guide_getting-started.md.Bxtluukf.lean.js new file mode 100644 index 00000000..89cd9998 --- /dev/null +++ b/assets/pt-br_guide_getting-started.md.Bxtluukf.lean.js @@ -0,0 +1,13 @@ +import{_ as a,c as i,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const k=JSON.parse('{"title":"Começando","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/guide/getting-started.md","filePath":"pt-br/guide/getting-started.md","lastUpdated":1724080713000}'),l={name:"pt-br/guide/getting-started.md"};function n(o,s,h,d,p,r){return t(),i("div",null,s[0]||(s[0]=[e(`

Começando

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

A instalação do asdf envolve:

  1. Instalar as dependências
  2. Instalar o núcleo do asdf
  3. Adicionar o asdf ao seu shell
  4. Instalar um plugin para cada ferramenta que você gostaria de gerenciar
  5. Instalar uma versão desta ferramenta
  6. Definir uma versão global e uma versão local através do arquivo de configuração .tool-versions

Você pode também acompanhar o passo a passo da instalação através deste vídeo.

1. Instalando as dependências

asdf primarily requires git & curl. Here is a non-exhaustive list of commands to run for your package manager (some might automatically install these tools in later steps).

OSPackage ManagerCommand
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

Note

sudo may be required depending on your system configuration.

2. Download asdf

Official Download

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1

Community Supported Download Methods

We highly recommend using the official git method.

MethodCommand
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper

3. Adicionando ao seu shell

Existem diversas combinações de shells, sistemas operacionais e métodos de instalação que podem impactar a configuração. Abaixo, expanda a seção que se adeque mais com o seu sistema:

Bash & Git

Adicione esta linha ao seu ~/.bashrc:

shell
. "$HOME/.asdf/asdf.sh"

O auto completar deve ser configurado manualmente a partir da adição da seguinte linha ao .bashrc:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

Se você estiver usando o macOS Catalina ou mais recente, o shell padrão mudou para o ZSH. A não ser que você tenha voltado para o bash, siga as instruções de instalação para o ZSH.

Adicione esta linha ao seu ~/.bash_profile:

shell
. "$HOME/.asdf/asdf.sh"

O auto completar deve ser configurado manualmente a partir da adição da seguinte linha ao .bash_profile:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

Adicione asdf.sh ao ~/.bashrc através do comando:

shell
echo -e "\\n. $(brew --prefix asdf)/asdf.sh" >> ~/.bashrc

O auto completar deve ser configurado seguindo as instruções da Homebrew, ou as seguintes:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Bash & Homebrew (macOS)

Se você estiver usando o macOS Catalina ou mais recente, o shell padrão mudou para o ZSH. A não ser que você tenha voltado para o bash, siga as instruções de instalação para o ZSH.

Adicione asdf.sh ao ~/.bash_profile através do comando:

shell
echo -e "\\n. $(brew --prefix asdf)/asdf.sh" >> ~/.bash_profile

O auto completar deve ser configurado seguindo as instruções da Homebrew, ou as seguintes:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Bash & Pacman

Adicione a seguinte linha ao seu ~/.bashrc:

shell
. /opt/asdf-vm/asdf.sh

O pacote bash-completion precisa ser instalado para o auto completar funcionar.

Fish & Git

Adicione a seguinte linha ao seu ~/.config/fish/config.fish:

shell
source ~/.asdf/asdf.fish

O auto completar deve ser configurado manualmente através do seguinte comando:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

Adicione asdf.fish ao seu ~/.config/fish/config.fish através do comando:

shell
echo -e "\\nsource "(brew --prefix asdf)"/asdf.fish" >> ~/.config/fish/config.fish

O auto completar é configurado pela Homebrew para o fish shell.

Fish & Pacman

Adicione a seguinte linha ao seu ~/.config/fish/config.fish:

shell
source /opt/asdf-vm/asdf.fish

O auto completar é configurado automaticamente durante a instalação do pacote AUR.

Elvish & Git

Adicione asdf.elv ao ~/.config/elvish/rc.elv através do comando:

shell
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

Ao concluir atualizará automaticamente

Elvish & Homebrew

Adicione asdf.elv ao ~/.config/elvish/rc.elv através do comando:

shell
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

Ao concluir atualizará automaticamente

Elvish & Pacman

Adicione asdf.elv ao ~/.config/elvish/rc.elv através do comando:

shell
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

Ao concluir atualizará automaticamente

ZSH & Git

Adicione a seguinte linha ao seu ~/.zshrc:

shell
. "$HOME/.asdf/asdf.sh"

OU utilize um framework para ZSH, como asdf para oh-my-zsh que irá adicionar o script e o auto completar.

O auto completar pode ser configurado ou pelo plugin do asdf para framework para ZSH, ou através da adição das seguintes linhas ao seu .zshrc:

shell
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • Se você está utilizando uma configuração compinit customizada, garanta que compinit esteja abaixo chamada asdf.sh
  • Se você está utilizando uma configuração compinit customizada com um framework para ZSH, garanta que compinit esteja abaixo da chamada do framework.

Aviso

Se você está utilizando um framework para ZSH, o plugin do asdf pode precisar ser atualizado para utilização adequada do novo auto completar do ZSH através do fpath. O plugin do asdf para o oh-my-zsh ainda não foi atualizado, veja: ohmyzsh/ohmyzsh#8837.

ZSH & Homebrew

Adicione asdf.sh ao seu ~/.zshrc através do comando:

shell
echo -e "\\n. $(brew --prefix asdf)/asdf.sh" >> \${ZDOTDIR:-~}/.zshrc

OU utilize um framework para ZSH, como asdf para oh-my-zsh que irá adicionar o script e o auto completar.

O auto completar pode ser configurado ou pelo framework para ZSH, ou de acordo com as instruções da Homebrew. Se você está usando um framework para ZSH, pode ser que seja necessário atualizar o plugin do asdf para que o novo auto completar funcione adequadamente através do fpath. O plugin do asdf para o Oh-My-ZSH ainda será atualizado, veja: ohmyzsh/ohmyzsh#8837.

ZSH & Pacman

Adicione a seguinte linha ao seu ~/.zshrc:

shell
. /opt/asdf-vm/asdf.sh
PowerShell Core & Git

Adicione a seguinte linha ao seu ~/.config/powershell/profile.ps1:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

Adicione asdf.ps1 ao seu ~/.config/powershell/profile.ps1 através do comando:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

Adicione a seguinte linha ao seu ~/.config/powershell/profile.ps1:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

Adicione asdf.nu ao seu ~/.config/nushell/config.nu através do comando:

shell
"\\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

Ao concluir atualizará automaticamente

Nushell & Homebrew

Adicione asdf.nu ao seu ~/.config/nushell/config.nu através do comando:

shell
"\\n$env.ASDF_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\\n source " +  (brew --prefix asdf | str trim | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path

Ao concluir atualizará automaticamente

Nushell & Pacman

Adicione asdf.nu ao seu ~/.config/nushell/config.nu através do comando:

shell
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

Ao concluir atualizará automaticamente

POSIX Shell & Git

Adicione a seguinte linha ao seu ~/.profile:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

Adicione asdf.sh ao ~/.profile através do comando:

shell
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
POSIX Shell & Pacman

Adicione a seguinte linha ao seu ~/.profile:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

O auto completar é colocado em um local familiar para o ZSH, mas o ZSH deve ser configurado para conseguir utilizá-lo. :::

Os scripts do asdf precisam ser chamados depois de ter configurado a sua variável $PATH e depois de ter chamado o seu framework para ZSH (oh-my-zsh etc).

Reinicie seu shell para que as mudanças na variável PATH tenham efeito. Abrir uma nova janela/sessão de terminal o fará.

4. Instalando um plugin

Para demonstração, vamos instalar e configurar o Node.js através do plugin asdf-nodejs.

Dependências dos plugins

Cada plugin possui algumas dependências, por isso precisamos checar no repositório onde elas estão listadas. Por exemplo, para o asdf-nodejs são:

SOInstalação de dependencia
Linux (Debian)apt-get install dirmngr gpg curl gawk
macOSbrew install gpg gawk

Devemos instalar instalar as dependências primeiro, pois alguns plugins exigem algumas ações após a instalação.

Instalando o plugin

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. Instalando uma versão

Agora temos o plugin para o Node.js, nós podemos instalar uma versão desta ferramenta.

Podemos ver quais versões tão disponíveis através do comando asdf list all nodejs, ou uma lista específica de versões com asdf list all nodejs 14

Vamos instalar somente a última versão disponível, utilizando a tag latest:

shell
asdf install nodejs latest

Nota

asdf exige versões exatas. A palavra latest resulta na instalação da versão atual na data da execução.

6. Definindo uma versão

asdf executa uma verificação das versões das ferramentas a serem utilizadas através do arquivo .tool-versions presente desde diretório atual, até o diretório $HOME. A varredura ocorre no momento em que você executa uma ferramenta que o asdf gerencia.

WARNING

Se uma versão não for especificada para uma ferramenta, ao executá-la resultará em erro. asdf current mostrará a ferramenta e sua versão, ou então a falta dela no seu diretório atual para que você possa observar quais ferramentas falharão ao serem executadas.

Versões globais

Os padrões globais são gerenciados em $HOME/.tool-versions. Defina uma versão global através do comando:

shell
asdf global nodejs latest

$HOME/.tool-versions ficará assim:

nodejs 16.5.0

Alguns sistemas operacionais vêm por padrão com ferramentas que são gerenciadas pelo próprio sistema e não pelo asdf, python é um exemplo. Você precisa indicar para o asdf para devolver o gerenciamento para o sistema. A seção de referência de versões irá guiá-lo.

Versões locais

Versões locais são definidas no arquivo $PWD/.tool-versions (seu diretório atual). Geralmente, será um repositório Git para um projeto. Quando estiver no diretório desejado, execute:

shell
asdf local nodejs latest

$PWD/.tool-versions ficará assim:

nodejs 16.5.0

Usando arquivos de versão existentes

asdf suporta a migração de arquivos de versão provenientes de outros gerenciadores de versão. Por exemplo: .ruby-version para o rbenv. Essa funcionalidade é baseada no plugin de cada ferramenta.

O asdf-nodejs suporta tanto arquivos .nvmrc quanto .node-version. Para ativar essa funcionalidade, adicione a seguinte linha ao seu arquivo de configuração do asdf - $HOME/.asdfrc:

legacy_version_file = yes

Veja a página de refencia da configuração para mais opções de configuração.

Setup finalizado!

A configuração inicial do asdf foi finalizada 🎉. Agora, você pode gerenciar versões do nodejs para o seus projetos. Siga passos semelhantes para cada ferramenta do seu projeto.

O asdf possui diversos outros comandos para se acustomar ainda, você pode ver todos eles através do comando asdf --help ou simplesmente asdf. Eles estão divididos em três categorias:

`,79)]))}const g=a(l,[["render",n]]);export{k as __pageData,g as default}; diff --git a/assets/pt-br_guide_introduction.md.C231JBSG.js b/assets/pt-br_guide_introduction.md.C231JBSG.js new file mode 100644 index 00000000..6e4988e3 --- /dev/null +++ b/assets/pt-br_guide_introduction.md.C231JBSG.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as s}from"./chunks/framework.C9NVOr0y.js";const p=JSON.parse('{"title":"Introdução","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/guide/introduction.md","filePath":"pt-br/guide/introduction.md","lastUpdated":1643288544000}'),t={name:"pt-br/guide/introduction.md"};function n(i,e,d,c,m,u){return s(),o("div",null,e[0]||(e[0]=[r('

Introdução

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

O asdf é um gerenciador de versões. Todas as definições de versão das ferramentas estão contidas no arquivo (.tool-versions), o qual você pode compartilhar com o seu time no repositório Git de um projeto e garantir que todos estejam usando exatamente a mesma versão das ferramentas.

A maneira antiga de trabalhar necessitava diversos gerenciadores de versão, cada um deles com uma documentação, arquivos de configuração diferentes (manipulação do $PATH, shims e variáveis de ambiente, por exemplo). O asdf provê um único arquivo de configuração e uma única interface para simplificar o fluxo de desenvolvimento, podendo ser ampliado para todas as ferramentas através de um simples plugin.

Funcionamento

Após instalar e configurar o asdf no seu shell, plugins podem ser instalados para gerenciar determinadas ferramentas. Quando uma ferramenta é instalada por um plugin, os executáveis que foram instalados possuem shims criados para cada um deles. Quando você roda algum destes executáveis, o shim é executado, permitindo que o asdf identifique qual versão da ferramenta está configurada no arquivo .tool-versions e execute esta versão.

Projetos relacionados

nvm / n / rbenv etc

Ferramentas como o nvm, n e rbenv são escritas em shell scripts que criam shims para os executáveis instalados para essas ferramentas.

O asdf é bem similar e foi criado para competir neste meio de ferramentas de gerenciamento de versão. O grande diferencial do asdf é que seu sistema de plugins elimina a necessidade de um gerenciador de versões para cada ferramenta, esta com diferentes comandos e arquivos de configuração.

direnv

Aumenta os shells existentes com a possibilidade de utilizar diferentes variáveis de ambiente com base no diretório atual.

O asdf não gerencia variáveis de ambiente, entretanto existe o plugin asdf-direnv para integrar o comportamento do direnv ao asdf.

Veja a documentação do direnv para mais detalhes.

Homebrew

O gerenciador de pacotes faltante para o macOS (ou Linux)

O Homebrew gerencia seus pacotes e dependências destes pacotes. O asdf não gerencia dependencias, não é um gerenciador de pacotes, a escolha do gerenciador de pacotes é reservada ao usuário.

Veja a documentação do Homebrew para mais detalhes.

NixOS

O Nix é uma ferramenta que relaciona o gerenciamento de pacotes e as configurações de sistema.

O NixOS visa construir ambientes verdadeiramente replicáveis através da gerência das versões exatas dos pacotes e dependências de cada ferramenta, algo que o asdf não faz. O NixOS faz isso através da sua própria linguagem de programação, muitas ferramentas da linha de comando e uma coleção de pacotes contendo mais de 60,000 destes.

Novamente, o asdf não gerencia dependências/pacotes e não é um gerenciador de pacotes.

Veja a documentação do NixOS para mais detalhes.

Por que usar o asdf?

O asdf garante que equipes utilizem exatamente a mesma versão de alguma ferramenta, com suporte para diversas delas através do sistema de plugins e a simplicidade e familiaridade de ser um único shell script que você inclui na configuração do seu shell

Nota

O asdf não foi feito para ser o gerenciador de pacotes do seu sistema, mas sim uma ferramenta para gerenciar versões de outras ferramentas. Não é por que é possível criar um plugin para qualquer ferramenta/linguagem com o asdf que esta sempre será a solução mais adequada.

',26)]))}const f=a(t,[["render",n]]);export{p as __pageData,f as default}; diff --git a/assets/pt-br_guide_introduction.md.C231JBSG.lean.js b/assets/pt-br_guide_introduction.md.C231JBSG.lean.js new file mode 100644 index 00000000..6e4988e3 --- /dev/null +++ b/assets/pt-br_guide_introduction.md.C231JBSG.lean.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as s}from"./chunks/framework.C9NVOr0y.js";const p=JSON.parse('{"title":"Introdução","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/guide/introduction.md","filePath":"pt-br/guide/introduction.md","lastUpdated":1643288544000}'),t={name:"pt-br/guide/introduction.md"};function n(i,e,d,c,m,u){return s(),o("div",null,e[0]||(e[0]=[r('

Introdução

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

O asdf é um gerenciador de versões. Todas as definições de versão das ferramentas estão contidas no arquivo (.tool-versions), o qual você pode compartilhar com o seu time no repositório Git de um projeto e garantir que todos estejam usando exatamente a mesma versão das ferramentas.

A maneira antiga de trabalhar necessitava diversos gerenciadores de versão, cada um deles com uma documentação, arquivos de configuração diferentes (manipulação do $PATH, shims e variáveis de ambiente, por exemplo). O asdf provê um único arquivo de configuração e uma única interface para simplificar o fluxo de desenvolvimento, podendo ser ampliado para todas as ferramentas através de um simples plugin.

Funcionamento

Após instalar e configurar o asdf no seu shell, plugins podem ser instalados para gerenciar determinadas ferramentas. Quando uma ferramenta é instalada por um plugin, os executáveis que foram instalados possuem shims criados para cada um deles. Quando você roda algum destes executáveis, o shim é executado, permitindo que o asdf identifique qual versão da ferramenta está configurada no arquivo .tool-versions e execute esta versão.

Projetos relacionados

nvm / n / rbenv etc

Ferramentas como o nvm, n e rbenv são escritas em shell scripts que criam shims para os executáveis instalados para essas ferramentas.

O asdf é bem similar e foi criado para competir neste meio de ferramentas de gerenciamento de versão. O grande diferencial do asdf é que seu sistema de plugins elimina a necessidade de um gerenciador de versões para cada ferramenta, esta com diferentes comandos e arquivos de configuração.

direnv

Aumenta os shells existentes com a possibilidade de utilizar diferentes variáveis de ambiente com base no diretório atual.

O asdf não gerencia variáveis de ambiente, entretanto existe o plugin asdf-direnv para integrar o comportamento do direnv ao asdf.

Veja a documentação do direnv para mais detalhes.

Homebrew

O gerenciador de pacotes faltante para o macOS (ou Linux)

O Homebrew gerencia seus pacotes e dependências destes pacotes. O asdf não gerencia dependencias, não é um gerenciador de pacotes, a escolha do gerenciador de pacotes é reservada ao usuário.

Veja a documentação do Homebrew para mais detalhes.

NixOS

O Nix é uma ferramenta que relaciona o gerenciamento de pacotes e as configurações de sistema.

O NixOS visa construir ambientes verdadeiramente replicáveis através da gerência das versões exatas dos pacotes e dependências de cada ferramenta, algo que o asdf não faz. O NixOS faz isso através da sua própria linguagem de programação, muitas ferramentas da linha de comando e uma coleção de pacotes contendo mais de 60,000 destes.

Novamente, o asdf não gerencia dependências/pacotes e não é um gerenciador de pacotes.

Veja a documentação do NixOS para mais detalhes.

Por que usar o asdf?

O asdf garante que equipes utilizem exatamente a mesma versão de alguma ferramenta, com suporte para diversas delas através do sistema de plugins e a simplicidade e familiaridade de ser um único shell script que você inclui na configuração do seu shell

Nota

O asdf não foi feito para ser o gerenciador de pacotes do seu sistema, mas sim uma ferramenta para gerenciar versões de outras ferramentas. Não é por que é possível criar um plugin para qualquer ferramenta/linguagem com o asdf que esta sempre será a solução mais adequada.

',26)]))}const f=a(t,[["render",n]]);export{p as __pageData,f as default}; diff --git a/assets/pt-br_index.md.B18T-HnP.js b/assets/pt-br_index.md.B18T-HnP.js new file mode 100644 index 00000000..6c2e6168 --- /dev/null +++ b/assets/pt-br_index.md.B18T-HnP.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a}from"./chunks/framework.C9NVOr0y.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"asdf","text":"O Gerenciador de Múltiplas Versões de Tempo de Execução","tagline":"Gerencie todas as suas versões de tempo de execução com uma ferramenta!","actions":[{"theme":"brand","text":"Começar","link":"/pt-br/guide/getting-started"},{"theme":"alt","text":"O que é asdf?","link":"/pt-br/guide/introduction"},{"theme":"alt","text":"Ver no GitHub","link":"https://github.com/asdf-vm/asdf"}]},"features":[{"title":"Uma super ferramenta","details":"Gerencie cada um dos runtimes e ferramentas dos seus projetos com uma única ferramenta de CLI","icon":"🎉"},{"title":"Plugins","details":"Grande ecossistema de runtimes e ferramentas existentes. API simples para adicionar suporte para novas ferramentas conforme necessário!","icon":"🔌"},{"title":"Compatível com vários arquivos de configuração","details":"Suporte para arquivos de configuração existentes .nvmrc, .node-version, .ruby-version para uma migração tranquila!","icon":"⏮"},{"title":"Só um arquivo de configuração","details":".tool-versions para gerenciar todas as suas ferramentas, runtimes e suas versões em um único arquivo","icon":"📄"},{"title":"Shells","details":"Suporta Bash, ZSH, Fish & Elvish com autocomplete.","icon":"🐚"},{"title":"GitHub Actions","details":"Fornece um GitHub Action para instalar e utilizar seu .tool-verions em seu fluxo de trabalho CICD.","icon":"🤖"}]},"headers":[],"relativePath":"pt-br/index.md","filePath":"pt-br/index.md","lastUpdated":1700090238000}'),r={name:"pt-br/index.md"};function s(o,i,n,d,m,c){return a(),t("div")}const p=e(r,[["render",s]]);export{l as __pageData,p as default}; diff --git a/assets/pt-br_index.md.B18T-HnP.lean.js b/assets/pt-br_index.md.B18T-HnP.lean.js new file mode 100644 index 00000000..6c2e6168 --- /dev/null +++ b/assets/pt-br_index.md.B18T-HnP.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a}from"./chunks/framework.C9NVOr0y.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"asdf","text":"O Gerenciador de Múltiplas Versões de Tempo de Execução","tagline":"Gerencie todas as suas versões de tempo de execução com uma ferramenta!","actions":[{"theme":"brand","text":"Começar","link":"/pt-br/guide/getting-started"},{"theme":"alt","text":"O que é asdf?","link":"/pt-br/guide/introduction"},{"theme":"alt","text":"Ver no GitHub","link":"https://github.com/asdf-vm/asdf"}]},"features":[{"title":"Uma super ferramenta","details":"Gerencie cada um dos runtimes e ferramentas dos seus projetos com uma única ferramenta de CLI","icon":"🎉"},{"title":"Plugins","details":"Grande ecossistema de runtimes e ferramentas existentes. API simples para adicionar suporte para novas ferramentas conforme necessário!","icon":"🔌"},{"title":"Compatível com vários arquivos de configuração","details":"Suporte para arquivos de configuração existentes .nvmrc, .node-version, .ruby-version para uma migração tranquila!","icon":"⏮"},{"title":"Só um arquivo de configuração","details":".tool-versions para gerenciar todas as suas ferramentas, runtimes e suas versões em um único arquivo","icon":"📄"},{"title":"Shells","details":"Suporta Bash, ZSH, Fish & Elvish com autocomplete.","icon":"🐚"},{"title":"GitHub Actions","details":"Fornece um GitHub Action para instalar e utilizar seu .tool-verions em seu fluxo de trabalho CICD.","icon":"🤖"}]},"headers":[],"relativePath":"pt-br/index.md","filePath":"pt-br/index.md","lastUpdated":1700090238000}'),r={name:"pt-br/index.md"};function s(o,i,n,d,m,c){return a(),t("div")}const p=e(r,[["render",s]]);export{l as __pageData,p as default}; diff --git a/assets/pt-br_manage_commands.md.C9u0wbDc.js b/assets/pt-br_manage_commands.md.C9u0wbDc.js new file mode 100644 index 00000000..c784ed82 --- /dev/null +++ b/assets/pt-br_manage_commands.md.C9u0wbDc.js @@ -0,0 +1,66 @@ +import{_ as a,c as n,a2 as e,o as p}from"./chunks/framework.C9NVOr0y.js";const m=JSON.parse('{"title":"All Commands","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/manage/commands.md","filePath":"pt-br/manage/commands.md","lastUpdated":1687069487000}'),l={name:"pt-br/manage/commands.md"};function t(i,s,o,c,r,d){return p(),n("div",null,s[0]||(s[0]=[e(`

All Commands

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

A lista de todos os comandos disponíveis em asdf. Esta lista é o texto do comando asdf help.

txt
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>]      Add a plugin from the plugin repo OR,
+                                        add a Git repo as a plugin by
+                                        specifying the name and repo url
+asdf plugin list [--urls] [--refs]      List installed plugins. Optionally show
+                                        git urls and git-ref
+asdf plugin list all                    List plugins registered on asdf-plugins
+                                        repository with URLs
+asdf plugin remove <name>               Remove plugin and package versions
+asdf plugin update <name> [<git-ref>]   Update a plugin to latest commit on
+                                        default branch or a particular git-ref
+asdf plugin update --all                Update all plugins to latest commit on
+                                        default branch
+
+
+MANAGE PACKAGES
+asdf current                            Display current version set or being
+                                        used for all packages
+asdf current <name>                     Display current version set or being
+                                        used for package
+asdf global <name> <version>            Set the package global version
+asdf global <name> latest[:<version>]   Set the package global version to the
+                                        latest provided version
+asdf help <name> [<version>]            Output documentation for plugin and tool
+asdf install                            Install all the package versions listed
+                                        in the .tool-versions file
+asdf install <name>                     Install one tool at the version
+                                        specified in the .tool-versions file
+asdf install <name> <version>           Install a specific version of a package
+asdf install <name> latest[:<version>]  Install the latest stable version of a
+                                        package, or with optional version,
+                                        install the latest stable version that
+                                        begins with the given string
+asdf latest <name> [<version>]          Show latest stable version of a package
+asdf latest --all                       Show latest stable version of all the
+                                        packages and if they are installed
+asdf list <name> [version]              List installed versions of a package and
+                                        optionally filter the versions
+asdf list all <name> [<version>]        List all versions of a package and
+                                        optionally filter the returned versions
+asdf local <name> <version>             Set the package local version
+asdf local <name> latest[:<version>]    Set the package local version to the
+                                        latest provided version
+asdf shell <name> <version>             Set the package version to
+                                        \`ASDF_\${LANG}_VERSION\` in the current shell
+asdf uninstall <name> <version>         Remove a specific version of a package
+asdf where <name> [<version>]           Display install path for an installed
+                                        or current version
+asdf which <command>                    Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...]           Executes the command shim for current version
+asdf env <command> [util]               Runs util (default: \`env\`) inside the
+                                        environment used for command shim execution.
+asdf info                               Print OS, Shell and ASDF debug information.
+asdf version                            Print the currently installed version of ASDF
+asdf reshim <name> <version>            Recreate shims for version of a package
+asdf shim-versions <command>            List the plugins and versions that
+                                        provide a command
+asdf update                             Update asdf to the latest stable release
+asdf update --head                      Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs:   https://asdf-vm.com
`,4)]))}const f=a(l,[["render",t]]);export{m as __pageData,f as default}; diff --git a/assets/pt-br_manage_commands.md.C9u0wbDc.lean.js b/assets/pt-br_manage_commands.md.C9u0wbDc.lean.js new file mode 100644 index 00000000..c784ed82 --- /dev/null +++ b/assets/pt-br_manage_commands.md.C9u0wbDc.lean.js @@ -0,0 +1,66 @@ +import{_ as a,c as n,a2 as e,o as p}from"./chunks/framework.C9NVOr0y.js";const m=JSON.parse('{"title":"All Commands","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/manage/commands.md","filePath":"pt-br/manage/commands.md","lastUpdated":1687069487000}'),l={name:"pt-br/manage/commands.md"};function t(i,s,o,c,r,d){return p(),n("div",null,s[0]||(s[0]=[e(`

All Commands

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

A lista de todos os comandos disponíveis em asdf. Esta lista é o texto do comando asdf help.

txt
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>]      Add a plugin from the plugin repo OR,
+                                        add a Git repo as a plugin by
+                                        specifying the name and repo url
+asdf plugin list [--urls] [--refs]      List installed plugins. Optionally show
+                                        git urls and git-ref
+asdf plugin list all                    List plugins registered on asdf-plugins
+                                        repository with URLs
+asdf plugin remove <name>               Remove plugin and package versions
+asdf plugin update <name> [<git-ref>]   Update a plugin to latest commit on
+                                        default branch or a particular git-ref
+asdf plugin update --all                Update all plugins to latest commit on
+                                        default branch
+
+
+MANAGE PACKAGES
+asdf current                            Display current version set or being
+                                        used for all packages
+asdf current <name>                     Display current version set or being
+                                        used for package
+asdf global <name> <version>            Set the package global version
+asdf global <name> latest[:<version>]   Set the package global version to the
+                                        latest provided version
+asdf help <name> [<version>]            Output documentation for plugin and tool
+asdf install                            Install all the package versions listed
+                                        in the .tool-versions file
+asdf install <name>                     Install one tool at the version
+                                        specified in the .tool-versions file
+asdf install <name> <version>           Install a specific version of a package
+asdf install <name> latest[:<version>]  Install the latest stable version of a
+                                        package, or with optional version,
+                                        install the latest stable version that
+                                        begins with the given string
+asdf latest <name> [<version>]          Show latest stable version of a package
+asdf latest --all                       Show latest stable version of all the
+                                        packages and if they are installed
+asdf list <name> [version]              List installed versions of a package and
+                                        optionally filter the versions
+asdf list all <name> [<version>]        List all versions of a package and
+                                        optionally filter the returned versions
+asdf local <name> <version>             Set the package local version
+asdf local <name> latest[:<version>]    Set the package local version to the
+                                        latest provided version
+asdf shell <name> <version>             Set the package version to
+                                        \`ASDF_\${LANG}_VERSION\` in the current shell
+asdf uninstall <name> <version>         Remove a specific version of a package
+asdf where <name> [<version>]           Display install path for an installed
+                                        or current version
+asdf which <command>                    Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...]           Executes the command shim for current version
+asdf env <command> [util]               Runs util (default: \`env\`) inside the
+                                        environment used for command shim execution.
+asdf info                               Print OS, Shell and ASDF debug information.
+asdf version                            Print the currently installed version of ASDF
+asdf reshim <name> <version>            Recreate shims for version of a package
+asdf shim-versions <command>            List the plugins and versions that
+                                        provide a command
+asdf update                             Update asdf to the latest stable release
+asdf update --head                      Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs:   https://asdf-vm.com
`,4)]))}const f=a(l,[["render",t]]);export{m as __pageData,f as default}; diff --git a/assets/pt-br_manage_configuration.md.Bo5UByU1.js b/assets/pt-br_manage_configuration.md.Bo5UByU1.js new file mode 100644 index 00000000..93b3ff71 --- /dev/null +++ b/assets/pt-br_manage_configuration.md.Bo5UByU1.js @@ -0,0 +1 @@ +import{_ as o,c as a,a2 as s,o as d}from"./chunks/framework.C9NVOr0y.js";const m=JSON.parse('{"title":"Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/manage/configuration.md","filePath":"pt-br/manage/configuration.md","lastUpdated":1687069487000}'),i={name:"pt-br/manage/configuration.md"};function r(c,e,n,t,l,p){return d(),a("div",null,e[0]||(e[0]=[s('

Configuration

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

A configuração do asdf abrange tanto os arquivos .tool-versions compartilháveis quanto as personalizações específicas do usuário com .asdfrc e variáveis de ambiente.

.tool-versions

Sempre que o arquivo .tool-versions estiver presente em um diretório, as versões da ferramenta que ele declara serão usadas nesse diretório e em seus subdiretórios.

Configurações globais podem ser modificadas no arquivo $HOME/.tool-versions

O arquivo .tool-versions se parece assim:

ruby 2.5.3\nnodejs 10.15.0

As versões podem estar no seguinte formato:

  • 10.15.0 - uma versão real. Os plugins que suportam o download de binários farão o download de binários.
  • ref:v1.0.2-a ou ref:39cb398vb39 - tag/commit/branch para download pelo github e compilação um path costumizado e compi
  • path:~/src/elixir - um path para uma versão compilada e personalizada de uma ferramenta pronta para usar. Para uso por linguagens de desenvolvimento e outros.
  • system - faz com que asdf passe para a versão da ferramenta no sistema que não é gerenciada por asdf .

Várias versões podem ser definidas, separando-as com um espaço. Por exemplo, para usar Python 3.7.2, e também Python 2.7.15, use a linha abaixo em seu arquivo .tool-versions.

python 3.7.2 2.7.15 system

Para instalar todas as ferramentas definidas em .tool-versions, execute o camando asdf install sem argumentos no mesmo diretório de .tool-versions.

Para isntalar somente uma ferramenta definida em .tool-versions, execute o camando asdf install sem argumentos no mesmo diretório de .tool-versions. A ferramenta será instalada na versão especificada no arquivo .tool-versions.

Edite o arquivo diretamente no diretório ou use asdf local (ou asdf global) para atualiza-lo.

$HOME/.asdfrc

Adicione um arquivo .asdfrc ao seu diretório home e asdf usará as configurações especificadas no arquivo. O arquivo deve ser formatado assim:

legacy_version_file = yes

Configurações

  • legacy_version_file - por padrão é no. Se definido como yes, fará com que os plug-ins que suportam esse recurso leiam os arquivos de versão usados por outros gerenciadores de versão (por exemplo, .ruby-version no caso do rbenv do Ruby).

  • use_release_candidates - por padrão é no. Se definido como yes, fará com que o comando asdf update atualize para o mais recente em vez da versão semântica mais recente.

  • always_keep_download - por padrão é no. Se definido como yes, fará com que o asdf install sempre mantenha o código-fonte ou binário baixado. Se definido como no, o código fonte ou binário baixado por asdf install será excluído após a instalação bem sucedida.

  • plugin_repository_last_check_duration - por padrão é 60 min (1 hrs). Ele define a duração da última verificação do repositório de plugins asdf. Quando o comando asdf plugin add <nome>, asdf plugin list all for executado, ele verificará a duração da última atualização para atualizar o repositório. Se definido como 0, ele atualizará o repositório de plugins asdf todas as vezes.

Variáveis de ambiente

  • ASDF_CONFIG_FILE - O padrão é ~ /.asdfrc conforme descrito acima. Pode ser definido para qualquer local.
  • ASDF_DEFAULT_TOOL_VERSIONS_FILENAME - O nome do arquivo que armazena os nomes e versões das ferramentas. O padrão é .tool-versions. Pode ser qualquer nome de arquivo válido. Normalmente você não deve substituir o valor padrão, a menos que deseja que o asdf ignore os arquivos .tool-versions.
  • ASDF_DIR - O padrão é ~/.asdf - Localização dos arquivos asdf. Se você instalar asdf em algum outro diretório, defina-o para esse diretório. Por exemplo, se você estiver instalando através do AUR, você deve definir isso para /opt/asdf-vm.
  • ASDF_DATA_DIR - O padrão é ~/.asdf - Local onde asdf instala plugins, correções e instalações. Pode ser definido para qualquer local antes de fornecer asdf.sh ou asdf.fish mencionado na seção acima. Para Elvish, isso pode ser definido acima de use asdf.
',22)]))}const f=o(i,[["render",r]]);export{m as __pageData,f as default}; diff --git a/assets/pt-br_manage_configuration.md.Bo5UByU1.lean.js b/assets/pt-br_manage_configuration.md.Bo5UByU1.lean.js new file mode 100644 index 00000000..93b3ff71 --- /dev/null +++ b/assets/pt-br_manage_configuration.md.Bo5UByU1.lean.js @@ -0,0 +1 @@ +import{_ as o,c as a,a2 as s,o as d}from"./chunks/framework.C9NVOr0y.js";const m=JSON.parse('{"title":"Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/manage/configuration.md","filePath":"pt-br/manage/configuration.md","lastUpdated":1687069487000}'),i={name:"pt-br/manage/configuration.md"};function r(c,e,n,t,l,p){return d(),a("div",null,e[0]||(e[0]=[s('

Configuration

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

A configuração do asdf abrange tanto os arquivos .tool-versions compartilháveis quanto as personalizações específicas do usuário com .asdfrc e variáveis de ambiente.

.tool-versions

Sempre que o arquivo .tool-versions estiver presente em um diretório, as versões da ferramenta que ele declara serão usadas nesse diretório e em seus subdiretórios.

Configurações globais podem ser modificadas no arquivo $HOME/.tool-versions

O arquivo .tool-versions se parece assim:

ruby 2.5.3\nnodejs 10.15.0

As versões podem estar no seguinte formato:

  • 10.15.0 - uma versão real. Os plugins que suportam o download de binários farão o download de binários.
  • ref:v1.0.2-a ou ref:39cb398vb39 - tag/commit/branch para download pelo github e compilação um path costumizado e compi
  • path:~/src/elixir - um path para uma versão compilada e personalizada de uma ferramenta pronta para usar. Para uso por linguagens de desenvolvimento e outros.
  • system - faz com que asdf passe para a versão da ferramenta no sistema que não é gerenciada por asdf .

Várias versões podem ser definidas, separando-as com um espaço. Por exemplo, para usar Python 3.7.2, e também Python 2.7.15, use a linha abaixo em seu arquivo .tool-versions.

python 3.7.2 2.7.15 system

Para instalar todas as ferramentas definidas em .tool-versions, execute o camando asdf install sem argumentos no mesmo diretório de .tool-versions.

Para isntalar somente uma ferramenta definida em .tool-versions, execute o camando asdf install sem argumentos no mesmo diretório de .tool-versions. A ferramenta será instalada na versão especificada no arquivo .tool-versions.

Edite o arquivo diretamente no diretório ou use asdf local (ou asdf global) para atualiza-lo.

$HOME/.asdfrc

Adicione um arquivo .asdfrc ao seu diretório home e asdf usará as configurações especificadas no arquivo. O arquivo deve ser formatado assim:

legacy_version_file = yes

Configurações

  • legacy_version_file - por padrão é no. Se definido como yes, fará com que os plug-ins que suportam esse recurso leiam os arquivos de versão usados por outros gerenciadores de versão (por exemplo, .ruby-version no caso do rbenv do Ruby).

  • use_release_candidates - por padrão é no. Se definido como yes, fará com que o comando asdf update atualize para o mais recente em vez da versão semântica mais recente.

  • always_keep_download - por padrão é no. Se definido como yes, fará com que o asdf install sempre mantenha o código-fonte ou binário baixado. Se definido como no, o código fonte ou binário baixado por asdf install será excluído após a instalação bem sucedida.

  • plugin_repository_last_check_duration - por padrão é 60 min (1 hrs). Ele define a duração da última verificação do repositório de plugins asdf. Quando o comando asdf plugin add <nome>, asdf plugin list all for executado, ele verificará a duração da última atualização para atualizar o repositório. Se definido como 0, ele atualizará o repositório de plugins asdf todas as vezes.

Variáveis de ambiente

  • ASDF_CONFIG_FILE - O padrão é ~ /.asdfrc conforme descrito acima. Pode ser definido para qualquer local.
  • ASDF_DEFAULT_TOOL_VERSIONS_FILENAME - O nome do arquivo que armazena os nomes e versões das ferramentas. O padrão é .tool-versions. Pode ser qualquer nome de arquivo válido. Normalmente você não deve substituir o valor padrão, a menos que deseja que o asdf ignore os arquivos .tool-versions.
  • ASDF_DIR - O padrão é ~/.asdf - Localização dos arquivos asdf. Se você instalar asdf em algum outro diretório, defina-o para esse diretório. Por exemplo, se você estiver instalando através do AUR, você deve definir isso para /opt/asdf-vm.
  • ASDF_DATA_DIR - O padrão é ~/.asdf - Local onde asdf instala plugins, correções e instalações. Pode ser definido para qualquer local antes de fornecer asdf.sh ou asdf.fish mencionado na seção acima. Para Elvish, isso pode ser definido acima de use asdf.
',22)]))}const f=o(i,[["render",r]]);export{m as __pageData,f as default}; diff --git a/assets/pt-br_manage_core.md.CTnvZ9A5.js b/assets/pt-br_manage_core.md.CTnvZ9A5.js new file mode 100644 index 00000000..e5e0f510 --- /dev/null +++ b/assets/pt-br_manage_core.md.CTnvZ9A5.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"Core","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/manage/core.md","filePath":"pt-br/manage/core.md","lastUpdated":1687069487000}'),l={name:"pt-br/manage/core.md"};function h(n,s,p,d,k,o){return t(),a("div",null,s[0]||(s[0]=[e(`

Core

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

A lista de comandos do núcleo asdf é bastante pequena, mas pode facilitar muitos fluxos de trabalho.

Instalação e configuração

Baseado no Guia de Introdução.

Execute

shell
asdf exec <command> [args...]

Executa o comando shim para a versão atual

Variável de Ambiente

shell
asdf env <command> [util]

Informações

shell
asdf info

Um comando auxiliar para imprimir as informações de depuração do SO, Shell e asdf. Compartilhe isso ao fazer um relatório de bug.

Reshim

shell
asdf reshim <name> <version>

Isso recria os shims para a versão atual de um pacote. Por padrão, os calços são criados por plugins durante a instalação de uma ferramenta. Algumas ferramentas como a npm CLI permitem a instalação global de executáveis, por exemplo, instalando Yarn via npm install -g fio. Como este executável não foi instalado por meio do ciclo de vida do plug-in, ainda não existe shim para ele. asdf reshim nodejs <version> forçará o recálculo de shims para quaisquer novos executáveis, como yarn, para <version> de nodejs.

Versionamento do Shim

shell
asdf shim-versions <command>

Lista os plugins e versões que fornecem shims para um comando.

Como exemplo, o Node.js vem com dois executáveis, node e npm. Quando muitas versões das ferramentas são instaladas com asdf-nodejs shim-versions pode retornar:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

Atualizar

asdf tem um comando embutido para atualização que depende do Git (nosso método de instalação recomendado). Se você instalou usando um método diferente, siga as etapas para esse método:

MethodLatest Stable ReleaseLatest commit on master
asdf (via Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
PacmanObter manualmente um novo PKGBUILD e
reconstruir ou usar suas preferências de AUR.

Desinstalar

Para desinstalar asdf siga os passos:

Bash & Git
  1. Em seu ~/.bashrc remova as linhas do asdf.sh e seus complementos:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. Em seu ~/.bash_profile remova as linhas do asdf.sh e remova seus complementos:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. Em seu ~/.bashrc remova as linhas do asdf.sh e remova seus complementos:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

?> Os complementos precisam instruções de configuração do Homebrew e siga o guia de remoção.

  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

Caso esteja usando macOs Catalina ou mais recente, por padrão o shell é ZSH. Se não achar alguma configuração em seu ~/.bash_profile talvez esteja em ~/.zshrc em cada caso siga as intruções do ZSH.

  1. Em seu ~/.bash_profile remova as linhas do asdf.sh e remova seus complementos:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

?> Os complementos precisam instruções de configuração do Homebrew e siga o guia de remoção.

  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. Em seu ~/.bashrc remova as linhas do asdf.sh e seus complementos:
shell
. /opt/asdf-vm/asdf.sh
  1. Desinstale usando seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. Em seu ~/.config/fish/config.fish remova as linhas do asdf.sh:
shell
source ~/.asdf/asdf.fish

e remova os complementos de com esse comando:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. Em seu ~/.config/fish/config.fish remova as linhas do asdf.fish:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. Em seu ~/.config/fish/config.fish remova as linhas do asdf.fish:
shell
source /opt/asdf-vm/asdf.fish
  1. Desinstale usando seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. Em seu ~/.config/elvish/rc.elv remova as linhas que importa o módulo asdf:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

e desinstale o módulo asdf com este comando:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Remova o diretório $HOME/.asdf:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Execute este comando para remover todos os arquivos de configuração asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. Em seu ~/.config/elvish/rc.elv remova as linhas que importa o módulo asdf:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

e desinstale o módulo asdf com este comando:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Desinstale com seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute este comando para remover todos os arquivos de configuração asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. Em seu ~/.config/elvish/rc.elv remova as linhas que importa o módulo asdf:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

e desinstale o módulo asdf com este comando:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Desinstale com seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $ HOME/.asdf:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Execute este comando para remover todos os arquivos de configuração asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. Em seu ~/.zshrc remova as linhas do asdf.sh e seus complementos:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

Ou use ZSH Framework plugin.

  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. Em seu ~/.zshrc remova as linhas do asdf.sh:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. Em seu ~/.zshrc remova as linhas do asdf.sh:
shell
. /opt/asdf-vm/asdf.sh
  1. Desinstale usando seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"

Tudo pronto! 🎉

`,42)]))}const g=i(l,[["render",h]]);export{c as __pageData,g as default}; diff --git a/assets/pt-br_manage_core.md.CTnvZ9A5.lean.js b/assets/pt-br_manage_core.md.CTnvZ9A5.lean.js new file mode 100644 index 00000000..e5e0f510 --- /dev/null +++ b/assets/pt-br_manage_core.md.CTnvZ9A5.lean.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"Core","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/manage/core.md","filePath":"pt-br/manage/core.md","lastUpdated":1687069487000}'),l={name:"pt-br/manage/core.md"};function h(n,s,p,d,k,o){return t(),a("div",null,s[0]||(s[0]=[e(`

Core

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

A lista de comandos do núcleo asdf é bastante pequena, mas pode facilitar muitos fluxos de trabalho.

Instalação e configuração

Baseado no Guia de Introdução.

Execute

shell
asdf exec <command> [args...]

Executa o comando shim para a versão atual

Variável de Ambiente

shell
asdf env <command> [util]

Informações

shell
asdf info

Um comando auxiliar para imprimir as informações de depuração do SO, Shell e asdf. Compartilhe isso ao fazer um relatório de bug.

Reshim

shell
asdf reshim <name> <version>

Isso recria os shims para a versão atual de um pacote. Por padrão, os calços são criados por plugins durante a instalação de uma ferramenta. Algumas ferramentas como a npm CLI permitem a instalação global de executáveis, por exemplo, instalando Yarn via npm install -g fio. Como este executável não foi instalado por meio do ciclo de vida do plug-in, ainda não existe shim para ele. asdf reshim nodejs <version> forçará o recálculo de shims para quaisquer novos executáveis, como yarn, para <version> de nodejs.

Versionamento do Shim

shell
asdf shim-versions <command>

Lista os plugins e versões que fornecem shims para um comando.

Como exemplo, o Node.js vem com dois executáveis, node e npm. Quando muitas versões das ferramentas são instaladas com asdf-nodejs shim-versions pode retornar:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

Atualizar

asdf tem um comando embutido para atualização que depende do Git (nosso método de instalação recomendado). Se você instalou usando um método diferente, siga as etapas para esse método:

MethodLatest Stable ReleaseLatest commit on master
asdf (via Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
PacmanObter manualmente um novo PKGBUILD e
reconstruir ou usar suas preferências de AUR.

Desinstalar

Para desinstalar asdf siga os passos:

Bash & Git
  1. Em seu ~/.bashrc remova as linhas do asdf.sh e seus complementos:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. Em seu ~/.bash_profile remova as linhas do asdf.sh e remova seus complementos:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. Em seu ~/.bashrc remova as linhas do asdf.sh e remova seus complementos:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

?> Os complementos precisam instruções de configuração do Homebrew e siga o guia de remoção.

  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

Caso esteja usando macOs Catalina ou mais recente, por padrão o shell é ZSH. Se não achar alguma configuração em seu ~/.bash_profile talvez esteja em ~/.zshrc em cada caso siga as intruções do ZSH.

  1. Em seu ~/.bash_profile remova as linhas do asdf.sh e remova seus complementos:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

?> Os complementos precisam instruções de configuração do Homebrew e siga o guia de remoção.

  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. Em seu ~/.bashrc remova as linhas do asdf.sh e seus complementos:
shell
. /opt/asdf-vm/asdf.sh
  1. Desinstale usando seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. Em seu ~/.config/fish/config.fish remova as linhas do asdf.sh:
shell
source ~/.asdf/asdf.fish

e remova os complementos de com esse comando:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. Em seu ~/.config/fish/config.fish remova as linhas do asdf.fish:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. Em seu ~/.config/fish/config.fish remova as linhas do asdf.fish:
shell
source /opt/asdf-vm/asdf.fish
  1. Desinstale usando seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. Em seu ~/.config/elvish/rc.elv remova as linhas que importa o módulo asdf:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

e desinstale o módulo asdf com este comando:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Remova o diretório $HOME/.asdf:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Execute este comando para remover todos os arquivos de configuração asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. Em seu ~/.config/elvish/rc.elv remova as linhas que importa o módulo asdf:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

e desinstale o módulo asdf com este comando:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Desinstale com seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute este comando para remover todos os arquivos de configuração asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. Em seu ~/.config/elvish/rc.elv remova as linhas que importa o módulo asdf:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

e desinstale o módulo asdf com este comando:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Desinstale com seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $ HOME/.asdf:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Execute este comando para remover todos os arquivos de configuração asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. Em seu ~/.zshrc remova as linhas do asdf.sh e seus complementos:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

Ou use ZSH Framework plugin.

  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. Em seu ~/.zshrc remova as linhas do asdf.sh:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. Em seu ~/.zshrc remova as linhas do asdf.sh:
shell
. /opt/asdf-vm/asdf.sh
  1. Desinstale usando seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"

Tudo pronto! 🎉

`,42)]))}const g=i(l,[["render",h]]);export{c as __pageData,g as default}; diff --git a/assets/pt-br_manage_plugins.md.CuNF9gHf.js b/assets/pt-br_manage_plugins.md.CuNF9gHf.js new file mode 100644 index 00000000..4f3656fd --- /dev/null +++ b/assets/pt-br_manage_plugins.md.CuNF9gHf.js @@ -0,0 +1,11 @@ +import{_ as a,c as i,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"Plugins","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/manage/plugins.md","filePath":"pt-br/manage/plugins.md","lastUpdated":1687069487000}'),n={name:"pt-br/manage/plugins.md"};function l(p,s,o,d,h,r){return t(),i("div",null,s[0]||(s[0]=[e(`

Plugins

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

Plugins são como asdf sabe lidar com diferentes ferramentas, tais quais Node.js, Ruby, Elixir etc.

Veja Criando Plugins para a API do plugin usada para suportar mais ferramentas.

Adicionar

Adicione os plugins via sua Url Git:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

ou pelo nome abreviado dentro do repositório de plugins:

shell
asdf plugin add <name>
+# asdf plugin add erlang

Recommendation

Prefira o método mais longo git-url, pois ele é independente do repositório de nome abreviado.

Listar Instalados

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

Listar todos nomes abreviados no repositório

shell
asdf plugin list all

Veja Plugins Shortname Index para toda a lista de nomes curtos de plugins.

Atualizar

shell
asdf plugin update --all

Se você quiser atualizar um pacote específico, apenas use.

shell
asdf plugin update <name>
+# asdf plugin update erlang

Esta atualização irá buscar o último commit na branch padrão no origin de seu respositório. Plugins e atualizações das versões estão sendo desenvolvidas (#916)

Remover

bash
asdf plugin remove <name>
+# asdf plugin remove erlang

Removendo o plugin irá remover todas as instalações feitas com o plugin. Isso pode ser usado como um atalho para apagar/remover sujeiras de versões não utilizadas de uma ferramenta.

Sincronizar nome abreviado no repositório

O nome abreviado do repositório é sincronizado em seu máquina local e periodicamente atualizado. Esse período pode ser determinado com o seguinte método:

  • comandos asdf plugin add <name> ou asdf plugin list all disparam a sincronização
  • ocorre uma sincronização se não houver nenhuma nos últimos X minutos
  • X por padrão é 60, mas pode ser mudado em .asdfrc via as opções do plugin_repository_last_check_duration. Seja mais em asdf documentação de configuração.
`,27)]))}const g=a(n,[["render",l]]);export{c as __pageData,g as default}; diff --git a/assets/pt-br_manage_plugins.md.CuNF9gHf.lean.js b/assets/pt-br_manage_plugins.md.CuNF9gHf.lean.js new file mode 100644 index 00000000..4f3656fd --- /dev/null +++ b/assets/pt-br_manage_plugins.md.CuNF9gHf.lean.js @@ -0,0 +1,11 @@ +import{_ as a,c as i,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"Plugins","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/manage/plugins.md","filePath":"pt-br/manage/plugins.md","lastUpdated":1687069487000}'),n={name:"pt-br/manage/plugins.md"};function l(p,s,o,d,h,r){return t(),i("div",null,s[0]||(s[0]=[e(`

Plugins

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

Plugins são como asdf sabe lidar com diferentes ferramentas, tais quais Node.js, Ruby, Elixir etc.

Veja Criando Plugins para a API do plugin usada para suportar mais ferramentas.

Adicionar

Adicione os plugins via sua Url Git:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

ou pelo nome abreviado dentro do repositório de plugins:

shell
asdf plugin add <name>
+# asdf plugin add erlang

Recommendation

Prefira o método mais longo git-url, pois ele é independente do repositório de nome abreviado.

Listar Instalados

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

Listar todos nomes abreviados no repositório

shell
asdf plugin list all

Veja Plugins Shortname Index para toda a lista de nomes curtos de plugins.

Atualizar

shell
asdf plugin update --all

Se você quiser atualizar um pacote específico, apenas use.

shell
asdf plugin update <name>
+# asdf plugin update erlang

Esta atualização irá buscar o último commit na branch padrão no origin de seu respositório. Plugins e atualizações das versões estão sendo desenvolvidas (#916)

Remover

bash
asdf plugin remove <name>
+# asdf plugin remove erlang

Removendo o plugin irá remover todas as instalações feitas com o plugin. Isso pode ser usado como um atalho para apagar/remover sujeiras de versões não utilizadas de uma ferramenta.

Sincronizar nome abreviado no repositório

O nome abreviado do repositório é sincronizado em seu máquina local e periodicamente atualizado. Esse período pode ser determinado com o seguinte método:

  • comandos asdf plugin add <name> ou asdf plugin list all disparam a sincronização
  • ocorre uma sincronização se não houver nenhuma nos últimos X minutos
  • X por padrão é 60, mas pode ser mudado em .asdfrc via as opções do plugin_repository_last_check_duration. Seja mais em asdf documentação de configuração.
`,27)]))}const g=a(n,[["render",l]]);export{c as __pageData,g as default}; diff --git a/assets/pt-br_manage_versions.md.Ctc109hL.js b/assets/pt-br_manage_versions.md.Ctc109hL.js new file mode 100644 index 00000000..9739bf15 --- /dev/null +++ b/assets/pt-br_manage_versions.md.Ctc109hL.js @@ -0,0 +1,30 @@ +import{_ as a,c as i,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"Versões","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/manage/versions.md","filePath":"pt-br/manage/versions.md","lastUpdated":1687069487000}'),l={name:"pt-br/manage/versions.md"};function n(h,s,p,k,d,o){return t(),i("div",null,s[0]||(s[0]=[e(`

Versões

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

Instalar Versão

shell
asdf install <name> <version>
+# asdf install erlang 17.3

Se um plugin suporta o download e compilação do código-fonte, você pode especificar ref:foo no qual foo é uma 'branch' especifica, 'tag', ou 'commit'. Você também precisará usar o mesmo nome e referência ao desinstalar.

Instalar última versão estável

shell
asdf install <name> latest
+# asdf install erlang latest

Instale a última versão estável que inicia com um texto.

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

Listar versões instaladas

shell
asdf list <name>
+# asdf list erlang

Limite as versões que inicie com um determinado texto.

shell
asdf list <name> <version>
+# asdf list erlang 17

Listar todas as versões disponíveis

shell
asdf list all <name>
+# asdf list all erlang

Limite as versões que inicie com um determinado texto.

shell
asdf list all <name> <version>
+# asdf list all erlang 17

Mostrar última versão estável

shell
asdf latest <name>
+# asdf latest erlang

Mostrar última versão estável que inicie com um determinado texto.

shell
asdf latest <name> <version>
+# asdf latest erlang 17

Selecionar versão atual

shell
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest

global escreve a versão para $HOME/.tool-versions.

shell selecione a versão na variável de ambiente ASDF_\${LANG}_VERSION, para a atual seção do shell.

local escreve a versão para $PWD/.tool-versions, crie se necessário .

Veja em .tool-versions arquivo de seleção de configuração para mais detalhes.

Alternativa

Se você quiser selecionar a versão atual do seu shell ou para executar um comando em uma versão específica de sua ferramenta, você pode selecionar a versão na variável de ambiente ASDF_\${TOOL}_VERSION.

O seguinte exemplo executa os testes em um projeto Elixir na versão 1.4.0. O formato da versão é o mesmo suportado pelo arquivo .tool-versions.

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

Resposta do sistema de versão

Para usar o sistema de versão da ferramenta <name> inicie um gerenciador de versões do asdf para selecionar a versão na ferramenta do system.

Selecione o sistema com global, local ou shell Set system with either global, local or shell conforme descrito em Selecionar versão atual.

shell
asdf local <name> system
+# asdf local python system

Verificar a versão atual

shell
asdf current
+# asdf current
+# erlang 17.3 (set by /Users/kim/.tool-versions)
+# nodejs 6.11.5 (set by /Users/kim/cool-node-project/.tool-versions)
+
+asdf current <name>
+# asdf current erlang
+# 17.3 (set by /Users/kim/.tool-versions)

Desinstalar versão

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

Shims

Quando asdf instala um pacote é criado shims para cada programa executado no pacote do diretório $ASDF_DATA_DIR/shims (padrão ~/.asdf/shims). Esse diretório começa no $PATH (pelos asdf.sh, asdf.fish, etc) é como o programa instalado é disponibilizado no ambiente do sistema.

Os shims em si são atalhos simples que executam um programa auxiliar asdf exec passando o nome do plugin e o caminho para o executável no pacote instalado que o shim está contido.

O asdf exec ajuda a determinar a versão do pacote usado (como especificado no arquivo .tool-versions, pelo asdf local ... ou asdf global ...), o final do path do executavél no pacote instalado no diretório (pode ser manipulado pelo exec-path no callback do plugin) e o ambiente executado em (também fornecido pelo plugin - exec-env) e finalmente executado.

Observação

Observe que, como este sistema usa chamadas exec, qualquer scripts no pacote devem ser fornecidos pelo shell, a instancia em execução precisa ser aessado diretamente ao invés do shim. Os dois comandos do asdf: which e where pode ajudar com o retorno do caminho para o pacote instalado:

shell
# retorna o 'path' da versão atual em execução
+source $(asdf which \${PLUGIN})/../script.sh
+
+# retorna o 'path' do pacote instalado no diretório
+source $(asdf where \${PLUGIN} $(asdf current \${PLUGIN}))/bin/script.sh

Ignorando shims do asdf

Se por algum motivo você deseja ignorar shims do asdf ou deseja que suas variáveis de ambiente sejam definidas automaticamente ao entrar no diretório do seu projeto, pode ser útil o asdf-direnv. Verifique o README para mais detalhes.

`,46)]))}const g=a(l,[["render",n]]);export{c as __pageData,g as default}; diff --git a/assets/pt-br_manage_versions.md.Ctc109hL.lean.js b/assets/pt-br_manage_versions.md.Ctc109hL.lean.js new file mode 100644 index 00000000..9739bf15 --- /dev/null +++ b/assets/pt-br_manage_versions.md.Ctc109hL.lean.js @@ -0,0 +1,30 @@ +import{_ as a,c as i,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"Versões","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/manage/versions.md","filePath":"pt-br/manage/versions.md","lastUpdated":1687069487000}'),l={name:"pt-br/manage/versions.md"};function n(h,s,p,k,d,o){return t(),i("div",null,s[0]||(s[0]=[e(`

Versões

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

Instalar Versão

shell
asdf install <name> <version>
+# asdf install erlang 17.3

Se um plugin suporta o download e compilação do código-fonte, você pode especificar ref:foo no qual foo é uma 'branch' especifica, 'tag', ou 'commit'. Você também precisará usar o mesmo nome e referência ao desinstalar.

Instalar última versão estável

shell
asdf install <name> latest
+# asdf install erlang latest

Instale a última versão estável que inicia com um texto.

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

Listar versões instaladas

shell
asdf list <name>
+# asdf list erlang

Limite as versões que inicie com um determinado texto.

shell
asdf list <name> <version>
+# asdf list erlang 17

Listar todas as versões disponíveis

shell
asdf list all <name>
+# asdf list all erlang

Limite as versões que inicie com um determinado texto.

shell
asdf list all <name> <version>
+# asdf list all erlang 17

Mostrar última versão estável

shell
asdf latest <name>
+# asdf latest erlang

Mostrar última versão estável que inicie com um determinado texto.

shell
asdf latest <name> <version>
+# asdf latest erlang 17

Selecionar versão atual

shell
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest

global escreve a versão para $HOME/.tool-versions.

shell selecione a versão na variável de ambiente ASDF_\${LANG}_VERSION, para a atual seção do shell.

local escreve a versão para $PWD/.tool-versions, crie se necessário .

Veja em .tool-versions arquivo de seleção de configuração para mais detalhes.

Alternativa

Se você quiser selecionar a versão atual do seu shell ou para executar um comando em uma versão específica de sua ferramenta, você pode selecionar a versão na variável de ambiente ASDF_\${TOOL}_VERSION.

O seguinte exemplo executa os testes em um projeto Elixir na versão 1.4.0. O formato da versão é o mesmo suportado pelo arquivo .tool-versions.

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

Resposta do sistema de versão

Para usar o sistema de versão da ferramenta <name> inicie um gerenciador de versões do asdf para selecionar a versão na ferramenta do system.

Selecione o sistema com global, local ou shell Set system with either global, local or shell conforme descrito em Selecionar versão atual.

shell
asdf local <name> system
+# asdf local python system

Verificar a versão atual

shell
asdf current
+# asdf current
+# erlang 17.3 (set by /Users/kim/.tool-versions)
+# nodejs 6.11.5 (set by /Users/kim/cool-node-project/.tool-versions)
+
+asdf current <name>
+# asdf current erlang
+# 17.3 (set by /Users/kim/.tool-versions)

Desinstalar versão

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

Shims

Quando asdf instala um pacote é criado shims para cada programa executado no pacote do diretório $ASDF_DATA_DIR/shims (padrão ~/.asdf/shims). Esse diretório começa no $PATH (pelos asdf.sh, asdf.fish, etc) é como o programa instalado é disponibilizado no ambiente do sistema.

Os shims em si são atalhos simples que executam um programa auxiliar asdf exec passando o nome do plugin e o caminho para o executável no pacote instalado que o shim está contido.

O asdf exec ajuda a determinar a versão do pacote usado (como especificado no arquivo .tool-versions, pelo asdf local ... ou asdf global ...), o final do path do executavél no pacote instalado no diretório (pode ser manipulado pelo exec-path no callback do plugin) e o ambiente executado em (também fornecido pelo plugin - exec-env) e finalmente executado.

Observação

Observe que, como este sistema usa chamadas exec, qualquer scripts no pacote devem ser fornecidos pelo shell, a instancia em execução precisa ser aessado diretamente ao invés do shim. Os dois comandos do asdf: which e where pode ajudar com o retorno do caminho para o pacote instalado:

shell
# retorna o 'path' da versão atual em execução
+source $(asdf which \${PLUGIN})/../script.sh
+
+# retorna o 'path' do pacote instalado no diretório
+source $(asdf where \${PLUGIN} $(asdf current \${PLUGIN}))/bin/script.sh

Ignorando shims do asdf

Se por algum motivo você deseja ignorar shims do asdf ou deseja que suas variáveis de ambiente sejam definidas automaticamente ao entrar no diretório do seu projeto, pode ser útil o asdf-direnv. Verifique o README para mais detalhes.

`,46)]))}const g=a(l,[["render",n]]);export{c as __pageData,g as default}; diff --git a/assets/pt-br_more_community-projects.md.C3m600b2.js b/assets/pt-br_more_community-projects.md.C3m600b2.js new file mode 100644 index 00000000..16aff5bf --- /dev/null +++ b/assets/pt-br_more_community-projects.md.C3m600b2.js @@ -0,0 +1 @@ +import{_ as t,c as o,a2 as r,o as a}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"Community Projects","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/more/community-projects.md","filePath":"pt-br/more/community-projects.md","lastUpdated":1687069487000}'),s={name:"pt-br/more/community-projects.md"};function c(n,e,i,m,d,l){return a(),o("div",null,e[0]||(e[0]=[r('

Community Projects

Here are some community projects related to asdf:

Note

asdf core do not own these projects or their code. asdf core are not responsible for the quality or security as they relate to those listed here.

',4)]))}const f=t(s,[["render",c]]);export{u as __pageData,f as default}; diff --git a/assets/pt-br_more_community-projects.md.C3m600b2.lean.js b/assets/pt-br_more_community-projects.md.C3m600b2.lean.js new file mode 100644 index 00000000..16aff5bf --- /dev/null +++ b/assets/pt-br_more_community-projects.md.C3m600b2.lean.js @@ -0,0 +1 @@ +import{_ as t,c as o,a2 as r,o as a}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"Community Projects","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/more/community-projects.md","filePath":"pt-br/more/community-projects.md","lastUpdated":1687069487000}'),s={name:"pt-br/more/community-projects.md"};function c(n,e,i,m,d,l){return a(),o("div",null,e[0]||(e[0]=[r('

Community Projects

Here are some community projects related to asdf:

Note

asdf core do not own these projects or their code. asdf core are not responsible for the quality or security as they relate to those listed here.

',4)]))}const f=t(s,[["render",c]]);export{u as __pageData,f as default}; diff --git a/assets/pt-br_more_faq.md.Bch3gpm2.js b/assets/pt-br_more_faq.md.Bch3gpm2.js new file mode 100644 index 00000000..10ea5206 --- /dev/null +++ b/assets/pt-br_more_faq.md.Bch3gpm2.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as s}from"./chunks/framework.C9NVOr0y.js";const p=JSON.parse('{"title":"Perguntas frequentes","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/more/faq.md","filePath":"pt-br/more/faq.md","lastUpdated":1671778129000}'),t={name:"pt-br/more/faq.md"};function n(i,e,d,c,u,l){return s(),o("div",null,e[0]||(e[0]=[r('

Perguntas frequentes

Aqui estão algumas perguntas comuns sobre asdf.

Suporte WSL1?

WSL1 (Windows Subsystem for Linux 1) não é oficialmente suportado. Alguns aspectos do asdf podem não funcionar corretamente. Não temos a intenção de adicionar suporte oficial para WSL1.

Suporte WSL2?

WSL2 (Subsistema Windows para Linux 2) deve funcionar usando as instruções de configuração e dependência para a distribuição WSL escolhida.

É importante ressaltar que o WSL2 apenas deve funcionar corretamente quando o diretório de trabalho atual é uma unidade Unix e não uma unidade Windows vinculada.

Pretendemos executar o conjunto de testes no WSL2 quando o suporte ao host runner estiver disponível nas Ações do GitHub; atualmente, esse não parece ser o caso.

Exectable recém-instalado não está funcionando?

Acabei de instalar o npm -g yarn, mas não consigo executar o yarn. O que da?

asdf usa shims para gerenciar executáveis. Aqueles instalados por plug-ins têm shims criados automaticamente, enquanto a instalação de executáveis ​​por meio de uma ferramenta gerenciada asdf exigirá que você notifique oasdf sobre a necessidade de criar shims. Neste caso, para criar um shim para Yarn. Veja a documentação do comando [asdf reshim](/ manage / core.md # reshim).

Shell não detecta shims recém-instalados?

Se asdf reshim não está resolvendo seu problema, então é mais provável devido ao sourcing deasdf.sh ou asdf.fish não estar no ** BOTTOM ** de seu arquivo de configuração Shell (.bash_profile, .zshrc, config.fish, etc). Ele precisa ser fornecido DEPOIS de você definir seu $PATH e DEPOIS de ter fornecido seu framework (oh-meu-zsh etc), se houver.

',13)]))}const f=a(t,[["render",n]]);export{p as __pageData,f as default}; diff --git a/assets/pt-br_more_faq.md.Bch3gpm2.lean.js b/assets/pt-br_more_faq.md.Bch3gpm2.lean.js new file mode 100644 index 00000000..10ea5206 --- /dev/null +++ b/assets/pt-br_more_faq.md.Bch3gpm2.lean.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as s}from"./chunks/framework.C9NVOr0y.js";const p=JSON.parse('{"title":"Perguntas frequentes","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/more/faq.md","filePath":"pt-br/more/faq.md","lastUpdated":1671778129000}'),t={name:"pt-br/more/faq.md"};function n(i,e,d,c,u,l){return s(),o("div",null,e[0]||(e[0]=[r('

Perguntas frequentes

Aqui estão algumas perguntas comuns sobre asdf.

Suporte WSL1?

WSL1 (Windows Subsystem for Linux 1) não é oficialmente suportado. Alguns aspectos do asdf podem não funcionar corretamente. Não temos a intenção de adicionar suporte oficial para WSL1.

Suporte WSL2?

WSL2 (Subsistema Windows para Linux 2) deve funcionar usando as instruções de configuração e dependência para a distribuição WSL escolhida.

É importante ressaltar que o WSL2 apenas deve funcionar corretamente quando o diretório de trabalho atual é uma unidade Unix e não uma unidade Windows vinculada.

Pretendemos executar o conjunto de testes no WSL2 quando o suporte ao host runner estiver disponível nas Ações do GitHub; atualmente, esse não parece ser o caso.

Exectable recém-instalado não está funcionando?

Acabei de instalar o npm -g yarn, mas não consigo executar o yarn. O que da?

asdf usa shims para gerenciar executáveis. Aqueles instalados por plug-ins têm shims criados automaticamente, enquanto a instalação de executáveis ​​por meio de uma ferramenta gerenciada asdf exigirá que você notifique oasdf sobre a necessidade de criar shims. Neste caso, para criar um shim para Yarn. Veja a documentação do comando [asdf reshim](/ manage / core.md # reshim).

Shell não detecta shims recém-instalados?

Se asdf reshim não está resolvendo seu problema, então é mais provável devido ao sourcing deasdf.sh ou asdf.fish não estar no ** BOTTOM ** de seu arquivo de configuração Shell (.bash_profile, .zshrc, config.fish, etc). Ele precisa ser fornecido DEPOIS de você definir seu $PATH e DEPOIS de ter fornecido seu framework (oh-meu-zsh etc), se houver.

',13)]))}const f=a(t,[["render",n]]);export{p as __pageData,f as default}; diff --git a/assets/pt-br_more_thanks.md.BziNXVH9.js b/assets/pt-br_more_thanks.md.BziNXVH9.js new file mode 100644 index 00000000..787afdd7 --- /dev/null +++ b/assets/pt-br_more_thanks.md.BziNXVH9.js @@ -0,0 +1 @@ +import{_ as r,c as t,a2 as a,o}from"./chunks/framework.C9NVOr0y.js";const b=JSON.parse('{"title":"Créditos","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/more/thanks.md","filePath":"pt-br/more/thanks.md","lastUpdated":1671778129000}'),s={name:"pt-br/more/thanks.md"};function i(n,e,h,l,d,u){return o(),t("div",null,e[0]||(e[0]=[a('

Créditos

Eu (@HashNuke), febre alta, resfriado e tosse.

Copyright 2014 até o final dos tempos (MIT License)

Mantenedores

Contribuidores

Veja em lista de contribuidores 🙏 no GitHub

',7)]))}const f=r(s,[["render",i]]);export{b as __pageData,f as default}; diff --git a/assets/pt-br_more_thanks.md.BziNXVH9.lean.js b/assets/pt-br_more_thanks.md.BziNXVH9.lean.js new file mode 100644 index 00000000..787afdd7 --- /dev/null +++ b/assets/pt-br_more_thanks.md.BziNXVH9.lean.js @@ -0,0 +1 @@ +import{_ as r,c as t,a2 as a,o}from"./chunks/framework.C9NVOr0y.js";const b=JSON.parse('{"title":"Créditos","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/more/thanks.md","filePath":"pt-br/more/thanks.md","lastUpdated":1671778129000}'),s={name:"pt-br/more/thanks.md"};function i(n,e,h,l,d,u){return o(),t("div",null,e[0]||(e[0]=[a('

Créditos

Eu (@HashNuke), febre alta, resfriado e tosse.

Copyright 2014 até o final dos tempos (MIT License)

Mantenedores

Contribuidores

Veja em lista de contribuidores 🙏 no GitHub

',7)]))}const f=r(s,[["render",i]]);export{b as __pageData,f as default}; diff --git a/assets/pt-br_plugins_create.md.CnPY6mOB.js b/assets/pt-br_plugins_create.md.CnPY6mOB.js new file mode 100644 index 00000000..26743f82 --- /dev/null +++ b/assets/pt-br_plugins_create.md.CnPY6mOB.js @@ -0,0 +1,35 @@ +import{_ as s,c as e,a2 as i,o}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"Criar um plug-in","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/plugins/create.md","filePath":"pt-br/plugins/create.md","lastUpdated":1704804447000}'),n={name:"pt-br/plugins/create.md"};function t(l,a,p,d,r,h){return o(),e("div",null,a[0]||(a[0]=[i(`

Criar um plug-in

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

O que há em um plug-in

Um plugin é um repositório git, com alguns scripts executáveis, para dar suporte ao versionamento de outra linguagem ou ferramenta. Esses scripts são executados quando os comandos list-all, install ou uninstall são executados. Você pode definir ou desmarcar env vars e fazer qualquer coisa necessária para configurar o ambiente para a ferramenta.

Scripts obrigatórios

  • bin/list-all - lista todas as versões instaláveis
  • bin/download - baixe o código fonte ou binário para a versão especificada
  • bin/install - instala a versão especificada

Variavéis de Ambiente

Todos os scripts, exceto bin/list-all, terão acesso aos seguintes env vars para agir:

  • ASDF_INSTALL_TYPE - version ou ref
  • ASDF_INSTALL_VERSION - se ASDF_INSTALL_TYPE é version então este será o número da versão. Caso contrário, será o git ref que será passado. Pode apontar para uma tag/commit/branch no repositório.
  • ASDF_INSTALL_PATH - o diretório onde foi instalado (ou deve ser instalado no caso do script bin/install)

Essas variáveis de ambiente adicionais estarão disponíveis para o script bin/install:

  • ASDF_CONCURRENCY - o número de núcleos a serem usados ao compilar o código-fonte. Útil para definir make -j.
  • ASDF_DOWNLOAD_PATH - o caminho para onde o código fonte ou binário foi baixado pelo script bin/download.

Essas variáveis de ambiente adicionais estarão disponíveis para o script bin/download:

  • ASDF_DOWNLOAD_PATH - o caminho para onde o código-fonte ou binário deve ser baixado.

bin/list-all

Deve imprimir uma string com uma lista de versões separadas por espaço. A saída de exemplo seria a seguinte:

shell
1.0.1 1.0.2 1.3.0 1.4

Observe que a versão mais recente deve ser listada por último para que apareça mais próxima do prompt do usuário. Isso é útil já que o comando list-all imprime cada versão em sua própria linha. Se houver muitas versões, é possível que as primeiras versões fiquem fora da tela.

Se as versões estiverem sendo extraídas da página de lançamentos em um site, é recomendável não classificar as versões, se possível. Muitas vezes as versões já estão na ordem correta ou, na ordem inversa, nesse caso algo como tac deve ser suficiente. Se você precisar classificar as versões manualmente, não poderá confiar em sort -V, pois não é suportado no OSX. Uma função de classificação alternativa como esta é uma escolha melhor.

bin/download

Este script deve baixar o código fonte ou binário, no caminho contido na variável de ambiente ASDF_DOWNLOAD_PATH. Se o código-fonte ou binário baixado estiver compactado, apenas o código-fonte ou binário descompactado poderá ser colocado no diretório ASDF_DOWNLOAD_PATH.

O script deve sair com um status de 0 quando o download for bem-sucedido. Se o download falhar, o script deve sair com qualquer status de saída diferente de zero.

Se possível, o script deve apenas colocar arquivos no ASDF_DOWNLOAD_PATH. Se o download falhar, nenhum arquivo deve ser colocado no diretório.

Se este script não estiver presente, o asdf assumirá que o script bin/install está presente e fará o download e instalará a versão. asdf só funciona sem este script para suportar plugins legados. Todos os plugins devem incluir este script e, eventualmente, o suporte para plugins legados será removido.

bin/install

Este script deve instalar a versão, no caminho mencionado em ASDF_INSTALL_PATH. Por padrão, o asdf criará shims para qualquer arquivo em $ASDF_INSTALL_PATH/bin (isso pode ser personalizado com o script opcional bin/list-bin-paths).

O script de instalação deve sair com um status de 0 quando a instalação for bem-sucedida. Se a instalação falhar, o script deve sair com qualquer status de saída diferente de zero.

Se possível, o script deve apenas colocar os arquivos no diretório ASDF_INSTALL_PATH uma vez que a compilação e instalação da ferramenta são consideradas bem sucedidas pelo script de instalação. asdf verifica a existência do diretório ASDF_INSTALL_PATH para determinar se essa versão da ferramenta está instalado. Se o diretório ASDF_INSTALL_PATH for preenchido no início do processo de instalação, outros comandos asdf executados em outros terminais durante a instalação podem considerar essa versão da ferramenta instalada, mesmo quando não estiver totalmente instalada.

Se você quiser que seu plugin funcione com asdf versão 0.7._ e anterior e versão 0.8._ e mais recente, verifique a presença da variável de ambiente ASDF_DOWNLOAD_PATH. Se não estiver definido, baixe o código-fonte no retorno de chamada bin/install. Se estiver definido, suponha que o script bin/download já tenha baixado.

Scripts Opcional

scripts bin/help

Este não é um script de retorno de chamada, mas sim um conjunto de scripts de retorno de chamada que imprimem documentação diferente para STDOUT. Os scripts de retorno de chamada possíveis estão listados abaixo. Observe que bin/help.overview é um caso especial, pois deve estar presente para que qualquer saída de ajuda seja exibida para o script.

  • bin/help.overview - Este script deve gerar uma descrição geral sobre o plugin e a ferramenta que está sendo gerenciada. Nenhum título deve ser impresso, pois o asdf imprimirá títulos. A saída pode ser um texto de formato livre, mas idealmente apenas um parágrafo curto. Este script deve estar presente se você quiser que o asdf forneça informações de ajuda para seu plugin. Todos os outros scripts de retorno de chamada de ajuda são opcionais.
  • bin/help.deps - Esse script deve gerar a lista de dependências adaptadas ao sistema operacional. Uma dependência por linha.
  • bin/help.config - Este script deve imprimir qualquer configuração obrigatória ou opcional que possa estar disponível para o plug-in e a ferramenta. Quaisquer variáveis de ambiente ou outros sinalizadores necessários para instalar ou compilar a ferramenta (para o sistema operacional dos usuários quando possível). A saída pode ser texto de formato livre.
  • bin/help.links - Esta deve ser uma lista de links relevantes para o plug-in e a ferramenta (mais uma vez, adaptados ao sistema operacional atual, quando possível). Um link por linha. As linhas podem estar no formato <title>: <link> ou apenas <link>.

Cada um desses scripts deve adaptar sua saída ao sistema operacional atual. Por exemplo, quando no Ubuntu, o script deps pode gerar as dependências como pacotes apt-get que devem ser instalados. O script também deve adaptar sua saída ao valor de ASDF_INSTALL_VERSION e ASDF_INSTALL_TYPE quando as variáveis forem definidas. Eles são opcionais e nem sempre serão definidos.

O script de retorno de chamada de ajuda NÃO DEVE gerar nenhuma informação que já esteja coberta na documentação principal do asdf-vm. As informações gerais de uso do asdf não devem estar presentes.

bin/list-bin-paths

Liste os executáveis para a versão especificada da ferramenta. Deve imprimir uma string com uma lista separada por espaços de caminhos de diretórios que contêm executáveis. Os caminhos devem ser relativos ao caminho de instalação passado. A saída de exemplo seria:

shell
bin tools veggies

Isso instruirá o asdf a criar shims para os arquivos em <install-path>/bin, <install-path>/tools e <install-path>/veggies

Se este script não for especificado, o asdf procurará o diretório bin em uma instalação e criará shims para eles.

bin/exec-env

Configure o env para executar os binários no pacote.

bin/exec-path

Obtenha o caminho executável para a versão especificada da ferramenta. Deve imprimir uma string com o caminho executável relativo. Isso permite que o plug-in substitua condicionalmente o caminho executável especificado do shim, caso contrário, retorne o caminho padrão especificado pelo shim.

shell
Usage:
+  plugin/bin/exec-path <install-path> <command> <executable-path>
+
+Example Call:
+  ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"
+
+Output:
+  bin/foox

bin/uninstall

Desinstala uma versão específica de uma ferramenta.

bin/list-legacy-filenames

Registre arquivos setter adicionais para este plugin. Deve imprimir uma string com uma lista de nomes de arquivos separados por espaços.

shell
.ruby-version .rvmrc

Nota: Isso só se aplica a usuários que habilitaram a opção legacy_version_file em seu ~/.asdfrc.

bin/parse-legacy-file

Isso pode ser usado para analisar ainda mais o arquivo legado encontrado pelo asdf. Se o parse-legacy-file não for implementado, o asdf simplesmente irá cat o arquivo para determinar a versão. O script receberá o caminho do arquivo como seu primeiro argumento.

bin/post-plugin-add

Isso pode ser usado para executar qualquer ação pós-instalação depois que o plug-in for adicionado ao asdf.

O script tem acesso ao caminho em que o plugin foi instalado (\${ASDF_PLUGIN_PATH}) e o URL de origem (\${ASDF_PLUGIN_SOURCE_URL}), se algum foi usado.

Veja também os ganchos relacionados:

  • pre_asdf_plugin_add
  • pre_asdf_plugin_add_\${plugin_name}
  • post_asdf_plugin_add
  • post_asdf_plugin_add_\${plugin_name}

bin/pre-plugin-remove

Isso pode ser usado para executar qualquer ação de pré-remoção antes que o plug-in seja removido do asdf.

O script tem acesso ao caminho em que o plugin foi instalado (\${ASDF_PLUGIN_PATH}).

Veja também os ganchos relacionados:

  • pre_asdf_plugin_remove
  • pre_asdf_plugin_remove_\${plugin_name}
  • post_asdf_plugin_remove
  • post_asdf_plugin_remove_\${plugin_name}

Comandos de extensão para asdf CLI.

É possível que plugins definam novos comandos asdf fornecendo scripts ou executáveis lib/commands/command*.bash que será chamado usando a interface de linha de comando asdf usando o nome do plug-in como um subcomando.

Por exemplo, suponha que um plugin foo tenha:

shell
foo/
+  lib/commands/
+    command.bash
+    command-bat.bash
+    command-bat-man.bash
+    command-help.bash

Os usuários agora podem executar

shell
$ asdf foo         # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash\`
+$ asdf foo bar     # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar\`
+$ asdf foo help    # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash\`
+$ asdf foo bat man # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash\`
+$ asdf foo bat baz # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz\`

Os autores de plugins podem usar esse recurso para fornecer utilitários relacionados às suas ferramentas, ou até mesmo criar plugins que são apenas novas extensões de comando para o próprio asdf.

Quando invocados, se os comandos de extensão não tiverem seus bits executáveis definidos, eles serão originado como scripts bash, tendo todas as funções de $ASDF_DIR/lib/utils.bash disponíveis. Além disso, o $ASDF_CMD_FILE resolve para o caminho completo do arquivo que está sendo originado. Se o bit executável estiver definido, eles são apenas executados e substituem a execução do asdf.

Um bom exemplo desse recurso é para plugins como haxe que fornece o asdf haxe neko-dylibs-link para corrigir um problema onde os executáveis haxe esperam encontrar bibliotecas dinâmicas relativas ao diretório executável.

Se o seu plug-in fornecer um comando de extensão asdf, certifique-se de mencioná-lo no README do seu plug-in.

Modelos de calços personalizados

POR FAVOR, use este recurso apenas se for absolutamente necessário

asdf permite modelos de calços personalizados. Para um executável chamado foo, se houver um arquivo shims/foo no plug-in, o asdf copiará esse arquivo em vez de usar seu modelo padrão de shim.

Isso deve ser usado com sabedoria. Por enquanto AFAIK, está sendo usado apenas no plugin Elixir, porque um executável também é lido como um arquivo Elixir, além de ser apenas um executável. O que torna impossível usar o calço bash padrão.

Testando plug-ins

asdf contém o comando plugin-test para testar seu plugin. Você pode usá-lo da seguinte forma

shell
asdf plugin test <plugin-name> <plugin-url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git-ref>] [test-command*]

Apenas os dois primeiros argumentos são necessários. Se _version for especificado, a ferramenta será instalada com essa versão específica. O padrão é o que retorna asdf latest <plugin-name>. Se git-ref for especificado, o plug-in em si é verificado nesse commit/branch/tag, útil para testar um pull-request no CI do seu plug-in. O padrão é o branch default do repositório do plugin.

Os argumentos Rest são considerados o comando a ser executado para garantir que a ferramenta instalada funcione corretamente. Normalmente seria algo que leva --version ou --help. Por exemplo, para testar o plugin NodeJS, podemos executar

shell
asdf plugin test nodejs https://github.com/asdf-vm/asdf-nodejs.git node --version

É altamente recomendável que você teste seu plug-in em um ambiente CI e verifique se ele funciona no Linux e no OSX.

Exemplo GitHub Action

O repositório asdf-vm/actions fornece uma ação do GitHub para testar seus plugins hospedados no github.

yaml
steps:
+  - name: asdf_plugin_test
+    uses: asdf-vm/actions/plugin-test@v1
+    with:
+      command: "my_tool --version"
+    env:
+      GITHUB_API_TOKEN: \${{ secrets.GITHUB_TOKEN }} # automatically provided

Exemplo de configuração do TravisCI

Aqui está um arquivo .travis.yml de amostra, personalize-o de acordo com suas necessidades

yaml
language: c
+script: asdf plugin test nodejs $TRAVIS_BUILD_DIR 'node --version'
+before_script:
+  - git clone https://github.com/asdf-vm/asdf.git asdf
+  - . asdf/asdf.sh
+os:
+  - linux
+  - osx

Notas: Ao usar outro IC, você precisará verificar qual variável mapeia para o caminho do repositório.

Você também tem a opção de passar um caminho relativo para plugin-test.

Por exemplo, se o script de teste for executado no diretório: asdf plugin test nodejs . 'node --version'.

Limitação de taxa da API do GitHub

Se o list-all do seu plug-in depender do acesso à API do GitHub, certifique-se de fornecer um token de autorização ao acessá-lo, caso contrário, seus testes podem falhar devido à limitação de taxa.

Para fazer isso, crie um novo token pessoal com apenas acesso public_repo.

Em seguida, nas configurações de compilação do travis.ci, adicione uma variável de ambiente secure para ela chamada algo como GITHUB_API_TOKEN. E NUNCA publique seu token em seu código.

Finalmente, adicione algo como o seguinte para bin/list-all

shell
cmd="curl -s"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"

Enviando plugins para o repositório oficial de plugins

asdf pode facilmente instalar plugins especificando o url do repositório de plugins, por exemplo. plugin add my-plugin https://github.com/user/asdf-my-plugin.git.

Para facilitar para seus usuários, você pode adicionar seu plugin ao repositório oficial de plugins para ter seu plugin listado e facilmente instalável usando um comando mais curto, por exemplo asdf plugin add my-plugin.

Siga as instruções no repositório de plugins: asdf-vm/asdf-plugins.

`,102)]))}const k=s(n,[["render",t]]);export{u as __pageData,k as default}; diff --git a/assets/pt-br_plugins_create.md.CnPY6mOB.lean.js b/assets/pt-br_plugins_create.md.CnPY6mOB.lean.js new file mode 100644 index 00000000..26743f82 --- /dev/null +++ b/assets/pt-br_plugins_create.md.CnPY6mOB.lean.js @@ -0,0 +1,35 @@ +import{_ as s,c as e,a2 as i,o}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"Criar um plug-in","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/plugins/create.md","filePath":"pt-br/plugins/create.md","lastUpdated":1704804447000}'),n={name:"pt-br/plugins/create.md"};function t(l,a,p,d,r,h){return o(),e("div",null,a[0]||(a[0]=[i(`

Criar um plug-in

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

O que há em um plug-in

Um plugin é um repositório git, com alguns scripts executáveis, para dar suporte ao versionamento de outra linguagem ou ferramenta. Esses scripts são executados quando os comandos list-all, install ou uninstall são executados. Você pode definir ou desmarcar env vars e fazer qualquer coisa necessária para configurar o ambiente para a ferramenta.

Scripts obrigatórios

  • bin/list-all - lista todas as versões instaláveis
  • bin/download - baixe o código fonte ou binário para a versão especificada
  • bin/install - instala a versão especificada

Variavéis de Ambiente

Todos os scripts, exceto bin/list-all, terão acesso aos seguintes env vars para agir:

  • ASDF_INSTALL_TYPE - version ou ref
  • ASDF_INSTALL_VERSION - se ASDF_INSTALL_TYPE é version então este será o número da versão. Caso contrário, será o git ref que será passado. Pode apontar para uma tag/commit/branch no repositório.
  • ASDF_INSTALL_PATH - o diretório onde foi instalado (ou deve ser instalado no caso do script bin/install)

Essas variáveis de ambiente adicionais estarão disponíveis para o script bin/install:

  • ASDF_CONCURRENCY - o número de núcleos a serem usados ao compilar o código-fonte. Útil para definir make -j.
  • ASDF_DOWNLOAD_PATH - o caminho para onde o código fonte ou binário foi baixado pelo script bin/download.

Essas variáveis de ambiente adicionais estarão disponíveis para o script bin/download:

  • ASDF_DOWNLOAD_PATH - o caminho para onde o código-fonte ou binário deve ser baixado.

bin/list-all

Deve imprimir uma string com uma lista de versões separadas por espaço. A saída de exemplo seria a seguinte:

shell
1.0.1 1.0.2 1.3.0 1.4

Observe que a versão mais recente deve ser listada por último para que apareça mais próxima do prompt do usuário. Isso é útil já que o comando list-all imprime cada versão em sua própria linha. Se houver muitas versões, é possível que as primeiras versões fiquem fora da tela.

Se as versões estiverem sendo extraídas da página de lançamentos em um site, é recomendável não classificar as versões, se possível. Muitas vezes as versões já estão na ordem correta ou, na ordem inversa, nesse caso algo como tac deve ser suficiente. Se você precisar classificar as versões manualmente, não poderá confiar em sort -V, pois não é suportado no OSX. Uma função de classificação alternativa como esta é uma escolha melhor.

bin/download

Este script deve baixar o código fonte ou binário, no caminho contido na variável de ambiente ASDF_DOWNLOAD_PATH. Se o código-fonte ou binário baixado estiver compactado, apenas o código-fonte ou binário descompactado poderá ser colocado no diretório ASDF_DOWNLOAD_PATH.

O script deve sair com um status de 0 quando o download for bem-sucedido. Se o download falhar, o script deve sair com qualquer status de saída diferente de zero.

Se possível, o script deve apenas colocar arquivos no ASDF_DOWNLOAD_PATH. Se o download falhar, nenhum arquivo deve ser colocado no diretório.

Se este script não estiver presente, o asdf assumirá que o script bin/install está presente e fará o download e instalará a versão. asdf só funciona sem este script para suportar plugins legados. Todos os plugins devem incluir este script e, eventualmente, o suporte para plugins legados será removido.

bin/install

Este script deve instalar a versão, no caminho mencionado em ASDF_INSTALL_PATH. Por padrão, o asdf criará shims para qualquer arquivo em $ASDF_INSTALL_PATH/bin (isso pode ser personalizado com o script opcional bin/list-bin-paths).

O script de instalação deve sair com um status de 0 quando a instalação for bem-sucedida. Se a instalação falhar, o script deve sair com qualquer status de saída diferente de zero.

Se possível, o script deve apenas colocar os arquivos no diretório ASDF_INSTALL_PATH uma vez que a compilação e instalação da ferramenta são consideradas bem sucedidas pelo script de instalação. asdf verifica a existência do diretório ASDF_INSTALL_PATH para determinar se essa versão da ferramenta está instalado. Se o diretório ASDF_INSTALL_PATH for preenchido no início do processo de instalação, outros comandos asdf executados em outros terminais durante a instalação podem considerar essa versão da ferramenta instalada, mesmo quando não estiver totalmente instalada.

Se você quiser que seu plugin funcione com asdf versão 0.7._ e anterior e versão 0.8._ e mais recente, verifique a presença da variável de ambiente ASDF_DOWNLOAD_PATH. Se não estiver definido, baixe o código-fonte no retorno de chamada bin/install. Se estiver definido, suponha que o script bin/download já tenha baixado.

Scripts Opcional

scripts bin/help

Este não é um script de retorno de chamada, mas sim um conjunto de scripts de retorno de chamada que imprimem documentação diferente para STDOUT. Os scripts de retorno de chamada possíveis estão listados abaixo. Observe que bin/help.overview é um caso especial, pois deve estar presente para que qualquer saída de ajuda seja exibida para o script.

  • bin/help.overview - Este script deve gerar uma descrição geral sobre o plugin e a ferramenta que está sendo gerenciada. Nenhum título deve ser impresso, pois o asdf imprimirá títulos. A saída pode ser um texto de formato livre, mas idealmente apenas um parágrafo curto. Este script deve estar presente se você quiser que o asdf forneça informações de ajuda para seu plugin. Todos os outros scripts de retorno de chamada de ajuda são opcionais.
  • bin/help.deps - Esse script deve gerar a lista de dependências adaptadas ao sistema operacional. Uma dependência por linha.
  • bin/help.config - Este script deve imprimir qualquer configuração obrigatória ou opcional que possa estar disponível para o plug-in e a ferramenta. Quaisquer variáveis de ambiente ou outros sinalizadores necessários para instalar ou compilar a ferramenta (para o sistema operacional dos usuários quando possível). A saída pode ser texto de formato livre.
  • bin/help.links - Esta deve ser uma lista de links relevantes para o plug-in e a ferramenta (mais uma vez, adaptados ao sistema operacional atual, quando possível). Um link por linha. As linhas podem estar no formato <title>: <link> ou apenas <link>.

Cada um desses scripts deve adaptar sua saída ao sistema operacional atual. Por exemplo, quando no Ubuntu, o script deps pode gerar as dependências como pacotes apt-get que devem ser instalados. O script também deve adaptar sua saída ao valor de ASDF_INSTALL_VERSION e ASDF_INSTALL_TYPE quando as variáveis forem definidas. Eles são opcionais e nem sempre serão definidos.

O script de retorno de chamada de ajuda NÃO DEVE gerar nenhuma informação que já esteja coberta na documentação principal do asdf-vm. As informações gerais de uso do asdf não devem estar presentes.

bin/list-bin-paths

Liste os executáveis para a versão especificada da ferramenta. Deve imprimir uma string com uma lista separada por espaços de caminhos de diretórios que contêm executáveis. Os caminhos devem ser relativos ao caminho de instalação passado. A saída de exemplo seria:

shell
bin tools veggies

Isso instruirá o asdf a criar shims para os arquivos em <install-path>/bin, <install-path>/tools e <install-path>/veggies

Se este script não for especificado, o asdf procurará o diretório bin em uma instalação e criará shims para eles.

bin/exec-env

Configure o env para executar os binários no pacote.

bin/exec-path

Obtenha o caminho executável para a versão especificada da ferramenta. Deve imprimir uma string com o caminho executável relativo. Isso permite que o plug-in substitua condicionalmente o caminho executável especificado do shim, caso contrário, retorne o caminho padrão especificado pelo shim.

shell
Usage:
+  plugin/bin/exec-path <install-path> <command> <executable-path>
+
+Example Call:
+  ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"
+
+Output:
+  bin/foox

bin/uninstall

Desinstala uma versão específica de uma ferramenta.

bin/list-legacy-filenames

Registre arquivos setter adicionais para este plugin. Deve imprimir uma string com uma lista de nomes de arquivos separados por espaços.

shell
.ruby-version .rvmrc

Nota: Isso só se aplica a usuários que habilitaram a opção legacy_version_file em seu ~/.asdfrc.

bin/parse-legacy-file

Isso pode ser usado para analisar ainda mais o arquivo legado encontrado pelo asdf. Se o parse-legacy-file não for implementado, o asdf simplesmente irá cat o arquivo para determinar a versão. O script receberá o caminho do arquivo como seu primeiro argumento.

bin/post-plugin-add

Isso pode ser usado para executar qualquer ação pós-instalação depois que o plug-in for adicionado ao asdf.

O script tem acesso ao caminho em que o plugin foi instalado (\${ASDF_PLUGIN_PATH}) e o URL de origem (\${ASDF_PLUGIN_SOURCE_URL}), se algum foi usado.

Veja também os ganchos relacionados:

  • pre_asdf_plugin_add
  • pre_asdf_plugin_add_\${plugin_name}
  • post_asdf_plugin_add
  • post_asdf_plugin_add_\${plugin_name}

bin/pre-plugin-remove

Isso pode ser usado para executar qualquer ação de pré-remoção antes que o plug-in seja removido do asdf.

O script tem acesso ao caminho em que o plugin foi instalado (\${ASDF_PLUGIN_PATH}).

Veja também os ganchos relacionados:

  • pre_asdf_plugin_remove
  • pre_asdf_plugin_remove_\${plugin_name}
  • post_asdf_plugin_remove
  • post_asdf_plugin_remove_\${plugin_name}

Comandos de extensão para asdf CLI.

É possível que plugins definam novos comandos asdf fornecendo scripts ou executáveis lib/commands/command*.bash que será chamado usando a interface de linha de comando asdf usando o nome do plug-in como um subcomando.

Por exemplo, suponha que um plugin foo tenha:

shell
foo/
+  lib/commands/
+    command.bash
+    command-bat.bash
+    command-bat-man.bash
+    command-help.bash

Os usuários agora podem executar

shell
$ asdf foo         # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash\`
+$ asdf foo bar     # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar\`
+$ asdf foo help    # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash\`
+$ asdf foo bat man # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash\`
+$ asdf foo bat baz # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz\`

Os autores de plugins podem usar esse recurso para fornecer utilitários relacionados às suas ferramentas, ou até mesmo criar plugins que são apenas novas extensões de comando para o próprio asdf.

Quando invocados, se os comandos de extensão não tiverem seus bits executáveis definidos, eles serão originado como scripts bash, tendo todas as funções de $ASDF_DIR/lib/utils.bash disponíveis. Além disso, o $ASDF_CMD_FILE resolve para o caminho completo do arquivo que está sendo originado. Se o bit executável estiver definido, eles são apenas executados e substituem a execução do asdf.

Um bom exemplo desse recurso é para plugins como haxe que fornece o asdf haxe neko-dylibs-link para corrigir um problema onde os executáveis haxe esperam encontrar bibliotecas dinâmicas relativas ao diretório executável.

Se o seu plug-in fornecer um comando de extensão asdf, certifique-se de mencioná-lo no README do seu plug-in.

Modelos de calços personalizados

POR FAVOR, use este recurso apenas se for absolutamente necessário

asdf permite modelos de calços personalizados. Para um executável chamado foo, se houver um arquivo shims/foo no plug-in, o asdf copiará esse arquivo em vez de usar seu modelo padrão de shim.

Isso deve ser usado com sabedoria. Por enquanto AFAIK, está sendo usado apenas no plugin Elixir, porque um executável também é lido como um arquivo Elixir, além de ser apenas um executável. O que torna impossível usar o calço bash padrão.

Testando plug-ins

asdf contém o comando plugin-test para testar seu plugin. Você pode usá-lo da seguinte forma

shell
asdf plugin test <plugin-name> <plugin-url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git-ref>] [test-command*]

Apenas os dois primeiros argumentos são necessários. Se _version for especificado, a ferramenta será instalada com essa versão específica. O padrão é o que retorna asdf latest <plugin-name>. Se git-ref for especificado, o plug-in em si é verificado nesse commit/branch/tag, útil para testar um pull-request no CI do seu plug-in. O padrão é o branch default do repositório do plugin.

Os argumentos Rest são considerados o comando a ser executado para garantir que a ferramenta instalada funcione corretamente. Normalmente seria algo que leva --version ou --help. Por exemplo, para testar o plugin NodeJS, podemos executar

shell
asdf plugin test nodejs https://github.com/asdf-vm/asdf-nodejs.git node --version

É altamente recomendável que você teste seu plug-in em um ambiente CI e verifique se ele funciona no Linux e no OSX.

Exemplo GitHub Action

O repositório asdf-vm/actions fornece uma ação do GitHub para testar seus plugins hospedados no github.

yaml
steps:
+  - name: asdf_plugin_test
+    uses: asdf-vm/actions/plugin-test@v1
+    with:
+      command: "my_tool --version"
+    env:
+      GITHUB_API_TOKEN: \${{ secrets.GITHUB_TOKEN }} # automatically provided

Exemplo de configuração do TravisCI

Aqui está um arquivo .travis.yml de amostra, personalize-o de acordo com suas necessidades

yaml
language: c
+script: asdf plugin test nodejs $TRAVIS_BUILD_DIR 'node --version'
+before_script:
+  - git clone https://github.com/asdf-vm/asdf.git asdf
+  - . asdf/asdf.sh
+os:
+  - linux
+  - osx

Notas: Ao usar outro IC, você precisará verificar qual variável mapeia para o caminho do repositório.

Você também tem a opção de passar um caminho relativo para plugin-test.

Por exemplo, se o script de teste for executado no diretório: asdf plugin test nodejs . 'node --version'.

Limitação de taxa da API do GitHub

Se o list-all do seu plug-in depender do acesso à API do GitHub, certifique-se de fornecer um token de autorização ao acessá-lo, caso contrário, seus testes podem falhar devido à limitação de taxa.

Para fazer isso, crie um novo token pessoal com apenas acesso public_repo.

Em seguida, nas configurações de compilação do travis.ci, adicione uma variável de ambiente secure para ela chamada algo como GITHUB_API_TOKEN. E NUNCA publique seu token em seu código.

Finalmente, adicione algo como o seguinte para bin/list-all

shell
cmd="curl -s"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"

Enviando plugins para o repositório oficial de plugins

asdf pode facilmente instalar plugins especificando o url do repositório de plugins, por exemplo. plugin add my-plugin https://github.com/user/asdf-my-plugin.git.

Para facilitar para seus usuários, você pode adicionar seu plugin ao repositório oficial de plugins para ter seu plugin listado e facilmente instalável usando um comando mais curto, por exemplo asdf plugin add my-plugin.

Siga as instruções no repositório de plugins: asdf-vm/asdf-plugins.

`,102)]))}const k=s(n,[["render",t]]);export{u as __pageData,k as default}; diff --git a/assets/style.p0L2iRKi.css b/assets/style.p0L2iRKi.css new file mode 100644 index 00000000..b61f707f --- /dev/null +++ b/assets/style.p0L2iRKi.css @@ -0,0 +1 @@ +@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, "PingFang SC", "Noto Sans CJK SC", "Noto Sans SC", "Heiti SC", "Microsoft YaHei", "DengXian", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.vpi-social-discord{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418Z'/%3E%3C/svg%3E")}.vpi-social-facebook{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z'/%3E%3C/svg%3E")}.vpi-social-github{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")}.vpi-social-instagram{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.03.084c-1.277.06-2.149.264-2.91.563a5.874 5.874 0 0 0-2.124 1.388 5.878 5.878 0 0 0-1.38 2.127C.321 4.926.12 5.8.064 7.076.008 8.354-.005 8.764.001 12.023c.007 3.259.021 3.667.083 4.947.061 1.277.264 2.149.563 2.911.308.789.72 1.457 1.388 2.123a5.872 5.872 0 0 0 2.129 1.38c.763.295 1.636.496 2.913.552 1.278.056 1.689.069 4.947.063 3.257-.007 3.668-.021 4.947-.082 1.28-.06 2.147-.265 2.91-.563a5.881 5.881 0 0 0 2.123-1.388 5.881 5.881 0 0 0 1.38-2.129c.295-.763.496-1.636.551-2.912.056-1.28.07-1.69.063-4.948-.006-3.258-.02-3.667-.081-4.947-.06-1.28-.264-2.148-.564-2.911a5.892 5.892 0 0 0-1.387-2.123 5.857 5.857 0 0 0-2.128-1.38C19.074.322 18.202.12 16.924.066 15.647.009 15.236-.006 11.977 0 8.718.008 8.31.021 7.03.084m.14 21.693c-1.17-.05-1.805-.245-2.228-.408a3.736 3.736 0 0 1-1.382-.895 3.695 3.695 0 0 1-.9-1.378c-.165-.423-.363-1.058-.417-2.228-.06-1.264-.072-1.644-.08-4.848-.006-3.204.006-3.583.061-4.848.05-1.169.246-1.805.408-2.228.216-.561.477-.96.895-1.382a3.705 3.705 0 0 1 1.379-.9c.423-.165 1.057-.361 2.227-.417 1.265-.06 1.644-.072 4.848-.08 3.203-.006 3.583.006 4.85.062 1.168.05 1.804.244 2.227.408.56.216.96.475 1.382.895.421.42.681.817.9 1.378.165.422.362 1.056.417 2.227.06 1.265.074 1.645.08 4.848.005 3.203-.006 3.583-.061 4.848-.051 1.17-.245 1.805-.408 2.23-.216.56-.477.96-.896 1.38a3.705 3.705 0 0 1-1.378.9c-.422.165-1.058.362-2.226.418-1.266.06-1.645.072-4.85.079-3.204.007-3.582-.006-4.848-.06m9.783-16.192a1.44 1.44 0 1 0 1.437-1.442 1.44 1.44 0 0 0-1.437 1.442M5.839 12.012a6.161 6.161 0 1 0 12.323-.024 6.162 6.162 0 0 0-12.323.024M8 12.008A4 4 0 1 1 12.008 16 4 4 0 0 1 8 12.008'/%3E%3C/svg%3E")}.vpi-social-linkedin{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z'/%3E%3C/svg%3E")}.vpi-social-mastodon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z'/%3E%3C/svg%3E")}.vpi-social-npm{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z'/%3E%3C/svg%3E")}.vpi-social-slack{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zm0 1.271a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zm10.122 2.521a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zm-1.268 0a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zm-2.523 10.122a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zm0-1.268a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z'/%3E%3C/svg%3E")}.vpi-social-twitter,.vpi-social-x{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z'/%3E%3C/svg%3E")}.vpi-social-youtube{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-54a304ca]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-54a304ca],.VPBackdrop.fade-leave-to[data-v-54a304ca]{opacity:0}.VPBackdrop.fade-leave-active[data-v-54a304ca]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-54a304ca]{display:none}}.NotFound[data-v-6ff51ddd]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-6ff51ddd]{padding:96px 32px 168px}}.code[data-v-6ff51ddd]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-6ff51ddd]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-6ff51ddd]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-6ff51ddd]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-6ff51ddd]{padding-top:20px}.link[data-v-6ff51ddd]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-6ff51ddd]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-53c99d69]{position:relative;z-index:1}.nested[data-v-53c99d69]{padding-right:16px;padding-left:16px}.outline-link[data-v-53c99d69]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-53c99d69]:hover,.outline-link.active[data-v-53c99d69]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-53c99d69]{padding-left:13px}.VPDocAsideOutline[data-v-f610f197]{display:none}.VPDocAsideOutline.has-outline[data-v-f610f197]{display:block}.content[data-v-f610f197]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-f610f197]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-f610f197]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-cb998dce]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-cb998dce]{flex-grow:1}.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-cb998dce] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-1bb0c8a8]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-1bb0c8a8]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-1bcd8184]{margin-top:64px}.edit-info[data-v-1bcd8184]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-1bcd8184]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-1bcd8184]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-1bcd8184]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-1bcd8184]{margin-right:8px}.prev-next[data-v-1bcd8184]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-1bcd8184]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-1bcd8184]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-1bcd8184]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-1bcd8184]{margin-left:auto;text-align:right}.desc[data-v-1bcd8184]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-1bcd8184]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-e6f2a212]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-e6f2a212]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-e6f2a212]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-e6f2a212]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-e6f2a212]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-e6f2a212]{display:flex;justify-content:center}.VPDoc .aside[data-v-e6f2a212]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-e6f2a212]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-e6f2a212]{max-width:1104px}}.container[data-v-e6f2a212]{margin:0 auto;width:100%}.aside[data-v-e6f2a212]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-e6f2a212]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-e6f2a212]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-e6f2a212]::-webkit-scrollbar{display:none}.aside-curtain[data-v-e6f2a212]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-e6f2a212]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-e6f2a212]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-e6f2a212]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-e6f2a212]{order:1;margin:0;min-width:640px}}.content-container[data-v-e6f2a212]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-e6f2a212]{max-width:688px}.VPButton[data-v-c9cf0e3c]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-c9cf0e3c]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-c9cf0e3c]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-c9cf0e3c]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-c9cf0e3c]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-c9cf0e3c]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-c9cf0e3c]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-c9cf0e3c]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-c9cf0e3c]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-c9cf0e3c]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-c9cf0e3c]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-c9cf0e3c]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-c9cf0e3c]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-ab19afbb]{display:none}.dark .VPImage.light[data-v-ab19afbb]{display:none}.VPHero[data-v-b10c5094]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-b10c5094]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-b10c5094]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-b10c5094]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-b10c5094]{flex-direction:row}}.main[data-v-b10c5094]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-b10c5094]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-b10c5094]{text-align:left}}@media (min-width: 960px){.main[data-v-b10c5094]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-b10c5094]{max-width:592px}}.name[data-v-b10c5094],.text[data-v-b10c5094]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-b10c5094],.VPHero.has-image .text[data-v-b10c5094]{margin:0 auto}.name[data-v-b10c5094]{color:var(--vp-home-hero-name-color)}.clip[data-v-b10c5094]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-b10c5094],.text[data-v-b10c5094]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-b10c5094],.text[data-v-b10c5094]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-b10c5094],.VPHero.has-image .text[data-v-b10c5094]{margin:0}}.tagline[data-v-b10c5094]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-b10c5094]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-b10c5094]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-b10c5094]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-b10c5094]{margin:0}}.actions[data-v-b10c5094]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-b10c5094]{justify-content:center}@media (min-width: 640px){.actions[data-v-b10c5094]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-b10c5094]{justify-content:flex-start}}.action[data-v-b10c5094]{flex-shrink:0;padding:6px}.image[data-v-b10c5094]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-b10c5094]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-b10c5094]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-b10c5094]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-b10c5094]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-b10c5094]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-b10c5094]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-b10c5094]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-b10c5094]{width:320px;height:320px}}[data-v-b10c5094] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-b10c5094] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-b10c5094] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-bd37d1a2]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-bd37d1a2]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-bd37d1a2]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-bd37d1a2]>.VPImage{margin-bottom:20px}.icon[data-v-bd37d1a2]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-bd37d1a2]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-bd37d1a2]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-bd37d1a2]{padding-top:8px}.link-text-value[data-v-bd37d1a2]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-bd37d1a2]{margin-left:6px}.VPFeatures[data-v-b1eea84a]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-b1eea84a]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-b1eea84a]{padding:0 64px}}.container[data-v-b1eea84a]{margin:0 auto;max-width:1152px}.items[data-v-b1eea84a]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-b1eea84a]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-b1eea84a],.item.grid-4[data-v-b1eea84a],.item.grid-6[data-v-b1eea84a]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-b1eea84a],.item.grid-4[data-v-b1eea84a]{width:50%}.item.grid-3[data-v-b1eea84a],.item.grid-6[data-v-b1eea84a]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-b1eea84a]{width:25%}}.container[data-v-c141a4bd]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-c141a4bd]{padding:0 48px}}@media (min-width: 960px){.container[data-v-c141a4bd]{width:100%;padding:0 64px}}.vp-doc[data-v-c141a4bd] .VPHomeSponsors,.vp-doc[data-v-c141a4bd] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-c141a4bd] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-c141a4bd] .VPHomeSponsors a,.vp-doc[data-v-c141a4bd] .VPTeamPage a{text-decoration:none}.VPHome[data-v-07b1ad08]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-07b1ad08]{margin-bottom:128px}}.VPContent[data-v-9a6c75ad]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-9a6c75ad]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-9a6c75ad]{margin:0}@media (min-width: 960px){.VPContent[data-v-9a6c75ad]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-9a6c75ad]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-9a6c75ad]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-566314d4]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-566314d4]{display:none}.VPFooter[data-v-566314d4] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-566314d4] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-566314d4]{padding:32px}}.container[data-v-566314d4]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-566314d4],.copyright[data-v-566314d4]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-883964e0]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-883964e0]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-883964e0]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-883964e0]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-883964e0]{color:var(--vp-c-text-1)}.icon[data-v-883964e0]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-883964e0]{font-size:14px}.icon[data-v-883964e0]{font-size:16px}}.open>.icon[data-v-883964e0]{transform:rotate(90deg)}.items[data-v-883964e0]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-883964e0]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-883964e0]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-883964e0]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-883964e0]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-883964e0]{transition:all .2s ease-out}.flyout-leave-active[data-v-883964e0]{transition:all .15s ease-in}.flyout-enter-from[data-v-883964e0],.flyout-leave-to[data-v-883964e0]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-2488c25a]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-2488c25a]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-2488c25a]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-2488c25a]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-2488c25a]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-2488c25a]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-2488c25a]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-2488c25a]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-2488c25a]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-2488c25a]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-2488c25a]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-2488c25a]{display:none}}.menu-icon[data-v-2488c25a]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-2488c25a]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-2488c25a]{padding:12px 32px 11px}}.VPSwitch[data-v-b4ccac88]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-b4ccac88]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-b4ccac88]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-b4ccac88]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-b4ccac88] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-b4ccac88] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-be9742d9]{opacity:1}.moon[data-v-be9742d9],.dark .sun[data-v-be9742d9]{opacity:0}.dark .moon[data-v-be9742d9]{opacity:1}.dark .VPSwitchAppearance[data-v-be9742d9] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-3f90c1a5]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-3f90c1a5]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-f51f088d]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-f51f088d]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-f51f088d]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-f51f088d]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-a6b0397c]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-a6b0397c]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-a6b0397c]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-a6b0397c]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-20ed86d6]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-20ed86d6] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-20ed86d6] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-20ed86d6] .group:last-child{padding-bottom:0}.VPMenu[data-v-20ed86d6] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-20ed86d6] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-20ed86d6] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-20ed86d6] .action{padding-left:24px}.VPFlyout[data-v-af5898d3]{position:relative}.VPFlyout[data-v-af5898d3]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-af5898d3]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-af5898d3]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-af5898d3]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-af5898d3]{color:var(--vp-c-brand-2)}.VPFlyout:hover .menu[data-v-af5898d3],.button[aria-expanded=true]+.menu[data-v-af5898d3]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-af5898d3]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-af5898d3]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-af5898d3]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-af5898d3]{margin-right:0;font-size:16px}.text-icon[data-v-af5898d3]{margin-left:4px;font-size:14px}.icon[data-v-af5898d3]{font-size:20px;transition:fill .25s}.menu[data-v-af5898d3]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-358b6670]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-358b6670]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-358b6670]>svg,.VPSocialLink[data-v-358b6670]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-e71e869c]{display:flex;justify-content:center}.VPNavBarExtra[data-v-f953d92f]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-f953d92f]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-f953d92f]{display:none}}.trans-title[data-v-f953d92f]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-f953d92f],.item.social-links[data-v-f953d92f]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-f953d92f]{min-width:176px}.appearance-action[data-v-f953d92f]{margin-right:-2px}.social-links-list[data-v-f953d92f]{margin:-4px -8px}.VPNavBarHamburger[data-v-6bee1efd]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-6bee1efd]{display:none}}.container[data-v-6bee1efd]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-6bee1efd]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-6bee1efd]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-6bee1efd],.VPNavBarHamburger.active:hover .middle[data-v-6bee1efd],.VPNavBarHamburger.active:hover .bottom[data-v-6bee1efd]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-6bee1efd],.middle[data-v-6bee1efd],.bottom[data-v-6bee1efd]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-6bee1efd]{top:0;left:0;transform:translate(0)}.middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-08fbf4b6]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-08fbf4b6],.VPNavBarMenuLink[data-v-08fbf4b6]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-afb2845e]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-afb2845e]{display:flex}}/*! @docsearch/css 3.6.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 rgba(3,4,9,.30196078431372547);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}.DocSearch-Button-Key--pressed{transform:translate3d(0,1px,0);box-shadow:var(--docsearch-key-pressed-shadow)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-ef6192dc]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-ef6192dc]{display:flex;align-items:center}}.title[data-v-0ad69264]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-0ad69264]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-0ad69264]{border-bottom-color:var(--vp-c-divider)}}[data-v-0ad69264] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-acee064b]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-acee064b]{display:flex;align-items:center}}.title[data-v-acee064b]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-9fd4d1dd]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-9fd4d1dd]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-9fd4d1dd]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-9fd4d1dd]:not(.home){background-color:transparent}.VPNavBar[data-v-9fd4d1dd]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-9fd4d1dd]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-9fd4d1dd]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-9fd4d1dd]{padding:0}}.container[data-v-9fd4d1dd]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-9fd4d1dd],.container>.content[data-v-9fd4d1dd]{pointer-events:none}.container[data-v-9fd4d1dd] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-9fd4d1dd]{max-width:100%}}.title[data-v-9fd4d1dd]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-9fd4d1dd]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-9fd4d1dd]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-9fd4d1dd]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-9fd4d1dd]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-9fd4d1dd]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-9fd4d1dd]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-9fd4d1dd]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-9fd4d1dd]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-9fd4d1dd]{column-gap:.5rem}}.menu+.translations[data-v-9fd4d1dd]:before,.menu+.appearance[data-v-9fd4d1dd]:before,.menu+.social-links[data-v-9fd4d1dd]:before,.translations+.appearance[data-v-9fd4d1dd]:before,.appearance+.social-links[data-v-9fd4d1dd]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-9fd4d1dd]:before,.translations+.appearance[data-v-9fd4d1dd]:before{margin-right:16px}.appearance+.social-links[data-v-9fd4d1dd]:before{margin-left:16px}.social-links[data-v-9fd4d1dd]{margin-right:-8px}.divider[data-v-9fd4d1dd]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-9fd4d1dd]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-9fd4d1dd]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-9fd4d1dd]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-9fd4d1dd]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-9fd4d1dd]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-9fd4d1dd]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-a3e2920d]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-a3e2920d]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-1a934d60]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-1a934d60]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-aea78dd1]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-aea78dd1]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-f60dbfa7]{display:block}.title[data-v-f60dbfa7]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-d99bfeec]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-d99bfeec]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-d99bfeec]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-d99bfeec]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-d99bfeec]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-d99bfeec]{transform:rotate(45deg)}.button[data-v-d99bfeec]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-d99bfeec]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-d99bfeec]{transition:transform .25s}.group[data-v-d99bfeec]:first-child{padding-top:0}.group+.group[data-v-d99bfeec],.group+.item[data-v-d99bfeec]{padding-top:4px}.VPNavScreenTranslations[data-v-516e4bc3]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-516e4bc3]{height:auto}.title[data-v-516e4bc3]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-516e4bc3]{font-size:16px}.icon.lang[data-v-516e4bc3]{margin-right:8px}.icon.chevron[data-v-516e4bc3]{margin-left:4px}.list[data-v-516e4bc3]{padding:4px 0 0 24px}.link[data-v-516e4bc3]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-2dd6d0c7]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-2dd6d0c7],.VPNavScreen.fade-leave-active[data-v-2dd6d0c7]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-2dd6d0c7],.VPNavScreen.fade-leave-active .container[data-v-2dd6d0c7]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-2dd6d0c7],.VPNavScreen.fade-leave-to[data-v-2dd6d0c7]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-2dd6d0c7],.VPNavScreen.fade-leave-to .container[data-v-2dd6d0c7]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-2dd6d0c7]{display:none}}.container[data-v-2dd6d0c7]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-2dd6d0c7],.menu+.appearance[data-v-2dd6d0c7],.translations+.appearance[data-v-2dd6d0c7]{margin-top:24px}.menu+.social-links[data-v-2dd6d0c7]{margin-top:16px}.appearance+.social-links[data-v-2dd6d0c7]{margin-top:16px}.VPNav[data-v-7ad780c2]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-7ad780c2]{position:fixed}}.VPSidebarItem.level-0[data-v-edd2eed8]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-edd2eed8]{padding-bottom:10px}.item[data-v-edd2eed8]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-edd2eed8]{cursor:pointer}.indicator[data-v-edd2eed8]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-edd2eed8],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-edd2eed8],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-edd2eed8],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-edd2eed8]{background-color:var(--vp-c-brand-1)}.link[data-v-edd2eed8]{display:flex;align-items:center;flex-grow:1}.text[data-v-edd2eed8]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-edd2eed8]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-edd2eed8],.VPSidebarItem.level-2 .text[data-v-edd2eed8],.VPSidebarItem.level-3 .text[data-v-edd2eed8],.VPSidebarItem.level-4 .text[data-v-edd2eed8],.VPSidebarItem.level-5 .text[data-v-edd2eed8]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-edd2eed8]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-1.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-2.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-3.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-4.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-5.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-edd2eed8]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-edd2eed8]{color:var(--vp-c-brand-1)}.caret[data-v-edd2eed8]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-edd2eed8]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-edd2eed8]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-edd2eed8]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-edd2eed8]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-edd2eed8],.VPSidebarItem.level-2 .items[data-v-edd2eed8],.VPSidebarItem.level-3 .items[data-v-edd2eed8],.VPSidebarItem.level-4 .items[data-v-edd2eed8],.VPSidebarItem.level-5 .items[data-v-edd2eed8]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-edd2eed8]{display:none}.no-transition[data-v-51288d80] .caret-icon{transition:none}.group+.group[data-v-51288d80]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-51288d80]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-42c4c606]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-42c4c606]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-42c4c606]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-42c4c606]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-42c4c606]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-42c4c606]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-42c4c606]{outline:0}.VPSkipLink[data-v-c8291ffa]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-c8291ffa]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-c8291ffa]{top:14px;left:16px}}.Layout[data-v-d8b57b2d]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-3dc26e1d]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-3dc26e1d]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-3dc26e1d]{margin:128px 0}}.VPHomeSponsors[data-v-3dc26e1d]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-3dc26e1d]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-3dc26e1d]{padding:0 64px}}.container[data-v-3dc26e1d]{margin:0 auto;max-width:1152px}.love[data-v-3dc26e1d]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-3dc26e1d]{display:inline-block}.message[data-v-3dc26e1d]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-3dc26e1d]{padding-top:32px}.action[data-v-3dc26e1d]{padding-top:40px;text-align:center}.VPTeamPage[data-v-a5329171]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-a5329171]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-a5329171-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-a5329171-s],.VPTeamMembers+.VPTeamPageSection[data-v-a5329171-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-a5329171-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-a5329171-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-a5329171-s],.VPTeamMembers+.VPTeamPageSection[data-v-a5329171-s]{margin-top:96px}}.VPTeamMembers[data-v-a5329171-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-a5329171-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-a5329171-s]{padding:0 64px}}.VPTeamPageTitle[data-v-46c5e327]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-46c5e327]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-46c5e327]{padding:80px 64px 48px}}.title[data-v-46c5e327]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-46c5e327]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-46c5e327]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-46c5e327]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-3bf2e850]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 64px}}.title[data-v-3bf2e850]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-3bf2e850]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-3bf2e850]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-3bf2e850]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-3bf2e850]{padding-top:40px}.VPTeamMembersItem[data-v-acff304e]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-acff304e]{padding:32px}.VPTeamMembersItem.small .data[data-v-acff304e]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-acff304e]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-acff304e]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-acff304e]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-acff304e]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-acff304e]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-acff304e]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-acff304e]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-acff304e]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-acff304e]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-acff304e]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-acff304e]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-acff304e]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-acff304e]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-acff304e]{text-align:center}.avatar[data-v-acff304e]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-acff304e]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-acff304e]{margin:0;font-weight:600}.affiliation[data-v-acff304e]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-acff304e]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-acff304e]:hover{color:var(--vp-c-brand-1)}.desc[data-v-acff304e]{margin:0 auto}.desc[data-v-acff304e] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-acff304e]{display:flex;justify-content:center;height:56px}.sp-link[data-v-acff304e]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-acff304e]:hover,.sp .sp-link.link[data-v-acff304e]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-acff304e]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-bf782009]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-bf782009]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-bf782009]{max-width:876px}.VPTeamMembers.medium .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-bf782009]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-bf782009]{max-width:760px}.container[data-v-bf782009]{display:grid;gap:24px;margin:0 auto;max-width:1152px}:root{--vp-c-brand-1: #b744b8;--vp-c-brand-2: #a379c9;--vp-c-brand-3: #a379c9}.VPLocalSearchBox[data-v-40ea83c9]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-40ea83c9]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-40ea83c9]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 767px){.shell[data-v-40ea83c9]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-40ea83c9]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-40ea83c9]{padding:0 8px}}.search-bar[data-v-40ea83c9]:focus-within{border-color:var(--vp-c-brand-1)}.local-search-icon[data-v-40ea83c9]{display:block;font-size:18px}.navigate-icon[data-v-40ea83c9]{display:block;font-size:14px}.search-icon[data-v-40ea83c9]{margin:8px}@media (max-width: 767px){.search-icon[data-v-40ea83c9]{display:none}}.search-input[data-v-40ea83c9]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-40ea83c9]{padding:6px 4px}}.search-actions[data-v-40ea83c9]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-40ea83c9]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-40ea83c9]{display:none}}.search-actions button[data-v-40ea83c9]{padding:8px}.search-actions button[data-v-40ea83c9]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-40ea83c9]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-40ea83c9]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-40ea83c9]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-40ea83c9]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-40ea83c9]{display:none}}.search-keyboard-shortcuts kbd[data-v-40ea83c9]{background:#8080801a;border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-40ea83c9]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-40ea83c9]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-40ea83c9]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-40ea83c9]{margin:8px}}.titles[data-v-40ea83c9]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-40ea83c9]{display:flex;align-items:center;gap:4px}.title.main[data-v-40ea83c9]{font-weight:500}.title-icon[data-v-40ea83c9]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-40ea83c9]{opacity:.5}.result.selected[data-v-40ea83c9]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-40ea83c9]{position:relative}.excerpt[data-v-40ea83c9]{opacity:50%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;margin-top:4px}.result.selected .excerpt[data-v-40ea83c9]{opacity:1}.excerpt[data-v-40ea83c9] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-40ea83c9] mark,.excerpt[data-v-40ea83c9] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-40ea83c9] .vp-code-group .tabs{display:none}.excerpt[data-v-40ea83c9] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-40ea83c9]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-40ea83c9]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-40ea83c9],.result.selected .title-icon[data-v-40ea83c9]{color:var(--vp-c-brand-1)!important}.no-results[data-v-40ea83c9]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-40ea83c9]{flex:none} diff --git a/assets/zh-hans_contribute_core.md.oF4_zk5Q.js b/assets/zh-hans_contribute_core.md.oF4_zk5Q.js new file mode 100644 index 00000000..0406bafa --- /dev/null +++ b/assets/zh-hans_contribute_core.md.oF4_zk5Q.js @@ -0,0 +1,25 @@ +import{_ as a,c as e,a2 as i,o as t}from"./chunks/framework.C9NVOr0y.js";const k=JSON.parse('{"title":"asdf","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/contribute/core.md","filePath":"zh-hans/contribute/core.md","lastUpdated":1687069487000}'),n={name:"zh-hans/contribute/core.md"};function l(p,s,h,o,r,d){return t(),e("div",null,s[0]||(s[0]=[i(`

asdf

asdf 核心贡献指南.

初始化安装

在 Github 上 fork asdf 并且/或者使用 Git 克隆默认分支:

shell
# 克隆你 fork 的 asdf
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# 或者直接克隆 asdf
+git clone https://github.com/asdf-vm/asdf.git

核心开发所需的工具都列举在这个存储库的 .tool-versions 文件中。如果你想要使用 asdf 自身来管理它,请使用以下命令添加这些插件:

shell
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git

使用以下命令安装这些版本来开发 asdf

shell
asdf install

在本地机器的开发过程中不使用 asdf 来管理工具 或许 对你有帮助,因为你可能需要打破某些可能会影响到你的开发工具链的功能。以下是所需工具的原始列表:

  • bats-core:Bash 自动化测试系统,用于单元测试 Bash 或 POSIX 兼容脚本。
  • shellcheck:Shell 脚本的静态分析工具。
  • shfmt:支持 Bash 的 Shell 解析器、格式化器和解释器;包含 shfmt。

开发

如果你想要在不更改已安装的 asdf 的情况下尝试应用你的更改,可以将 $ASDF_DIR 变量设置为克隆存储库的路径,并临时将目录的 binshims 目录添加到你的路径中。

最好在提交或推送到远程之前,在本地做好格式化、lint 检查和测试你的代码。可以使用以下脚本/命令:

shell
# 脚本检查
+./scripts/shellcheck.bash
+
+# 格式化
+./scripts/shfmt.bash
+
+# 测试:所有案例
+bats test/
+# 测试:特定命令
+bats test/list_commands.bash

提示

增加测试! - 新特性需要进行测试,并加快错误修复的审查速度。请在创建拉取请求之前覆盖新的代码路径。查看 bats-core 文档 了解更多。

Bats 测试

强烈建议在编写测试之前检查现有的测试套件和 bats-core 文档

Bats 调试有时可能很困难。使用带有 -t 标识的 TAP 输出将使你能够在测试执行期间打印带有特殊文件描述符 >&3 的输出,从而简化调试。例如:

shell
# test/some_tests.bats
+
+printf "%s\\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\\n" "Will be printed during bats -t test/some_tests.bats" >&3

进一步相关文档请查看 bats-core 的 Printing to the Terminal 部分.

拉取请求、发布以及约定式提交

asdf 正在使用一个名为 Release Please 的自动发布工具来自动碰撞 SemVer 版本并生成 变更日志。这个信息是通过读取自上次发布以来的提交历史记录来确定的。

约定式提交 定义了拉取请求标题的格式,该标题成为默认分支上的提交消息格式。这是通过 Github Action amannn/action-semantic-pull-request 强制执行的。

约定式提交遵循以下格式:

<type>[optional scope][optional !]: <description>
+
+<!-- 例子 -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change

<types> 的所有类型包含: featfixdocsstylerefactorperftestbuildcichorerevert

  • !:表示重大更改
  • fix:将会创建一个新的 SemVer patch 补丁
  • feat:将会创建一个新的 SemVer minor 小版本
  • <type>!:将会创建一个新的 SemVer major 大版本

拉取请求标题必须遵循这种格式。

提示

请使用约定式提交信息格式作为拉取请求标题。

Docker 镜像

asdf-alpineasdf-ubuntu 项目正在努力提供一些 asdf 工具的容器化镜像。你可以使用这些容器镜像作为开发服务器的基础镜像,或者运行生产应用。

`,32)]))}const g=a(n,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/zh-hans_contribute_core.md.oF4_zk5Q.lean.js b/assets/zh-hans_contribute_core.md.oF4_zk5Q.lean.js new file mode 100644 index 00000000..0406bafa --- /dev/null +++ b/assets/zh-hans_contribute_core.md.oF4_zk5Q.lean.js @@ -0,0 +1,25 @@ +import{_ as a,c as e,a2 as i,o as t}from"./chunks/framework.C9NVOr0y.js";const k=JSON.parse('{"title":"asdf","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/contribute/core.md","filePath":"zh-hans/contribute/core.md","lastUpdated":1687069487000}'),n={name:"zh-hans/contribute/core.md"};function l(p,s,h,o,r,d){return t(),e("div",null,s[0]||(s[0]=[i(`

asdf

asdf 核心贡献指南.

初始化安装

在 Github 上 fork asdf 并且/或者使用 Git 克隆默认分支:

shell
# 克隆你 fork 的 asdf
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# 或者直接克隆 asdf
+git clone https://github.com/asdf-vm/asdf.git

核心开发所需的工具都列举在这个存储库的 .tool-versions 文件中。如果你想要使用 asdf 自身来管理它,请使用以下命令添加这些插件:

shell
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git

使用以下命令安装这些版本来开发 asdf

shell
asdf install

在本地机器的开发过程中不使用 asdf 来管理工具 或许 对你有帮助,因为你可能需要打破某些可能会影响到你的开发工具链的功能。以下是所需工具的原始列表:

  • bats-core:Bash 自动化测试系统,用于单元测试 Bash 或 POSIX 兼容脚本。
  • shellcheck:Shell 脚本的静态分析工具。
  • shfmt:支持 Bash 的 Shell 解析器、格式化器和解释器;包含 shfmt。

开发

如果你想要在不更改已安装的 asdf 的情况下尝试应用你的更改,可以将 $ASDF_DIR 变量设置为克隆存储库的路径,并临时将目录的 binshims 目录添加到你的路径中。

最好在提交或推送到远程之前,在本地做好格式化、lint 检查和测试你的代码。可以使用以下脚本/命令:

shell
# 脚本检查
+./scripts/shellcheck.bash
+
+# 格式化
+./scripts/shfmt.bash
+
+# 测试:所有案例
+bats test/
+# 测试:特定命令
+bats test/list_commands.bash

提示

增加测试! - 新特性需要进行测试,并加快错误修复的审查速度。请在创建拉取请求之前覆盖新的代码路径。查看 bats-core 文档 了解更多。

Bats 测试

强烈建议在编写测试之前检查现有的测试套件和 bats-core 文档

Bats 调试有时可能很困难。使用带有 -t 标识的 TAP 输出将使你能够在测试执行期间打印带有特殊文件描述符 >&3 的输出,从而简化调试。例如:

shell
# test/some_tests.bats
+
+printf "%s\\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\\n" "Will be printed during bats -t test/some_tests.bats" >&3

进一步相关文档请查看 bats-core 的 Printing to the Terminal 部分.

拉取请求、发布以及约定式提交

asdf 正在使用一个名为 Release Please 的自动发布工具来自动碰撞 SemVer 版本并生成 变更日志。这个信息是通过读取自上次发布以来的提交历史记录来确定的。

约定式提交 定义了拉取请求标题的格式,该标题成为默认分支上的提交消息格式。这是通过 Github Action amannn/action-semantic-pull-request 强制执行的。

约定式提交遵循以下格式:

<type>[optional scope][optional !]: <description>
+
+<!-- 例子 -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change

<types> 的所有类型包含: featfixdocsstylerefactorperftestbuildcichorerevert

  • !:表示重大更改
  • fix:将会创建一个新的 SemVer patch 补丁
  • feat:将会创建一个新的 SemVer minor 小版本
  • <type>!:将会创建一个新的 SemVer major 大版本

拉取请求标题必须遵循这种格式。

提示

请使用约定式提交信息格式作为拉取请求标题。

Docker 镜像

asdf-alpineasdf-ubuntu 项目正在努力提供一些 asdf 工具的容器化镜像。你可以使用这些容器镜像作为开发服务器的基础镜像,或者运行生产应用。

`,32)]))}const g=a(n,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/zh-hans_contribute_documentation.md.DL3_2XKG.js b/assets/zh-hans_contribute_documentation.md.DL3_2XKG.js new file mode 100644 index 00000000..7b6bdb3d --- /dev/null +++ b/assets/zh-hans_contribute_documentation.md.DL3_2XKG.js @@ -0,0 +1,29 @@ +import{_ as a,c as i,a2 as e,o as n}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"文档 & 网站","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/contribute/documentation.md","filePath":"zh-hans/contribute/documentation.md","lastUpdated":1687069487000}'),t={name:"zh-hans/contribute/documentation.md"};function l(p,s,h,k,d,r){return n(),i("div",null,s[0]||(s[0]=[e(`

文档 & 网站

文档 & 网站贡献指南。

初始化设置

在 Github 上 fork asdf 并且/或者使用 Git 克隆默认分支:

shell
# 克隆你 fork 的 asdf
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# 或者直接克隆 asdf
+git clone https://github.com/asdf-vm/asdf.git

文档网站开发所需的工具都在文件 docs/.tool-versions 中使用 asdf 进行管理。使用以下命令添加插件:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

使用以下命令安装工具版本:

shell
asdf install
  • Node.js:基于 Chrome 的 V8 引擎的 JavaScript 运行环境。

根据 docs/package.json 文件安装 Node.js 依赖:

shell
npm install

开发

Vuepress (v2) 是我们用来构建 asdf 文档网站的静态站点生成器(SSG)。它被选中来取代 Docsify.js,因为我们希望在用户没有可用或未启用 JavaScript 时支持仅依靠 HTML。Docsify 无法做到这一点。除此之外,两者特性集合大致相同,重点是 Vuepress 可以用最少的配置编写 Markdown 文件。

package.json 包含了开发所需的脚本:

@code json{3-5}

启动本地开发服务器:

shell
npm run dev

在提交之前格式化代码:

shell
npm run format

拉取请求、发布以及约定式提交

asdf 正在使用依赖 PR 标题中的约定式提交的自动化发布流水线。具体的文档可以查看 核心贡献指南.

当为文档更改创建 PR 请求时,请确保 PR 标题使用了约定式提交类型 docs 以及 docs: <description> 的格式。

Vuepress

网站的配置包含在几个 JavaScript 文件中,其中 JS 对象用于表示配置。它们是:

  • docs/.vuepress/config.js:网站的根配置文件。请查看 Vuepress 文档 了解更多详情。

为了简化根配置文件,更大的 JS 对象表示 导航栏和侧边栏 配置已经被提取并按照语言类型分隔开来。请参考以下文件:

  • docs/.vuepress/navbar.js
  • docs/.vuepress/sidebar.js

这些配置的官方文档位于 默认主题参考

I18n 国际化

Vuepress 有一流的国际化支持。根配置文件 docs/.vuepress/config.js 定义了支持的语言类型及其 URL、在选择下拉菜单中的标题以及导航栏/侧边栏配置引用。

导航栏/侧边栏配置在上述配置文件中捕获,按语言类型分隔开并单独导出。

每种语言的 markdown 内容必须位于与根配置文件中 locale 键同名的目录位置。也就是:

js
{
+  ...
+  themeConfig: {
+    locales: {
+      "/": {
+        selectLanguageName: "English (US)",
+        sidebar: sidebar.en,
+        navbar: navbar.en
+      },
+      "/pt-BR/": {
+        selectLanguageName: "Brazilian Portuguese",
+        sidebar: sidebar.pt_br,
+        navbar: navbar.pt_br
+      }
+    }
+  }
+}

/pt-BR/ 将要求 markdown 文件的同一集合位于 docs/pt-BR/ 目录下,如下所示:

shell
docs
+├─ README.md
+├─ foo.md
+├─ nested
+  └─ README.md
+└─ pt-BR
+   ├─ README.md
+   ├─ foo.md
+   └─ nested
+      └─ README.md

请查看 Vuepress i18n 国际化官方文档 了解更多详情。

`,37)]))}const g=a(t,[["render",l]]);export{c as __pageData,g as default}; diff --git a/assets/zh-hans_contribute_documentation.md.DL3_2XKG.lean.js b/assets/zh-hans_contribute_documentation.md.DL3_2XKG.lean.js new file mode 100644 index 00000000..7b6bdb3d --- /dev/null +++ b/assets/zh-hans_contribute_documentation.md.DL3_2XKG.lean.js @@ -0,0 +1,29 @@ +import{_ as a,c as i,a2 as e,o as n}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"文档 & 网站","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/contribute/documentation.md","filePath":"zh-hans/contribute/documentation.md","lastUpdated":1687069487000}'),t={name:"zh-hans/contribute/documentation.md"};function l(p,s,h,k,d,r){return n(),i("div",null,s[0]||(s[0]=[e(`

文档 & 网站

文档 & 网站贡献指南。

初始化设置

在 Github 上 fork asdf 并且/或者使用 Git 克隆默认分支:

shell
# 克隆你 fork 的 asdf
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# 或者直接克隆 asdf
+git clone https://github.com/asdf-vm/asdf.git

文档网站开发所需的工具都在文件 docs/.tool-versions 中使用 asdf 进行管理。使用以下命令添加插件:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

使用以下命令安装工具版本:

shell
asdf install
  • Node.js:基于 Chrome 的 V8 引擎的 JavaScript 运行环境。

根据 docs/package.json 文件安装 Node.js 依赖:

shell
npm install

开发

Vuepress (v2) 是我们用来构建 asdf 文档网站的静态站点生成器(SSG)。它被选中来取代 Docsify.js,因为我们希望在用户没有可用或未启用 JavaScript 时支持仅依靠 HTML。Docsify 无法做到这一点。除此之外,两者特性集合大致相同,重点是 Vuepress 可以用最少的配置编写 Markdown 文件。

package.json 包含了开发所需的脚本:

@code json{3-5}

启动本地开发服务器:

shell
npm run dev

在提交之前格式化代码:

shell
npm run format

拉取请求、发布以及约定式提交

asdf 正在使用依赖 PR 标题中的约定式提交的自动化发布流水线。具体的文档可以查看 核心贡献指南.

当为文档更改创建 PR 请求时,请确保 PR 标题使用了约定式提交类型 docs 以及 docs: <description> 的格式。

Vuepress

网站的配置包含在几个 JavaScript 文件中,其中 JS 对象用于表示配置。它们是:

  • docs/.vuepress/config.js:网站的根配置文件。请查看 Vuepress 文档 了解更多详情。

为了简化根配置文件,更大的 JS 对象表示 导航栏和侧边栏 配置已经被提取并按照语言类型分隔开来。请参考以下文件:

  • docs/.vuepress/navbar.js
  • docs/.vuepress/sidebar.js

这些配置的官方文档位于 默认主题参考

I18n 国际化

Vuepress 有一流的国际化支持。根配置文件 docs/.vuepress/config.js 定义了支持的语言类型及其 URL、在选择下拉菜单中的标题以及导航栏/侧边栏配置引用。

导航栏/侧边栏配置在上述配置文件中捕获,按语言类型分隔开并单独导出。

每种语言的 markdown 内容必须位于与根配置文件中 locale 键同名的目录位置。也就是:

js
{
+  ...
+  themeConfig: {
+    locales: {
+      "/": {
+        selectLanguageName: "English (US)",
+        sidebar: sidebar.en,
+        navbar: navbar.en
+      },
+      "/pt-BR/": {
+        selectLanguageName: "Brazilian Portuguese",
+        sidebar: sidebar.pt_br,
+        navbar: navbar.pt_br
+      }
+    }
+  }
+}

/pt-BR/ 将要求 markdown 文件的同一集合位于 docs/pt-BR/ 目录下,如下所示:

shell
docs
+├─ README.md
+├─ foo.md
+├─ nested
+  └─ README.md
+└─ pt-BR
+   ├─ README.md
+   ├─ foo.md
+   └─ nested
+      └─ README.md

请查看 Vuepress i18n 国际化官方文档 了解更多详情。

`,37)]))}const g=a(t,[["render",l]]);export{c as __pageData,g as default}; diff --git a/assets/zh-hans_contribute_first-party-plugins.md.CaobaPwV.js b/assets/zh-hans_contribute_first-party-plugins.md.CaobaPwV.js new file mode 100644 index 00000000..c8ba361f --- /dev/null +++ b/assets/zh-hans_contribute_first-party-plugins.md.CaobaPwV.js @@ -0,0 +1 @@ +import{_ as a,c as r,a2 as t,o as s}from"./chunks/framework.C9NVOr0y.js";const p=JSON.parse('{"title":"官方插件","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/contribute/first-party-plugins.md","filePath":"zh-hans/contribute/first-party-plugins.md","lastUpdated":1643288544000}'),i={name:"zh-hans/contribute/first-party-plugins.md"};function l(o,e,n,d,f,c){return s(),r("div",null,e[0]||(e[0]=[t('

官方插件

asdf 核心团队已经开发了一些与他们日常工作相关的插件。随时欢迎大家维护和改进这些插件。这些插件所对应的存储库链接如下所示:

对于社区插件,请参考:

',5)]))}const u=a(i,[["render",l]]);export{p as __pageData,u as default}; diff --git a/assets/zh-hans_contribute_first-party-plugins.md.CaobaPwV.lean.js b/assets/zh-hans_contribute_first-party-plugins.md.CaobaPwV.lean.js new file mode 100644 index 00000000..c8ba361f --- /dev/null +++ b/assets/zh-hans_contribute_first-party-plugins.md.CaobaPwV.lean.js @@ -0,0 +1 @@ +import{_ as a,c as r,a2 as t,o as s}from"./chunks/framework.C9NVOr0y.js";const p=JSON.parse('{"title":"官方插件","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/contribute/first-party-plugins.md","filePath":"zh-hans/contribute/first-party-plugins.md","lastUpdated":1643288544000}'),i={name:"zh-hans/contribute/first-party-plugins.md"};function l(o,e,n,d,f,c){return s(),r("div",null,e[0]||(e[0]=[t('

官方插件

asdf 核心团队已经开发了一些与他们日常工作相关的插件。随时欢迎大家维护和改进这些插件。这些插件所对应的存储库链接如下所示:

对于社区插件,请参考:

',5)]))}const u=a(i,[["render",l]]);export{p as __pageData,u as default}; diff --git a/assets/zh-hans_contribute_github-actions.md.BMOvSElT.js b/assets/zh-hans_contribute_github-actions.md.BMOvSElT.js new file mode 100644 index 00000000..54622979 --- /dev/null +++ b/assets/zh-hans_contribute_github-actions.md.BMOvSElT.js @@ -0,0 +1 @@ +import{_ as n,c as s,j as t,a,o as i}from"./chunks/framework.C9NVOr0y.js";const p=JSON.parse('{"title":"GitHub Actions","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/contribute/github-actions.md","filePath":"zh-hans/contribute/github-actions.md","lastUpdated":1643288544000}'),o={name:"zh-hans/contribute/github-actions.md"};function r(c,e,h,d,u,l){return i(),s("div",null,e[0]||(e[0]=[t("h1",{id:"github-actions",tabindex:"-1"},[a("GitHub Actions "),t("a",{class:"header-anchor",href:"#github-actions","aria-label":'Permalink to "GitHub Actions"'},"​")],-1),t("p",null,[a("感谢你的关注,请参考 "),t("a",{href:"https://github.com/asdf-vm/actions",target:"_blank",rel:"noreferrer"},"asdf actions repo"),a(" 了解现有的问题、对话和贡献指南。")],-1)]))}const f=n(o,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/zh-hans_contribute_github-actions.md.BMOvSElT.lean.js b/assets/zh-hans_contribute_github-actions.md.BMOvSElT.lean.js new file mode 100644 index 00000000..54622979 --- /dev/null +++ b/assets/zh-hans_contribute_github-actions.md.BMOvSElT.lean.js @@ -0,0 +1 @@ +import{_ as n,c as s,j as t,a,o as i}from"./chunks/framework.C9NVOr0y.js";const p=JSON.parse('{"title":"GitHub Actions","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/contribute/github-actions.md","filePath":"zh-hans/contribute/github-actions.md","lastUpdated":1643288544000}'),o={name:"zh-hans/contribute/github-actions.md"};function r(c,e,h,d,u,l){return i(),s("div",null,e[0]||(e[0]=[t("h1",{id:"github-actions",tabindex:"-1"},[a("GitHub Actions "),t("a",{class:"header-anchor",href:"#github-actions","aria-label":'Permalink to "GitHub Actions"'},"​")],-1),t("p",null,[a("感谢你的关注,请参考 "),t("a",{href:"https://github.com/asdf-vm/actions",target:"_blank",rel:"noreferrer"},"asdf actions repo"),a(" 了解现有的问题、对话和贡献指南。")],-1)]))}const f=n(o,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/zh-hans_guide_getting-started.md.neLGUZQV.js b/assets/zh-hans_guide_getting-started.md.neLGUZQV.js new file mode 100644 index 00000000..af16ccb1 --- /dev/null +++ b/assets/zh-hans_guide_getting-started.md.neLGUZQV.js @@ -0,0 +1,13 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"快速入门","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/guide/getting-started.md","filePath":"zh-hans/guide/getting-started.md","lastUpdated":1724080713000}'),l={name:"zh-hans/guide/getting-started.md"};function h(n,s,p,d,o,k){return t(),a("div",null,s[0]||(s[0]=[e(`

快速入门

asdf 安装过程包括:

  1. 安装依赖
  2. 下载 asdf 核心
  3. 安装 asdf
  4. 为每一个你想要管理的工具/运行环境安装插件
  5. 安装工具/运行环境的一个版本
  6. 通过 .tool-versions 配置文件设置全局和项目版本

1. 安装依赖

asdf primarily requires git & curl. Here is a non-exhaustive list of commands to run for your package manager (some might automatically install these tools in later steps).

OSPackage ManagerCommand
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

Note

sudo may be required depending on your system configuration.

2. 下载 asdf

Official Download

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1

Community Supported Download Methods

We highly recommend using the official git method.

MethodCommand
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper

3. 安装 asdf

根据 Shell 脚本、操作系统和安装方法的组合不同,相应的配置也会不同。展开以下与你的系统最匹配的选项:

Bash & Git

~/.bashrc 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.sh"

补全功能必须在 .bashrc 文件中加入以下内容来配置完成:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

如果你正在使用 macOS Catalina 或者更新的版本, 默认的 shell 已经被修改为 ZSH。除非修改回 Bash, 否则请遵循 ZSH 的说明。

~/.bash_profile 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.sh"

补全功能必须在 .bash_profile 文件中使用以下内容手动配置完成:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

使用以下命令将 asdf.sh 加入到 ~/.bashrc 文件中:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bashrc

补全功能将需要 按照 Homebrew 的说明完成配置 或者执行以下命令:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Bash & Homebrew (macOS)

如果你正在使用 macOS Catalina 或者更新的版本, 默认的 shell 已经被修改为 ZSH。除非修改回 Bash, 否则请遵循 ZSH 的说明。

使用以下命令将 asdf.sh 加入到 ~/.bash_profile 文件中:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bash_profile

补全功能将需要 按照 Homebrew 的说明完成配置 或者执行以下命令:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Bash & Pacman

~/.bashrc 文件中加入以下内容:

shell
. /opt/asdf-vm/asdf.sh

为了让补全功能正常工作需要安装 bash-completion

Fish & Git

~/.config/fish/config.fish 文件中加入以下内容:

shell
source ~/.asdf/asdf.fish

补全功能必须按照以下命令手动配置完成:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

使用以下命令将 asdf.fish 加入到 ~/.config/fish/config.fish 文件中:

shell
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

Fish shell 的补全功能可以交给 Homebrew 处理. 很友好!

Fish & Pacman

~/.config/fish/config.fish 文件中加入以下内容:

shell
source /opt/asdf-vm/asdf.fish

补全功能将会在安装过程中由 AUR 包管理器自动配置完成。

Elvish & Git

使用以下命令将 asdf.elv 加入到 ~/.config/elvish/rc.elv 文件中:

shell
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

补全功能将会自动配置。

Elvish & Homebrew

使用以下命令将 asdf.elv 加入到 ~/.config/elvish/rc.elv 文件中:

shell
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

补全功能将会自动配置。

Elvish & Pacman

使用以下命令将 asdf.elv 加入到 ~/.config/elvish/rc.elv 文件中:

shell
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

补全功能将会自动配置。

ZSH & Git

~/.zshrc 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.sh"

或者 使用 ZSH 框架插件,比如 asdf for oh-my-zsh 将会使脚本生效并安装补全功能。

补全功能会被 ZSH 框架 asdf 插件或者通过在 .zshrc 文件中加入以下内容自动配置:

shell
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • 如果你正在使用自定义的 compinit 配置,请确保 compinitasdf.sh 生效位置的下方
  • 如果你正在使用自定义的 compinit 配置和 ZSH 框架,请确保 compinit 在框架生效位置的下方

警告

如果你正在使用 ZSH 框架,有关的 asdf 插件或许需要更新才能通过 fpath 正确地使用最新的 ZSH 补全功能。Oh-My-ZSH asdf 插件还在更新中,请查看 ohmyzsh/ohmyzsh#8837 了解更多。

ZSH & Homebrew

使用以下命令将 asdf.sh 加入到 ~/.zshrc 文件中:

shell
echo -e "\\n. $(brew --prefix asdf)/libexec/asdf.sh" >> \${ZDOTDIR:-~}/.zshrc

或者 使用 ZSH 框架插件,比如 asdf for oh-my-zsh 将会使脚本生效并安装补全功能。

补全功能可以被 ZSH 框架 asdf 或者 按照 Homebrew 的指引 完成配置。如果你正在使用 ZSH 框架,有关的 asdf 插件或许需要更新才能通过 fpath 正确地使用最新的 ZSH 补全功能。Oh-My-ZSH asdf 插件还在更新中,请查看 ohmyzsh/ohmyzsh#8837 了解更多。

ZSH & Pacman

~/.zshrc 文件中加入以下内容:

shell
. /opt/asdf-vm/asdf.sh

补全功能会被放在一个对 ZSH 很友好的位置,但是 ZSH 必须使用自动补全完成配置

PowerShell Core & Git

~/.config/powershell/profile.ps1 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

使用以下命令将 asdf.ps1 加入到 ~/.config/powershell/profile.ps1 文件中:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

~/.config/powershell/profile.ps1 文件中加入以下内容:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

使用以下命令将 asdf.nu 加入到 ~/.config/nushell/config.nu 文件中:

shell
"\\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

补全功能将会自动配置。

Nushell & Homebrew

使用以下命令将 asdf.nu 加入到 ~/.config/nushell/config.nu 文件中:

shell
"\\n$env.ASDF_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\\n source " +  (brew --prefix asdf | str trim | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path

补全功能将会自动配置。

Nushell & Pacman

使用以下命令将 asdf.nu 加入到 ~/.config/nushell/config.nu 文件中:

shell
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

补全功能将会自动配置。

POSIX Shell & Git

~/.profile 文件中加入以下内容:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

使用以下命令将 asdf.sh 加入到 ~/.profile 文件中:

shell
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
POSIX Shell & Pacman

~/.profile 文件中加入以下内容:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

asdf 脚本需要在设置好的 $PATH 之后和已经生效的框架(比如 oh-my-zsh 等等)之后的位置生效。

通常打开一个新的终端标签页来重启你的 shell 让 PATH 更改即时生效。

核心安装完成!

这样就完成了 asdf 核心的安装 🎉

asdf 仅在你安装插件工具和管理它们的版本时才开始真正发挥作用。请继续阅读下面的指南来了解这些是如何做到的。

4. 安装插件

出于演示目的,我们将通过 asdf-nodejs 插件来安装和设置 Node.js

插件依赖

每个插件都有依赖,所以我们需要确认应该列举了这些依赖的插件源码。对于 asdf-nodejs 来说,它们是:

操作系统安装依赖
Linux (Debian)apt-get install dirmngr gpg curl gawk
macOSbrew install gpg gawk

我们应该提前安装这些依赖,因为有些插件有 post-install 钩子。

安装插件

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. 安装指定版本

现在我们已经有了 Node.js 插件,所以我们可以开始安装某个版本了。

我们通过 asdf list all nodejs 可以看到所有可用的版本或者通过 asdf list all nodejs 14 查看版本子集。

我们将只安装最新可用的 latest 版本:

shell
asdf install nodejs latest

注意

asdf 强制使用准确的版本。latest 是一个通过 asdf 来解析到执行时刻的实际版本号的辅助工具。

6. 设置默认版本

asdf 在从当前工作目录一直到 $HOME 目录的所有 .tool-versions 文件中进行工具的版本查找。查找在执行 asdf 管理的工具时实时发生。

警告

如果没有为工具找到指定的版本,则会出现错误asdf current 将显示当前目录中的工具和版本解析结果,或者不存在,以便你可以观察哪些工具将无法执行。

全局

全局默认配置在 $HOME/.tool-versions 文件中进行管理。使用以下命令可以设置一个全局版本:

shell
asdf global nodejs latest

$HOME/.tool-versions 文件内容将会如下所示:

nodejs 16.5.0

某些操作系统已经有一些由系统而非 asdf 安装和管理的工具了,python 就是一个常见的例子。你需要告诉 asdf 将管理权还给系统。版本参考部分 将会引导你。

本地

本地版本被定义在 $PWD/.tool-versions 文件中(当前工作目录)。通常,这将会是一个项目的 Git 存储库。当在你想要的目录执行:

shell
asdf local nodejs latest

$PWD/.tool-versions 文件内容将会如下所示:

nodejs 16.5.0

使用现有工具版本文件

asdf 支持从其他版本管理器的现有版本文件中迁移过来,比如 rbenv.ruby-version 文件。这在每个插件中都原生支持。

asdf-nodejs 支持从 .nvmrc.node-version 文件进行迁移。为了启用此功能,请在 asdf 配置文件 $HOME/.asdfrc 中加入以下内容:

legacy_version_file = yes

请查看 配置 参考页面可以了解更多配置选项。

完成指南!

恭喜你完成了 asdf 的快速上手 🎉 你现在可以管理你的项目的 nodejs 版本了。对于项目中的其他工具类型可以执行类似步骤即可!

asdf 还有更多命令需要熟悉,你可以通过运行 asdf --help 或者 asdf 来查看它们。命令主要分为三类:

`,80)]))}const g=i(l,[["render",h]]);export{c as __pageData,g as default}; diff --git a/assets/zh-hans_guide_getting-started.md.neLGUZQV.lean.js b/assets/zh-hans_guide_getting-started.md.neLGUZQV.lean.js new file mode 100644 index 00000000..af16ccb1 --- /dev/null +++ b/assets/zh-hans_guide_getting-started.md.neLGUZQV.lean.js @@ -0,0 +1,13 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"快速入门","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/guide/getting-started.md","filePath":"zh-hans/guide/getting-started.md","lastUpdated":1724080713000}'),l={name:"zh-hans/guide/getting-started.md"};function h(n,s,p,d,o,k){return t(),a("div",null,s[0]||(s[0]=[e(`

快速入门

asdf 安装过程包括:

  1. 安装依赖
  2. 下载 asdf 核心
  3. 安装 asdf
  4. 为每一个你想要管理的工具/运行环境安装插件
  5. 安装工具/运行环境的一个版本
  6. 通过 .tool-versions 配置文件设置全局和项目版本

1. 安装依赖

asdf primarily requires git & curl. Here is a non-exhaustive list of commands to run for your package manager (some might automatically install these tools in later steps).

OSPackage ManagerCommand
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

Note

sudo may be required depending on your system configuration.

2. 下载 asdf

Official Download

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1

Community Supported Download Methods

We highly recommend using the official git method.

MethodCommand
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper

3. 安装 asdf

根据 Shell 脚本、操作系统和安装方法的组合不同,相应的配置也会不同。展开以下与你的系统最匹配的选项:

Bash & Git

~/.bashrc 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.sh"

补全功能必须在 .bashrc 文件中加入以下内容来配置完成:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

如果你正在使用 macOS Catalina 或者更新的版本, 默认的 shell 已经被修改为 ZSH。除非修改回 Bash, 否则请遵循 ZSH 的说明。

~/.bash_profile 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.sh"

补全功能必须在 .bash_profile 文件中使用以下内容手动配置完成:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

使用以下命令将 asdf.sh 加入到 ~/.bashrc 文件中:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bashrc

补全功能将需要 按照 Homebrew 的说明完成配置 或者执行以下命令:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Bash & Homebrew (macOS)

如果你正在使用 macOS Catalina 或者更新的版本, 默认的 shell 已经被修改为 ZSH。除非修改回 Bash, 否则请遵循 ZSH 的说明。

使用以下命令将 asdf.sh 加入到 ~/.bash_profile 文件中:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bash_profile

补全功能将需要 按照 Homebrew 的说明完成配置 或者执行以下命令:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Bash & Pacman

~/.bashrc 文件中加入以下内容:

shell
. /opt/asdf-vm/asdf.sh

为了让补全功能正常工作需要安装 bash-completion

Fish & Git

~/.config/fish/config.fish 文件中加入以下内容:

shell
source ~/.asdf/asdf.fish

补全功能必须按照以下命令手动配置完成:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

使用以下命令将 asdf.fish 加入到 ~/.config/fish/config.fish 文件中:

shell
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

Fish shell 的补全功能可以交给 Homebrew 处理. 很友好!

Fish & Pacman

~/.config/fish/config.fish 文件中加入以下内容:

shell
source /opt/asdf-vm/asdf.fish

补全功能将会在安装过程中由 AUR 包管理器自动配置完成。

Elvish & Git

使用以下命令将 asdf.elv 加入到 ~/.config/elvish/rc.elv 文件中:

shell
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

补全功能将会自动配置。

Elvish & Homebrew

使用以下命令将 asdf.elv 加入到 ~/.config/elvish/rc.elv 文件中:

shell
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

补全功能将会自动配置。

Elvish & Pacman

使用以下命令将 asdf.elv 加入到 ~/.config/elvish/rc.elv 文件中:

shell
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

补全功能将会自动配置。

ZSH & Git

~/.zshrc 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.sh"

或者 使用 ZSH 框架插件,比如 asdf for oh-my-zsh 将会使脚本生效并安装补全功能。

补全功能会被 ZSH 框架 asdf 插件或者通过在 .zshrc 文件中加入以下内容自动配置:

shell
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • 如果你正在使用自定义的 compinit 配置,请确保 compinitasdf.sh 生效位置的下方
  • 如果你正在使用自定义的 compinit 配置和 ZSH 框架,请确保 compinit 在框架生效位置的下方

警告

如果你正在使用 ZSH 框架,有关的 asdf 插件或许需要更新才能通过 fpath 正确地使用最新的 ZSH 补全功能。Oh-My-ZSH asdf 插件还在更新中,请查看 ohmyzsh/ohmyzsh#8837 了解更多。

ZSH & Homebrew

使用以下命令将 asdf.sh 加入到 ~/.zshrc 文件中:

shell
echo -e "\\n. $(brew --prefix asdf)/libexec/asdf.sh" >> \${ZDOTDIR:-~}/.zshrc

或者 使用 ZSH 框架插件,比如 asdf for oh-my-zsh 将会使脚本生效并安装补全功能。

补全功能可以被 ZSH 框架 asdf 或者 按照 Homebrew 的指引 完成配置。如果你正在使用 ZSH 框架,有关的 asdf 插件或许需要更新才能通过 fpath 正确地使用最新的 ZSH 补全功能。Oh-My-ZSH asdf 插件还在更新中,请查看 ohmyzsh/ohmyzsh#8837 了解更多。

ZSH & Pacman

~/.zshrc 文件中加入以下内容:

shell
. /opt/asdf-vm/asdf.sh

补全功能会被放在一个对 ZSH 很友好的位置,但是 ZSH 必须使用自动补全完成配置

PowerShell Core & Git

~/.config/powershell/profile.ps1 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

使用以下命令将 asdf.ps1 加入到 ~/.config/powershell/profile.ps1 文件中:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

~/.config/powershell/profile.ps1 文件中加入以下内容:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

使用以下命令将 asdf.nu 加入到 ~/.config/nushell/config.nu 文件中:

shell
"\\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

补全功能将会自动配置。

Nushell & Homebrew

使用以下命令将 asdf.nu 加入到 ~/.config/nushell/config.nu 文件中:

shell
"\\n$env.ASDF_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\\n source " +  (brew --prefix asdf | str trim | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path

补全功能将会自动配置。

Nushell & Pacman

使用以下命令将 asdf.nu 加入到 ~/.config/nushell/config.nu 文件中:

shell
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

补全功能将会自动配置。

POSIX Shell & Git

~/.profile 文件中加入以下内容:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

使用以下命令将 asdf.sh 加入到 ~/.profile 文件中:

shell
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
POSIX Shell & Pacman

~/.profile 文件中加入以下内容:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

asdf 脚本需要在设置好的 $PATH 之后和已经生效的框架(比如 oh-my-zsh 等等)之后的位置生效。

通常打开一个新的终端标签页来重启你的 shell 让 PATH 更改即时生效。

核心安装完成!

这样就完成了 asdf 核心的安装 🎉

asdf 仅在你安装插件工具和管理它们的版本时才开始真正发挥作用。请继续阅读下面的指南来了解这些是如何做到的。

4. 安装插件

出于演示目的,我们将通过 asdf-nodejs 插件来安装和设置 Node.js

插件依赖

每个插件都有依赖,所以我们需要确认应该列举了这些依赖的插件源码。对于 asdf-nodejs 来说,它们是:

操作系统安装依赖
Linux (Debian)apt-get install dirmngr gpg curl gawk
macOSbrew install gpg gawk

我们应该提前安装这些依赖,因为有些插件有 post-install 钩子。

安装插件

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. 安装指定版本

现在我们已经有了 Node.js 插件,所以我们可以开始安装某个版本了。

我们通过 asdf list all nodejs 可以看到所有可用的版本或者通过 asdf list all nodejs 14 查看版本子集。

我们将只安装最新可用的 latest 版本:

shell
asdf install nodejs latest

注意

asdf 强制使用准确的版本。latest 是一个通过 asdf 来解析到执行时刻的实际版本号的辅助工具。

6. 设置默认版本

asdf 在从当前工作目录一直到 $HOME 目录的所有 .tool-versions 文件中进行工具的版本查找。查找在执行 asdf 管理的工具时实时发生。

警告

如果没有为工具找到指定的版本,则会出现错误asdf current 将显示当前目录中的工具和版本解析结果,或者不存在,以便你可以观察哪些工具将无法执行。

全局

全局默认配置在 $HOME/.tool-versions 文件中进行管理。使用以下命令可以设置一个全局版本:

shell
asdf global nodejs latest

$HOME/.tool-versions 文件内容将会如下所示:

nodejs 16.5.0

某些操作系统已经有一些由系统而非 asdf 安装和管理的工具了,python 就是一个常见的例子。你需要告诉 asdf 将管理权还给系统。版本参考部分 将会引导你。

本地

本地版本被定义在 $PWD/.tool-versions 文件中(当前工作目录)。通常,这将会是一个项目的 Git 存储库。当在你想要的目录执行:

shell
asdf local nodejs latest

$PWD/.tool-versions 文件内容将会如下所示:

nodejs 16.5.0

使用现有工具版本文件

asdf 支持从其他版本管理器的现有版本文件中迁移过来,比如 rbenv.ruby-version 文件。这在每个插件中都原生支持。

asdf-nodejs 支持从 .nvmrc.node-version 文件进行迁移。为了启用此功能,请在 asdf 配置文件 $HOME/.asdfrc 中加入以下内容:

legacy_version_file = yes

请查看 配置 参考页面可以了解更多配置选项。

完成指南!

恭喜你完成了 asdf 的快速上手 🎉 你现在可以管理你的项目的 nodejs 版本了。对于项目中的其他工具类型可以执行类似步骤即可!

asdf 还有更多命令需要熟悉,你可以通过运行 asdf --help 或者 asdf 来查看它们。命令主要分为三类:

`,80)]))}const g=i(l,[["render",h]]);export{c as __pageData,g as default}; diff --git a/assets/zh-hans_guide_introduction.md.4qLfdOnh.js b/assets/zh-hans_guide_introduction.md.4qLfdOnh.js new file mode 100644 index 00000000..57060df9 --- /dev/null +++ b/assets/zh-hans_guide_introduction.md.4qLfdOnh.js @@ -0,0 +1 @@ +import{_ as a,c as r,a2 as o,o as t}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"项目简介","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/guide/introduction.md","filePath":"zh-hans/guide/introduction.md","lastUpdated":1643288544000}'),d={name:"zh-hans/guide/introduction.md"};function n(i,e,s,c,l,h){return t(),r("div",null,e[0]||(e[0]=[o('

项目简介

asdf 是一个工具版本管理器。所有的工具版本定义都包含在一个文件(.tool-versions)中,你可以将配置文件放在项目的 Git 存储库中以便于和团队其他成员共享,从而确保每个人都使用完全相同的工具版本。

传统工作方式需要多个命令行版本管理器,而且每个管理器都有其不同的 API、配置文件和实现方式(比如,$PATH 操作、垫片、环境变量等等)。asdf 提供单个交互方式和配置文件来简化开发工作流程,并可通过简单的插件接口扩展到所有工具和运行环境。

它是如何工作的

一旦 asdf 核心在 Shell 配置中设置好之后,你可以安装插件来管理特定的工具。当通过插件安装工具时,安装的可执行程序会为每个可执行程序创建 垫片。当你尝试运行其中一个可执行程序时,将运行垫片,从而允许 asdf 识别 .tool-versions 文件中设置的工具版本并执行该版本。

相关项目

nvm / n / rbenv 等

nvm, nrbenv 等工具都是用 Shell 脚本写的,这些脚本能为工具安装的可执行程序创建垫片。

asdf 非常相似,目的是在工具/运行环境版本管理领域竞争。asdf 的区别之处在于它的插件系统,它消除了每个工具/运行环境对管理工具的需求、每个管理工具的不同命令以及存储库中不同的*-版本文件。

direnv

使用可以根据当前目录加载和卸载环境变量的新功能增强现有 shell。

asdf 不管理环境变量,但是有一个插件 asdf-direnv 可以用来集成 direnv 的特性到 asdf 中。

请查看 direnv 文档 了解更多。

Homebrew

macOS(或者 Linux)上缺失包的管理器

Homebrew 管理你的软件包及其上游依赖。asdf 不管理上游依赖,它不是包管理器。这个责任取决于用户,尽管我们试图保持依赖关系列表很小。

请查看 Homebrew 文档 了解更多。

NixOS

Nix 是一种采用独特方法进行软件包管理和系统配置的工具

NixOS 旨在通过管理每个工具的整个依赖关系树中软件包的确切版本来构建真正可重复的环境,有些是 asdf 无法做到的。NixOS 使用自己的编程语言、许多命令行工具和超过 60,000 个包的包集合来实现这一点。

同样,asdf 不管理上游依赖,并且它不是一个包管理器。

请查看 NixOS 文档 了解更多。

为什么使用 asdf?

asdf 确保团队可以使用完全相同的工具版本,通过插件系统支持很多工具,以及作为 Shell 配置中包含的单个 Shell 脚本的 简单性和熟悉性

注意

asdf 并不打算成为一个系统包管理器。它是一个工具版本管理器。仅仅因为你可以为任何工具创建插件并使用 asdf 管理其版本,并不意味着这是这个特定工具的最佳实践方案。

',25)]))}const b=a(d,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/zh-hans_guide_introduction.md.4qLfdOnh.lean.js b/assets/zh-hans_guide_introduction.md.4qLfdOnh.lean.js new file mode 100644 index 00000000..57060df9 --- /dev/null +++ b/assets/zh-hans_guide_introduction.md.4qLfdOnh.lean.js @@ -0,0 +1 @@ +import{_ as a,c as r,a2 as o,o as t}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"项目简介","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/guide/introduction.md","filePath":"zh-hans/guide/introduction.md","lastUpdated":1643288544000}'),d={name:"zh-hans/guide/introduction.md"};function n(i,e,s,c,l,h){return t(),r("div",null,e[0]||(e[0]=[o('

项目简介

asdf 是一个工具版本管理器。所有的工具版本定义都包含在一个文件(.tool-versions)中,你可以将配置文件放在项目的 Git 存储库中以便于和团队其他成员共享,从而确保每个人都使用完全相同的工具版本。

传统工作方式需要多个命令行版本管理器,而且每个管理器都有其不同的 API、配置文件和实现方式(比如,$PATH 操作、垫片、环境变量等等)。asdf 提供单个交互方式和配置文件来简化开发工作流程,并可通过简单的插件接口扩展到所有工具和运行环境。

它是如何工作的

一旦 asdf 核心在 Shell 配置中设置好之后,你可以安装插件来管理特定的工具。当通过插件安装工具时,安装的可执行程序会为每个可执行程序创建 垫片。当你尝试运行其中一个可执行程序时,将运行垫片,从而允许 asdf 识别 .tool-versions 文件中设置的工具版本并执行该版本。

相关项目

nvm / n / rbenv 等

nvm, nrbenv 等工具都是用 Shell 脚本写的,这些脚本能为工具安装的可执行程序创建垫片。

asdf 非常相似,目的是在工具/运行环境版本管理领域竞争。asdf 的区别之处在于它的插件系统,它消除了每个工具/运行环境对管理工具的需求、每个管理工具的不同命令以及存储库中不同的*-版本文件。

direnv

使用可以根据当前目录加载和卸载环境变量的新功能增强现有 shell。

asdf 不管理环境变量,但是有一个插件 asdf-direnv 可以用来集成 direnv 的特性到 asdf 中。

请查看 direnv 文档 了解更多。

Homebrew

macOS(或者 Linux)上缺失包的管理器

Homebrew 管理你的软件包及其上游依赖。asdf 不管理上游依赖,它不是包管理器。这个责任取决于用户,尽管我们试图保持依赖关系列表很小。

请查看 Homebrew 文档 了解更多。

NixOS

Nix 是一种采用独特方法进行软件包管理和系统配置的工具

NixOS 旨在通过管理每个工具的整个依赖关系树中软件包的确切版本来构建真正可重复的环境,有些是 asdf 无法做到的。NixOS 使用自己的编程语言、许多命令行工具和超过 60,000 个包的包集合来实现这一点。

同样,asdf 不管理上游依赖,并且它不是一个包管理器。

请查看 NixOS 文档 了解更多。

为什么使用 asdf?

asdf 确保团队可以使用完全相同的工具版本,通过插件系统支持很多工具,以及作为 Shell 配置中包含的单个 Shell 脚本的 简单性和熟悉性

注意

asdf 并不打算成为一个系统包管理器。它是一个工具版本管理器。仅仅因为你可以为任何工具创建插件并使用 asdf 管理其版本,并不意味着这是这个特定工具的最佳实践方案。

',25)]))}const b=a(d,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/zh-hans_index.md.DQ8VBECv.js b/assets/zh-hans_index.md.DQ8VBECv.js new file mode 100644 index 00000000..627e3765 --- /dev/null +++ b/assets/zh-hans_index.md.DQ8VBECv.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as i}from"./chunks/framework.C9NVOr0y.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"asdf","text":"多运行时版本管理器","tagline":"使用一个工具管理所有运行时版本!","actions":[{"theme":"brand","text":"快速上手","link":"/zh-hans/guide/getting-started"},{"theme":"alt","text":"什么是asdf?","link":"/zh-hans/guide/introduction"},{"theme":"alt","text":"在 Github 上查看","link":"https://github.com/asdf-vm/asdf"}]},"features":[{"title":"一个工具","details":"使用单个命令行工具和命令界面管理你的每个项目运行环境。","icon":"🎉"},{"title":"插件","details":"现有运行环境和工具的大型生态系统。简单 API 用于根据需要添加对新工具的支持!","icon":"🔌"},{"title":"向后兼容","details":"支持从现有配置文件 .nvmrc、.node-version、.ruby-version 平滑迁移!","icon":"⏮"},{"title":"一个配置文件","details":"一个可共享的 .tool-versions 配置文件管理所有工具、运行环境及其版本。","icon":"📄"},{"title":"Shells","details":"支持 Bash、ZSH、Fish 和 Elvish,并提供补全功能。","icon":"🐚"},{"title":"GitHub Actions","details":"提供 Github Action 在 CI/CD 工作流中安装和使用 .tool-versions。","icon":"🤖"}]},"headers":[],"relativePath":"zh-hans/index.md","filePath":"zh-hans/index.md","lastUpdated":1700090238000}'),n={name:"zh-hans/index.md"};function a(s,o,d,l,r,c){return i(),e("div")}const u=t(n,[["render",a]]);export{m as __pageData,u as default}; diff --git a/assets/zh-hans_index.md.DQ8VBECv.lean.js b/assets/zh-hans_index.md.DQ8VBECv.lean.js new file mode 100644 index 00000000..627e3765 --- /dev/null +++ b/assets/zh-hans_index.md.DQ8VBECv.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as i}from"./chunks/framework.C9NVOr0y.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"asdf","text":"多运行时版本管理器","tagline":"使用一个工具管理所有运行时版本!","actions":[{"theme":"brand","text":"快速上手","link":"/zh-hans/guide/getting-started"},{"theme":"alt","text":"什么是asdf?","link":"/zh-hans/guide/introduction"},{"theme":"alt","text":"在 Github 上查看","link":"https://github.com/asdf-vm/asdf"}]},"features":[{"title":"一个工具","details":"使用单个命令行工具和命令界面管理你的每个项目运行环境。","icon":"🎉"},{"title":"插件","details":"现有运行环境和工具的大型生态系统。简单 API 用于根据需要添加对新工具的支持!","icon":"🔌"},{"title":"向后兼容","details":"支持从现有配置文件 .nvmrc、.node-version、.ruby-version 平滑迁移!","icon":"⏮"},{"title":"一个配置文件","details":"一个可共享的 .tool-versions 配置文件管理所有工具、运行环境及其版本。","icon":"📄"},{"title":"Shells","details":"支持 Bash、ZSH、Fish 和 Elvish,并提供补全功能。","icon":"🐚"},{"title":"GitHub Actions","details":"提供 Github Action 在 CI/CD 工作流中安装和使用 .tool-versions。","icon":"🤖"}]},"headers":[],"relativePath":"zh-hans/index.md","filePath":"zh-hans/index.md","lastUpdated":1700090238000}'),n={name:"zh-hans/index.md"};function a(s,o,d,l,r,c){return i(),e("div")}const u=t(n,[["render",a]]);export{m as __pageData,u as default}; diff --git a/assets/zh-hans_manage_commands.md.BJVPpY77.js b/assets/zh-hans_manage_commands.md.BJVPpY77.js new file mode 100644 index 00000000..8da8fe39 --- /dev/null +++ b/assets/zh-hans_manage_commands.md.BJVPpY77.js @@ -0,0 +1,66 @@ +import{_ as a,c as n,a2 as e,o as p}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"所有命令","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/manage/commands.md","filePath":"zh-hans/manage/commands.md","lastUpdated":1687069487000}'),l={name:"zh-hans/manage/commands.md"};function t(i,s,o,c,r,d){return p(),n("div",null,s[0]||(s[0]=[e(`

所有命令

asdf 中所有可用命令的列表。这个列表就是 asdf help 命令的打印内容。

txt
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>]      Add a plugin from the plugin repo OR,
+                                        add a Git repo as a plugin by
+                                        specifying the name and repo url
+asdf plugin list [--urls] [--refs]      List installed plugins. Optionally show
+                                        git urls and git-ref
+asdf plugin list all                    List plugins registered on asdf-plugins
+                                        repository with URLs
+asdf plugin remove <name>               Remove plugin and package versions
+asdf plugin update <name> [<git-ref>]   Update a plugin to latest commit on
+                                        default branch or a particular git-ref
+asdf plugin update --all                Update all plugins to latest commit on
+                                        default branch
+
+
+MANAGE PACKAGES
+asdf current                            Display current version set or being
+                                        used for all packages
+asdf current <name>                     Display current version set or being
+                                        used for package
+asdf global <name> <version>            Set the package global version
+asdf global <name> latest[:<version>]   Set the package global version to the
+                                        latest provided version
+asdf help <name> [<version>]            Output documentation for plugin and tool
+asdf install                            Install all the package versions listed
+                                        in the .tool-versions file
+asdf install <name>                     Install one tool at the version
+                                        specified in the .tool-versions file
+asdf install <name> <version>           Install a specific version of a package
+asdf install <name> latest[:<version>]  Install the latest stable version of a
+                                        package, or with optional version,
+                                        install the latest stable version that
+                                        begins with the given string
+asdf latest <name> [<version>]          Show latest stable version of a package
+asdf latest --all                       Show latest stable version of all the
+                                        packages and if they are installed
+asdf list <name> [version]              List installed versions of a package and
+                                        optionally filter the versions
+asdf list all <name> [<version>]        List all versions of a package and
+                                        optionally filter the returned versions
+asdf local <name> <version>             Set the package local version
+asdf local <name> latest[:<version>]    Set the package local version to the
+                                        latest provided version
+asdf shell <name> <version>             Set the package version to
+                                        \`ASDF_\${LANG}_VERSION\` in the current shell
+asdf uninstall <name> <version>         Remove a specific version of a package
+asdf where <name> [<version>]           Display install path for an installed
+                                        or current version
+asdf which <command>                    Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...]           Executes the command shim for current version
+asdf env <command> [util]               Runs util (default: \`env\`) inside the
+                                        environment used for command shim execution.
+asdf info                               Print OS, Shell and ASDF debug information.
+asdf version                            Print the currently installed version of ASDF
+asdf reshim <name> <version>            Recreate shims for version of a package
+asdf shim-versions <command>            List the plugins and versions that
+                                        provide a command
+asdf update                             Update asdf to the latest stable release
+asdf update --head                      Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs:   https://asdf-vm.com
`,3)]))}const h=a(l,[["render",t]]);export{f as __pageData,h as default}; diff --git a/assets/zh-hans_manage_commands.md.BJVPpY77.lean.js b/assets/zh-hans_manage_commands.md.BJVPpY77.lean.js new file mode 100644 index 00000000..8da8fe39 --- /dev/null +++ b/assets/zh-hans_manage_commands.md.BJVPpY77.lean.js @@ -0,0 +1,66 @@ +import{_ as a,c as n,a2 as e,o as p}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"所有命令","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/manage/commands.md","filePath":"zh-hans/manage/commands.md","lastUpdated":1687069487000}'),l={name:"zh-hans/manage/commands.md"};function t(i,s,o,c,r,d){return p(),n("div",null,s[0]||(s[0]=[e(`

所有命令

asdf 中所有可用命令的列表。这个列表就是 asdf help 命令的打印内容。

txt
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>]      Add a plugin from the plugin repo OR,
+                                        add a Git repo as a plugin by
+                                        specifying the name and repo url
+asdf plugin list [--urls] [--refs]      List installed plugins. Optionally show
+                                        git urls and git-ref
+asdf plugin list all                    List plugins registered on asdf-plugins
+                                        repository with URLs
+asdf plugin remove <name>               Remove plugin and package versions
+asdf plugin update <name> [<git-ref>]   Update a plugin to latest commit on
+                                        default branch or a particular git-ref
+asdf plugin update --all                Update all plugins to latest commit on
+                                        default branch
+
+
+MANAGE PACKAGES
+asdf current                            Display current version set or being
+                                        used for all packages
+asdf current <name>                     Display current version set or being
+                                        used for package
+asdf global <name> <version>            Set the package global version
+asdf global <name> latest[:<version>]   Set the package global version to the
+                                        latest provided version
+asdf help <name> [<version>]            Output documentation for plugin and tool
+asdf install                            Install all the package versions listed
+                                        in the .tool-versions file
+asdf install <name>                     Install one tool at the version
+                                        specified in the .tool-versions file
+asdf install <name> <version>           Install a specific version of a package
+asdf install <name> latest[:<version>]  Install the latest stable version of a
+                                        package, or with optional version,
+                                        install the latest stable version that
+                                        begins with the given string
+asdf latest <name> [<version>]          Show latest stable version of a package
+asdf latest --all                       Show latest stable version of all the
+                                        packages and if they are installed
+asdf list <name> [version]              List installed versions of a package and
+                                        optionally filter the versions
+asdf list all <name> [<version>]        List all versions of a package and
+                                        optionally filter the returned versions
+asdf local <name> <version>             Set the package local version
+asdf local <name> latest[:<version>]    Set the package local version to the
+                                        latest provided version
+asdf shell <name> <version>             Set the package version to
+                                        \`ASDF_\${LANG}_VERSION\` in the current shell
+asdf uninstall <name> <version>         Remove a specific version of a package
+asdf where <name> [<version>]           Display install path for an installed
+                                        or current version
+asdf which <command>                    Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...]           Executes the command shim for current version
+asdf env <command> [util]               Runs util (default: \`env\`) inside the
+                                        environment used for command shim execution.
+asdf info                               Print OS, Shell and ASDF debug information.
+asdf version                            Print the currently installed version of ASDF
+asdf reshim <name> <version>            Recreate shims for version of a package
+asdf shim-versions <command>            List the plugins and versions that
+                                        provide a command
+asdf update                             Update asdf to the latest stable release
+asdf update --head                      Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs:   https://asdf-vm.com
`,3)]))}const h=a(l,[["render",t]]);export{f as __pageData,h as default}; diff --git a/assets/zh-hans_manage_configuration.md.DckznVe9.js b/assets/zh-hans_manage_configuration.md.DckznVe9.js new file mode 100644 index 00000000..31c68596 --- /dev/null +++ b/assets/zh-hans_manage_configuration.md.DckznVe9.js @@ -0,0 +1,9 @@ +import{_ as d,c as n,a2 as a,j as e,a as t,G as o,B as i,o as r}from"./chunks/framework.C9NVOr0y.js";const A=JSON.parse('{"title":"配置","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/manage/configuration.md","filePath":"zh-hans/manage/configuration.md","lastUpdated":1687069487000}'),p={name:"zh-hans/manage/configuration.md"},u={tabindex:"0"},c={style:{"text-align":"left"}},f={tabindex:"0"},g={style:{"text-align":"left"}},y={tabindex:"0"},b={style:{"text-align":"left"}},v={tabindex:"0"},x={style:{"text-align":"left"}};function m(h,l,k,P,q,w){const s=i("Badge");return r(),n("div",null,[l[28]||(l[28]=a(`

配置

asdf 配置既包括可共享的 .tool-versions 文件,也包括用户特定的自定义 .asdfrc 和环境变量。

.tool-versions

无论何时 .tool-versions 出现在目录中,它所声明的工具版本将会被用于该目录和任意子目录。

注意

全局默认配置将设置在文件$HOME/.tool-versions

一个 .tool-versions 文件示例如下所示:

ruby 2.5.3
+nodejs 10.15.0

你也可以包含注释在里面:

ruby 2.5.3 # 这是一个注释
+# 这是另一个注释
+nodejs 10.15.0

版本号可以有如下格式:

  • 10.15.0 - 实际的版本号。支持下载二进制文件的插件将会下载二进制文件。
  • ref:v1.0.2-a 或者 ref:39cb398vb39 - 指定标签/提交/分支从 github 下载并编译。
  • path:~/src/elixir - 要使用的工具的自定义编译版本的路径。这种方式供语言开发者等使用。
  • system - 此关键字会导致 asdf 传递系统上未由 asdf 管理的工具版本。

提示

多版本可以通过空格将它们分隔开来。比如,使用 Python 3.7.2 回退到 Python 2.7.15 最后回退到 system Python,可以将以下行的内容添加到 .tool-versions 文件中。

python 3.7.2 2.7.15 system

为了安装 .tool-versions 文件中定义的所有工具,在包含 .tool-versions 文件的目录中不带其他参数执行 asdf install 命令。

为了安装 .tool-versions 文件中定义的某个工具,在包含 .tool-versions 文件的目录中运行 asdf install <name> 命令。这个工具将会安装 .tool-versions 文件所指定的版本。

可以直接编辑这个文件或者使用 asdf local (或者 asdf global)来更新工具版本。

$HOME/.asdfrc

给你的家目录添加一个 .asdfrc 文件然后 asdf 将会使用这个文件所指定的配置。下面的文件展示了所需的格式,其中包含用于演示的默认值:

txt
legacy_version_file = no
+use_release_candidates = no
+always_keep_download = no
+plugin_repository_last_check_duration = 60
+disable_plugin_short_name_repository = no
+concurrency = auto

legacy_version_file

插件 支持 读取其他版本管理器使用的版本文件,比如,Ruby 的 rbenv.ruby-version 文件。

`,20)),e("table",u,[l[4]||(l[4]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"选项"),e("th",{style:{"text-align":"left"}},"描述")])],-1)),e("tbody",null,[e("tr",null,[e("td",c,[l[0]||(l[0]=e("code",null,"no",-1)),l[1]||(l[1]=t()),o(s,{type:"tip",text:"默认",vertical:"middle"})]),l[2]||(l[2]=e("td",{style:{"text-align":"left"}},[t("从 "),e("code",null,".tool-versions"),t(" 文件读取版本")],-1))]),l[3]||(l[3]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},[t("如果可行的话,从传统版本文件读取版本("),e("code",null,".ruby-versions"),t(")")])],-1))])]),l[29]||(l[29]=e("h3",{id:"use-release-candidates",tabindex:"-1"},[e("code",null,"use_release_candidates"),t(),e("a",{class:"header-anchor",href:"#use-release-candidates","aria-label":'Permalink to "`use_release_candidates`"'},"​")],-1)),l[30]||(l[30]=e("p",null,[t("配置 "),e("code",null,"asdf update"),t(" 命令以升级到最新的候选版本,而不是最新的语义版本。")],-1)),e("table",f,[l[9]||(l[9]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"选项"),e("th",{style:{"text-align":"left"}},"描述")])],-1)),e("tbody",null,[e("tr",null,[e("td",g,[l[5]||(l[5]=e("code",null,"no",-1)),l[6]||(l[6]=t()),o(s,{type:"tip",text:"默认",vertical:"middle"})]),l[7]||(l[7]=e("td",{style:{"text-align":"left"}},"语义版本被使用",-1))]),l[8]||(l[8]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"候选版本被使用")],-1))])]),l[31]||(l[31]=e("h3",{id:"always-keep-download",tabindex:"-1"},[e("code",null,"always_keep_download"),t(),e("a",{class:"header-anchor",href:"#always-keep-download","aria-label":'Permalink to "`always_keep_download`"'},"​")],-1)),l[32]||(l[32]=e("p",null,[t("配置 "),e("code",null,"asdf install"),t(" 命令以保留或删除下载的源代码或二进制文件。")],-1)),e("table",y,[l[14]||(l[14]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"选项"),e("th",{style:{"text-align":"left"}},"描述")])],-1)),e("tbody",null,[e("tr",null,[e("td",b,[l[10]||(l[10]=e("code",null,"no",-1)),l[11]||(l[11]=t()),o(s,{type:"tip",text:"默认",vertical:"middle"})]),l[12]||(l[12]=e("td",{style:{"text-align":"left"}},"在成功安装后删除源代码或二进制文件",-1))]),l[13]||(l[13]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"在成功安装后保留源代码或二进制文件")],-1))])]),l[33]||(l[33]=e("h3",{id:"plugin-repository-last-check-duration",tabindex:"-1"},[e("code",null,"plugin_repository_last_check_duration"),t(),e("a",{class:"header-anchor",href:"#plugin-repository-last-check-duration","aria-label":'Permalink to "`plugin_repository_last_check_duration`"'},"​")],-1)),l[34]||(l[34]=e("p",null,[t("配置自上次 asdf 插件存储库同步到下一次存储库同步的持续时间。命令 "),e("code",null,"asdf plugin add "),t(" 或者 "),e("code",null,"asdf plugin list all"),t(" 将会触发持续时间的检查,如果持续时间已过,则进行同步。")],-1)),e("table",v,[l[27]||(l[27]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"选项"),e("th",{style:{"text-align":"left"}},"描述")])],-1)),e("tbody",null,[e("tr",null,[e("td",x,[l[15]||(l[15]=t("从 ")),l[16]||(l[16]=e("code",null,"1",-1)),l[17]||(l[17]=t(" 到 ")),l[18]||(l[18]=e("code",null,"999999999",-1)),l[19]||(l[19]=t(" 的数字 ")),l[20]||(l[20]=e("br",null,null,-1)),l[21]||(l[21]=t()),o(s,{type:"tip",text:"默认",vertical:"middle"}),l[22]||(l[22]=t(" 为 ")),l[23]||(l[23]=e("code",null,"60",-1))]),l[24]||(l[24]=e("td",{style:{"text-align":"left"}},"如果已过自上次同步的持续时间,触发器事件发生时同步",-1))]),l[25]||(l[25]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"0")]),e("td",{style:{"text-align":"left"}},"每个触发器事件发生时同步")],-1)),l[26]||(l[26]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"never")]),e("td",{style:{"text-align":"left"}},"从不同步")],-1))])]),l[35]||(l[35]=a('

环境变量

  • ASDF_CONFIG_FILE - 如上所述默认为 ~/.asdfrc 文件。可以被设置在任何位置。
  • ASDF_DEFAULT_TOOL_VERSIONS_FILENAME - 存储工具名称和版本的文件名。默认为 .tool-versions。可以是任何有效的文件名。通常,除非你知道你希望 asdf 忽略 .tool-versions 文件,否则不应该覆盖默认值。
  • ASDF_DIR - 默认为 ~/.asdf - asdf 脚本的位置。如果你把 asdf 安装到了其他目录,请设置该变量到那个目录。比如,如果通过 AUR 进行安装,则应设置该变量为 /opt/asdf-vm
  • ASDF_DATA_DIR - 默认为 ~/.asdf - asdf 安装插件、垫片和安装器的位置。可以被设置在上一节提到的生效 asdf.sh 或者 asdf.fish 之间的任何位置。对于 Elvish,这可以设置在 use asdf 上面。

内部配置

用户不必担心本节,因为它描述了对包管理器和集成者有用的 asdf 的内部配置。

  • $ASDF_DIR/asdf_updates_disabled:当此文件存在时(内容无关),通过 asdf update 命令进行的更新 将会被禁用。像 Pacman 或者 Homebrew 等包管理器使用它来确保个性化安装的正确的更新方法。
',5))])}const C=d(p,[["render",m]]);export{A as __pageData,C as default}; diff --git a/assets/zh-hans_manage_configuration.md.DckznVe9.lean.js b/assets/zh-hans_manage_configuration.md.DckznVe9.lean.js new file mode 100644 index 00000000..31c68596 --- /dev/null +++ b/assets/zh-hans_manage_configuration.md.DckznVe9.lean.js @@ -0,0 +1,9 @@ +import{_ as d,c as n,a2 as a,j as e,a as t,G as o,B as i,o as r}from"./chunks/framework.C9NVOr0y.js";const A=JSON.parse('{"title":"配置","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/manage/configuration.md","filePath":"zh-hans/manage/configuration.md","lastUpdated":1687069487000}'),p={name:"zh-hans/manage/configuration.md"},u={tabindex:"0"},c={style:{"text-align":"left"}},f={tabindex:"0"},g={style:{"text-align":"left"}},y={tabindex:"0"},b={style:{"text-align":"left"}},v={tabindex:"0"},x={style:{"text-align":"left"}};function m(h,l,k,P,q,w){const s=i("Badge");return r(),n("div",null,[l[28]||(l[28]=a(`

配置

asdf 配置既包括可共享的 .tool-versions 文件,也包括用户特定的自定义 .asdfrc 和环境变量。

.tool-versions

无论何时 .tool-versions 出现在目录中,它所声明的工具版本将会被用于该目录和任意子目录。

注意

全局默认配置将设置在文件$HOME/.tool-versions

一个 .tool-versions 文件示例如下所示:

ruby 2.5.3
+nodejs 10.15.0

你也可以包含注释在里面:

ruby 2.5.3 # 这是一个注释
+# 这是另一个注释
+nodejs 10.15.0

版本号可以有如下格式:

  • 10.15.0 - 实际的版本号。支持下载二进制文件的插件将会下载二进制文件。
  • ref:v1.0.2-a 或者 ref:39cb398vb39 - 指定标签/提交/分支从 github 下载并编译。
  • path:~/src/elixir - 要使用的工具的自定义编译版本的路径。这种方式供语言开发者等使用。
  • system - 此关键字会导致 asdf 传递系统上未由 asdf 管理的工具版本。

提示

多版本可以通过空格将它们分隔开来。比如,使用 Python 3.7.2 回退到 Python 2.7.15 最后回退到 system Python,可以将以下行的内容添加到 .tool-versions 文件中。

python 3.7.2 2.7.15 system

为了安装 .tool-versions 文件中定义的所有工具,在包含 .tool-versions 文件的目录中不带其他参数执行 asdf install 命令。

为了安装 .tool-versions 文件中定义的某个工具,在包含 .tool-versions 文件的目录中运行 asdf install <name> 命令。这个工具将会安装 .tool-versions 文件所指定的版本。

可以直接编辑这个文件或者使用 asdf local (或者 asdf global)来更新工具版本。

$HOME/.asdfrc

给你的家目录添加一个 .asdfrc 文件然后 asdf 将会使用这个文件所指定的配置。下面的文件展示了所需的格式,其中包含用于演示的默认值:

txt
legacy_version_file = no
+use_release_candidates = no
+always_keep_download = no
+plugin_repository_last_check_duration = 60
+disable_plugin_short_name_repository = no
+concurrency = auto

legacy_version_file

插件 支持 读取其他版本管理器使用的版本文件,比如,Ruby 的 rbenv.ruby-version 文件。

`,20)),e("table",u,[l[4]||(l[4]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"选项"),e("th",{style:{"text-align":"left"}},"描述")])],-1)),e("tbody",null,[e("tr",null,[e("td",c,[l[0]||(l[0]=e("code",null,"no",-1)),l[1]||(l[1]=t()),o(s,{type:"tip",text:"默认",vertical:"middle"})]),l[2]||(l[2]=e("td",{style:{"text-align":"left"}},[t("从 "),e("code",null,".tool-versions"),t(" 文件读取版本")],-1))]),l[3]||(l[3]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},[t("如果可行的话,从传统版本文件读取版本("),e("code",null,".ruby-versions"),t(")")])],-1))])]),l[29]||(l[29]=e("h3",{id:"use-release-candidates",tabindex:"-1"},[e("code",null,"use_release_candidates"),t(),e("a",{class:"header-anchor",href:"#use-release-candidates","aria-label":'Permalink to "`use_release_candidates`"'},"​")],-1)),l[30]||(l[30]=e("p",null,[t("配置 "),e("code",null,"asdf update"),t(" 命令以升级到最新的候选版本,而不是最新的语义版本。")],-1)),e("table",f,[l[9]||(l[9]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"选项"),e("th",{style:{"text-align":"left"}},"描述")])],-1)),e("tbody",null,[e("tr",null,[e("td",g,[l[5]||(l[5]=e("code",null,"no",-1)),l[6]||(l[6]=t()),o(s,{type:"tip",text:"默认",vertical:"middle"})]),l[7]||(l[7]=e("td",{style:{"text-align":"left"}},"语义版本被使用",-1))]),l[8]||(l[8]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"候选版本被使用")],-1))])]),l[31]||(l[31]=e("h3",{id:"always-keep-download",tabindex:"-1"},[e("code",null,"always_keep_download"),t(),e("a",{class:"header-anchor",href:"#always-keep-download","aria-label":'Permalink to "`always_keep_download`"'},"​")],-1)),l[32]||(l[32]=e("p",null,[t("配置 "),e("code",null,"asdf install"),t(" 命令以保留或删除下载的源代码或二进制文件。")],-1)),e("table",y,[l[14]||(l[14]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"选项"),e("th",{style:{"text-align":"left"}},"描述")])],-1)),e("tbody",null,[e("tr",null,[e("td",b,[l[10]||(l[10]=e("code",null,"no",-1)),l[11]||(l[11]=t()),o(s,{type:"tip",text:"默认",vertical:"middle"})]),l[12]||(l[12]=e("td",{style:{"text-align":"left"}},"在成功安装后删除源代码或二进制文件",-1))]),l[13]||(l[13]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"在成功安装后保留源代码或二进制文件")],-1))])]),l[33]||(l[33]=e("h3",{id:"plugin-repository-last-check-duration",tabindex:"-1"},[e("code",null,"plugin_repository_last_check_duration"),t(),e("a",{class:"header-anchor",href:"#plugin-repository-last-check-duration","aria-label":'Permalink to "`plugin_repository_last_check_duration`"'},"​")],-1)),l[34]||(l[34]=e("p",null,[t("配置自上次 asdf 插件存储库同步到下一次存储库同步的持续时间。命令 "),e("code",null,"asdf plugin add "),t(" 或者 "),e("code",null,"asdf plugin list all"),t(" 将会触发持续时间的检查,如果持续时间已过,则进行同步。")],-1)),e("table",v,[l[27]||(l[27]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"选项"),e("th",{style:{"text-align":"left"}},"描述")])],-1)),e("tbody",null,[e("tr",null,[e("td",x,[l[15]||(l[15]=t("从 ")),l[16]||(l[16]=e("code",null,"1",-1)),l[17]||(l[17]=t(" 到 ")),l[18]||(l[18]=e("code",null,"999999999",-1)),l[19]||(l[19]=t(" 的数字 ")),l[20]||(l[20]=e("br",null,null,-1)),l[21]||(l[21]=t()),o(s,{type:"tip",text:"默认",vertical:"middle"}),l[22]||(l[22]=t(" 为 ")),l[23]||(l[23]=e("code",null,"60",-1))]),l[24]||(l[24]=e("td",{style:{"text-align":"left"}},"如果已过自上次同步的持续时间,触发器事件发生时同步",-1))]),l[25]||(l[25]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"0")]),e("td",{style:{"text-align":"left"}},"每个触发器事件发生时同步")],-1)),l[26]||(l[26]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"never")]),e("td",{style:{"text-align":"left"}},"从不同步")],-1))])]),l[35]||(l[35]=a('

环境变量

  • ASDF_CONFIG_FILE - 如上所述默认为 ~/.asdfrc 文件。可以被设置在任何位置。
  • ASDF_DEFAULT_TOOL_VERSIONS_FILENAME - 存储工具名称和版本的文件名。默认为 .tool-versions。可以是任何有效的文件名。通常,除非你知道你希望 asdf 忽略 .tool-versions 文件,否则不应该覆盖默认值。
  • ASDF_DIR - 默认为 ~/.asdf - asdf 脚本的位置。如果你把 asdf 安装到了其他目录,请设置该变量到那个目录。比如,如果通过 AUR 进行安装,则应设置该变量为 /opt/asdf-vm
  • ASDF_DATA_DIR - 默认为 ~/.asdf - asdf 安装插件、垫片和安装器的位置。可以被设置在上一节提到的生效 asdf.sh 或者 asdf.fish 之间的任何位置。对于 Elvish,这可以设置在 use asdf 上面。

内部配置

用户不必担心本节,因为它描述了对包管理器和集成者有用的 asdf 的内部配置。

  • $ASDF_DIR/asdf_updates_disabled:当此文件存在时(内容无关),通过 asdf update 命令进行的更新 将会被禁用。像 Pacman 或者 Homebrew 等包管理器使用它来确保个性化安装的正确的更新方法。
',5))])}const C=d(p,[["render",m]]);export{A as __pageData,C as default}; diff --git a/assets/zh-hans_manage_core.md._3uzcWzu.js b/assets/zh-hans_manage_core.md._3uzcWzu.js new file mode 100644 index 00000000..0c5bdc50 --- /dev/null +++ b/assets/zh-hans_manage_core.md._3uzcWzu.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as l,o as t}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"核心","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/manage/core.md","filePath":"zh-hans/manage/core.md","lastUpdated":1687069487000}'),h={name:"zh-hans/manage/core.md"};function e(n,s,p,k,d,o){return t(),a("div",null,s[0]||(s[0]=[l(`

核心

核心 asdf 命令列表很小,但可以促进很多工作流。

安装和配置

请查看 快速上手 了解更多详情。

Exec

shell
asdf exec <command> [args...]

执行当前版本的命令垫片。

Env

shell
asdf env <command> [util]

Info

shell
asdf info

用于打印操作系统、Shell 和 asdf 调试信息的辅助命令。在报告 bug 时需要共享这些信息。

Reshim

shell
asdf reshim <name> <version>

这将为某个包的当前版本重新创建垫片。默认情况下,垫片是在某个工具安装的过程中由插件创建。一些工具像 npm 命令行 允许全局安装可执行程序,比如使用 npm install -g yarn 命令安装 Yarn。因为这个可执行程序不是通过插件生命周期安装的,所以还没有对应的垫片存在。asdf reshim nodejs <version> 命令将会强制重新计算任何新可执行程序的垫片,类似 nodejsversions 版本下的 yarn

Shim-versions

shell
asdf shim-versions <command>

列举为命令提供垫片的插件和版本。

例如,Node.js 附带了两个可执行程序,nodenpm。当使用 asdf-nodejs插件安装了这些工具的很多版本时,执行shim-versions\` 命令会返回:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

更新

asdf 有一个依赖于 Git (我们推荐的安装方法)的内置命令用于更新。如果你使用了其他方法安装,则应按照该方法的步骤操作:

方法最新稳定版本master 分支上的最新提交
asdf (Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
Pacman下载一个新的 PKGBUILD 并且重新编译
或者使用你习惯的 AUR helper

卸载

根据以下步骤卸载 asdf

Bash & Git
  1. ~/.bashrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. ~/.bash_profile 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. ~/.bashrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

补全功能可能已经如 Homebrew 的指南 那样配置了,因此请按照他们的指南找出要删除的内容。

  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

如果你正在使用 macOS Catalina 以及更新版本,默认的 shell 已经变成了 ZSH。如果你在 ~/.bash_profile 文件中找不到任何配置,则可能位于 ~/.zshrc 中。在这种情况下,请按照 ZSH 指南进行操作。

  1. ~/.bash_profile 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

补全功能可能已经如 Homebrew 的指南 那样配置了,因此请按照他们的指南找出要删除的内容。

  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. ~/.bashrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. /opt/asdf-vm/asdf.sh
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. ~/.config/fish/config.fish 配置文件中移除生效 asdf.fish 的行:
shell
source ~/.asdf/asdf.fish

以及使用以下命令移除补全功能:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. ~/.config/fish/config.fish 配置文件中移除生效 asdf.fish 的行:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. ~/.config/fish/config.fish 配置文件中移除生效 asdf.fish 的行:
shell
source /opt/asdf-vm/asdf.fish
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. ~/.config/elvish/rc.elv 配置文件中移除使用 asdf 模块的行:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

以及使用以下命令卸载 asdf 模块:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 移除 $HOME/.asdf 目录:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. ~/.config/elvish/rc.elv 配置文件中移除使用 asdf 模块的行:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

以及使用以下命令卸载 asdf 模块:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. ~/.config/elvish/rc.elv 配置文件中移除使用 asdf 模块的行:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

以及使用以下命令卸载 asdf 模块:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. ~/.zshrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

或者 ZSH 框架插件(如果用了的话)

  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. ~/.zshrc 配置文件中移除生效 asdf.sh 的行:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. 用包管理器卸载:
shell
brew uninstall asdf --force && brew autoremove
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. ~/.zshrc 配置文件中移除生效 asdf.sh 的行:
shell
. /opt/asdf-vm/asdf.sh
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"

恭喜你完成了 🎉

`,41)]))}const F=i(h,[["render",e]]);export{c as __pageData,F as default}; diff --git a/assets/zh-hans_manage_core.md._3uzcWzu.lean.js b/assets/zh-hans_manage_core.md._3uzcWzu.lean.js new file mode 100644 index 00000000..0c5bdc50 --- /dev/null +++ b/assets/zh-hans_manage_core.md._3uzcWzu.lean.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as l,o as t}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"核心","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/manage/core.md","filePath":"zh-hans/manage/core.md","lastUpdated":1687069487000}'),h={name:"zh-hans/manage/core.md"};function e(n,s,p,k,d,o){return t(),a("div",null,s[0]||(s[0]=[l(`

核心

核心 asdf 命令列表很小,但可以促进很多工作流。

安装和配置

请查看 快速上手 了解更多详情。

Exec

shell
asdf exec <command> [args...]

执行当前版本的命令垫片。

Env

shell
asdf env <command> [util]

Info

shell
asdf info

用于打印操作系统、Shell 和 asdf 调试信息的辅助命令。在报告 bug 时需要共享这些信息。

Reshim

shell
asdf reshim <name> <version>

这将为某个包的当前版本重新创建垫片。默认情况下,垫片是在某个工具安装的过程中由插件创建。一些工具像 npm 命令行 允许全局安装可执行程序,比如使用 npm install -g yarn 命令安装 Yarn。因为这个可执行程序不是通过插件生命周期安装的,所以还没有对应的垫片存在。asdf reshim nodejs <version> 命令将会强制重新计算任何新可执行程序的垫片,类似 nodejsversions 版本下的 yarn

Shim-versions

shell
asdf shim-versions <command>

列举为命令提供垫片的插件和版本。

例如,Node.js 附带了两个可执行程序,nodenpm。当使用 asdf-nodejs插件安装了这些工具的很多版本时,执行shim-versions\` 命令会返回:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

更新

asdf 有一个依赖于 Git (我们推荐的安装方法)的内置命令用于更新。如果你使用了其他方法安装,则应按照该方法的步骤操作:

方法最新稳定版本master 分支上的最新提交
asdf (Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
Pacman下载一个新的 PKGBUILD 并且重新编译
或者使用你习惯的 AUR helper

卸载

根据以下步骤卸载 asdf

Bash & Git
  1. ~/.bashrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. ~/.bash_profile 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. ~/.bashrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

补全功能可能已经如 Homebrew 的指南 那样配置了,因此请按照他们的指南找出要删除的内容。

  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

如果你正在使用 macOS Catalina 以及更新版本,默认的 shell 已经变成了 ZSH。如果你在 ~/.bash_profile 文件中找不到任何配置,则可能位于 ~/.zshrc 中。在这种情况下,请按照 ZSH 指南进行操作。

  1. ~/.bash_profile 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

补全功能可能已经如 Homebrew 的指南 那样配置了,因此请按照他们的指南找出要删除的内容。

  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. ~/.bashrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. /opt/asdf-vm/asdf.sh
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. ~/.config/fish/config.fish 配置文件中移除生效 asdf.fish 的行:
shell
source ~/.asdf/asdf.fish

以及使用以下命令移除补全功能:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. ~/.config/fish/config.fish 配置文件中移除生效 asdf.fish 的行:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. ~/.config/fish/config.fish 配置文件中移除生效 asdf.fish 的行:
shell
source /opt/asdf-vm/asdf.fish
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. ~/.config/elvish/rc.elv 配置文件中移除使用 asdf 模块的行:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

以及使用以下命令卸载 asdf 模块:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 移除 $HOME/.asdf 目录:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. ~/.config/elvish/rc.elv 配置文件中移除使用 asdf 模块的行:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

以及使用以下命令卸载 asdf 模块:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. ~/.config/elvish/rc.elv 配置文件中移除使用 asdf 模块的行:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

以及使用以下命令卸载 asdf 模块:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. ~/.zshrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

或者 ZSH 框架插件(如果用了的话)

  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. ~/.zshrc 配置文件中移除生效 asdf.sh 的行:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. 用包管理器卸载:
shell
brew uninstall asdf --force && brew autoremove
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. ~/.zshrc 配置文件中移除生效 asdf.sh 的行:
shell
. /opt/asdf-vm/asdf.sh
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"

恭喜你完成了 🎉

`,41)]))}const F=i(h,[["render",e]]);export{c as __pageData,F as default}; diff --git a/assets/zh-hans_manage_plugins.md.DY_Xuyjn.js b/assets/zh-hans_manage_plugins.md.DY_Xuyjn.js new file mode 100644 index 00000000..3c1c746d --- /dev/null +++ b/assets/zh-hans_manage_plugins.md.DY_Xuyjn.js @@ -0,0 +1,11 @@ +import{_ as a,c as i,a2 as l,o as e}from"./chunks/framework.C9NVOr0y.js";const o=JSON.parse('{"title":"插件","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/manage/plugins.md","filePath":"zh-hans/manage/plugins.md","lastUpdated":1687069487000}'),t={name:"zh-hans/manage/plugins.md"};function n(h,s,p,d,k,r){return e(),i("div",null,s[0]||(s[0]=[l(`

插件

插件告诉 asdf 如何处理不同的工具,如 Node.js、 Ruby、 Elixir 等。

请参考 创建插件 了解用于支持更多工具的插件 API。

添加

通过 Git URL 地址添加插件:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

或者通过插件存储库中的缩写添加插件:

shell
asdf plugin add <name>
+# asdf plugin add erlang

建议

推荐独立于缩写存储库的、更长的 git-url 方法。

列举已安装

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

列举缩写存储库中的所有插件

shell
asdf plugin list all

请参考 插件缩写索引 了解插件的完整缩写列表。

更新

shell
asdf plugin update --all

如果你想要更新特定的包,如下所示。

shell
asdf plugin update <name>
+# asdf plugin update erlang

这种更新方式将会获取插件存储库的 源代码默认分支最新提交。版本化的插件和更新正在开发中 (#916)。

移除

bash
asdf plugin remove <name>
+# asdf plugin remove erlang

移除一个插件将会移除该插件安装的所有工具。这可以当作是清理/修剪工具的许多未使用版本的简单方法。

同步缩写存储库

缩写存储库将同步到你的本地计算机并定期刷新。这个周期由以下方法确定:

  • 命令 asdf plugin add <name> 或者 asdf plugin list all 将会触发同步
  • 如果在过去的 X 分钟内没有同步,则进行同步
  • X 默认是 60,但可以通过在 .asdfrc 文件中配置 plugin_repository_last_check_duration 选项来进行配置。请查看 asdf 配置文档 了解更多。
`,26)]))}const c=a(t,[["render",n]]);export{o as __pageData,c as default}; diff --git a/assets/zh-hans_manage_plugins.md.DY_Xuyjn.lean.js b/assets/zh-hans_manage_plugins.md.DY_Xuyjn.lean.js new file mode 100644 index 00000000..3c1c746d --- /dev/null +++ b/assets/zh-hans_manage_plugins.md.DY_Xuyjn.lean.js @@ -0,0 +1,11 @@ +import{_ as a,c as i,a2 as l,o as e}from"./chunks/framework.C9NVOr0y.js";const o=JSON.parse('{"title":"插件","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/manage/plugins.md","filePath":"zh-hans/manage/plugins.md","lastUpdated":1687069487000}'),t={name:"zh-hans/manage/plugins.md"};function n(h,s,p,d,k,r){return e(),i("div",null,s[0]||(s[0]=[l(`

插件

插件告诉 asdf 如何处理不同的工具,如 Node.js、 Ruby、 Elixir 等。

请参考 创建插件 了解用于支持更多工具的插件 API。

添加

通过 Git URL 地址添加插件:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

或者通过插件存储库中的缩写添加插件:

shell
asdf plugin add <name>
+# asdf plugin add erlang

建议

推荐独立于缩写存储库的、更长的 git-url 方法。

列举已安装

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

列举缩写存储库中的所有插件

shell
asdf plugin list all

请参考 插件缩写索引 了解插件的完整缩写列表。

更新

shell
asdf plugin update --all

如果你想要更新特定的包,如下所示。

shell
asdf plugin update <name>
+# asdf plugin update erlang

这种更新方式将会获取插件存储库的 源代码默认分支最新提交。版本化的插件和更新正在开发中 (#916)。

移除

bash
asdf plugin remove <name>
+# asdf plugin remove erlang

移除一个插件将会移除该插件安装的所有工具。这可以当作是清理/修剪工具的许多未使用版本的简单方法。

同步缩写存储库

缩写存储库将同步到你的本地计算机并定期刷新。这个周期由以下方法确定:

  • 命令 asdf plugin add <name> 或者 asdf plugin list all 将会触发同步
  • 如果在过去的 X 分钟内没有同步,则进行同步
  • X 默认是 60,但可以通过在 .asdfrc 文件中配置 plugin_repository_last_check_duration 选项来进行配置。请查看 asdf 配置文档 了解更多。
`,26)]))}const c=a(t,[["render",n]]);export{o as __pageData,c as default}; diff --git a/assets/zh-hans_manage_versions.md.BOLJYZ7r.js b/assets/zh-hans_manage_versions.md.BOLJYZ7r.js new file mode 100644 index 00000000..0bbf0caa --- /dev/null +++ b/assets/zh-hans_manage_versions.md.BOLJYZ7r.js @@ -0,0 +1,30 @@ +import{_ as i,c as a,a2 as l,o as h}from"./chunks/framework.C9NVOr0y.js";const o=JSON.parse('{"title":"版本","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/manage/versions.md","filePath":"zh-hans/manage/versions.md","lastUpdated":1687069487000}'),t={name:"zh-hans/manage/versions.md"};function n(e,s,p,k,d,r){return h(),a("div",null,s[0]||(s[0]=[l(`

版本

安装版本

shell
asdf install <name> <version>
+# asdf install erlang 17.3

如果一个插件支持从源代码下载和编译,你可以指定 ref:foo,其中 foo 是特定的分支、标签或者提交。卸载该版本时,你也需要使用相同的名称和引用。

安装最新稳定版本

shell
asdf install <name> latest
+# asdf install erlang latest

安装给定字符串开头的最新稳定版本。

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

列举已安装版本

shell
asdf list <name>
+# asdf list erlang

筛选出以给定字符串开头的版本。

shell
asdf list <name> <version>
+# asdf list erlang 17

列举所有可用版本

shell
asdf list all <name>
+# asdf list all erlang

筛选出以给定字符串开头的版本。

shell
asdf list all <name> <version>
+# asdf list all erlang 17

显示最新稳定版本

shell
asdf latest <name>
+# asdf latest erlang

显示以给定字符串开头的最新稳定版本。

shell
asdf latest <name> <version>
+# asdf latest erlang 17

设置当前版本

shell
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest

global 将版本写到 $HOME/.tool-versions 文件中。

shell 仅为当前 shell 会话将版本设置为一个名为 ASDF_\${LANG}_VERSION 的环境变量。

local 将版本写到 $PWD/.tool-versions 文件中,如果有需要也会创建此文件。

请查看 配置部分.tool-versions 文件了解更多详情。

可选

如果你只是想为当前 shell 会话或者在特定工具版本下执行一条命令,你可以设置一个类似 ASDF_\${TOOL}_VERSION 的环境变量。

下面的示例在版本为 1.4.0 的 Elixir 项目上运行测试。 版本格式与 .tool-versions 文件支持的版本格式相同。

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

回退到系统版本

要使用工具 <name> 的系统版本而非 asdf 管理版本,你可以将工具的版本设置为 system

使用 globallocal 或者 shell 设置系统,如上面的 设置当前版本 部分所述。

shell
asdf local <name> system
+# asdf local python system

显示当前版本

shell
asdf current
+# asdf current
+# erlang 17.3 (set by /Users/kim/.tool-versions)
+# nodejs 6.11.5 (set by /Users/kim/cool-node-project/.tool-versions)
+
+asdf current <name>
+# asdf current erlang
+# 17.3 (set by /Users/kim/.tool-versions)

卸载版本

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

垫片(Shims)

当 asdf 安装一个包时,它会在 $ASDF_DATA_DIR/shims 目录(默认为 ~/.asdf/shims)中为该包中的每个可执行程序创建垫片。这个位于 $PATH 中(通过 asdf.shasdf.fish 等等实现)的目录是已安装程序在环境中可用的方式。

垫片本身是非常简单的包装器,它 exec (执行)一个辅助程序 asdf exec,向其传递插件的名称和垫片正在包装的已安装包中的可执行程序的路径。

asdf exec 辅助程序确定要使用的软件包版本(比如在 .tool-versions 文件中指定,通过 asdf local ... 或者 asdf global ... 命令选择)、软件包安装目录中的可执行程序的最终路径(这可以在插件中通过 exec-path 回调来操作)以及要在其中执行的环境(也由插件 - exec-env 脚本提供),最后完成执行。

注意

因为此系统使用 exec 调用,所以软件包中的任何脚本如果要由 shell 生效而不是执行的脚本都需要直接访问,而不是通过垫片包装器进行访问。两个 asdf 命令:whichwhere 可以通过返回已安装软件包的路径来帮助解决这个问题。

shell
# 返回当前版本中主要可执行程序的路径
+source $(asdf which \${PLUGIN})/../script.sh
+
+# 返回软件包安装目录的路径
+source $(asdf where \${PLUGIN} $(asdf current \${PLUGIN}))/bin/script.sh

绕过 asdf 垫片

如果由于某种原因,你希望绕过 asdf 垫片,或者希望在进入项目目录时自动设置环境变量,则 asdf-direnv 插件可能会有所帮助。请务必查看其 README 文件了解更多详情。

`,45)]))}const c=i(t,[["render",n]]);export{o as __pageData,c as default}; diff --git a/assets/zh-hans_manage_versions.md.BOLJYZ7r.lean.js b/assets/zh-hans_manage_versions.md.BOLJYZ7r.lean.js new file mode 100644 index 00000000..0bbf0caa --- /dev/null +++ b/assets/zh-hans_manage_versions.md.BOLJYZ7r.lean.js @@ -0,0 +1,30 @@ +import{_ as i,c as a,a2 as l,o as h}from"./chunks/framework.C9NVOr0y.js";const o=JSON.parse('{"title":"版本","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/manage/versions.md","filePath":"zh-hans/manage/versions.md","lastUpdated":1687069487000}'),t={name:"zh-hans/manage/versions.md"};function n(e,s,p,k,d,r){return h(),a("div",null,s[0]||(s[0]=[l(`

版本

安装版本

shell
asdf install <name> <version>
+# asdf install erlang 17.3

如果一个插件支持从源代码下载和编译,你可以指定 ref:foo,其中 foo 是特定的分支、标签或者提交。卸载该版本时,你也需要使用相同的名称和引用。

安装最新稳定版本

shell
asdf install <name> latest
+# asdf install erlang latest

安装给定字符串开头的最新稳定版本。

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

列举已安装版本

shell
asdf list <name>
+# asdf list erlang

筛选出以给定字符串开头的版本。

shell
asdf list <name> <version>
+# asdf list erlang 17

列举所有可用版本

shell
asdf list all <name>
+# asdf list all erlang

筛选出以给定字符串开头的版本。

shell
asdf list all <name> <version>
+# asdf list all erlang 17

显示最新稳定版本

shell
asdf latest <name>
+# asdf latest erlang

显示以给定字符串开头的最新稳定版本。

shell
asdf latest <name> <version>
+# asdf latest erlang 17

设置当前版本

shell
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest

global 将版本写到 $HOME/.tool-versions 文件中。

shell 仅为当前 shell 会话将版本设置为一个名为 ASDF_\${LANG}_VERSION 的环境变量。

local 将版本写到 $PWD/.tool-versions 文件中,如果有需要也会创建此文件。

请查看 配置部分.tool-versions 文件了解更多详情。

可选

如果你只是想为当前 shell 会话或者在特定工具版本下执行一条命令,你可以设置一个类似 ASDF_\${TOOL}_VERSION 的环境变量。

下面的示例在版本为 1.4.0 的 Elixir 项目上运行测试。 版本格式与 .tool-versions 文件支持的版本格式相同。

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

回退到系统版本

要使用工具 <name> 的系统版本而非 asdf 管理版本,你可以将工具的版本设置为 system

使用 globallocal 或者 shell 设置系统,如上面的 设置当前版本 部分所述。

shell
asdf local <name> system
+# asdf local python system

显示当前版本

shell
asdf current
+# asdf current
+# erlang 17.3 (set by /Users/kim/.tool-versions)
+# nodejs 6.11.5 (set by /Users/kim/cool-node-project/.tool-versions)
+
+asdf current <name>
+# asdf current erlang
+# 17.3 (set by /Users/kim/.tool-versions)

卸载版本

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

垫片(Shims)

当 asdf 安装一个包时,它会在 $ASDF_DATA_DIR/shims 目录(默认为 ~/.asdf/shims)中为该包中的每个可执行程序创建垫片。这个位于 $PATH 中(通过 asdf.shasdf.fish 等等实现)的目录是已安装程序在环境中可用的方式。

垫片本身是非常简单的包装器,它 exec (执行)一个辅助程序 asdf exec,向其传递插件的名称和垫片正在包装的已安装包中的可执行程序的路径。

asdf exec 辅助程序确定要使用的软件包版本(比如在 .tool-versions 文件中指定,通过 asdf local ... 或者 asdf global ... 命令选择)、软件包安装目录中的可执行程序的最终路径(这可以在插件中通过 exec-path 回调来操作)以及要在其中执行的环境(也由插件 - exec-env 脚本提供),最后完成执行。

注意

因为此系统使用 exec 调用,所以软件包中的任何脚本如果要由 shell 生效而不是执行的脚本都需要直接访问,而不是通过垫片包装器进行访问。两个 asdf 命令:whichwhere 可以通过返回已安装软件包的路径来帮助解决这个问题。

shell
# 返回当前版本中主要可执行程序的路径
+source $(asdf which \${PLUGIN})/../script.sh
+
+# 返回软件包安装目录的路径
+source $(asdf where \${PLUGIN} $(asdf current \${PLUGIN}))/bin/script.sh

绕过 asdf 垫片

如果由于某种原因,你希望绕过 asdf 垫片,或者希望在进入项目目录时自动设置环境变量,则 asdf-direnv 插件可能会有所帮助。请务必查看其 README 文件了解更多详情。

`,45)]))}const c=i(t,[["render",n]]);export{o as __pageData,c as default}; diff --git a/assets/zh-hans_more_community-projects.md.yE4Odlba.js b/assets/zh-hans_more_community-projects.md.yE4Odlba.js new file mode 100644 index 00000000..2a171b46 --- /dev/null +++ b/assets/zh-hans_more_community-projects.md.yE4Odlba.js @@ -0,0 +1 @@ +import{_ as t,c as o,a2 as r,o as a}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"Community Projects","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/more/community-projects.md","filePath":"zh-hans/more/community-projects.md","lastUpdated":1687069487000}'),s={name:"zh-hans/more/community-projects.md"};function n(c,e,i,m,d,l){return a(),o("div",null,e[0]||(e[0]=[r('

Community Projects

Here are some community projects related to asdf:

Note

asdf core do not own these projects or their code. asdf core are not responsible for the quality or security as they relate to those listed here.

',4)]))}const f=t(s,[["render",n]]);export{u as __pageData,f as default}; diff --git a/assets/zh-hans_more_community-projects.md.yE4Odlba.lean.js b/assets/zh-hans_more_community-projects.md.yE4Odlba.lean.js new file mode 100644 index 00000000..2a171b46 --- /dev/null +++ b/assets/zh-hans_more_community-projects.md.yE4Odlba.lean.js @@ -0,0 +1 @@ +import{_ as t,c as o,a2 as r,o as a}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"Community Projects","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/more/community-projects.md","filePath":"zh-hans/more/community-projects.md","lastUpdated":1687069487000}'),s={name:"zh-hans/more/community-projects.md"};function n(c,e,i,m,d,l){return a(),o("div",null,e[0]||(e[0]=[r('

Community Projects

Here are some community projects related to asdf:

Note

asdf core do not own these projects or their code. asdf core are not responsible for the quality or security as they relate to those listed here.

',4)]))}const f=t(s,[["render",n]]);export{u as __pageData,f as default}; diff --git a/assets/zh-hans_more_faq.md.CgpfvsMk.js b/assets/zh-hans_more_faq.md.CgpfvsMk.js new file mode 100644 index 00000000..cc75fa64 --- /dev/null +++ b/assets/zh-hans_more_faq.md.CgpfvsMk.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as t}from"./chunks/framework.C9NVOr0y.js";const p=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/more/faq.md","filePath":"zh-hans/more/faq.md","lastUpdated":1671778129000}'),s={name:"zh-hans/more/faq.md"};function d(n,e,i,h,c,l){return t(),o("div",null,e[0]||(e[0]=[r('

FAQ

以下是 asdf 相关的一些常见问题。

支持 WSL1 吗?

WSL1 (Windows Subsystem for Linux 1) 不受官方支持。asdf 的某些方面可能无法正常工作。我们不打算添加对 WSL1 的官方支持。

支持 WSL2 吗?

WSL2 (Windows Subsystem for Linux 2) 应该作为你选择的 WSL 发行版来使用本设置和依赖说明。

重要的是,只有当前工作目录是 Unix 驱动器而不是绑定的 Windows 驱动器时,WSL2 才能 正常工作。

当 Github Actions 上提供主机运行器支持时,我们打算在 WSL2 上运行测试套件。(Github Actions 目前还未提供 WSL2 支持)

新安装的可执行程序无法运行?

我执行了 npm install -g yarn 命令,但是之后不能运行 yarn 命令。这是为什么?

asdf 使用 垫片 来管理可执行程序。插件所安装的那些命令会自动创建垫片,而通过 asdf 管理工具安装过的可执行程序则需要通知 asdf 创建垫片的需要。在这个例子中,为 Yarn 创建一个垫片即可。请查看 asdf reshim 命令文档 了解更多。

Shell 没有检测到新安装的垫片?

如果 asdf reshim 没有解决你的问题,那么很有可能是在 asdf.sh 或者 asdf.fish 的生效不在你的 Shell 配置文件(.bash_profile.zshrcconfig.fish 等等)的下方。这需要你在设置你的 $PATH 之后和生效你的框架(oh-my-zsh 等等)(如果有的话)之后再生效。

',13)]))}const m=a(s,[["render",d]]);export{p as __pageData,m as default}; diff --git a/assets/zh-hans_more_faq.md.CgpfvsMk.lean.js b/assets/zh-hans_more_faq.md.CgpfvsMk.lean.js new file mode 100644 index 00000000..cc75fa64 --- /dev/null +++ b/assets/zh-hans_more_faq.md.CgpfvsMk.lean.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as t}from"./chunks/framework.C9NVOr0y.js";const p=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/more/faq.md","filePath":"zh-hans/more/faq.md","lastUpdated":1671778129000}'),s={name:"zh-hans/more/faq.md"};function d(n,e,i,h,c,l){return t(),o("div",null,e[0]||(e[0]=[r('

FAQ

以下是 asdf 相关的一些常见问题。

支持 WSL1 吗?

WSL1 (Windows Subsystem for Linux 1) 不受官方支持。asdf 的某些方面可能无法正常工作。我们不打算添加对 WSL1 的官方支持。

支持 WSL2 吗?

WSL2 (Windows Subsystem for Linux 2) 应该作为你选择的 WSL 发行版来使用本设置和依赖说明。

重要的是,只有当前工作目录是 Unix 驱动器而不是绑定的 Windows 驱动器时,WSL2 才能 正常工作。

当 Github Actions 上提供主机运行器支持时,我们打算在 WSL2 上运行测试套件。(Github Actions 目前还未提供 WSL2 支持)

新安装的可执行程序无法运行?

我执行了 npm install -g yarn 命令,但是之后不能运行 yarn 命令。这是为什么?

asdf 使用 垫片 来管理可执行程序。插件所安装的那些命令会自动创建垫片,而通过 asdf 管理工具安装过的可执行程序则需要通知 asdf 创建垫片的需要。在这个例子中,为 Yarn 创建一个垫片即可。请查看 asdf reshim 命令文档 了解更多。

Shell 没有检测到新安装的垫片?

如果 asdf reshim 没有解决你的问题,那么很有可能是在 asdf.sh 或者 asdf.fish 的生效不在你的 Shell 配置文件(.bash_profile.zshrcconfig.fish 等等)的下方。这需要你在设置你的 $PATH 之后和生效你的框架(oh-my-zsh 等等)(如果有的话)之后再生效。

',13)]))}const m=a(s,[["render",d]]);export{p as __pageData,m as default}; diff --git a/assets/zh-hans_more_thanks.md.Dyz87Q2k.js b/assets/zh-hans_more_thanks.md.Dyz87Q2k.js new file mode 100644 index 00000000..cfd2fadb --- /dev/null +++ b/assets/zh-hans_more_thanks.md.Dyz87Q2k.js @@ -0,0 +1 @@ +import{_ as e,c as r,a2 as t,o as h}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"致谢","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/more/thanks.md","filePath":"zh-hans/more/thanks.md","lastUpdated":1671778129000}'),s={name:"zh-hans/more/thanks.md"};function o(l,a,n,i,d,c){return h(),r("div",null,a[0]||(a[0]=[t('

致谢

asdf 作者和贡献者的感谢页!

作者

我 (@HashNuke),高烧、感冒、咳嗽。

版权 2014 直到时间尽头 (MIT License)

维护者

贡献者

请查看 Github 上的 贡献者名单 🙏 了解更多。

',9)]))}const p=e(s,[["render",o]]);export{u as __pageData,p as default}; diff --git a/assets/zh-hans_more_thanks.md.Dyz87Q2k.lean.js b/assets/zh-hans_more_thanks.md.Dyz87Q2k.lean.js new file mode 100644 index 00000000..cfd2fadb --- /dev/null +++ b/assets/zh-hans_more_thanks.md.Dyz87Q2k.lean.js @@ -0,0 +1 @@ +import{_ as e,c as r,a2 as t,o as h}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"致谢","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/more/thanks.md","filePath":"zh-hans/more/thanks.md","lastUpdated":1671778129000}'),s={name:"zh-hans/more/thanks.md"};function o(l,a,n,i,d,c){return h(),r("div",null,a[0]||(a[0]=[t('

致谢

asdf 作者和贡献者的感谢页!

作者

我 (@HashNuke),高烧、感冒、咳嗽。

版权 2014 直到时间尽头 (MIT License)

维护者

贡献者

请查看 Github 上的 贡献者名单 🙏 了解更多。

',9)]))}const p=e(s,[["render",o]]);export{u as __pageData,p as default}; diff --git a/assets/zh-hans_plugins_create.md.P38AmJ4g.js b/assets/zh-hans_plugins_create.md.P38AmJ4g.js new file mode 100644 index 00000000..6f9d055c --- /dev/null +++ b/assets/zh-hans_plugins_create.md.P38AmJ4g.js @@ -0,0 +1,35 @@ +import{_ as i,c as a,a2 as e,o as l}from"./chunks/framework.C9NVOr0y.js";const r=JSON.parse('{"title":"创建插件","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/plugins/create.md","filePath":"zh-hans/plugins/create.md","lastUpdated":1704804447000}'),n={name:"zh-hans/plugins/create.md"};function t(h,s,p,d,o,k){return l(),a("div",null,s[0]||(s[0]=[e(`

创建插件

插件里有什么

插件是一个包含几个可执行脚本的 git 存储库,用于支持对某种语言或工具进行版本控制。这些脚本在执行 list-allinstall 或者 uninstall 命令时被执行。你可以设定或取消设定环境变量,并执行设置工具环境所需的任何操作。

必要的脚本

  • bin/list-all - 列举所有可安装的版本
  • bin/download - 下载指定版本的源代码或二进制文件
  • bin/install - 安装指定版本

环境变量

所有脚本除了 bin/list-all 之外对以下环境变量有权限进行操作:

  • ASDF_INSTALL_TYPE - version 或者 ref
  • ASDF_INSTALL_VERSION - 如果 ASDF_INSTALL_TYPEversion,那么这将是版本号。否则它将传递为 git 的 ref。可能指向存储库的一个标签/提交/分支。
  • ASDF_INSTALL_PATH - 已经 安装到的目录(或 bin/install 脚本执行情况下 应该 安装到的目录)

这些附加的环境变量将可用于 bin/install 脚本:

  • ASDF_CONCURRENCY - 编译源代码时使用的内核数。对于配置 make -j 非常有用。
  • ASDF_DOWNLOAD_PATH - bin/download 脚本下载源代码或二进制文件的路径。

这些附加的环境变量将可用于 bin/download 脚本:

  • ASDF_DOWNLOAD_PATH - 源代码或二进制文件应该下载到的路径。

bin/list-all

必须打印一个带有空格分隔的版本列表的字符串,示例输出如下所示:

shell
1.0.1 1.0.2 1.3.0 1.4

请注意,最新版本应列在最后,以便它看起来更接近用户的提示。这很有帮助,因为 list-all 命令会在自己的行打印每个版本。如果有很多版本,那么早期版本可能会不在屏幕上。

如果从网站上的发布页面拉取版本,建议尽可能不对版本进行排序。通常,版本已经按照正确的顺序排列,或者以相反的顺序排列,在这种情况下,像 tac 这样的东西就足够了。如果必须手动对版本进行排序,则不能依赖 sort -V,因为 OSX 操作系统不支持。一种可以替代的排序功能是 更好的选择

bin/download

此脚本必须下载源代码或者二进制文件到 ASDF_DOWNLOAD_PATH 环境变量包含的路径。如果下载的源代码或者二进制文件是压缩的,则只有未压缩的源代码或二进制文件会放置在 ASDF_DOWNLOAD_PATH 目录中。

下载成功后脚本必须以 0 状态退出。如果下载失败,脚本必须以任何非零退出状态退出。

如果可能,脚本应该仅将文件放在 ASDF_DOWNLOAD_PATH 中。如果下载失败,则不应将任何文件放在目录中。

如果此脚本不存在,asdf 将假设存在 bin/install 脚本,将下载并安装该版本。asdf 仅在没有此脚本的情况下才能支持传统插件。所有插件都必须包含此脚本,最终将删除对传统插件的支持。

bin/install

本脚本应在 ASDF_INSTALL_PATH 中安装版本。默认情况下,asdf 将为 $ASDF_INSTALL_PATH/bin (可以通过可选的 bin/list-bin-paths 脚本自定义)目录中的任意文件创建垫片。

安装成功时,安装脚本应以 0 状态退出。如果安装失败,脚本应以任何非零退出状态退出。

如果可能,脚本应仅在安装脚本认为工具的生成和安装成功后,才将文件放在 ASDF_INSTALL_PATH 目录中。asdf 检查 ASDF_INSTALL_PATH 目录的 扩展 以确认是否安装了该工具版本。如果在安装过程开始时填充了 ASDF_INSTALL_PATH 目录,则在安装过程中在其他终端中运行的其他 asdf 命令可能会认为该工具版本已经安装,即使它还未完全安装。

如果你希望你的插件使用 asdf 0.7._ 及更早版本和 0.8._ 及更高版本,请检查是否存在 ASDF_DOWNLOAD_PATH 环境变量。如果未设置,请在 bin/install 脚本回调时下载源代码。如果设置,则假设 bin/downlaod 脚本已经下载源代码。

可选脚本

bin/help 脚本

这不是一个回调脚本,而是一组回调脚本,每个脚本将打印不同的文档到 STDOUT。下面列出了可能的回调脚本。请注意,bin/help.overview 是一种特殊情况,因为必须存在才能为脚本显示任何帮助输出。

  • bin/help.overview - 此脚本应该输出有关插件和所管理工具的一般描述。不应该打印任何标题,因为 asdf 将打印标题。输出可以是自由格式的文本,但理想情况下只有一个短段落。如果你希望 asdf 为你的插件提供帮助信息,则必须存在此脚本。所有其他的帮助回调脚本都是可选的。
  • bin/help.deps - 此脚本应该输出为操作系统量身定制的依赖项列表。每行一个依赖项。
  • bin/help.config - 此脚本应该打印对插件和工具可能有用的任何必需或可选配置。安装或编译该工具所需的任何环境变量或其他标志(尽可能针对用户的操作系统)。输出可以是自由格式的文本。
  • bin/help.links - 这应该是与插件和工具相关的链接列表(同样,尽可能针对当前操作系统量身定制)。每行一个链接。行的格式可以是 <title>: <link> 或只是 <link>

这些脚本的每一个都应根据当前操作系统调整其输出。例如,在 Ubuntu 上,依赖脚本可以将依赖项输出为必须安装的 apt-get 包。设置变量时,脚本还应该根据设置变量 ASDF_INSTALL_VERSIONASDF_INSTALL_TYPE 的值。它们是可选的,并不总是被设置。

帮助回调脚本不得输出核心 asdf-vm 文档中已涵盖的任何信息。不得出现一般的 asdf 使用信息。

bin/latest-stable

如果实现了此回调,asdf 将使用它来确定工具的最新稳定版本,而不是尝试自行判断。asdf latest 通过查看由 list-all 回调打印的最新版本,在从输出中排除了几种类型的版本(如发布候选版本)之后推断出最新版本。当你的插件的 list-all 回调打印同一工具的不同变体并且最新版本不是你希望默认使用的变体的最新稳定版本时,这种默认行为是不可取的。例如,对于 Ruby,最新的稳定版本应该是 Ruby(MRI)的常规实现,但最后 list-all 回调打印的是 truffleruby 版本。

此回调使用单个 “过滤器” 字符串调用,因为它是唯一的参数。这应该用于过滤所有最新稳定版本。例如对于 Ruby,用户可以选择传入 jruby 以选择 jruby 的最新稳定版本。

bin/list-bin-paths

列举指定工具版本的可执行程序。必须打印一个带有空格分隔的包含可执行文件的目录路径列表的字符串。路径必须相对于传递的安装路径。示例输出如下所示:

shell
bin tools veggies

这将指示 asdf 为 <install-path>/bin<install-path>/tools<install-path>/veggies 中的文件创建垫片。

如果未指定此脚本,asdf 将在安装中查找 bin 目录并为这些脚本创建垫片。

bin/exec-env

设置环境变量以运行包中的二进制文件。

bin/exec-path

获取工具的指定版本的可执行程序路径。必须打印具有相对可执行程序路径的字符串。这允许插件有条件地覆盖垫片指定的可执行程序路径,否则返回垫片指定的默认路径。

shell
用法:
+  plugin/bin/exec-path <install-path> <command> <executable-path>
+
+例子调用:
+  ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"
+
+输出:
+  bin/foox

bin/uninstall

卸载某个工具的指定版本。

bin/list-legacy-filenames

为此插件注册其他设置器文件。必须打印一个带有空格分隔的文件名列表的字符串。

shell
.ruby-version .rvmrc

注意:这仅适用于在 ~/.asdfrc 配置文件中启用了 legacy_version_file 选项的用户。

bin/parse-legacy-file

这可用于进一步解析 asdf 找到的传统文件。如果 parse-legacy-file 未实现,asdf 将会简单读取文件来确定版本。脚本将传递文件路径作为其第一个参数。

bin/post-plugin-add

这可用于在插件添加到 asdf 后运行任何安装后操作。

该脚本可以访问插件的安装路径(\${ASDF_PLUGIN_PATH})和源 URL(\${ASDF_PLUGIN_SOURCE_URL}),如果有的话。

其他请参考相关钩子:

  • pre_asdf_plugin_add
  • pre_asdf_plugin_add_\${plugin_name}
  • post_asdf_plugin_add
  • post_asdf_plugin_add_\${plugin_name}

bin/post-plugin-update

这可用于在 asdf 下载更新的插件后运行任何插件更新后操作。

该脚本可以访问插件的安装路径(\${ASDF_PLUGIN_PATH})、更新前的 git-ref(\${ASDF_PLUGIN_PREV_REF})和更新后的 git-ref(\${ASDF_PLUGIN_POST_REF})。

其他请参考相关钩子:

  • pre_asdf_plugin_update
  • pre_asdf_plugin_update_\${plugin_name}
  • post_asdf_plugin_update
  • post_asdf_plugin_update_\${plugin_name}

bin/pre-plugin-remove

这可用于在从 asdf 中删除插件之前运行任何预删除操作。

该脚本可以访问安装插件的路径(\${ASDF_PLUGIN_PATH})。

其他请参考相关钩子:

  • pre_asdf_plugin_remove
  • pre_asdf_plugin_remove_\${plugin_name}
  • post_asdf_plugin_remove
  • post_asdf_plugin_remove_\${plugin_name}

asdf 命令行的扩展命令

插件可以通过提供 lib/commands/command*.bash 脚本或者可执行程序来定义新的 asdf 命令,这些脚本或可执行程序将使用插件名称作为 asdf 命令的子命令进行调用。

例如,假设一个 foo 插件有以下文件:

shell
foo/
+  lib/commands/
+    command.bash
+    command-bat.bash
+    command-bat-man.bash
+    command-help.bash

用户现在可以执行:

shell
$ asdf foo         # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash\`
+$ asdf foo bar     # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar\`
+$ asdf foo help    # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash\`
+$ asdf foo bat man # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash\`
+$ asdf foo bat baz # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz\`

插件作者可以使用此功能来提供与其工具相关的实用命令,或者可以创建 asdf 本身的新命令扩展的插件。

调用时,如果扩展命令未设置其可执行位,则它们将作为 bash 脚本获取,且具有来自 $ASDF_DIR/lib/utils.bash 的所有可用功能。 此外,$ASDF_CMD_FILE 解析所获取文件的完整路径。 如果设置了可执行位,则只是执行它们并替换 asdf 执行。

这个功能的一个很好的例子是像 haxe 这样的插件。 它提供了 asdf haxe neko-dylibs-link 来修复 haxe 可执行文件期望找到相对于可执行目录的动态链接库的问题。

如果你的插件提供了 asdf 扩展命令,请务必在插件的 README 文件中提及。

自定义垫片模板

请仅在真的需要时才使用此功能

asdf 允许自定义垫片模板。对于名为 foo 的可执行程序,如果有一个 shims/foo 的文件在插件中,那么 asdf 将复制这个文件替代使用标准垫片模板。

必须明智地使用这一点。对于目前的 AFAIK,它仅仅被使用在了 Elixir 插件中,因为一个可执行程序除了是可执行程序文件之外,还被读作为 Elixir 文件,这使得无法使用标准的 bash 垫片。

测试插件

asdf 包含 plugin-test 命令用于测试插件。你可以像下面这样使用它:

shell
asdf plugin test <plugin-name> <plugin-url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git-ref>] [test-command*]

只有前两个参数是必须的。 如果指定了 _version,则该工具将随指定版本一起安装。默认返回为 asdf latest <plugin-name>。 如果指定了 git-ref,则插件将检查提交/分支/标签。这对于在该插件的 CI 上测试拉取请求非常有用。默认值是插件仓库的默认分支。

剩下的参数被视为要执行的命令,以确保安装的工具正常工作。通常情况下,它需要带 --version 或者 --help。例如,要测试 NodeJS 插件,我们可以运行:

shell
asdf plugin test nodejs https://github.com/asdf-vm/asdf-nodejs.git node --version

我们强烈建议你在 CI 环境中测试你的插件,并确保它可以在 Linux 和 OSX 上运行。

GitHub Action 示例

asdf-vm/actions 存储库为托管在 github 的项目提供了使用 Github Action 来测试插件的可能。

yaml
steps:
+  - name: asdf_plugin_test
+    uses: asdf-vm/actions/plugin-test@v1
+    with:
+      command: "my_tool --version"
+    env:
+      GITHUB_API_TOKEN: \${{ secrets.GITHUB_TOKEN }} # 自动提供

TravisCI 配置示例

这是一个 .travis.yml 示例文件,请根据你的需要进行自定义:

yaml
language: c
+script: asdf plugin test nodejs $TRAVIS_BUILD_DIR 'node --version'
+before_script:
+  - git clone https://github.com/asdf-vm/asdf.git asdf
+  - . asdf/asdf.sh
+os:
+  - linux
+  - osx

注意: 当使用其他 CI 时,你将需要确认哪些变量映射到存储库路径。

你还可以选择将相对路径传递给 plugin-test

例如,如果在存储库目录中运行测试脚本:asdf plugin test nodejs . 'node --version'

GitHub API 频率限制

如果你的插件的 list-all 依赖于访问 GitHub API,请确保在访问时提供授权令牌,否则你的测试可能会因频率限制而失败。

为此,创建一个仅具有 public_repo 权限的 新个人令牌

然后,在 travis.ci 构建设置中添加一个名为 GITHUB_API_TOKEN安全 环境变量。并且 绝对不要 在你的代码中公布你的 token。

最后,添加如下内容到 bin/list-all

shell
cmd="curl -s"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"

向官方插件存储库提交插件

asdf 可以通过指定插件存储库 url 轻松安装插件,比如 plugin add my-plugin https://github.com/user/asdf-my-plugin.git

为了使你的用户更轻松,你可以将插件添加到官方插件存储库中,以列出你的插件并使用较短的命令轻松安装,比如 asdf plugin add my-plugin

请查看插件存储库 asdf-vm/asdf-plugins 中的说明了解更多。

`,109)]))}const g=i(n,[["render",t]]);export{r as __pageData,g as default}; diff --git a/assets/zh-hans_plugins_create.md.P38AmJ4g.lean.js b/assets/zh-hans_plugins_create.md.P38AmJ4g.lean.js new file mode 100644 index 00000000..6f9d055c --- /dev/null +++ b/assets/zh-hans_plugins_create.md.P38AmJ4g.lean.js @@ -0,0 +1,35 @@ +import{_ as i,c as a,a2 as e,o as l}from"./chunks/framework.C9NVOr0y.js";const r=JSON.parse('{"title":"创建插件","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/plugins/create.md","filePath":"zh-hans/plugins/create.md","lastUpdated":1704804447000}'),n={name:"zh-hans/plugins/create.md"};function t(h,s,p,d,o,k){return l(),a("div",null,s[0]||(s[0]=[e(`

创建插件

插件里有什么

插件是一个包含几个可执行脚本的 git 存储库,用于支持对某种语言或工具进行版本控制。这些脚本在执行 list-allinstall 或者 uninstall 命令时被执行。你可以设定或取消设定环境变量,并执行设置工具环境所需的任何操作。

必要的脚本

  • bin/list-all - 列举所有可安装的版本
  • bin/download - 下载指定版本的源代码或二进制文件
  • bin/install - 安装指定版本

环境变量

所有脚本除了 bin/list-all 之外对以下环境变量有权限进行操作:

  • ASDF_INSTALL_TYPE - version 或者 ref
  • ASDF_INSTALL_VERSION - 如果 ASDF_INSTALL_TYPEversion,那么这将是版本号。否则它将传递为 git 的 ref。可能指向存储库的一个标签/提交/分支。
  • ASDF_INSTALL_PATH - 已经 安装到的目录(或 bin/install 脚本执行情况下 应该 安装到的目录)

这些附加的环境变量将可用于 bin/install 脚本:

  • ASDF_CONCURRENCY - 编译源代码时使用的内核数。对于配置 make -j 非常有用。
  • ASDF_DOWNLOAD_PATH - bin/download 脚本下载源代码或二进制文件的路径。

这些附加的环境变量将可用于 bin/download 脚本:

  • ASDF_DOWNLOAD_PATH - 源代码或二进制文件应该下载到的路径。

bin/list-all

必须打印一个带有空格分隔的版本列表的字符串,示例输出如下所示:

shell
1.0.1 1.0.2 1.3.0 1.4

请注意,最新版本应列在最后,以便它看起来更接近用户的提示。这很有帮助,因为 list-all 命令会在自己的行打印每个版本。如果有很多版本,那么早期版本可能会不在屏幕上。

如果从网站上的发布页面拉取版本,建议尽可能不对版本进行排序。通常,版本已经按照正确的顺序排列,或者以相反的顺序排列,在这种情况下,像 tac 这样的东西就足够了。如果必须手动对版本进行排序,则不能依赖 sort -V,因为 OSX 操作系统不支持。一种可以替代的排序功能是 更好的选择

bin/download

此脚本必须下载源代码或者二进制文件到 ASDF_DOWNLOAD_PATH 环境变量包含的路径。如果下载的源代码或者二进制文件是压缩的,则只有未压缩的源代码或二进制文件会放置在 ASDF_DOWNLOAD_PATH 目录中。

下载成功后脚本必须以 0 状态退出。如果下载失败,脚本必须以任何非零退出状态退出。

如果可能,脚本应该仅将文件放在 ASDF_DOWNLOAD_PATH 中。如果下载失败,则不应将任何文件放在目录中。

如果此脚本不存在,asdf 将假设存在 bin/install 脚本,将下载并安装该版本。asdf 仅在没有此脚本的情况下才能支持传统插件。所有插件都必须包含此脚本,最终将删除对传统插件的支持。

bin/install

本脚本应在 ASDF_INSTALL_PATH 中安装版本。默认情况下,asdf 将为 $ASDF_INSTALL_PATH/bin (可以通过可选的 bin/list-bin-paths 脚本自定义)目录中的任意文件创建垫片。

安装成功时,安装脚本应以 0 状态退出。如果安装失败,脚本应以任何非零退出状态退出。

如果可能,脚本应仅在安装脚本认为工具的生成和安装成功后,才将文件放在 ASDF_INSTALL_PATH 目录中。asdf 检查 ASDF_INSTALL_PATH 目录的 扩展 以确认是否安装了该工具版本。如果在安装过程开始时填充了 ASDF_INSTALL_PATH 目录,则在安装过程中在其他终端中运行的其他 asdf 命令可能会认为该工具版本已经安装,即使它还未完全安装。

如果你希望你的插件使用 asdf 0.7._ 及更早版本和 0.8._ 及更高版本,请检查是否存在 ASDF_DOWNLOAD_PATH 环境变量。如果未设置,请在 bin/install 脚本回调时下载源代码。如果设置,则假设 bin/downlaod 脚本已经下载源代码。

可选脚本

bin/help 脚本

这不是一个回调脚本,而是一组回调脚本,每个脚本将打印不同的文档到 STDOUT。下面列出了可能的回调脚本。请注意,bin/help.overview 是一种特殊情况,因为必须存在才能为脚本显示任何帮助输出。

  • bin/help.overview - 此脚本应该输出有关插件和所管理工具的一般描述。不应该打印任何标题,因为 asdf 将打印标题。输出可以是自由格式的文本,但理想情况下只有一个短段落。如果你希望 asdf 为你的插件提供帮助信息,则必须存在此脚本。所有其他的帮助回调脚本都是可选的。
  • bin/help.deps - 此脚本应该输出为操作系统量身定制的依赖项列表。每行一个依赖项。
  • bin/help.config - 此脚本应该打印对插件和工具可能有用的任何必需或可选配置。安装或编译该工具所需的任何环境变量或其他标志(尽可能针对用户的操作系统)。输出可以是自由格式的文本。
  • bin/help.links - 这应该是与插件和工具相关的链接列表(同样,尽可能针对当前操作系统量身定制)。每行一个链接。行的格式可以是 <title>: <link> 或只是 <link>

这些脚本的每一个都应根据当前操作系统调整其输出。例如,在 Ubuntu 上,依赖脚本可以将依赖项输出为必须安装的 apt-get 包。设置变量时,脚本还应该根据设置变量 ASDF_INSTALL_VERSIONASDF_INSTALL_TYPE 的值。它们是可选的,并不总是被设置。

帮助回调脚本不得输出核心 asdf-vm 文档中已涵盖的任何信息。不得出现一般的 asdf 使用信息。

bin/latest-stable

如果实现了此回调,asdf 将使用它来确定工具的最新稳定版本,而不是尝试自行判断。asdf latest 通过查看由 list-all 回调打印的最新版本,在从输出中排除了几种类型的版本(如发布候选版本)之后推断出最新版本。当你的插件的 list-all 回调打印同一工具的不同变体并且最新版本不是你希望默认使用的变体的最新稳定版本时,这种默认行为是不可取的。例如,对于 Ruby,最新的稳定版本应该是 Ruby(MRI)的常规实现,但最后 list-all 回调打印的是 truffleruby 版本。

此回调使用单个 “过滤器” 字符串调用,因为它是唯一的参数。这应该用于过滤所有最新稳定版本。例如对于 Ruby,用户可以选择传入 jruby 以选择 jruby 的最新稳定版本。

bin/list-bin-paths

列举指定工具版本的可执行程序。必须打印一个带有空格分隔的包含可执行文件的目录路径列表的字符串。路径必须相对于传递的安装路径。示例输出如下所示:

shell
bin tools veggies

这将指示 asdf 为 <install-path>/bin<install-path>/tools<install-path>/veggies 中的文件创建垫片。

如果未指定此脚本,asdf 将在安装中查找 bin 目录并为这些脚本创建垫片。

bin/exec-env

设置环境变量以运行包中的二进制文件。

bin/exec-path

获取工具的指定版本的可执行程序路径。必须打印具有相对可执行程序路径的字符串。这允许插件有条件地覆盖垫片指定的可执行程序路径,否则返回垫片指定的默认路径。

shell
用法:
+  plugin/bin/exec-path <install-path> <command> <executable-path>
+
+例子调用:
+  ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"
+
+输出:
+  bin/foox

bin/uninstall

卸载某个工具的指定版本。

bin/list-legacy-filenames

为此插件注册其他设置器文件。必须打印一个带有空格分隔的文件名列表的字符串。

shell
.ruby-version .rvmrc

注意:这仅适用于在 ~/.asdfrc 配置文件中启用了 legacy_version_file 选项的用户。

bin/parse-legacy-file

这可用于进一步解析 asdf 找到的传统文件。如果 parse-legacy-file 未实现,asdf 将会简单读取文件来确定版本。脚本将传递文件路径作为其第一个参数。

bin/post-plugin-add

这可用于在插件添加到 asdf 后运行任何安装后操作。

该脚本可以访问插件的安装路径(\${ASDF_PLUGIN_PATH})和源 URL(\${ASDF_PLUGIN_SOURCE_URL}),如果有的话。

其他请参考相关钩子:

  • pre_asdf_plugin_add
  • pre_asdf_plugin_add_\${plugin_name}
  • post_asdf_plugin_add
  • post_asdf_plugin_add_\${plugin_name}

bin/post-plugin-update

这可用于在 asdf 下载更新的插件后运行任何插件更新后操作。

该脚本可以访问插件的安装路径(\${ASDF_PLUGIN_PATH})、更新前的 git-ref(\${ASDF_PLUGIN_PREV_REF})和更新后的 git-ref(\${ASDF_PLUGIN_POST_REF})。

其他请参考相关钩子:

  • pre_asdf_plugin_update
  • pre_asdf_plugin_update_\${plugin_name}
  • post_asdf_plugin_update
  • post_asdf_plugin_update_\${plugin_name}

bin/pre-plugin-remove

这可用于在从 asdf 中删除插件之前运行任何预删除操作。

该脚本可以访问安装插件的路径(\${ASDF_PLUGIN_PATH})。

其他请参考相关钩子:

  • pre_asdf_plugin_remove
  • pre_asdf_plugin_remove_\${plugin_name}
  • post_asdf_plugin_remove
  • post_asdf_plugin_remove_\${plugin_name}

asdf 命令行的扩展命令

插件可以通过提供 lib/commands/command*.bash 脚本或者可执行程序来定义新的 asdf 命令,这些脚本或可执行程序将使用插件名称作为 asdf 命令的子命令进行调用。

例如,假设一个 foo 插件有以下文件:

shell
foo/
+  lib/commands/
+    command.bash
+    command-bat.bash
+    command-bat-man.bash
+    command-help.bash

用户现在可以执行:

shell
$ asdf foo         # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash\`
+$ asdf foo bar     # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar\`
+$ asdf foo help    # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash\`
+$ asdf foo bat man # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash\`
+$ asdf foo bat baz # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz\`

插件作者可以使用此功能来提供与其工具相关的实用命令,或者可以创建 asdf 本身的新命令扩展的插件。

调用时,如果扩展命令未设置其可执行位,则它们将作为 bash 脚本获取,且具有来自 $ASDF_DIR/lib/utils.bash 的所有可用功能。 此外,$ASDF_CMD_FILE 解析所获取文件的完整路径。 如果设置了可执行位,则只是执行它们并替换 asdf 执行。

这个功能的一个很好的例子是像 haxe 这样的插件。 它提供了 asdf haxe neko-dylibs-link 来修复 haxe 可执行文件期望找到相对于可执行目录的动态链接库的问题。

如果你的插件提供了 asdf 扩展命令,请务必在插件的 README 文件中提及。

自定义垫片模板

请仅在真的需要时才使用此功能

asdf 允许自定义垫片模板。对于名为 foo 的可执行程序,如果有一个 shims/foo 的文件在插件中,那么 asdf 将复制这个文件替代使用标准垫片模板。

必须明智地使用这一点。对于目前的 AFAIK,它仅仅被使用在了 Elixir 插件中,因为一个可执行程序除了是可执行程序文件之外,还被读作为 Elixir 文件,这使得无法使用标准的 bash 垫片。

测试插件

asdf 包含 plugin-test 命令用于测试插件。你可以像下面这样使用它:

shell
asdf plugin test <plugin-name> <plugin-url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git-ref>] [test-command*]

只有前两个参数是必须的。 如果指定了 _version,则该工具将随指定版本一起安装。默认返回为 asdf latest <plugin-name>。 如果指定了 git-ref,则插件将检查提交/分支/标签。这对于在该插件的 CI 上测试拉取请求非常有用。默认值是插件仓库的默认分支。

剩下的参数被视为要执行的命令,以确保安装的工具正常工作。通常情况下,它需要带 --version 或者 --help。例如,要测试 NodeJS 插件,我们可以运行:

shell
asdf plugin test nodejs https://github.com/asdf-vm/asdf-nodejs.git node --version

我们强烈建议你在 CI 环境中测试你的插件,并确保它可以在 Linux 和 OSX 上运行。

GitHub Action 示例

asdf-vm/actions 存储库为托管在 github 的项目提供了使用 Github Action 来测试插件的可能。

yaml
steps:
+  - name: asdf_plugin_test
+    uses: asdf-vm/actions/plugin-test@v1
+    with:
+      command: "my_tool --version"
+    env:
+      GITHUB_API_TOKEN: \${{ secrets.GITHUB_TOKEN }} # 自动提供

TravisCI 配置示例

这是一个 .travis.yml 示例文件,请根据你的需要进行自定义:

yaml
language: c
+script: asdf plugin test nodejs $TRAVIS_BUILD_DIR 'node --version'
+before_script:
+  - git clone https://github.com/asdf-vm/asdf.git asdf
+  - . asdf/asdf.sh
+os:
+  - linux
+  - osx

注意: 当使用其他 CI 时,你将需要确认哪些变量映射到存储库路径。

你还可以选择将相对路径传递给 plugin-test

例如,如果在存储库目录中运行测试脚本:asdf plugin test nodejs . 'node --version'

GitHub API 频率限制

如果你的插件的 list-all 依赖于访问 GitHub API,请确保在访问时提供授权令牌,否则你的测试可能会因频率限制而失败。

为此,创建一个仅具有 public_repo 权限的 新个人令牌

然后,在 travis.ci 构建设置中添加一个名为 GITHUB_API_TOKEN安全 环境变量。并且 绝对不要 在你的代码中公布你的 token。

最后,添加如下内容到 bin/list-all

shell
cmd="curl -s"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"

向官方插件存储库提交插件

asdf 可以通过指定插件存储库 url 轻松安装插件,比如 plugin add my-plugin https://github.com/user/asdf-my-plugin.git

为了使你的用户更轻松,你可以将插件添加到官方插件存储库中,以列出你的插件并使用较短的命令轻松安装,比如 asdf plugin add my-plugin

请查看插件存储库 asdf-vm/asdf-plugins 中的说明了解更多。

`,109)]))}const g=i(n,[["render",t]]);export{r as __pageData,g as default}; diff --git a/contribute/core.html b/contribute/core.html new file mode 100644 index 00000000..13e8feda --- /dev/null +++ b/contribute/core.html @@ -0,0 +1,61 @@ + + + + + + asdf + + + + + + + + + + + + + +
Skip to content

asdf

asdf core contribution guide.

Initial Setup

Fork asdf on GitHub and/or Git clone the default branch:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

The tools for core development are in this repo's .tool-versions. If you wish to manage with asdf itself, add the plugins:

shell
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git

Install the versions to develop asdf with:

shell
asdf install

It may be useful to not use asdf to manage the tools during development on your local machine as you may need to break functionality which would then break your dev tooling. Here's the raw list of tools:

  • bats-core: Bash Automated Testing System, for unit testing Bash or POSIX compliant scripts.
  • shellcheck: Static analysis tool for shell scripts.
  • shfmt: A shell parser, formatter, and interpreter with bash support; includes shfmt

Development

If you want to try out your changes without making change to your installed asdf, you can set the $ASDF_DIR variable to the path where you cloned the repository, and temporarily prepend the bin and shims directory of the directory to your path.

It is best to format, lint and test your code locally before you commit or push to the remote. Use the following scripts/commands:

shell
# Lint
+./scripts/lint.bash --check
+
+# Fix & Format
+./scripts/lint.bash --fix
+
+# Test: all tests
+./scripts/test.bash
+
+# Test: for specific command
+bats test/list_commands.bash

TIP

Add tests! - Tests are required for new features and speed up review of bug fixes. Please cover new code paths before you create a Pull Request. See bats-core documentation

Gitignore

The following is the .gitignore file in the asdf-vm/asdf repository. We ignore project-specific files. Files specific to your OS, tools or workflows should be ignored in your global .gitignore configuration, see here for more details.

gitignore
/installs
+/downloads
+/plugins
+/shims
+repository
+.vagrant
+keyrings
+/tmp

.git-blame-ignore-revs

asdf uses a .git-blame-ignore-revs to reduce noise when running a blame. See the git blame documentation for more information.

Use the file with git blame like so:

sh
git blame --ignore-revs-file .git-blame-ignore-revs ./test/install_command.bats

Optionally, configure to use the file on every invocation of blame without manually supplying it:

sh
git config blame.ignoreRevsFile .git-blame-ignore-revs

It is possible to configure IDEs to use this file. For example, when using VSCode (with GitLens), write the following to .vscode/settings.json:

json
{
+  "gitlens.advanced.blame.customArguments": [
+    "--ignore-revs-file",
+    ".git-blame-ignore-revs"
+  ]
+}

Bats Testing

Execute tests locally with:

shell
./scripts/test.bash

Before writing tests please read:

Bats Tips

Bats debugging can be difficult at times. Using the TAP output with -t flag will enable you to print outputs with the special file descriptor >&3 during test execution, simplifying debugging. As an example:

shell
# test/some_tests.bats
+
+printf "%s\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\n" "Will be printed during bats -t test/some_tests.bats" >&3

This is further documented in bats-core Printing to the Terminal.

Pull Requests, Releases & Conventional Commits

asdf is using an automated release tool called Release Please to automatically bump the SemVer version and generate the Changelog. This information is determined by reading the commit history since the last release.

Conventional Commit messages define the format of the Pull Request Title which becomes the commit message format on the default branch. This is enforced with GitHub Action amannn/action-semantic-pull-request.

Conventional Commit follows this format:

<type>[optional scope][optional !]: <description>
+
+<!-- examples -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change

The full list of <types> are: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert.

  • !: indicates a breaking change
  • fix: will create a new SemVer patch
  • feat: will create a new SemVer minor
  • <type>!: will create a new SemVer major

The Pull Request Title must follow this format.

TIP

Use Conventional Commit message format for your Pull Request Title.

Docker Images

The asdf-alpine and asdf-ubuntu projects are an ongoing effort to provide Dockerized images of some asdf tools. You can use these docker images as base for your development servers, or for running your production apps.

+ + + + \ No newline at end of file diff --git a/contribute/documentation.html b/contribute/documentation.html new file mode 100644 index 00000000..d477dd90 --- /dev/null +++ b/contribute/documentation.html @@ -0,0 +1,65 @@ + + + + + + Docs & Site | asdf + + + + + + + + + + + + + +
Skip to content

Docs & Site

Documentation & site contribution guide.

Initial Setup

Fork asdf on GitHub and/or Git clone the default branch:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

The tools for Docs site development are managed with asdf in the docs/.tool-versions. Add the plugins with:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

Install the tool version(s) with:

shell
asdf install
  • Node.js: JavaScript runtime built on Chrome's V8 JavaScript engine.

Install Node.js dependencies from docs/package.json:

shell
npm install

Development

VitePress (v2) is the Static Site Generator (SSG) we use to build the asdf documentation site. It was chosen to replace Docsify.js and subsequently VuePress as we would like to support an HTML only fallback when users do not have JavaScript available or enabled. This was not possible with Docsify & VitePress quicly supplanted VuePress. Other than this, the feature-set is largely the same, with the focus on writing Markdown files with minimal configuration.

package.json contains the scripts required for development:

@code json{3-5}

To start the local development server:

shell
npm run dev

Format the code before committing:

shell
npm run format

Pull Requests, Releases & Conventional Commits

asdf is using an automated release pipeline which relies on Conventional Commits in PR titles. Detailed documentation found in the core contribution guide.

When creating a PR for documentation changes please make the PR title with the Conventional Commit type docs in the format docs: <description>.

Vitepress

Configuration of the site is contained within a few TypeScript files with JS Objects used to represent the config. They are:

To simplify the root config, the larger JS Objects representing the navbar and sidebar configuration have been extracted and separated by their locale. See both in:

  • docs/.vitepress/navbars.js
  • docs/.vitepress/sidebars.js

With the official documentation for these configs living in the Default Theme Reference.

I18n

VitePress has first-class support for internationalization. The root config docs/.vitepress/config.js defines the supported locales with their URL, title in the selection dropdown menu and navbar/sidebar configs references.

The navbar/sidebar configs are captured in the aforementioned config files, separated by locale and exported individually.

The markdown content for each locale must fall under a folder with the same name as the keys for locales in the root config. That is:

js
// docs/.vitepress/config.js
+export default defineConfig({
+  ...
+  locales: {
+    root: {
+      label: "English",
+        lang: "en-US",
+        themeConfig: {
+        nav: navbars.en,
+          sidebar: sidebars.en,
+      },
+    },
+    "pt-br": {
+      label: "Brazilian Portuguese",
+        lang: "pr-br",
+        themeConfig: {
+        nav: navbars.pt_br,
+          sidebar: sidebars.pt_br,
+      },
+    },
+    "zh-hans": {
+      label: "简体中文",
+        lang: "zh-hans",
+        themeConfig: {
+        nav: navbars.zh_hans,
+          sidebar: sidebars.zh_hans,
+      },
+    },
+  },
+})

/pt-BR/ will require the same set of markdown files located under docs/pt-BR/, like so:

shell
docs
+├─ README.md
+├─ foo.md
+├─ nested
+  └─ README.md
+└─ pt-BR
+   ├─ README.md
+   ├─ foo.md
+   └─ nested
+      └─ README.md

The official VitePress i18n documentation goes into more detail.

+ + + + \ No newline at end of file diff --git a/contribute/first-party-plugins.html b/contribute/first-party-plugins.html new file mode 100644 index 00000000..32af4100 --- /dev/null +++ b/contribute/first-party-plugins.html @@ -0,0 +1,24 @@ + + + + + + First-Party Plugins | asdf + + + + + + + + + + + + + +
Skip to content

First-Party Plugins

The asdf core team has authored some plugins relevant to their daily work life. Help is always welcome in maintaining and improving these plugins. See the associated repo for each linked below:

For community plugins, see:

+ + + + \ No newline at end of file diff --git a/contribute/github-actions.html b/contribute/github-actions.html new file mode 100644 index 00000000..fcf50c84 --- /dev/null +++ b/contribute/github-actions.html @@ -0,0 +1,24 @@ + + + + + + GitHub Actions | asdf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/getting-started.html b/guide/getting-started.html new file mode 100644 index 00000000..e10b468d --- /dev/null +++ b/guide/getting-started.html @@ -0,0 +1,36 @@ + + + + + + Getting Started | asdf + + + + + + + + + + + + + +
Skip to content

Getting Started

asdf installation involves:

  1. Installing dependencies
  2. Downloading asdf core
  3. Installing asdf
  4. Installing a plugin for each tool/runtime you wish to manage
  5. Installing a version of the tool/runtime
  6. Setting global and project versions via .tool-versions config files

1. Install Dependencies

asdf primarily requires git & curl. Here is a non-exhaustive list of commands to run for your package manager (some might automatically install these tools in later steps).

OSPackage ManagerCommand
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

Note

sudo may be required depending on your system configuration.

2. Download asdf

Official Download

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1

Community Supported Download Methods

We highly recommend using the official git method.

MethodCommand
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper

3. Install asdf

There are many different combinations of Shells, OSs & Installation methods all of which affect the configuration here. Expand the selection below that best matches your system.

macOS users, be sure to read the warning about path_helper at the end of this section.

Bash & Git

Add the following to ~/.bashrc:

shell
. "$HOME/.asdf/asdf.sh"

Completions must be configured by adding the following to your .bashrc:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

If using macOS Catalina or newer, the default shell has changed to ZSH. Unless changing back to Bash, follow the ZSH instructions.

Add the following to ~/.bash_profile:

shell
. "$HOME/.asdf/asdf.sh"

Completions must be configured manually with the following entry in your .bash_profile:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

Add asdf.sh to your ~/.bashrc with:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.bashrc

Completions will need to be configured as per Homebrew's instructions or with the following:

shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bashrc
Bash & Homebrew (macOS)

If using macOS Catalina or newer, the default shell has changed to ZSH. Unless changing back to Bash, follow the ZSH instructions.

Add asdf.sh to your ~/.bash_profile with:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.bash_profile

Completions will need to be configured as per Homebrew's instructions or with the following:

shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bash_profile
Bash & Pacman

Add the following to ~/.bashrc:

shell
. /opt/asdf-vm/asdf.sh

bash-completion needs to be installed for the completions to work.

Fish & Git

Add the following to ~/.config/fish/config.fish:

shell
source ~/.asdf/asdf.fish

Completions must be configured manually with the following command:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

Add asdf.fish to your ~/.config/fish/config.fish with:

shell
echo -e "\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

Completions are handled by Homebrew for the Fish shell. Friendly!

Fish & Pacman

Add the following to ~/.config/fish/config.fish:

shell
source /opt/asdf-vm/asdf.fish

Completions are automatically configured on installation by the AUR package.

Elvish & Git

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

Completions are automatically configured.

Elvish & Homebrew

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

Completions are automatically configured.

Elvish & Pacman

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

Completions are automatically configured.

ZSH & Git

Add the following to ~/.zshrc:

shell
. "$HOME/.asdf/asdf.sh"

OR use a ZSH Framework plugin like asdf for oh-my-zsh which will source this script and setup completions.

Completions are configured by either a ZSH Framework asdf plugin or by adding the following to your .zshrc:

shell
# append completions to fpath
+fpath=(${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • if you are using a custom compinit setup, ensure compinit is below your sourcing of asdf.sh
  • if you are using a custom compinit setup with a ZSH Framework, ensure compinit is below your sourcing of the framework

Warning

If you are using a ZSH Framework the associated asdf plugin may need to be updated to use the new ZSH completions properly via fpath. The Oh-My-ZSH asdf plugin is yet to be updated, see ohmyzsh/ohmyzsh#8837.

ZSH & Homebrew

Add asdf.sh to your ~/.zshrc with:

shell
echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc

OR use a ZSH Framework plugin like asdf for oh-my-zsh which will source this script and setup completions.

Completions are configured by either a ZSH Framework asdf or will need to be configured as per Homebrew's instructions. If you are using a ZSH Framework the associated plugin for asdf may need to be updated to use the new ZSH completions properly via fpath. The Oh-My-ZSH asdf plugin is yet to be updated, see ohmyzsh/ohmyzsh#8837.

ZSH & Pacman

Add the following to ~/.zshrc:

shell
. /opt/asdf-vm/asdf.sh

Completions are placed in a ZSH friendly location, but ZSH must be configured to use the autocompletions.

PowerShell Core & Git

Add the following to ~/.config/powershell/profile.ps1:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

Add asdf.sh to your ~/.config/powershell/profile.ps1 with:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.ps1\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

Add the following to ~/.config/powershell/profile.ps1:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

Add asdf.nu to your ~/.config/nushell/config.nu with:

shell
"\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

Completions are automatically configured

Nushell & Homebrew

Add asdf.nu to your ~/.config/nushell/config.nu with:

shell
"\n$env.ASDF_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\n source " +  (brew --prefix asdf | str trim | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path

Completions are automatically configured

Nushell & Pacman

Add asdf.nu to your ~/.config/nushell/config.nu with:

shell
"\n$env.ASDF_DIR = '/opt/asdf-vm/'\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

Completions are automatically configured.

POSIX Shell & Git

Add the following to ~/.profile:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

Add asdf.sh to your ~/.profile with:

shell
echo -e "\nexport ASDF_DIR=\"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
+echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
POSIX Shell & Pacman

Add the following to ~/.profile:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

asdf scripts need to be sourced after you have set your $PATH and after you have sourced your framework (oh-my-zsh etc).

WARNING

On macOS, starting a Bash or Zsh shell automatically calls a utility called path_helper. path_helper can rearrange items in PATH (and MANPATH), causing inconsistent behavior for tools that require specific ordering. To workaround this, asdf on macOS defaults to forcily adding its PATH-entries to the front (taking highest priority). This is controllable with the ASDF_FORCE_PREPEND variable.

Restart your shell so that PATH changes take effect. Opening a new terminal tab will usually do it.

Core Installation Complete!

This completes the installation of the asdf core 🎉

asdf is only useful once you install a plugin, install a tool and manage its versions. Continue the guide below to learn how to do this.

4. Install a Plugin

For demonstration purposes we will install & set Node.js via the asdf-nodejs plugin.

Plugin Dependencies

Each plugin has dependencies so we need to check the plugin repo where they should be listed. For asdf-nodejs they are:

OSDependency Installation
Debianapt-get install dirmngr gpg curl gawk
CentOS/ Rocky Linux/ AlmaLinuxyum install gnupg2 curl gawk
macOSbrew install gpg gawk

We should install dependencies first as some Plugins have post-install hooks.

Install the Plugin

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. Install a Version

Now we have a plugin for Node.js we can install a version of the tool.

We can see which versions are available with asdf list all nodejs or a subset of versions with asdf list all nodejs 14.

We will just install the latest available version:

shell
asdf install nodejs latest

Note

asdf enforces exact versions. latest is a helper throughout asdf that will resolve to the actual version number at the time of execution.

6. Set a Version

asdf performs a version lookup of a tool in all .tool-versions files from the current working directory up to the $HOME directory. The lookup occurs just-in-time when you execute a tool that asdf manages.

WARNING

Without a version listed for a tool execution of the tool will error. asdf current will show you the tool & version resolution, or absence of, from your current directory so you can observe which tools will fail to execute.

Global

Global defaults are managed in $HOME/.tool-versions. Set a global version with:

shell
asdf global nodejs latest

$HOME/.tool-versions will then look like:

nodejs 16.5.0

Some OSs already have tools installed that are managed by the system and not asdf, python is a common example. You need to tell asdf to pass the management back to the system. The Versions reference section will guide you.

Local

Local versions are defined in the $PWD/.tool-versions file (your current working directory). Usually, this will be the Git repository for a project. When in your desired directory execute:

shell
asdf local nodejs latest

$PWD/.tool-versions will then look like:

nodejs 16.5.0

Using Existing Tool Version Files

asdf supports the migration from existing version files from other version managers. Eg: .ruby-version for the case of rbenv. This is supported on a per-plugin basis.

asdf-nodejs supports this via both .nvmrc and .node-version files. To enable this, add the following to your asdf configuration file $HOME/.asdfrc:

legacy_version_file = yes

See the configuration reference page for more config options.

Guide Complete!

That completes the Getting Started guide for asdf 🎉 You can now manage nodejs versions for your project. Follow similar steps for each type of tool in your project!

asdf has many more commands to become familiar with, you can see them all by running asdf --help or asdf. The core of the commands are broken into three categories:

+ + + + \ No newline at end of file diff --git a/guide/introduction.html b/guide/introduction.html new file mode 100644 index 00000000..084d3a06 --- /dev/null +++ b/guide/introduction.html @@ -0,0 +1,24 @@ + + + + + + Introduction | asdf + + + + + + + + + + + + + +
Skip to content

Introduction

asdf is a tool version manager. All tool version definitions are contained within one file (.tool-versions) which you can check in to your project's Git repository to share with your team, ensuring everyone is using the exact same versions of tools.

The old way of working required multiple CLI version managers, each with their distinct API, configurations files and implementation (e.g. $PATH manipulation, shims, environment variables, etc...). asdf provides a single interface and configuration file to simplify development workflows, and can be extended to all tools and runtimes via a simple plugin interface.

How It Works

Once asdf core is set up with your Shell configuration, plugins are installed to manage particular tools. When a tool is installed by a plugin, the executables that are installed have shims created for each of them. When you try and run one of these executables, the shim is run instead, allowing asdf to identify which version of the tool is set in .tool-versions and execute that version.

nvm / n / rbenv etc

Tools like nvm, n and rbenv are all written as Shell scripts which create shims for the executables installed by these tools.

asdf is very similar and was built to compete in this space of tool/runtime version management. The differentiating factor for asdf is its plugin system which removes the need for a manager per tool/runtime, different commands per manager and different *-version files in your repo.

direnv

augments existing shells with a new feature that can load and unload environment variables depending on the current directory.

asdf does not manage Environment Variables, however there is a plugin asdf-direnv to integrate direnv behaviour with asdf.

See direnv docs for more.

Homebrew

The Missing Package Manager for macOS (or Linux)

Homebrew manages your packages and their upstream dependencies. asdf does not manage upstream dependencies, it is not a package manager, that burden is upon the user, though we try and keep the dependency list small.

See Homebrew docs for more.

NixOS

Nix is a tool that takes a unique approach to package management and system configuration

NixOS aims to build truly reproducible environments by managing exact versions of packages up the entire dependency tree of each tool, something asdf does not do. NixOS does this with its own programming language, many CLI tools and a package collection of over 60,000 packages.

Again, asdf does not manage upstream dependencies and is not a package manager.

See NixOS docs for more.

Why use asdf?

asdf ensures teams are using the exact same versions of tools, with support for many tools via a plugin system, and the simplicity and familiarity of being a single Shell script you include in your Shell config.

Note

asdf is not intended to be a system package manager. It is a tool version manager. Just because you can create a plugin for any tool and manage its versions with asdf, does not mean that is the best course of action for that specific tool.

+ + + + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json new file mode 100644 index 00000000..d6566934 --- /dev/null +++ b/hashmap.json @@ -0,0 +1 @@ +{"contribute_core.md":"BABeyVan","contribute_documentation.md":"BYyBOKz0","contribute_first-party-plugins.md":"CpFWKmHh","contribute_github-actions.md":"CA9Mkw8-","guide_getting-started.md":"C3BDv6cZ","guide_introduction.md":"D7TZl5Xp","index.md":"CX4EfemI","ja-jp_contribute_core.md":"Dl6llQ1K","ja-jp_contribute_documentation.md":"DFrK7QhV","ja-jp_contribute_first-party-plugins.md":"C-K_bFJd","ja-jp_contribute_github-actions.md":"vwGbnpnK","ja-jp_guide_getting-started.md":"BOrg7Hf7","ja-jp_guide_introduction.md":"BiCZxaSp","ja-jp_index.md":"Nw2yHZ3B","ja-jp_manage_commands.md":"VPBtL-Un","ja-jp_manage_configuration.md":"BoE7Ge6N","ja-jp_manage_core.md":"B1eqmXXm","ja-jp_manage_plugins.md":"Cbru-sBo","ja-jp_manage_versions.md":"Dxk0G51J","ja-jp_more_community-projects.md":"Drt5Trip","ja-jp_more_faq.md":"DWV2Lkfg","ja-jp_more_thanks.md":"DgZpeSyP","ja-jp_plugins_create.md":"CF7Jmvco","manage_commands.md":"BSbw1HQ9","manage_configuration.md":"BTxM-Kga","manage_core.md":"BUHLaRG4","manage_plugins.md":"BOsG6k4O","manage_versions.md":"CAp-N8AZ","more_community-projects.md":"B9Jb3CEv","more_faq.md":"BjmX8xoH","more_thanks.md":"C4xnnmzS","plugins_create.md":"Ba4Peca-","pt-br_contribute_core.md":"BB7joZcW","pt-br_contribute_documentation.md":"D_CeZJ9y","pt-br_contribute_first-party-plugins.md":"TUKlMnR4","pt-br_contribute_github-actions.md":"BpD2TMaX","pt-br_guide_getting-started.md":"Bxtluukf","pt-br_guide_introduction.md":"C231JBSG","pt-br_index.md":"B18T-HnP","pt-br_manage_commands.md":"C9u0wbDc","pt-br_manage_configuration.md":"Bo5UByU1","pt-br_manage_core.md":"CTnvZ9A5","pt-br_manage_plugins.md":"CuNF9gHf","pt-br_manage_versions.md":"Ctc109hL","pt-br_more_community-projects.md":"C3m600b2","pt-br_more_faq.md":"Bch3gpm2","pt-br_more_thanks.md":"BziNXVH9","pt-br_plugins_create.md":"CnPY6mOB","zh-hans_contribute_core.md":"oF4_zk5Q","zh-hans_contribute_documentation.md":"DL3_2XKG","zh-hans_contribute_first-party-plugins.md":"CaobaPwV","zh-hans_contribute_github-actions.md":"BMOvSElT","zh-hans_guide_getting-started.md":"neLGUZQV","zh-hans_guide_introduction.md":"4qLfdOnh","zh-hans_index.md":"DQ8VBECv","zh-hans_manage_commands.md":"BJVPpY77","zh-hans_manage_configuration.md":"DckznVe9","zh-hans_manage_core.md":"_3uzcWzu","zh-hans_manage_plugins.md":"DY_Xuyjn","zh-hans_manage_versions.md":"BOLJYZ7r","zh-hans_more_community-projects.md":"yE4Odlba","zh-hans_more_faq.md":"CgpfvsMk","zh-hans_more_thanks.md":"Dyz87Q2k","zh-hans_plugins_create.md":"P38AmJ4g"} diff --git a/index.html b/index.html new file mode 100644 index 00000000..fa35670e --- /dev/null +++ b/index.html @@ -0,0 +1,24 @@ + + + + + + asdf + + + + + + + + + + + + + +
Skip to content

asdf

The Multiple Runtime Version Manager

Manage all your runtime versions with one tool!

+ + + + \ No newline at end of file diff --git a/ja-jp/contribute/core.html b/ja-jp/contribute/core.html new file mode 100644 index 00000000..33ed3787 --- /dev/null +++ b/ja-jp/contribute/core.html @@ -0,0 +1,54 @@ + + + + + + asdf + + + + + + + + + + + + + +
Skip to content

asdf

これは、asdfコアのコントリビューションガイドです。

初期セットアップ

GitHubでasdfをフォークするか、デフォルトのブランチをGitクローンしてください:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

コア開発用のツールは、このリポジトリの.tool-versionsで定義されています。asdf自身でこれらのツールを管理したい場合は、下記のようにプラグインを追加してください:

shell
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git

asdfの開発に必要なバージョンを、下記のようにインストールします:

shell
asdf install

開発ツールに影響を与える特定の機能を壊す可能性もあるため、ローカルマシンで開発する際は、asdfを使用しないほうが 良いかもしれません 。下記に、使用しているツールを列挙します:

  • bats-core: BashまたはPOSIX準拠のスクリプトを単体テストするための、Bash自動テストシステムです。
  • shellcheck: シェルスクリプトの静的解析ツールです。
  • shfmt: Bashをサポートするシェルパーサ、フォーマッタ、インタプリタです。

開発

インストール済みのasdfに変更を加えずに、あなたが開発した変更内容を試したいときは、$ASDF_DIR変数に、クローンしたリポジトリのパスを設定し、そのディレクトリのbinshimsディレクトリを一時的にパスの先頭へ追加します。

リモートにコミットまたはプッシュする前に、コードをローカルでフォーマット、Lint、およびテストすることを推奨します。その際は、次のスクリプト/コマンドを使用してください:

shell
# Lint
+./scripts/lint.bash --check
+
+# Fix & Format
+./scripts/lint.bash --fix
+
+# Test: all tests
+./scripts/test.bash
+
+# Test: for specific command
+bats test/list_commands.bash

ヒント

テストを作ってください! - 新機能にとってテストは必要不可欠であり、バグ修正のレビューをスピードアップさせることができます。プルリクエストを作成する前に、新しいコードをカバーするようなテストを作成してください。bats-coreのドキュメントもご覧ください。

Gitignore

下記は、asdf-vm/asdfリポジトリの.gitignoreファイルです。プロジェクト固有のファイルは無視をしています。使用しているOS、ツール、およびワークフロー固有のファイルは、グローバルな.gitignore構成で無視する必要があります。詳しくはこちらをご覧ください。

@Gitignoreコード

.git-blame-ignore-revs

asdfでは、.git-blame-ignore-revsを使用して、Blameを実行する際のノイズを減らしています。詳しくは、git blameのドキュメントをご覧ください。

git blameを実行するときは、下記のように、このファイルと共に使います:

sh
git blame --ignore-revs-file .git-blame-ignore-revs ./test/install_command.bats

毎回手動でファイルを指定しなくても、gitのオプションで、blameを呼び出すたびにこのファイルを使うように設定することもできます:

sh
git config blame.ignoreRevsFile .git-blame-ignore-revs

このファイルを使用するように、IDEを設定することもできます。例えば、VSCode(およびGitLens)を使う場合は、.vscode/settings.jsonに下記のように記述します:

json
{
+  "gitlens.advanced.blame.customArguments": [
+    "--ignore-revs-file",
+    ".git-blame-ignore-revs"
+  ]
+}

Batsテスト

ローカルでテストを実行するには、下記のようにテストを呼び出します:

shell
./scripts/test.bash

テストを作成する前に、下記項目を一通り参照してください:

Batsのヒント

Batsでのデバッグは、難しいことがあります。-tフラグを指定してTAP出力を有効にすると、テスト実行中に特殊なファイルディスクリプタ>&3を使用して出力を表示できるため、デバッグが簡単になります。例えば次のとおりです:

shell
# test/some_tests.bats
+
+printf "%s\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\n" "Will be printed during bats -t test/some_tests.bats" >&3

詳しくは、bats-coreドキュメント内のPrinting to the Terminalで説明されています。

プルリクエスト、リリース、Conventional Commits

asdfは、Release Pleaseという自動リリースツールを使用して、セマンティックバージョンを自動的に引き上げ、Changelogを生成しています。この情報は、前回のリリースからのコミット履歴を読み込むことで生成されます。

Conventional Commit messagesでは、デフォルトブランチでのコミットメッセージのフォーマットとなる、プルリクエストタイトルのフォーマットを定義しています。これは、GitHub Actionamannn/action-semantic-pull-requestで強制されます。

Conventional Commitは、下記のフォーマットに従います:

<type>[optional scope][optional !]: <description>
+
+<!-- examples -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change

<types>の種類は次のとおりです: featfixdocsstylerefactorperftestbuildcichorerevert

  • !: 破壊的変更を示します
  • fix: セマンティックバージョンのpatchを新しく作成します
  • feat: セマンティックバージョンのminorを新しく作成します
  • <type>!: セマンティックバージョンのmajorを新しく作成します

プルリクエストのタイトルは、このフォーマットに従う必要があります。

ヒント

プルリクエストのタイトルには、Conventional Commit messageのフォーマットを使用してください。

Dockerイメージ

asdf-alpineおよびasdf-ubuntuプロジェクトは、一部のasdfツールのDocker化されたイメージを提供する取り組みを継続的に行っています。これらのDockerイメージは、開発用サーバのベースとしたり、本番用アプリケーションの実行用途として使用することができます。

+ + + + \ No newline at end of file diff --git a/ja-jp/contribute/documentation.html b/ja-jp/contribute/documentation.html new file mode 100644 index 00000000..3db4e007 --- /dev/null +++ b/ja-jp/contribute/documentation.html @@ -0,0 +1,65 @@ + + + + + + ドキュメント & サイト | asdf + + + + + + + + + + + + + +
Skip to content

ドキュメント & サイト

これは、ドキュメントおよびサイトのコントリビューションガイドです。

初期セットアップ

GitHubでasdfをフォークするか、デフォルトのブランチをGitクローンしてください:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

ドキュメントサイト開発用のツールは、asdfによってdocs/.tool-versionsで管理されています。下記のようにプラグインを追加してください:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

開発に必要なバージョンを、下記のようにインストールします:

shell
asdf install
  • Node.js: ChromeのV8 JavaScriptエンジンをベースに構築されたJavaScriptランタイムです。

docs/package.jsonをもとに、Node.jsの依存関係をインストールしてください:

shell
npm install

開発

VitePress (v2)は、asdfドキュメントサイトを構築するために使用している静的サイトジェネレータ(SSG)です。類似ツールであるDocsify.jsやVuePressに代わってVitePressが採用されたのは、ユーザがJavaScriptを使用できない、または有効にしていない場合に、HTMLのみのフォールバックをサポートしたいからでした。これは、DocsifyとVitePressがVuePressに急速に取って代わっていた場合には不可能でした。これ以外の機能セットはほとんど同じで、最小限の構成でMarkdownファイルを書くことに重点を置いています。

package.jsonには、開発に必要なスクリプトが含まれています:

@package.jsonのコード

ローカルの開発サーバを起動するには、次のように実行します:

shell
npm run dev

コミットする前にコードをフォーマットするには、次のように実行します:

shell
npm run format

プルリクエスト、リリース、Conventional Commits

asdfは、プルリクエストタイトルのConventional Commitsに依存する自動リリースパイプラインを使用しています。詳しくは、コアのコントリビューションガイドのドキュメントに記述されています。

ドキュメントの変更に関するプルリクエストを作成する場合、プルリクエストのタイトルは、Conventional Commit typeをdocsとして、docs: <description>というフォーマットで作成するようにしてください。

Vitepress

サイトの構成設定は、構成を示すために使用されるJSオブジェクト含んだ、いくつかのTypeScriptファイルに記述されています。以下のとおりです:

  • docs/.vitepress/config.js: サイトのルート構成ファイルです。仕様については、VitePressのドキュメントをご覧ください。

ルート構成ファイルを簡素化するために、 Navバーサイドバー の構成を示す大きなJSオブジェクトについては、別ファイルに切り出されており、かつ、ロケールごとに分類されています。次の両方のファイルを参照してください:

  • docs/.vitepress/navbars.js
  • docs/.vitepress/sidebars.js

これらの構成設定に関する公式ドキュメントは、Default Theme Referenceをご覧ください。

I18n

VitePressは、国際化対応に関して最高のサポートを備えています。 ルート構成ファイルであるdocs/.vitepress/config.jsでは、サポートされているロケールとそのURL、ドロップメニューのタイトル、Navバー/サイドバーの構成への参照を定義しています。

Navバー/サイドバーの構成設定は前述の構成ファイルにキャプチャされ、ロケールごとに分類され、個別にエクスポートされます。

各ロケールのMarkdownコンテンツは、ルート構成ファイル内のlocales内のキーと同じ名前のディレクトリ配下に配置する必要があります。ルート構成が下記の場合:

js
// docs/.vitepress/config.js
+export default defineConfig({
+  ...
+  locales: {
+    root: {
+      label: "English",
+        lang: "en-US",
+        themeConfig: {
+        nav: navbars.en,
+          sidebar: sidebars.en,
+      },
+    },
+    "pt-br": {
+      label: "Brazilian Portuguese",
+        lang: "pr-br",
+        themeConfig: {
+        nav: navbars.pt_br,
+          sidebar: sidebars.pt_br,
+      },
+    },
+    "zh-hans": {
+      label: "简体中文",
+        lang: "zh-hans",
+        themeConfig: {
+        nav: navbars.zh_hans,
+          sidebar: sidebars.zh_hans,
+      },
+    },
+  },
+})

/pt-BR/を有効にするには、下記のように、docs/pt-BR/配下に同じMarkdownファイルのセットを配置する必要があります:

shell
docs
+├─ README.md
+├─ foo.md
+├─ nested
+  └─ README.md
+└─ pt-BR
+   ├─ README.md
+   ├─ foo.md
+   └─ nested
+      └─ README.md

公式のVitePress i18nドキュメントには、より詳細な説明が記述されています。

+ + + + \ No newline at end of file diff --git a/ja-jp/contribute/first-party-plugins.html b/ja-jp/contribute/first-party-plugins.html new file mode 100644 index 00000000..242149c4 --- /dev/null +++ b/ja-jp/contribute/first-party-plugins.html @@ -0,0 +1,24 @@ + + + + + + 公式プラグイン | asdf + + + + + + + + + + + + + +
Skip to content

公式プラグイン

asdfコアチームでは、日々のワークライフに関連するプラグインをいくつか作成しています。これらのプラグインのメンテナンスおよび改善にご協力いただける方を、いつでも歓迎しています。詳しくは、下記リンクから、それぞれのリポジトリを参照してください:

コミュニティプラグインについては、下記をご覧ください:

+ + + + \ No newline at end of file diff --git a/ja-jp/contribute/github-actions.html b/ja-jp/contribute/github-actions.html new file mode 100644 index 00000000..9902fe4c --- /dev/null +++ b/ja-jp/contribute/github-actions.html @@ -0,0 +1,24 @@ + + + + + + GitHub Actions | asdf + + + + + + + + + + + + + +
Skip to content

GitHub Actions

ご興味を持っていただきありがとうございます。既存のイシュー、議論、コントリビューションガイドについては、asdf actions リポジトリをご覧ください。

+ + + + \ No newline at end of file diff --git a/ja-jp/guide/getting-started.html b/ja-jp/guide/getting-started.html new file mode 100644 index 00000000..8a7aced4 --- /dev/null +++ b/ja-jp/guide/getting-started.html @@ -0,0 +1,36 @@ + + + + + + はじめよう | asdf + + + + + + + + + + + + + +
Skip to content

はじめよう

asdfのインストールには次の手順が必要です:

  1. 依存関係のインストール
  2. asdfコアのダウンロード
  3. asdfのインストール
  4. 管理したいツール/ランタイムごとにプラグインをインストール
  5. ツール/ランタイムの特定バージョンをインストール
  6. .tool-versionsファイルで、グローバルまたはプロジェクトのバージョンをセット

1. 依存関係のインストール

asdfの動作にはgitおよびcurlが必要です。以下の表は、 あなたが使用している パッケージマネージャで実行するコマンドの 一部例 です(some might automatically install these tools in later steps)。

OSパッケージマネージャコマンド
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

備考

お使いのシステムの構成によっては、接頭にsudoが必要となる場合もあります。

2. asdfのダウンロード

公式ダウンロード

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.13.1

コミュニティがサポートするダウンロード方法

理由がない限り、gitコマンドを使用した公式ダウンロードの手順を使用することを強く推奨します。

方法コマンド
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si または好みのAURヘルパーを使用

3. asdfのインストール

あなたが使用しているシェル、OS、およびインストール方法によって、ここでの設定方法が変わります。最も適したものを選択してください。

masOSユーザの方は、この節の最後にあるpath_helperに関する警告を必ず参照してください。

Bash & Git

~/.bashrcに下記の行を追記します:

shell
. "$HOME/.asdf/asdf.sh"

コマンド補完が必要な場合は、.bashrcに下記の行を追記します:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

macOS Catalina以降を使用している場合、デフォルトのシェルはZSHです。Bashに変更していない限り、ZSHの手順を参照してください。

~/.bash_profileに下記の行を追記します:

shell
. "$HOME/.asdf/asdf.sh"

コマンド補完が必要な場合は、.bash_profileに下記の行を追記します:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

下記コマンドで、~/.bashrcasdf.shを追加します:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.bashrc

コマンド補完が必要な場合は、Homebrewのガイドに従って設定を完了させるか、下記コマンドを実行します:

shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bashrc
Bash & Homebrew (macOS)

macOS Catalina以降を使用している場合、デフォルトのシェルはZSHです。Bashに変更していない限り、ZSHの手順を参照してください。

下記コマンドで、~/.bash_profileasdf.shを追加します:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.bash_profile

コマンド補完が必要な場合は、Homebrewのガイドに従って設定を完了させるか、下記コマンドを実行します:

shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bash_profile
Bash & Pacman

~/.bashrcに下記の行を追記します:

shell
. /opt/asdf-vm/asdf.sh

コマンド補完が必要な場合は、bash-completionをインストールします。

Fish & Git

~/.config/fish/config.fishに下記の行を追記します:

shell
source ~/.asdf/asdf.fish

コマンド補完が必要な場合は、下記コマンドを実行します:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

下記コマンドで、~/.config/fish/config.fishasdf.shを追加します:

shell
echo -e "\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

コマンド補完は、Fish shellのHomebrewが担います。親切ですね!

Fish & Pacman

~/.config/fish/config.fishに下記の行を追記します:

shell
source /opt/asdf-vm/asdf.fish

コマンド補完は、AURパッケージのインストール時に自動的に設定されます。

Elvish & Git

下記コマンドで、~/.config/elvish/rc.elvasdf.elvを追加します:

shell
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

コマンド補完は自動的に設定されます。

Elvish & Homebrew

下記コマンドで、~/.config/elvish/rc.elvasdf.elvを追加します:

shell
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

コマンド補完は自動的に設定されます。

Elvish & Pacman

下記コマンドで、~/.config/elvish/rc.elvasdf.elvを追加します:

shell
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

コマンド補完は自動的に設定されます。

ZSH & Git

~/.zshrcに下記の行を追記します:

shell
. "$HOME/.asdf/asdf.sh"

またはasdf for oh-my-zshのようなZSHフレームワークプラグインを使用して、このスクリプトをsourceし、コマンド補完をセットアップします。

コマンド補完は、ZSHフレームワークのasdfプラグインで設定するか、~/.zshrcに下記の行を追記することで設定できます:

shell
# append completions to fpath
+fpath=(${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • compinitのセットアップをカスタマイズしている場合は、asdf.shソース以下にcompinitがくるようにしてください。
  • ZSHフレームワークでcompinitのセットアップをカスタマイズしている場合は、フレームワークソース以下にcompinitがくるようにしてください。

警告

ZSHフレームワークを使用している場合、新しいZSHコマンド補完を使用するには、fpath経由で、関連するasdfプラグインの更新が必要となることがあります。Oh-My-ZSH asdfプラグインは、ohmyzsh/ohmyzsh#8837でご覧いただくと分かるとおり、まだ更新されていません。

ZSH & Homebrew

下記コマンドで、~/.zshrcasdf.shを追加します:

shell
echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc

OR use a ZSH Framework plugin like asdf for oh-my-zsh which will source this script and setup completions.

コマンド補完は、ZSHフレームワークasdfによって設定されるか、Homebrewの説明に従って設定必要があります。ZSHフレームワークを使用している場合、新しいZSHコマンド補完を使用するには、fpath経由で、関連するasdfプラグインの更新が必要となることがあります。Oh-My-ZSH asdfプラグインは、ohmyzsh/ohmyzsh#8837でご覧いただくと分かるとおり、まだ更新されていません。

ZSH & Pacman

~/.zshrcに下記の行を追記します:

shell
. /opt/asdf-vm/asdf.sh

コマンド補完は、ZSHに適した場所に配置されますが、オートコンプリートを使用するようにZSHを設定する必要があります

PowerShell Core & Git

~/.config/powershell/profile.ps1に下記の行を追記します:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

下記コマンドで、~/.config/powershell/profile.ps1asdf.shを追加します:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.ps1\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

~/.config/powershell/profile.ps1に下記の行を追記します:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

下記コマンドで、~/.config/nushell/config.nuasdf.nuを追加します:

shell
"\n$env.ASDF_NU_DIR = ($env.HOME | path join '.asdf')\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

コマンド補完は自動的に設定されます。

Nushell & Homebrew

下記コマンドで、~/.config/nushell/config.nuasdf.nuを追加します:

shell
"\n$env.ASDF_NU_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\n source " +  (brew --prefix asdf | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path

コマンド補完は自動的に設定されます。

Nushell & Pacman

下記コマンドで、~/.config/nushell/config.nuasdf.nuを追加します:

shell
"\n$env.ASDF_NU_DIR = '/opt/asdf-vm/'\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

コマンド補完は自動的に設定されます。

POSIX Shell & Git

~/.profileに下記の行を追記します:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

下記コマンドで、~/.profileasdf.shを追加します:

shell
echo -e "\nexport ASDF_DIR=\"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
+echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
POSIX Shell & Pacman

~/.profileに下記の行を追記します:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

asdfのスクリプトは、$PATHを設定したあと、かつ、使用中のフレームワーク(oh-my-zsh など)を呼び出したあとに記述する必要があります。

警告

macOSでは、BasgまたはZSHシェルを起動すると、自動的にpath_helperというユーティリティが呼び出されます。path_helperPATH(およびMANPATH)内の項目の順番を並び替えることができるため、特定の順序を必要とするツールの動作に、一貫性が無くなってしまいます。これを回避するため、macOSでasdfを利用するときは、強制的にPATHエントリの先頭に追加する(優先度を一番高くする)ようにしてください。これは、ASDF_FORCE_PREPEND環境変数で制御できます。

PATHの変更を反映するために、シェルを再起動してください。たいていの場合、ターミナルのタブを新たに開けばOKです。

コアのインストールが完了!

これで、asdfのコアのインストールは完了です🎉

しかし、asdfが役に立つようになるのは、プラグインをインストールしてからツールをインストールし、バージョンを管理するようになってからです。引き続き、ガイドを進めていきましょう。

4. プラグインのインストール

ここではデモとして、asdf-nodejsプラグインを使用してNode.jsをインストール・設定してみましょう。

プラグインの依存関係

各プラグインには依存関係があるため、プラグインのリポジトリを確認しておきましょう。asdf-nodejsの場合、必要なものは次のとおりです:

OS依存関係インストールコマンド
Debianapt-get install dirmngr gpg curl gawk
CentOS/ Rocky Linux/ AlmaLinuxyum install gnupg2 curl gawk
macOSbrew install gpg gawk

一部のプラグインではインストール後の事後処理でこれらの依存関係が必要となるため、あらかじめインストールしておきましょう。

プラグインのインストール

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. 特定のバージョンのインストール

Node.js用のプラグインをインストールしたので、このツールの特定のバージョンをインストールしましょう。

インストール可能なバージョンはasdf list all nodejsコマンドで確認できますし、特定のメジャーバージョンのサブセットはasdf list all nodejs 14コマンドで確認できます。

最新版をインストールするには、次のコマンドを実行します:

shell
asdf install nodejs latest

備考

asdfでは正確なバージョン番号を指定してください。latestは、現時点での最新バージョンを指定できるasdfのヘルパーです。

6. バージョンをセット

asdfは、カレントディレクトリから上位の$HOMEディレクトリまでに存在するすべての.tool-versionsファイルをもとに、ツールのバージョンを照会します。照会は、asdfで管理するツールを実行した際に、ジャストインタイムで行われます。

警告

ツールで指定されたバージョンが見つからない場合、エラーが発生します。asdf currentコマンドを実行すると、カレントディレクトリにおいてツールのバージョンを解決可能か確認できるため、どのツールが実行に失敗するか検証することができます。

グローバル

グローバルのデフォルト設定は、$HOME/.tool-versionsで管理されます。グローバルのバージョンをセットするには、次のコマンドを実行します:

shell
asdf global nodejs latest

すると、$HOME/.tool-versions内には次のように書き込まれます:

nodejs 16.5.0

一部のOSでは、pythonのように、asdfではなくシステムが管理するツールが既にインストールされていることがあります。それを使用する場合、asdfに対して、バージョン管理をシステムに委任するように指示する必要があります。詳しくは、バージョンのリファレンスをご覧ください。

ローカル

ローカルのバージョン設定は、$PWD/.tool-versionsファイル(カレントディレクトリ内)で定義されます。たいていの場合は、プロジェクトのGitリポジトリ内となるでしょう。対象となるディレクトリで、下記コマンドを実行します:

shell
asdf local nodejs latest

すると、$PWD/.tool-versions内には次のように書き込まれます:

nodejs 16.5.0

ツールごとに用意された既存バージョンファイルの利用

asdfは、他のバージョンマネージャ向けに作られた既存のバージョンファイル(例: rbenvの場合は.ruby-versionファイル)からの移行をサポートしています。これはプラグイン単位でのサポートです。

asdf-nodejsであれば、.nvmrcファイルと.node-versionファイルの両方に対応しています。このサポートを有効にするには、asdfの構成設定ファイルである$HOME/.asdfrc内に、下記の行を追記してください:

legacy_version_file = yes

構成設定でのその他のオプションについて詳しくは、構成設定のリファレンスをご覧ください。

入門完了!

以上で、asdfの入門は完了です🎉 ここまでで、プロジェクトでのnodejsのバージョン管理ができるようになりました。プロジェクトで使用するツールごとに、同様の手順を実施してください!

asdfには使いこなすと便利なコマンドが他にもいっぱいあり、asdf --helpコマンドまたは単にasdfコマンドを実行すれば、すべてのコマンドの説明を見ることができます。コマンドは大きく分けて3つのカテゴリに分けられます:

+ + + + \ No newline at end of file diff --git a/ja-jp/guide/introduction.html b/ja-jp/guide/introduction.html new file mode 100644 index 00000000..958d3e69 --- /dev/null +++ b/ja-jp/guide/introduction.html @@ -0,0 +1,24 @@ + + + + + + イントロダクション | asdf + + + + + + + + + + + + + +
Skip to content

イントロダクション

asdfは、ツールのためのバージョンマネージャです。すべてのツールのバージョンは単一のファイル(.tool-versions)内で定義されるため、プロジェクトのGitリポジトリにチェックインして共有することで、チーム全員に同じーバージョンのツールを使ってもらえるようになります。

従来は、複数のCLIのバージョンマネージャを用意する必要があり、それぞれが異なるAPI、構成ファイル、および実装($PATHの操作、Shim、環境変数など)となっていました。asdfは、開発ワークフローを簡素化するための単一インターフェースと構成ファイルを提供しており、シンプルなプラグインインターフェースを使って、すべてのツール・ランタイムに拡張することができます。

どうやって動いているの

シェル上でasdfコアがセットアップすると、特定のツールを管理するためのプラグインをインストールすることができるようになります。プラグインによってツールがインストールされると、インストールされる実行ファイルごとにShimが作成されます。これらの実行ファイルを実行しようとすると、代わりにShimが実行され、.tool-versionsで定義されているバージョンをasdfが認識して、当該バージョンが実行されます。

関連プロジェクト

nvm / n / rbenv etc

nvmn、およびrbenvのようなツールはすべて、ツールによってインストールされる実行ファイルのShimを作成するシェルスクリプトです。

asdfはこれらのツールと非常に似ていて、ツール/ランタイムのバージョン管理という分野では競合しています。asdfはプラグインシステムを採用し、他のツールと差別化することで、ツール/ランタイムごとのマネージャ、マネージャごとの異なるコマンド、そしてリポジトリ内の様々な*-versionファイルといったものを排除しています。

direnv

シェルに、ディレクトリごとに環境変数をロード/アンロードできる機能を付け加えます。

asdfは環境変数を管理することはしませんが、direnvの動作をasdfに統合するasdf-direnvプラグインが存在します。

詳しくはdirenvのドキュメントをご覧ください。

Homebrew

macOS(またはLinux)のためのパッケージマネージャー

Homebrewは、パッケージとその上位の依存関係を管理します。asdfは上位の依存関係を管理することはしませんし、パッケージマネージャでもありません。それらの管理はユーザが負担することとなりますが、asdfはなるべく依存関係のリストを小さく保つように努めています。

詳しくはHomebrewのドキュメントをご覧ください。

NixOS

Nixは、パッケージ管理とシステム構成に独自のアプローチを取り入れたツールです。

NixOSは、各ツールの依存関係ツリー全体でパッケージのバージョンを正確に管理することで、真に再現可能な環境を構築することを目指しています。asdfでそのようなことはできません。NixOSは、独自のプログラミング言語、たくさんのCLIツール、そして60,000を超えるパッケージコレクションによって、それらの機能を支えています。

繰り返しになりますが、asdfは上位の依存関係を管理することはしませんし、パッケージマネージャでもありません。

詳しくはNixOSのドキュメントをご覧ください。

なぜasdfを使うの?

asdfは、プラグインシステムによって多くのツールをサポートしており、シェル構成にたった1行のシェルスクリプトを記述するだけで使えるというシンプルさ・親しみやすさによって、チームが確実に同じバージョンのツールを使用することを保証できます。

Note

asdfはシステムのパッケージマネージャになることを目指してはいません。あくまで、ツールのバージョンマネージャです。プラグインを作成することで、どのようなツールでもasdfで管理できるようになりますが、それがそのツールにとって最善の方法であるとは限りませんのでご注意ください。

+ + + + \ No newline at end of file diff --git a/ja-jp/index.html b/ja-jp/index.html new file mode 100644 index 00000000..b92d18a4 --- /dev/null +++ b/ja-jp/index.html @@ -0,0 +1,24 @@ + + + + + + asdf + + + + + + + + + + + + + +
Skip to content

asdf

マルチランタイム
バージョンマネージャ

1つのツールですべてのランタイムのバージョンを管理しましょう!

+ + + + \ No newline at end of file diff --git a/ja-jp/manage/commands.html b/ja-jp/manage/commands.html new file mode 100644 index 00000000..40f8c601 --- /dev/null +++ b/ja-jp/manage/commands.html @@ -0,0 +1,89 @@ + + + + + + すべてのコマンド | asdf + + + + + + + + + + + + + +
Skip to content

すべてのコマンド

asdfで利用可能なすべてのコマンドの一覧です。この一覧は、asdf helpコマンドで表示されるテキストです。

txt
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>]      Add a plugin from the plugin repo OR,
+                                        add a Git repo as a plugin by
+                                        specifying the name and repo url
+asdf plugin list [--urls] [--refs]      List installed plugins. Optionally show
+                                        git urls and git-ref
+asdf plugin list all                    List plugins registered on asdf-plugins
+                                        repository with URLs
+asdf plugin remove <name>               Remove plugin and package versions
+asdf plugin update <name> [<git-ref>]   Update a plugin to latest commit on
+                                        default branch or a particular git-ref
+asdf plugin update --all                Update all plugins to latest commit on
+                                        default branch
+
+
+MANAGE PACKAGES
+asdf current                            Display current version set or being
+                                        used for all packages
+asdf current <name>                     Display current version set or being
+                                        used for package
+asdf global <name> <version>            Set the package global version
+asdf global <name> latest[:<version>]   Set the package global version to the
+                                        latest provided version
+asdf help <name> [<version>]            Output documentation for plugin and tool
+asdf install                            Install all the package versions listed
+                                        in the .tool-versions file
+asdf install <name>                     Install one tool at the version
+                                        specified in the .tool-versions file
+asdf install <name> <version>           Install a specific version of a package
+asdf install <name> latest[:<version>]  Install the latest stable version of a
+                                        package, or with optional version,
+                                        install the latest stable version that
+                                        begins with the given string
+asdf latest <name> [<version>]          Show latest stable version of a package
+asdf latest --all                       Show latest stable version of all the
+                                        packages and if they are installed
+asdf list <name> [version]              List installed versions of a package and
+                                        optionally filter the versions
+asdf list all <name> [<version>]        List all versions of a package and
+                                        optionally filter the returned versions
+asdf local <name> <version>             Set the package local version
+asdf local <name> latest[:<version>]    Set the package local version to the
+                                        latest provided version
+asdf shell <name> <version>             Set the package version to
+                                        `ASDF_${LANG}_VERSION` in the current shell
+asdf uninstall <name> <version>         Remove a specific version of a package
+asdf where <name> [<version>]           Display install path for an installed
+                                        or current version
+asdf which <command>                    Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...]           Executes the command shim for current version
+asdf env <command> [util]               Runs util (default: `env`) inside the
+                                        environment used for command shim execution.
+asdf info                               Print OS, Shell and ASDF debug information.
+asdf version                            Print the currently installed version of ASDF
+asdf reshim <name> <version>            Recreate shims for version of a package
+asdf shim-versions <command>            List the plugins and versions that
+                                        provide a command
+asdf update                             Update asdf to the latest stable release
+asdf update --head                      Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs:   https://asdf-vm.com
+ + + + \ No newline at end of file diff --git a/ja-jp/manage/configuration.html b/ja-jp/manage/configuration.html new file mode 100644 index 00000000..60ca25a6 --- /dev/null +++ b/ja-jp/manage/configuration.html @@ -0,0 +1,32 @@ + + + + + + 構成設定 | asdf + + + + + + + + + + + + + +
Skip to content

構成設定

asdfの構成設定には、他人と共有可能な.tool-versionsファイルと、.asdfrcや環境変数によってカスタマイズ可能なユーザ固有の設定とがあります。

.tool-versions

.tool-versionsファイルがディレクトリに存在する場合、当該ディレクトリおよびサブディレクトリで、ファイル内で宣言しているツールのバージョンが使用されます。

備考

グローバルのデフォルト値は、$HOME/.tool-versionsファイルで設定できます。

.tool-versionsファイル内は下記のような記述となっています:

ruby 2.5.3
+nodejs 10.15.0

コメントを含めることもできます:

ruby 2.5.3 # This is a comment
+# This is another comment
+nodejs 10.15.0

バージョンの表記は下記の形式があります:

  • 10.15.0 - 実バージョンの表記です。バイナリのダウンロードに対応しているプラグインの場合、バイナリがダウンロードされます。
  • ref:v1.0.2-a or ref:39cb398vb39 - 指定されたタグ/コミット/ブランチをgithubからダウンロードし、コンパイルされます。
  • path:~/src/elixir - 使用するツールをカスタムコンパイルしたバージョンへのパスです。言語開発者などが使用します。
  • system - このキーワードを指定した場合、asdfが管理していない、システム上のツールバージョンへパススルーします。

ヒント

スペースで区切れば、複数のバージョンを指定できます。例えば、Python 3.7.2を使用し、Python 2.7.15にフォールバックし、最終的にsystemのPythonにフォールバックさせるには、.tool-versionsに下記の行を追記します。

python 3.7.2 2.7.15 system

.tool-versionsファイルで定義されているすべてのツールをインストールするには、.tool-versionsファイルを含むディレクトリで、asdf installコマンドを引数を指定せずに実行します。

.tool-versionsファイルで定義されている単一のツールをインストールするには、.tool-versionsファイルを含むディレクトリで、asdf install <name>コマンドを実行します。ツールは、.tool-versionsファイルで指定されたバージョンでインストールされます。

ファイルは、直接編集するか、asdf localコマンド(またはasdf globalコマンド)を使用して更新してください。

.asdfrc

.asdfrcでは、ユーザのマシン固有の構成を設定します。

asdfはデフォルトで${HOME}/.asdfrcに構成ファイルを配置します。ファイルの場所は、ASDF_CONFIG_FILE環境変数で設定できます。

下記は、構成に必要な項目とそのデフォルト値を示しています:

txt
legacy_version_file = no
+use_release_candidates = no
+always_keep_download = no
+plugin_repository_last_check_duration = 60
+disable_plugin_short_name_repository = no
+concurrency = auto

legacy_version_file

対応しているプラグインの場合、他のバージョンマネージャで使用されているバージョンファイルを読み込むことができます。例えば、Rubyのrbenvであれば.ruby-versionファイルを読み込みます。

オプション説明
no デフォルトバージョンの読み込みには.tool-versionsを使用します
yes利用可能なレガシーバージョンファイル(.ruby-versionなど)がある場合、プラグインのフォールバックで使用します

use_release_candidates

asdf updateコマンドでasdfを更新する際に、最新リリースではなく、リリース候補版へ更新するか制御します。

オプション説明
no デフォルト最新リリースを使用します
yesリリース候補版を使用します

always_keep_download

asdf installコマンドでダウンロードしたソースコードやバイナリを、保持しておくか削除するかを制御します。

オプション説明
no デフォルトインストールが成功したら、ソースコードやバイナリを削除します
yesインストール後も、ソースコードやバイナリを保持します

plugin_repository_last_check_duration

asdfプラグインリポジトリの同期間隔(分)を制御します。何らかのトリガーイベントが発生した際に、最後に同期した時刻からの経過時間をチェックします。設定された間隔以上の時間が経過していた倍は、新たに同期が開始されます。

オプション説明
1から999999999までの整数値
デフォルト60
最後に同期した時刻から指定時間(分)以上経過していた場合、トリガーイベントで同期します
0トリガーイベントのたびに同期します
never同期しません

同期は、以下のコマンドが実行されたときに発生します:

  • asdf plugin add <name>
  • asdf plugin list all

asdf plugin add <name> <git-url>コマンドでは、プラグインの同期はトリガーされません。

備考

値をneverにしても、プラグインリポジトリの初期同期は停止されません。この動作については、disable_plugin_short_name_repositoryの節をご覧ください。

disable_plugin_short_name_repository

asdfプラグインのショートネームリポジトリの同期を無効化します。ショートネームリポジトリが無効となっている場合、同期イベントはすぐに終了します。

オプション説明
no デフォルト同期イベントが発生した際に、asdfプラグインリポジトリをクローンまたは更新します
yesプラグインショートネームリポジトリを無効化します

同期は、以下のコマンドが実行されたときに発生します:

  • asdf plugin add <name>
  • asdf plugin list all

asdf plugin add <name> <git-url>コマンドでは、プラグインの同期はトリガーされません。

備考

プラグインショートネームリポジトリを無効化しても、すでに同期されたリポジトリは削除されません。プラグインリポジトリを削除するには、rm --recursive --trash $ASDF_DATA_DIR/repositoryコマンドを実行してください。

また、プラグインショートネームリポジトリを無効化しても、以前にこのソースからインストールされたプラグインは削除されません。プラグインを削除するには、asdf plugin remove <name>コマンドを実行してください。プラグインを削除すると、そのプラグインでインストールされたすべてのツールバージョンが削除されます。

concurrency

コンパイル時に使用するデフォルトのコア数です。

OptionsDescription
整数値ソースコードのコンパイル時に使用するコア数です
autonprocsysctl hw.ncpu/proc/cpuinfo、または1、の優先順でコア数を計算します

備考: ASDF_CONCURRENCY環境変数が設定されている場合はそちらが優先されます。

環境変数

環境変数の設定値は、お使いのシステムやシェルによって異なります。デフォルトロケーションは、インストールした場所や方法(Gitクローン、Homebrew、AUR)によって異なります。

環境変数は通常、asdf.sh/asdf.fishなどをsourceする前に設定する必要があります。Elvishの場合は、use asdfの上側に設定します。

以下では、Bashシェルでの使用方法について説明します。

ASDF_CONFIG_FILE

.asdfrc構成ファイルへのパスです。任意の場所に設定できます。必ず絶対パスで設定してください。

  • 未設定の場合: $HOME/.asdfrcの値が使用されます。
  • 使用方法: export ASDF_CONFIG_FILE=/home/john_doe/.config/asdf/.asdfrc

ASDF_DEFAULT_TOOL_VERSIONS_FILENAME

ツール名とバージョンの情報を格納するファイルのファイル名です。有効なファイル名であれば何でも設定できます。通常、.tool-versionsファイルを無視したい場合を除き、この値を変更するべきではありません。

  • 未設定の場合: .tool-versionsの値が使用されます。
  • 使用方法: export ASDF_DEFAULT_TOOL_VERSIONS_FILENAME=tool_versions

ASDF_DIR

asdfのコアスクリプト場所です。任意の場所に設定できます。必ず絶対パスで設定してください。

  • 未設定の場合: bin/asdf実行ファイルの親ディレクトリが使用されます。
  • 使用方法: export ASDF_DIR=/home/john_doe/.config/asdf

ASDF_DATA_DIR

asdfがプラグイン、Shim、ツールのバージョンをインストールする場所です。任意の場所に設定できます。必ず絶対パスで設定してください。

  • 未設定の場合: $HOME/.asdfディレクトリが存在すればその場所、存在しない場合はASDF_DIRの値を使用します。
  • 使用方法: export ASDF_DATA_DIR=/home/john_doe/.asdf

ASDF_CONCURRENCY

ソースコードのコンパイル時に使用するコア数です。この環境変数の値は、asdf構成ファイルのconcurrencyの値よりも優先されます。

  • 未設定の場合: asdf構成ファイルのconcurrencyの値が使用されます。
  • 使用方法: export ASDF_CONCURRENCY=32

ASDF_FORCE_PREPEND

asdfのShimやパスのディレクトリをPATHの先頭(最高優先度)に追加するかどうかを設定します。

  • 未設定の場合: macOSでのデフォルト値はyes、その他のシステムでのデフォルト値はnoです。
  • yesの場合: asdfディレクトリを強制的にPATHの先頭に配置します。
  • yes以外の文字列を設定した場合: asdfディレクトリを強制的にPATHの先頭に配置することは しません
  • Usage: ASDF_FORCE_PREPEND=no . "<path-to-asdf-directory>/asdf.sh"

完全な構成の例

下記のように、asdfをシンプルにセットアップしたとします:

  • Bashシェル
  • インストール先は$HOME/.asdf
  • Git経由でインストール
  • 環境変数は何も設定していない
  • .asdfrcファイルは何もカスタマイズしていない

すると、結果として以下のような構成となります:

構成値がセットされる過程
config file location$HOME/.asdfrcASDF_CONFIG_FILEは空なので、$HOME/.asdfrcが使用されます。
default tool versions filename.tool-versionsASDF_DEFAULT_TOOL_VERSIONS_FILENAMEは空なので、.tool-versionsが使用されます。
asdf dir$HOME/.asdfASDF_DIRは空なので、bin/asdfの親ディレクトリが使用されます。
asdf data dir$HOME/.asdfASDF_DATA_DIRは空であり、$HOMEが存在するので、$HOME/.asdfが使用されます。
concurrencyautoASDF_CONCURRENCYは空なので、デフォルト構成concurrencyの値に依存します。
legacy_version_fileno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
use_release_candidatesno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
always_keep_downloadno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
plugin_repository_last_check_duration60.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
disable_plugin_short_name_repositoryno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。

内部構成

この節では、パッケージマネージャやインテグレータ向けのasdfの内部構成について記述しているため、ユーザが気にする必要はありません。

  • $ASDF_DIR/asdf_updates_disabled: このファイルが存在する場合、asdf updateコマンドによる更新は無効になります(ファイル内容は関係ありません)。これは、PacmanやHomebrewのようなパッケージマネージャによって使用され、特定のインストールに対して正しい更新方法を適用するようにします。
+ + + + \ No newline at end of file diff --git a/ja-jp/manage/core.html b/ja-jp/manage/core.html new file mode 100644 index 00000000..918d51ea --- /dev/null +++ b/ja-jp/manage/core.html @@ -0,0 +1,41 @@ + + + + + + コア | asdf + + + + + + + + + + + + + +
Skip to content

コア

コアとなるasdfのコマンドはかなり少量ですが、多くのワークフローを円滑に進めることができます。

インストール & セットアップ

はじめようのガイドで説明されています。

実行

shell
asdf exec <command> [args...]

現在のバージョンのShimでコマンドを実行します。

環境変数

shell
asdf env <command> [util]

情報

shell
asdf info

OS、シェル、およびasdfのデバッグ情報を表示するヘルパーコマンドです。バグレポート作成時に共有してください。

Shimの再作成

shell
asdf reshim <name> <version>

特定のパッケージ・バージョンのShimを再作成します。デフォルトでは、Shimはプラグインによってツールのインストール中に作成されます。npm CLIなどのツールは、実行ファイルをグローバルインストールができます(例:npm install -g yarnコマンドでYarnをインストール)が、これらの実行ファイルはプラグインのライフサイクルを通してインストールされないため、Shimはまだ存在しません。そのような時に、例えばasdf reshim nodejs <version>を実行すると、nodejs<version>に対して、yarnのような新しい実行ファイルのShimを強制的に再作成させることができます。

Shimのバージョン

shell
asdf shim-versions <command>

<command>のShimを提供するプラグインおよびバージョンを一覧で表示します。

例えば、Node.jsにはnodenpmという2つの実行ファイルが提供されています。asdf-nodejsプラグインで、複数のバージョンのツールがインストールされている場合、shim-versionsは下記のような一覧を返します:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

更新

asdfには、Git依存のアップデートコマンドが用意されています(推奨されるインストール方法を使用した場合)。別の方法でインストールした場合、その方法の手順に従ってください:

方法最新の安定リリースmasterブランチの最新コミット
asdf (Git経由)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
Pacman新しいPKGBUILDをダウンロードしてリビルド、
または好みのAURヘルパーを使用

アンインストール

asdfをアンインストールするには以下の手順に従ってください:

Bash & Git
  1. ~/.bashrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. ~/.bash_profileで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. ~/.bashrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

コマンド補完については、Homebrewで説明されている方法で設定されている可能性があるため、そちらのガイドに従って削除する行を見つけてください。

  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

macOS Catalina以降では、デフォルトのシェルがZSHに変更されました。もし、~/.bash_profileに設定が見つからない場合は、~/.zshrcにある可能性があります。その場合は、ZSHの手順をご覧ください。

  1. ~/.bash_profileで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

コマンド補完については、Homebrewで説明されている方法で設定されている可能性があるため、そちらのガイドに従って削除する行を見つけてください。

  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. ~/.bashrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. /opt/asdf-vm/asdf.sh
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. ~/.config/fish/config.fishで、asdf.fishをsourceしている行を削除します:
shell
source ~/.asdf/asdf.fish

そして、次のコマンドで、コマンド補完を削除します:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. ~/.config/fish/config.fishで、asdf.fishをsourceしている行を削除します:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. ~/.config/fish/config.fishで、asdf.fishをsourceしている行を削除します:
shell
source /opt/asdf-vm/asdf.fish
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. ~/.config/elvish/rc.elvで、asdfモジュールを使用している行を削除します:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

そして、次のコマンドで、asdfモジュールを削除します:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. $HOME/.asdfディレクトリを削除します:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. ~/.config/elvish/rc.elvで、asdfモジュールを使用している行を削除します:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

そして、次のコマンドで、asdfモジュールを削除します:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. ~/.config/elvish/rc.elvで、asdfモジュールを使用している行を削除します:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

そして、次のコマンドで、asdfモジュールを削除します:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. ~/.zshrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

または、ZSHフレームワークプラグインを使用します。

  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. ~/.zshrcで、asdf.shをsourceしている行を削除します:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force && brew autoremove
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. ~/.zshrcで、asdf.shをsourceしている行を削除します:
shell
. /opt/asdf-vm/asdf.sh
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"

たったこれだけです! 🎉

+ + + + \ No newline at end of file diff --git a/ja-jp/manage/plugins.html b/ja-jp/manage/plugins.html new file mode 100644 index 00000000..d2cafa10 --- /dev/null +++ b/ja-jp/manage/plugins.html @@ -0,0 +1,34 @@ + + + + + + プラグイン | asdf + + + + + + + + + + + + + +
Skip to content

プラグイン

プラグインは、asdfがNode.jsやRuby、Elixirなどの様々なツールを取り扱えるようにするためのものです。

様々なツールをサポートするために使用されるプラグインAPIについては、プラグインの作成をご覧ください。

追加

下記コマンドでは、GitのURLからプラグインを追加します:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

または下記のコマンドで、プラグインリポジトリのショートネームを指定して追加します:

shell
asdf plugin add <name>
+# asdf plugin add erlang

推奨

リポジトリのショートネームに依存しないために、git-urlを使用することを推奨します。

インストール済みプラグイン一覧

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

全プラグインのショートネーム一覧

shell
asdf plugin list all

全プラグインのショートネーム一覧については、プラグインショートネームの一覧もご覧ください。

更新

shell
asdf plugin update --all

特定のプラグインパッケージを更新したい場合は、下記のように指定してください。

shell
asdf plugin update <name>
+# asdf plugin update erlang

この更新コマンドは、プラグインリポジトリの originデフォルトブランチ における 最新コミット を取得します。バージョニングされたプラグインの更新機能については、現在開発中です(#916)。

削除

bash
asdf plugin remove <name>
+# asdf plugin remove erlang

プラグインを削除すると、当該プラグインでインストールされたすべてのツールが削除されます。これは、各ツールの未使用バージョンを手っ取り早くクリーンアップ/プルーニングするのに有用です。

ショートネームリポジトリの同期

ショートネームリポジトリはローカルマシンに同期され、定期的に更新されます。同期のタイミングの条件は、次のとおりです:

  • 同期イベントは、下記コマンドによってトリガーされます:
    • asdf plugin add <name>
    • asdf plugin list all
  • 構成設定のdisable_plugin_short_name_repositoryオプションがyesの場合、同期は中止されます。詳しくはasdfの構成設定のリファレンスをご覧ください。
  • もし、過去X分の間に同期が行われていない場合、同期が開始されます。
    • Xのデフォルト値は60ですが、.asdfrcファイルのplugin_repository_last_check_durationオプションで変更することができます。詳しくはasdfの構成設定のリファレンスをご覧ください。
+ + + + \ No newline at end of file diff --git a/ja-jp/manage/versions.html b/ja-jp/manage/versions.html new file mode 100644 index 00000000..79a8cec9 --- /dev/null +++ b/ja-jp/manage/versions.html @@ -0,0 +1,53 @@ + + + + + + バージョン | asdf + + + + + + + + + + + + + +
Skip to content

バージョン

バージョンのインストール

shell
asdf install <name> <version>
+# asdf install erlang 17.3

プラグインが、ソースコードからのダウンロード・コンパイルをサポートしている場合、ref:fooの形式(fooは特定のブランチ、タグ、またはコミット)でバージョンを指定できます。アンインストールするときも、同じ名前とバージョンを指定する必要があります。

最新安定バージョンのインストール

shell
asdf install <name> latest
+# asdf install erlang latest

下記のように、特定のプレフィックスでの最新安定バージョンをインストールすることもできます。

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

インストール済みバージョン一覧

shell
asdf list <name>
+# asdf list erlang

下記のように、特定のプレフィックスでのバージョンでフィルタすることもできます。

shell
asdf list <name> <version>
+# asdf list erlang 17

インストール可能な全バージョン一覧

shell
asdf list all <name>
+# asdf list all erlang

下記のように、特定のプレフィックスでのバージョンでフィルタすることもできます。

shell
asdf list all <name> <version>
+# asdf list all erlang 17

最新安定バージョンの表示

shell
asdf latest <name>
+# asdf latest erlang

下記のように、特定のプレフィックスでの最新安定バージョンで表示することもできます。

shell
asdf latest <name> <version>
+# asdf latest erlang 17

カレントバージョンのセット

shell
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest

globalの場合、バージョンは$HOME/.tool-versionsファイルに書き込まれます。

shellの場合、バージョンはASDF_${TOOL}_VERSIONという環境変数に設定され、現在のシェルセッションでのみ有効となります。

localの場合、バージョンは$PWD/.tool-versionsファイルに書き込まれます。存在しない場合は作成されます。

.tool-versionsファイルについて詳しくは、構成設定のリファレンスをご覧ください。

代替手段

現在のシェルセッションでのみバージョンを設定したい場合、 または、特定のツールバージョンでコマンドを実行するだけのためにバージョンを設定したい場合は、 ASDF_${TOOL}_VERSIONという環境変数で設定することができます。

下記の例では、バージョン1.4.0のElixirプロジェクトに対して、テストを実行させています。 バージョンの表記形式は、.tool-versionsファイルでサポートされているものと同じです。

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

システムバージョンへの委任

asdfで管理されているバージョンではなく、<name>で指定されたツールのシステムバージョンを使用するには、バージョンとしてsystemを指定します。

カレントバージョンのセットと同様の方法で、globallocal、またはshellのいずれかにsystemをセットしてください。

shell
asdf local <name> system
+# asdf local python system

カレントバージョンの表示

shell
asdf current
+# asdf current
+# erlang          17.3          /Users/kim/.tool-versions
+# nodejs          6.11.5        /Users/kim/cool-node-project/.tool-versions
+
+asdf current <name>
+# asdf current erlang
+# erlang          17.3          /Users/kim/.tool-versions

バージョンのアンインストール

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

Shims

asdfがパッケージをインストールすると、そのパッケージに含まれるすべての実行プログラムのShimが$ASDF_DATA_DIR/shimsディレクトリ(デフォルトは~/.asdf/shims)に作成されます。このディレクトリが(asdf.shasdf.fishなどによって)$PATHに設定されることで、インストールされているプログラムが当該環境で利用できるようになります。

Shim自体は非常に単純なラッパーであり、asdf execというヘルパープログラムに、プラグイン名と、Shimがラップしているインストール済みパッケージの実行ファイルのパスを渡して、execします。

asdf execヘルパーは、使用するパッケージのバージョン(.tool-versionsファイルで指定されたもの、またはasdf local ...asdf global ...で指定されたもの)、パッケージのインストールディレクトリにある実行ファイルの完全パス(プラグインのexec-pathコールバックで操作可能)、および実行環境(プラグインのexec-envスクリプトで提供)を決定し、実行します。

備考

本システムはexec呼び出しを使用するため、シェルによってsourceされるパッケージ内のスクリプトは、Shimラッパーを経由させずに直接アクセスする必要があります。asdfで用意されているwhichおよびwhereコマンドは、下記のように、インストールされたパッケージへのパスを返すため、この状況を解決するのに役立ちます:

shell
# returns path to main executable in current version
+source $(asdf which ${PLUGIN})/../script.sh
+
+# returns path to the package installation directory
+source $(asdf where ${PLUGIN})/bin/script.sh

asdfのShimのバイパス

何らかの理由でasdfのShimをバイパスしたい場合や、プロジェクトのディレクトリに移動した際に自動的に環境変数を設定したい場合は、asdf-direnvプラグインが役に立ちます。詳細はREADMEをご確認ください。

+ + + + \ No newline at end of file diff --git a/ja-jp/more/community-projects.html b/ja-jp/more/community-projects.html new file mode 100644 index 00000000..d3321541 --- /dev/null +++ b/ja-jp/more/community-projects.html @@ -0,0 +1,24 @@ + + + + + + コミュニティプロジェクト | asdf + + + + + + + + + + + + + +
Skip to content

コミュニティプロジェクト

asdfに関連するコミュニティプロジェクトをいくつか紹介します:

  • asdf-community: asdfプラグインの長期的なメンテナンスを目的とした コミュニティ主導の共同プロジェクトです。
  • asdf dev container: GitHub Codespacesでasdfによるツール管理をサポートする、 GitHub Dev Container です。

備考

asdfコアチームは、これらのプロジェクトやコードを所有していません。 asdfコアでは、ここに掲載されているものに関連する品質やセキュリティについては責任を負いません。

+ + + + \ No newline at end of file diff --git a/ja-jp/more/faq.html b/ja-jp/more/faq.html new file mode 100644 index 00000000..f9687ba6 --- /dev/null +++ b/ja-jp/more/faq.html @@ -0,0 +1,24 @@ + + + + + + FAQ | asdf + + + + + + + + + + + + + +
Skip to content

FAQ

ここでは、asdfに関するよくある質問を紹介します。

WSL1をサポートしていますか?

WSL1 (Windows Subsystem for Linux 1)は公式にはサポートしていません。asdfは正常に動作しない可能性があります。WSL1を公式にサポートする予定はありません。

WSL2をサポートしていますか?

WSL2 (Windows Subsystem for Linux 2)では、あなたが選択したWSLディストリビューションに基づいて、セットアップと依存関係の解決を済ませれば、動作するはずです。

重要なのは、WSL2が正常に動作するのは、カレントワークディレクトリがWindowsドライブではなくUnixドライブである場合に 限られる ということです。

GitHub Actionsでホストランナーのサポートが可能になれば、WSL2でテストスイートを実行する予定ですが、現時点ではそうではないようです。

新しくインストールした実行ファイルが実行できないのですが?

npm install -g yarnを実行したにも関わらず、yarnが実行できません。どうなっているの?

asdfShimを使って実行ファイルを管理しています。プラグインによってインストールされるものは、自動的にShimが作成されますが、asdfが管理しているツールによって実行ファイルがインストールされた場合は、Shimを作成しなければならないということをasdfに通知する必要があります。上記の例では、YarnのShimを作成しなければいけません。詳しくは、asdf reshimコマンドのドキュメントをご覧ください。

シェルが、新しくインストールされたShimを検知してくれないのですが?

asdf reshimコマンドを実行しても問題が解決しない場合、asdf.shasdf.fishのsourceが、シェルの構成ファイル(.bash_profile.zshrcconfig.fishなど)の一番下にないことが原因である可能性があります。$PATHを設定した、そしてフレームワーク(oh-my-zshなど)を使用しているのれあればそれをsourceしたに、sourceする必要があります。

+ + + + \ No newline at end of file diff --git a/ja-jp/more/thanks.html b/ja-jp/more/thanks.html new file mode 100644 index 00000000..7ed4116f --- /dev/null +++ b/ja-jp/more/thanks.html @@ -0,0 +1,24 @@ + + + + + + 謝辞 | asdf + + + + + + + + + + + + + +
Skip to content

謝辞

このページを借りて、asdfのオーサーおよびコントリビューターの皆様に感謝を申し上げます!

クレジット

私 (@HashNuke)、高熱、風邪、咳。

コピーライト 2014年から今まで (MIT License)

メンテナー

コントリビューター

GitHubのコントリビューターリスト🙏をご覧ください。

+ + + + \ No newline at end of file diff --git a/ja-jp/plugins/create.html b/ja-jp/plugins/create.html new file mode 100644 index 00000000..03d2d909 --- /dev/null +++ b/ja-jp/plugins/create.html @@ -0,0 +1,82 @@ + + + + + + プラグインの作成 | asdf + + + + + + + + + + + + + +
Skip to content

プラグインの作成

プラグインとは、 言語/ツールのバージョン管理をサポートするための実行スクリプトを含めたGitリポジトリのことです。 これらのスクリプトは、asdf list-all <name>asdf install <name> <version>などの機能をサポートするコマンドを使って、 asdfによって実行されます。

クイックスタート

オリジナルのプラグインを作成するには、次の2つの方法があります:

  1. asdf-vm/asdf-plugin-templateリポジトリを使用し、 デフォルトのスクリプトが実装されたプラグインリポジトリ(名前はasdf-<tool_name>)を 生成 します。 生成できたら、 そのリポジトリをクローンしてsetup.bashのスクリプトを実行し、 テンプレートを対話的に更新していきます。
  2. asdf-<tool_name>という名前のリポジトリを自分で立ち上げ、 以降に記載されている必要なスクリプトを実装します。

プラグインスクリプトの鉄則

  • スクリプト内で他のasdfコマンドを呼び出してはいけません
  • シェルのツール/コマンドへの依存関係を小さく保つようにしてください。
  • 移植性のないツールやコマンドフラグの使用は避けてください。 例えば、sort -Vなどです。 asdfコアの禁止コマンド一覧もご覧ください。

スクリプトの概要

以下は、asdfから呼び出せるスクリプトの全リストです。

スクリプト説明
bin/list-all 必須インストール可能なすべてのバージョンをリストします。
bin/download 必須ツールの特定バージョンのソースコードまたはバイナリをダウンロードします。
bin/install 必須ツールの特定バージョンをインストールします。
bin/latest-stable 推奨指定されたツールの最新安定バージョンをリストします。
bin/help.overviewプラグインおよびツールに関する概要説明を出力します。
bin/help.depsオペレーティングシステムに合わせた依存関係のリストを出力します。
bin/help.configプラグインおよびツールの構成設定一覧を出力します。
bin/help.linksプラグインとツールに関連するリンクリストを出力します。
bin/list-bin-pathsShimを作成するバイナリが存在するディレクトリへの相対パスの一覧を出力します。
bin/exec-envツールのバイナリのShimを実行する前に環境を準備します。
bin/exec-pathツールの特定バージョンの実行ファイルパスを出力します。
bin/uninstallツールの特定バージョンをアンインストールします。
bin/list-legacy-filenames.ruby-versionのような、レガシー構成ファイルのリストを出力します。
bin/parse-legacy-fileレガシーバージョンファイルのカスタムパーサーです。
bin/post-plugin-addプラグインが追加された後に実行されるフックです。
bin/post-plugin-updateプラグインが更新された後に実行されるフックです。
bin/pre-plugin-removeプラグインが削除される前に実行されるフックです。

どのコマンドがどのスクリプトを呼び出すかについては、 各スクリプトの詳細なドキュメントを参照してください。

環境変数の概要

以下は、すべてのスクリプトで使用される環境変数の全リストです。

環境変数説明
ASDF_INSTALL_TYPEversionまたはrefです。
ASDF_INSTALL_VERSIONASDF_INSTALL_TYPEに応じてフルバージョンナンバーまたはGit Refの値が入ります。
ASDF_INSTALL_PATHツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。
ASDF_CONCURRENCYソースコードのコンパイル時に使用するコア数です。make -jのようなフラグを設定する際に便利です。
ASDF_DOWNLOAD_PATHbin/downloadによってソースコードまたはバイナリがダウンロードされる場所へのパスです。
ASDF_PLUGIN_PATHプラグインがインストールされている場所へのパスです。
ASDF_PLUGIN_SOURCE_URLプラグインソースのURLです。
ASDF_PLUGIN_PREV_REFプラグインの以前のgit-refです。
ASDF_PLUGIN_POST_REF更新後のプラグインのgit-refです。
ASDF_CMD_FILEソースとなるファイルのフルパスに解決されます。

備考

すべてのスクリプトですべての環境変数が使用できるわけではありません。 以下の各スクリプトのドキュメントで、そのスクリプトで利用可能な環境変数を確認してください。

必須スクリプト

bin/list-all 必須

説明

インストール可能なすべてのバージョンをリストします。

出力フォーマット

スペース区切りのバージョンリストの文字列を出力する必要があります。例えば次のとおりです:

txt
1.0.1 1.0.2 1.3.0 1.4

最新バージョンが末尾にくる必要があります。

asdfコアは各バージョンを1行ずつ表示するため、 いくつかのバージョンは画面外にはみ出る場合があります。

並べ替え

ウェブサイト上のリリースページからバージョンを取得する場合、 提供されている順序は正しいリリース順となっていることが多いため、 そのままの順序を使用することを推奨します。 逆順にしたければ、tscをパイプで通すだけで十分です。

どうしても並べ替えが避けられない場合、sort -Vは移植性が無いため、次のいずれかの方法を使用することを推奨します:

スクリプトで使用できる環境変数

このスクリプトに環境変数は提供されません。

このスクリプトを呼び出すコマンド

  • asdf list all <name> [version]
  • asdf list all nodejs: このスクリプトで返されるすべてのバージョンを、 1行ずつリストします。
  • asdf list all nodejs 18: このスクリプトで返されるすべてのバージョンから、 18で始まるバージョンのみフィルタし、1行ずつリストします。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/list-all"

bin/download 必須

説明

ツールの特定バージョンのソースコードまたはバイナリを、指定された場所にダウンロードします。

実装内容

  • スクリプトは、ASDF_DOWNLOAD_PATHで指定されたディレクトリに、ソースコードまたはバイナリをダウンロードする必要があります。
  • 解凍されたソースコードまたはバイナリのみを、ASDF_DOWNLOAD_PATHディレクトリに配置する必要があります。
  • 失敗した場合、ASDF_DOWNLOAD_PATHディレクトリ内に何もファイルを配置しないようにしてください。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。

レガシープラグイン

このスクリプトはすべてのプラグインで 必須 とされていますが、このスクリプトが導入される以前の"レガシー"プラグインでは、 オプション となっていました。

このスクリプトが存在しない場合、asdfはbin/installスクリプトがあると想定して、バージョンのダウンロード、かつ、インストールが実行されます。

レガシープラグインのサポートは最終的に削除される予定のため、今後作成するすべてのプラグインでこのスクリプトを含めるようにしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。
  • ASDF_DOWNLOAD_PATH: ソースコードまたはバイナリのダウンロード先のパスです。

このスクリプトを呼び出すコマンド

  • asdf install <tool> [version]
  • asdf install <tool> latest[:version]
  • asdf install nodejs 18.0.0: Node.jsのバージョン18.0.0のソースコードまたはバイナリをダウンロードし、ASDF_DOWNLOAD_PATHディレクトリに配置します。 そしてbin/installスクリプトを実行します。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}"/bin/download

bin/install 必須

説明

ツールの特定バージョンを指定された場所にインストールします。

実装内容

  • スクリプトは、指定されたバージョンをASDF_INSTALL_PATHのパスのディレクトリにインストールする必要があります。
  • Shimはデフォルトで、$ASDF_INSTALL_PATH/bin内にあるファイルに対して作成されます。 この動作は、オプションのbin/list-bin-pathsスクリプトでカスタマイズできます。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。
  • TOCTOU (Time-of-Check-to-Time-of-Use)の問題を避けるために、ツールのビルドとインストールが成功したとみなされた場合にのみ、ASDF_INSTALL_PATHにファイルを配置するようなスクリプトとしてください。

レガシープラグイン

bin/downloadスクリプトが存在しない場合、このスクリプトでは、指定されたバージョンをダウンロード、かつ、インストールをする必要があります。

0.7._以前と0.8._以降のasdfコアの互換性を保つために、ASDF_DOWNLOAD_PATH環境変数が設定されているかを確認してください。 設定されている場合は、bin/downloadスクリプトがすでにバージョンをダウンロードしていると想定し、設定されていない場合は、bin/installでソースコードをダウンロードするようにしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。
  • ASDF_CONCURRENCY: ソースコードのコンパイル時に使用するコア数です。make -jのようなフラグを設定する際に便利です。
  • ASDF_DOWNLOAD_PATH: ソースコードまたはバイナリのダウンロード先のパスです。

このスクリプトを呼び出すコマンド

  • asdf install
  • asdf install <tool>
  • asdf install <tool> [version]
  • asdf install <tool> latest[:version]
  • asdf install nodejs 18.0.0: ASDF_INSTALL_PATHディレクトリに、 Node.jsのバージョン18.0.0をインストールします。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}"/bin/install

オプションスクリプト

bin/latest-stable 推奨

説明

ツールの最新安定バージョンを判定します。このスクリプトが存在しない場合、asdfコアはbin/list-allの出力をtailした結果をもとに判定しますが、ツールによってはこれが望ましくないことがあります。

実装内容

  • スクリプトは、ツールの最新安定バージョンを標準出力する必要があります。
  • 非安定版やリリース候補版は除外されるべきです。
  • フィルタクエリは、スクリプトの第1引数で提供されます。このクエリは、バージョン番号やツールプロバイダによる出力をフィルタするために使用されるべきです。
    • 例えば、rubyプラグインでのasdf list all rubyの出力は、jrubyrbxtrufflerubyなどの多くのプロバイダのRubyバージョンをリストアップします。ユーザが提供したフィルタは、セマンティックバージョンやプロバイダをフィルタするために、プラグインで使用できます。
      > asdf latest ruby
      +3.2.2
      +> asdf latest ruby 2
      +2.7.8
      +> asdf latest ruby truffleruby
      +truffleruby+graalvm-22.3.1
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf global <tool> latest: ツールのグローバルバージョンとして、当該ツールの最新安定バージョンにセットします。
  • asdf local <name> latest: ツールのローカルバージョンとして、当該ツールの最新安定バージョンにセットします。
  • asdf install <tool> latest: ツールの最新安定バージョンをインストールします。
  • asdf latest <tool> [<version>]: オプションのフィルタに基づいて、ツールの最新バージョンを出力します。
  • asdf latest --all: asdfによって管理されているすべてのツールの最新バージョンと、それらがインストールされているかどうかを出力します。

asdfからの呼び出しシグネチャ

このスクリプトは、フィルタクエリという1つの引数を受け取ります。

bash
"${plugin_path}"/bin/latest-stable "$query"

bin/help.overview

説明

プラグインおよび管理されているツールに関する概要説明を出力します。

実装内容

  • このスクリプトは、プラグインのヘルプを表示するために必要です。
  • ヘッダはasdfコア側で表示するため、スクリプト内では表示しないでください。
  • 自由な形式のテキストで出力して構いませんが、短い1段落程度の説明が理想です。
  • コアとなるasdf-vmドキュメントですでに説明されている情報は出力しないでください。
  • オペレーティングシステムと、インストールされているツールのバージョンに合わせて出力を調整する必要があります(必要に応じて、ASDF_INSTALL_VERSIONおよびASDF_INSTALL_TYPE環境変数の値を使用してください)。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf help <name> [<version>]: プラグインおよびツールのドキュメントを出力します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.overview

bin/help.deps

説明

オペレーティングシステムに合わせた依存関係のリストを出力します。依存関係を1行ごとに出力します。

bash
git
+curl
+sed

実装内容

  • このスクリプトの出力を考慮するために、bin/help.overviewを用意する必要があります。
  • オペレーティングシステムと、インストールされているツールのバージョンに合わせて出力を調整する必要があります(必要に応じて、ASDF_INSTALL_VERSIONおよびASDF_INSTALL_TYPE環境変数の値を使用してください)。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf help <name> [<version>]: プラグインおよびツールのドキュメントを出力します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.deps

bin/help.config

説明

プラグインおよびツールで設定必須または任意設定可能な構成設定一覧を出力します。例えば、ツールのインストール・コンパイルに必要な環境変数やその他フラグについて説明します。

実装内容

  • このスクリプトの出力を考慮するために、bin/help.overviewを用意する必要があります。
  • 自由な形式のテキストで出力できます。
  • オペレーティングシステムと、インストールされているツールのバージョンに合わせて出力を調整する必要があります(必要に応じて、ASDF_INSTALL_VERSIONおよびASDF_INSTALL_TYPE環境変数の値を使用してください)。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf help <name> [<version>]: プラグインおよびツールのドキュメントを出力します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.config

説明

プラグインとツールに関連するリンクリストを出力します。リンクを1行ごとに出力します。

bash
Git Repository:	https://github.com/vlang/v
+Documentation:	https://vlang.io

実装内容

  • このスクリプトの出力を考慮するために、bin/help.overviewを用意する必要があります。
  • リンクを1行ごとに出力してください。
  • 形式は以下のいずれかである必要があります:
    • <title>: <link>
    • または<link>のみ
  • オペレーティングシステムと、インストールされているツールのバージョンに合わせて出力を調整する必要があります(必要に応じて、ASDF_INSTALL_VERSIONおよびASDF_INSTALL_TYPE環境変数の値を使用してください)。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf help <name> [<version>]: プラグインおよびツールのドキュメントを出力します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.links

bin/list-bin-paths

説明

ツールの特定バージョンにおける、実行ファイルが含まれるディレクトリの一覧を出力します。

実装内容

  • このスクリプトが存在しない場合、asdfは"${ASDF_INSTALL_PATH}"/binディレクトリ内にあるバイナリを探し、そのバイナリ向けのShimを作成します。
  • 実行ファイルが含まれるディレクトリのパスをスペース区切りで出力してください。
  • パスはASDF_INSTALL_PATHからの相対パスである必要があります。例えば、次のような出力となります:
bash
bin tools veggies

以上の場合、下記ディレクトリ内のファイルへのShimを作成するよう、asdfへ指示されます:

  • "${ASDF_INSTALL_PATH}"/bin
  • "${ASDF_INSTALL_PATH}"/tools
  • "${ASDF_INSTALL_PATH}"/veggies

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf install <tool> [version]: バイナリへのShimを初期作成します。
  • asdf reshim <tool> <version>: バイナリへのShimを再作成します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}/bin/list-bin-paths"

bin/exec-env

説明

ツールのバイナリのShimを実行する前に環境を準備します。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf which <command>: 実行ファイルのパスを表示します。
  • asdf exec <command> [args...]: 現在のバージョンでShimコマンドを実行します。
  • asdf env <command> [util]: Shimコマンドの実行時に使用される環境において、util(デフォルト: env)を実行します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}/bin/exec-env"

bin/exec-path

ツールの特定バージョンの実行ファイルパスを取得します。 実行ファイルへの相対パスを文字列で出力する必要があります。 これにより、プラグインはShimで指定された実行ファイルパスを条件付きで上書きして返すか、 そうでなければ、Shimで指定されたデフォルトのパスを返すことができます。

説明

ツールの特定バージョンの実行ファイルパスを取得します。

実装内容

  • 実行ファイルへの相対パスを文字列で出力する必要があります。
  • Shimで指定された実行ファイルパスを条件付きで上書きして返すか、そうでなければ、Shimで指定されたデフォルトのパスを返してください。
shell
Usage:
+  plugin/bin/exec-path <install-path> <command> <executable-path>
+
+Example Call:
+  ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"
+
+Output:
+  bin/foox

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

  • asdf which <command>: 実行ファイルのパスを表示します。
  • asdf exec <command> [args...]: 現在のバージョンでShimコマンドを実行します。
  • asdf env <command> [util]: Shimコマンドの実行時に使用される環境において、util(デフォルト: env)を実行します。

asdfからの呼び出しシグネチャ

bash
"${plugin_path}/bin/exec-path" "$install_path" "$cmd" "$relative_path"

bin/uninstall

説明

ツールの特定バージョンをアンインストールします。

出力フォーマット

ユーザへの出力は、stdoutまたはstderrへ適切に送信してください。後続のコア実行によってこれらの出力が読み取られることはありません。

スクリプトで使用できる環境変数

このスクリプトに環境変数は提供されません。

このスクリプトを呼び出すコマンド

  • asdf list all <name> <version>
  • asdf uninstall nodejs 18.15.0: nodejsのバージョン18.15.0をアンインストールし、npm i -gでグローバルにインストールしたものを含むすべてのShimを削除します。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/uninstall"

bin/list-legacy-filenames

説明

ツールのバージョンを決定するために使用されるレガシー構成ファイルのリストを出力します。

実装内容

  • スペース区切りのファイル名リストを出力してください。
    bash
    .ruby-version .rvmrc
  • この内容は、"${HOME}"/.asdfrc内のlegacy_version_fileオプションを有効にしたユーザにのみ適用されます。

スクリプトで使用できる環境変数

  • ASDF_INSTALL_TYPE: versionまたはrefです。
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=versionの場合、バージョンのフルナンバーです。
    • ASDF_INSTALL_TYPE=refの場合、Gitのref (tag/commit/branch)です。
  • ASDF_INSTALL_PATH: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。

このスクリプトを呼び出すコマンド

ツールのバージョンを読み込むすべてのコマンドから呼び出されます。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/list-legacy-filenames"

bin/parse-legacy-file

説明

asdfによって発見されたレガシーファイルをパースして、ツールのバージョンを決定します。JavaScriptのpackage.jsonや、Go言語のgo.modのようなファイルから、バージョン番号を抽出するのに役立ちます。

実装内容

  • このスクリプトが存在しない場合、asdfは単純にレガシーファイルをcatしてバージョンを決定します。
  • 決定論的で、常に正確で同じバージョンを返す必要があります:
    • 同じレガシーファイルを解析したら、同じバージョンを返すようにしてください。
    • マシンに何がインストールされているか、また、レガシーバージョンが有効で完全かどうかは関係ありません。一部のレガシーファイルのフォーマットは適切でないときもあります。
  • 下記のように、バージョン番号を1行で出力してください:
    bash
    1.2.3

スクリプトで使用できる環境変数

このスクリプトが呼び出される前に、環境変数が設定されることはありません。

このスクリプトを呼び出すコマンド

ツールのバージョンを読み込むすべてのコマンドから呼び出されます。

asdfからの呼び出しシグネチャ

このスクリプトは、レガシーファイルの内容を読み込むために、レガシーファイルのパスという1つの引数を受け取ります。

bash
"${plugin_path}/bin/parse-legacy-file" "$file_path"

bin/post-plugin-add

説明

このスクリプトは、asdfのasdf plugin add <tool>コマンドで、プラグインが 追加 された 後に 呼び出されます。

関連するコマンドフックについても参照してください:

  • pre_asdf_plugin_add
  • pre_asdf_plugin_add_${plugin_name}
  • post_asdf_plugin_add
  • post_asdf_plugin_add_${plugin_name}

スクリプトで使用できる環境変数

  • ASDF_PLUGIN_PATH: プラグインがインストールされている場所へのパスです。
  • ASDF_PLUGIN_SOURCE_URL: プラグインソースのURLです。ローカルディレクトリパスを指定することもできます。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/post-plugin-add"

bin/post-plugin-update

説明

このスクリプトは、asdfのasdf plugin update <tool> [<git-ref>]コマンドで、 更新 されたプラグインがダウンロードされた 後に 呼び出されます。

関連するコマンドフックについても参照してください:

  • pre_asdf_plugin_updated
  • pre_asdf_plugin_updated_${plugin_name}
  • post_asdf_plugin_updated
  • post_asdf_plugin_updated_${plugin_name}

スクリプトで使用できる環境変数

  • ASDF_PLUGIN_PATH: プラグインがインストールされている場所へのパスです。
  • ASDF_PLUGIN_PREV_REF: プラグインの以前のgit-refです。
  • ASDF_PLUGIN_POST_REF: 更新後のプラグインのgit-refです。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/post-plugin-update"

bin/pre-plugin-remove

説明

このスクリプトは、asdfのasdf plugin remove <tool>コマンドで、プラグインが 削除 される 前に 呼び出されます。

関連するコマンドフックについても参照してください:

  • pre_asdf_plugin_remove
  • pre_asdf_plugin_remove_${plugin_name}
  • post_asdf_plugin_remove
  • post_asdf_plugin_remove_${plugin_name}

スクリプトで使用できる環境変数

  • ASDF_PLUGIN_PATH: プラグインがインストールされている場所へのパスです。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/pre-plugin-remove"

asdf CLIの拡張コマンド 高度

プラグイン名をサブコマンドとして使用し、 asdfコマンドラインインターフェースを通して呼び出すことのできるlib/commands/command*.bashスクリプトまたは実行ファイルを用意することで、 新しいasdfコマンドを定義することができます。

例えば、fooというプラグインがあるとすると:

shell
foo/
+  lib/commands/
+    command.bash
+    command-bat.bash
+    command-bat-man.bash
+    command-help.bash

ユーザは下記コマンドが実行できるようになります:

shell
$ asdf foo         # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash`
+$ asdf foo bar     # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar`
+$ asdf foo help    # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash`
+$ asdf foo bat man # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash`
+$ asdf foo bat baz # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz`

プラグイン開発者はこの機能を使って、ツールに関連するユーティリティを提供したり、 asdf自体のコマンド拡張プラグインを作成したりすることができます。

実行可能ビット(executable bit)が付与されている場合、 asdfの実行に代わって、当該スクリプトが実行されます。

実行可能ビット(executable bit)が付与されていない場合、asdfは当該スクリプトをBashスクリプトとしてsourceします。

$ASDF_CMD_FILE環境変数は、ソースとなるファイルのフルパスに解決されます。

haxeは、 この機能使ったプラグインの素晴らしい例です。 このプラグインは、asdf haxe neko-dylibs-linkを提供しており、 Haxeの実行ファイルが実行ディレクトリから相対的に動的ライブラリを見つけようとしてしまう問題を修正します。

プラグインのREADMEには、asdf拡張コマンドに関することを必ず記載するようにしてください。

カスタムShimテンプレート 高度

警告

どうしても必要な場合にのみ使用してください。

asdfでは、カスタムShimテンプレートを使用することができます。 fooという実行ファイルに対して、プラグイン内にshims/fooファイルが存在すれば、 asdfは標準Shimテンプレートを使用する代わりに、そのファイルをコピーします。

この機能は賢く使う必要があります。

asdfコアチームが把握している限り、 この機能は公式プラグインであるElixirプラグインでのみ使用されています。 実行ファイルは、実行ファイルであると同時に、Elixirファイルとしても読み込まれます。 そのため、標準的なBashのShimを使用できないのです。

テスト

asdfでは、プラグインをテストするためのplugin-testコマンドを用意しており、下記のように使用できます:

shell
asdf plugin test <plugin_name> <plugin_url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git_ref>] [test_command...]
  • <plugin_name><plugin_url>は必須です。
  • オプションで[--asdf-tool-version <version>]を指定すると、そのバージョンのツールがインストールされます。 デフォルトは、asdf latest <plugin-name>です。
  • オプションで[--asdf-plugin-gitref <git_ref>]を指定すると、 そのコミット/ブランチ/タグでプラグイン自体をチェックアウトします。 これは、プラグインのCIにおいて、プルリクエストをテストする際に便利です。
  • オプションの[test_command...]パラメータは、インストールしたツールが正しく動作するかを確認するために実行するコマンドです。 通常は、<tool> --versionまたは<tool> --helpとなります。 例えば、NodeJSプラグインをテストするときは、次のように実行します:
    shell
    # asdf plugin test <plugin_name>  <plugin_url>                               [test_command]
    +  asdf plugin test nodejs         https://github.com/asdf-vm/asdf-nodejs.git node --version

備考

LinuxとmacOSの両方のCI環境でテストすることを推奨します。

GitHub Action

asdf-vm/actionsリポジトリでは、 GitHub上でホストされているプラグインをテストするためのGitHub Actionを提供しています。 `.github/workflows/test.yamlのActionsワークフローの例は以下のとおりです:

yaml
name: Test
+on:
+  push:
+    branches:
+      - main
+  pull_request:
+
+jobs:
+  plugin_test:
+    name: asdf plugin test
+    strategy:
+      matrix:
+        os:
+          - ubuntu-latest
+          - macos-latest
+    runs-on: ${{ matrix.os }}
+    steps:
+      - name: asdf_plugin_test
+        uses: asdf-vm/actions/plugin-test@v2
+        with:
+          command: "<MY_TOOL> --version"

TravisCI 構成設定

以下は、.travis.ymlファイルの例です。必要に応じてカスタマイズしてください:

yaml
language: c
+script: asdf plugin test <MY_TOOL> $TRAVIS_BUILD_DIR '<MY_TOOL> --version'
+before_script:
+  - git clone https://github.com/asdf-vm/asdf.git asdf
+  - . asdf/asdf.sh
+os:
+  - linux
+  - osx

備考

他のCIを使用する場合、 プラグインの場所への相対パスを渡す必要がある場合があります:

shell
asdf plugin test <tool_name> <path> '<tool_command> --version'

APIレート制限

bin/list-allbin/latest-stableのように、コマンドが外部APIへのアクセスに依存している場合、 自動テスト中にレート制限が発生することがあります。 これを軽減するため、環境変数経由で認証トークンを提供するコードパスがあることを確認してください。 以下に例を示します:

shell
cmd="curl --silent"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"

GITHUB_API_TOKEN

GITHUB_API_TOKENを利用する際は、 まず、 public_repoアクセスのみをもつ新しいパーソナルトークンを作成してください。

次に、このトークンをCIパイプライン環境変数に追加してください。

警告

認証トークンをコードリポジトリで公開してはいけません。

プラグインショートネームインデックス

ヒント

推奨されるプラグインのインストール方法は、URLをもとに直接インストールする方法です:

shell
# asdf plugin add <name> <git_url>
+  asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

asdfの各種コマンドでgit_urlが指定されなかった場合、 asdfは正確なgit_urlを決定するために、 ショートネームインデックスリポジトリを使用します。

このリポジトリの指示に従うことで、 あなたが作成したプラグインを、 ショートネームインデックスに追加することができます。

+ + + + \ No newline at end of file diff --git a/manage/commands.html b/manage/commands.html new file mode 100644 index 00000000..8fdc8daf --- /dev/null +++ b/manage/commands.html @@ -0,0 +1,89 @@ + + + + + + All Commands | asdf + + + + + + + + + + + + + +
Skip to content

All Commands

The list of all commands available in asdf. This list is the asdf help command text.

txt
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>]      Add a plugin from the plugin repo OR,
+                                        add a Git repo as a plugin by
+                                        specifying the name and repo url
+asdf plugin list [--urls] [--refs]      List installed plugins. Optionally show
+                                        git urls and git-ref
+asdf plugin list all                    List plugins registered on asdf-plugins
+                                        repository with URLs
+asdf plugin remove <name>               Remove plugin and package versions
+asdf plugin update <name> [<git-ref>]   Update a plugin to latest commit on
+                                        default branch or a particular git-ref
+asdf plugin update --all                Update all plugins to latest commit on
+                                        default branch
+
+
+MANAGE PACKAGES
+asdf current                            Display current version set or being
+                                        used for all packages
+asdf current <name>                     Display current version set or being
+                                        used for package
+asdf global <name> <version>            Set the package global version
+asdf global <name> latest[:<version>]   Set the package global version to the
+                                        latest provided version
+asdf help <name> [<version>]            Output documentation for plugin and tool
+asdf install                            Install all the package versions listed
+                                        in the .tool-versions file
+asdf install <name>                     Install one tool at the version
+                                        specified in the .tool-versions file
+asdf install <name> <version>           Install a specific version of a package
+asdf install <name> latest[:<version>]  Install the latest stable version of a
+                                        package, or with optional version,
+                                        install the latest stable version that
+                                        begins with the given string
+asdf latest <name> [<version>]          Show latest stable version of a package
+asdf latest --all                       Show latest stable version of all the
+                                        packages and if they are installed
+asdf list <name> [version]              List installed versions of a package and
+                                        optionally filter the versions
+asdf list all <name> [<version>]        List all versions of a package and
+                                        optionally filter the returned versions
+asdf local <name> <version>             Set the package local version
+asdf local <name> latest[:<version>]    Set the package local version to the
+                                        latest provided version
+asdf shell <name> <version>             Set the package version to
+                                        `ASDF_${LANG}_VERSION` in the current shell
+asdf uninstall <name> <version>         Remove a specific version of a package
+asdf where <name> [<version>]           Display install path for an installed
+                                        or current version
+asdf which <command>                    Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...]           Executes the command shim for current version
+asdf env <command> [util]               Runs util (default: `env`) inside the
+                                        environment used for command shim execution.
+asdf info                               Print OS, Shell and ASDF debug information.
+asdf version                            Print the currently installed version of ASDF
+asdf reshim <name> <version>            Recreate shims for version of a package
+asdf shim-versions <command>            List the plugins and versions that
+                                        provide a command
+asdf update                             Update asdf to the latest stable release
+asdf update --head                      Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs:   https://asdf-vm.com
+ + + + \ No newline at end of file diff --git a/manage/configuration.html b/manage/configuration.html new file mode 100644 index 00000000..56072ea2 --- /dev/null +++ b/manage/configuration.html @@ -0,0 +1,32 @@ + + + + + + Configuration | asdf + + + + + + + + + + + + + +
Skip to content

Configuration

Configuration of asdf encompasses both the sharable .tool-versions files as well as user specific customisations with .asdfrc and Environment Variables.

.tool-versions

Whenever .tool-versions file is present in a directory, the tool versions it declares will be used in that directory and any subdirectories.

Note

Global defaults can be set in the file $HOME/.tool-versions

This is what a .tool-versions file looks like:

ruby 2.5.3
+nodejs 10.15.0

You can also include comments:

ruby 2.5.3 # This is a comment
+# This is another comment
+nodejs 10.15.0

The versions can be in the following format:

  • 10.15.0 - an actual version. Plugins that support downloading binaries, will download binaries.
  • ref:v1.0.2-a or ref:39cb398vb39 - tag/commit/branch to download from github and compile
  • path:~/src/elixir - a path to custom compiled version of a tool to use. For use by language developers and such.
  • system - this keyword causes asdf to passthrough to the version of the tool on the system that is not managed by asdf.

TIP

Multiple versions can be set by separating them with a space. For example, to use Python 3.7.2, fallback to Python 2.7.15 and finally to the system Python, the following line can be added to .tool-versions.

python 3.7.2 2.7.15 system

To install all the tools defined in a .tool-versions file run asdf install with no other arguments in the directory containing the .tool-versions file.

To install a single tool defined in a .tool-versions file run asdf install <name> in the directory containing the .tool-versions file. The tool will be installed at the version specified in the .tool-versions file.

Edit the file directly or use asdf local (or asdf global) which updates it.

.asdfrc

The .asdfrc file defines the user's machine specific configuration.

${HOME}/.asdfrc is the default location used by asdf. This can be set with the Environment Variable ASDF_CONFIG_FILE.

The below file shows the required format with the default values:

txt
legacy_version_file = no
+use_release_candidates = no
+always_keep_download = no
+plugin_repository_last_check_duration = 60
+disable_plugin_short_name_repository = no
+concurrency = auto

legacy_version_file

Plugins with support can read the versions files used by other version managers, for example, .ruby-version in the case of Ruby's rbenv.

OptionsDescription
no defaultUse .tool-versions to read versions
yesUse plugin fallback to legacy version files (.ruby-version) if available

use_release_candidates

Configure the asdf update command to upgrade to the latest Release Candidate instead of the latest Semantic Version.

OptionsDescription
no defaultSemantic Version is used
yesRelease Candidate is used

always_keep_download

Configure the asdf install command to keep or delete the source code or binary it downloads.

OptionsDescription
no defaultDelete source code or binary after successful install
yesKeep source code or binary after install

plugin_repository_last_check_duration

Configure the duration (in minutes) between asdf plugin repository syncs. Trigger events result in a check of the duration. If more time has elapsed since the last sync than specified in the duration, a new sync occurs.

OptionsDescription
integer in range 1 to 999999999
60 is default
Sync on trigger event if duration (in minutes) since last sync has been exceeded
0Sync on each trigger event
neverNever sync

Sync events occur when the following commands are executed:

  • asdf plugin add <name>
  • asdf plugin list all

asdf plugin add <name> <git-url> does NOT trigger a plugin sync.

Note

Setting the value to never does not stop the plugin repository from being initially synced, for that behaviour see disable_plugin_short_name_repository.

disable_plugin_short_name_repository

Disable synchronization of the asdf plugin short-name repository. Sync events will exit early if the short-name repository is disabled.

OptionsDescription
no defaultClone or update the asdf plugin repository on sync events
yesDisable the plugin short-name repository

Sync events occur when the following commands are executed:

  • asdf plugin add <name>
  • asdf plugin list all

asdf plugin add <name> <git-url> does NOT trigger a plugin sync.

Note

Disabling the plugin short-name repository does not remove the repository if it has already synced. Remove the plugin repo with rm --recursive --trash $ASDF_DATA_DIR/repository.

Disabling the plugin short-name repository does not remove plugins previously installed from this source. Plugins can be removed with asdf plugin remove <name>. Removing a plugin will remove all installed versions of the managed tool.

concurrency

The default number of cores to use during compilation.

OptionsDescription
integerNumber of cores to use when compiling the source code
autoCalculate the number of cores using nproc, then sysctl hw.ncpu, then /proc/cpuinfo or else 1

Note: the environment variable ASDF_CONCURRENCY take precedence if set.

Plugin Hooks

It is possible to execute custom code:

  • Before or after a plugin is installed, reshimed, updated, or uninstalled
  • Before or after a plugin command is executed

For example, if a plugin called foo is installed and provides a bar executable, then the following hooks can be used to execute custom code first:

text
pre_foo_bar = echo Executing with args: $@

The following patterns are supported:

  • pre_<plugin_name>_<command>
  • pre_asdf_download_<plugin_name>
  • {pre,post}_asdf_{install,reshim,uninstall}_<plugin_name>
    • $1: full version
  • {pre,post}_asdf_plugin_{add,update,remove,reshim}
    • $1: plugin name
  • {pre,post}_asdf_plugin_{add,update,remove}_<plugin_name>

See Create a Plugin for specifics on what command hooks are ran before or after what commands.

Environment Variables

Setting environment variables varies depending on your system and Shell. Default locations depend upon your installation location and method (Git clone, Homebrew, AUR).

Environment variables should generally be set before sourcing asdf.sh/asdf.fish etc. For Elvish set above use asdf.

The following describe usage with a Bash Shell.

ASDF_CONFIG_FILE

Path to the .asdfrc configuration file. Can be set to any location. Must be an absolute path.

  • If Unset: $HOME/.asdfrc will be used.
  • Usage: export ASDF_CONFIG_FILE=/home/john_doe/.config/asdf/.asdfrc

ASDF_DEFAULT_TOOL_VERSIONS_FILENAME

The filename of the file storing the tool names and versions. Can be any valid filename. Typically, you should not set this value unless you want to ignore .tool-versions files.

  • If Unset: .tool-versions will be used.
  • Usage: export ASDF_DEFAULT_TOOL_VERSIONS_FILENAME=tool_versions

ASDF_DIR

The location of asdf core scripts. Can be set to any location. Must be an absolute path.

  • If Unset: the parent directory of the bin/asdf executable is used.
  • Usage: export ASDF_DIR=/home/john_doe/.config/asdf

ASDF_DATA_DIR

The location where asdf will install plugins, shims and tool versions. Can be set to any location. Must be an absolute path.

  • If Unset: $HOME/.asdf if it exists, or else the value of ASDF_DIR
  • Usage: export ASDF_DATA_DIR=/home/john_doe/.asdf

ASDF_CONCURRENCY

Number of cores to use when compiling the source code. If set, this value takes precedence over the asdf config concurrency value.

  • If Unset: the asdf config concurrency value is used.
  • Usage: export ASDF_CONCURRENCY=32

ASDF_FORCE_PREPEND

Whether or not to prepend the asdf shims and path directories to the front-most (highest-priority) part of the PATH.

  • If Unset: On macOS, defaults to yes; but on other systems, defaults to no
  • If yes: Force asdf directories to the front of the PATH
  • If set to any string other than yes: Do not force asdf directories to the front of the PATH
  • Usage: ASDF_FORCE_PREPEND=no . "<path-to-asdf-directory>/asdf.sh"

Full Configuration Example

Following a simple asdf setup with:

  • a Bash Shell
  • an installation location of $HOME/.asdf
  • installed via Git
  • NO environment variables set
  • NO custom .asdfrc file

would result in the following outcomes:

ConfigurationValueCalculated by
config file location$HOME/.asdfrcASDF_CONFIG_FILE is empty, so use $HOME/.asdfrc
default tool versions filename.tool-versionsASDF_DEFAULT_TOOL_VERSIONS_FILENAME is empty, so use .tool-versions
asdf dir$HOME/.asdfASDF_DIR is empty, so use parent dir of bin/asdf
asdf data dir$HOME/.asdfASDF_DATA_DIR is empty so use $HOME/.asdf as $HOME exists.
concurrencyautoASDF_CONCURRENCY is empty, so rely on concurrency value from the default configuration
legacy_version_filenoNo custom .asdfrc, so use the default configuration
use_release_candidatesnoNo custom .asdfrc, so use the default configuration
always_keep_downloadnoNo custom .asdfrc, so use the default configuration
plugin_repository_last_check_duration60No custom .asdfrc, so use the default configuration
disable_plugin_short_name_repositorynoNo custom .asdfrc, so use the default configuration

Internal Configuration

Users should not worry about this section as it describes configuration internal to asdf useful for Package Managers and integrators.

  • $ASDF_DIR/asdf_updates_disabled: Updates via the asdf update command are disabled when this file is present (content irrelevant). This is used by package managers like Pacman or Homebrew to ensure the correct update method is used for the particular installation.
+ + + + \ No newline at end of file diff --git a/manage/core.html b/manage/core.html new file mode 100644 index 00000000..a8f666e5 --- /dev/null +++ b/manage/core.html @@ -0,0 +1,41 @@ + + + + + + Core | asdf + + + + + + + + + + + + + +
Skip to content

Core

The core asdf command list is rather small, but can facilitate many workflows.

Installation & Setup

Covered in the Getting Started guide.

Exec

shell
asdf exec <command> [args...]

Executes the command shim for the current version.

Env

shell
asdf env <command> [util]

Info

shell
asdf info

A helper command to print the OS, Shell and asdf debug information. Share this when making a bug report.

Reshim

shell
asdf reshim <name> <version>

This recreates the shims for the current version of a package. By default, shims are created by plugins during installation of a tool. Some tools like the npm CLI allow global installation of executables, for example, installing Yarn via npm install -g yarn. Since this executable was not installed via the plugin lifecycle, no shim exists for it yet. asdf reshim nodejs <version> will force recalculation of shims for any new executables, like yarn, for <version> of nodejs .

Shim-versions

shell
asdf shim-versions <command>

Lists the plugins and versions that provide shims for a command.

As an example, Node.js ships with two executables, node and npm. When many versions of the tools are installed with asdf-nodejs shim-versions can return:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

Update

asdf has a built in command to update which relies on Git (our recommended installation method). If you installed using a different method you should follow the steps for that method:

MethodLatest Stable ReleaseLatest commit on master
asdf (via Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
PacmanDownload a new PKGBUILD & rebuild
or use your preferred AUR helper

Uninstall

To uninstall asdf follow these steps:

Bash & Git
  1. In your ~/.bashrc remove the lines that source asdf.sh and the completions:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. In your ~/.bash_profile remove the lines that source asdf.sh and the completions:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. In your ~/.bashrc remove the lines that source asdf.sh and the completions:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

Completions may have been configured as per Homebrew's instructions so follow their guide to find out what to remove.

  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

If using macOS Catalina or newer, the default shell has changed to ZSH. If you can't find any config in your ~/.bash_profile it may be in a ~/.zshrc in which case please follow the ZSH instructions.

  1. In your ~/.bash_profile remove the lines that source asdf.sh and the completions:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

Completions may have been configured as per Homebrew's instructions so follow their guide to find out what to remove.

  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. In your ~/.bashrc remove the lines that source asdf.sh and the completions:
shell
. /opt/asdf-vm/asdf.sh
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. In your ~/.config/fish/config.fish remove the lines that source asdf.fish:
shell
source ~/.asdf/asdf.fish

and remove completions with this command:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. Remove the $HOME/.asdf dir:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. In your ~/.config/fish/config.fish remove the lines that source asdf.fish:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. In your ~/.config/fish/config.fish remove the lines that source asdf.fish:
shell
source /opt/asdf-vm/asdf.fish
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. In your ~/.config/elvish/rc.elv remove the lines that use the asdf module:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

and uninstall the asdf module with this command:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Remove the $HOME/.asdf dir:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. In your ~/.config/elvish/rc.elv remove the lines that use the asdf module:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

and uninstall the asdf module with this command:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. In your ~/.config/elvish/rc.elv remove the lines that use the asdf module:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

and uninstall the asdf module with this command:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. In your ~/.zshrc remove the lines that source asdf.sh and completions:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

OR the ZSH Framework plugin if used.

  1. Remove the $HOME/.asdf dir:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. In your ~/.zshrc remove the lines that source asdf.sh:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. Uninstall with your package manager:
shell
brew uninstall asdf --force && brew autoremove
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. In your ~/.zshrc remove the lines that source asdf.sh:
shell
. /opt/asdf-vm/asdf.sh
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"

That's it! 🎉

+ + + + \ No newline at end of file diff --git a/manage/plugins.html b/manage/plugins.html new file mode 100644 index 00000000..be59f0da --- /dev/null +++ b/manage/plugins.html @@ -0,0 +1,34 @@ + + + + + + Plugins | asdf + + + + + + + + + + + + + +
Skip to content

Plugins

Plugins are how asdf knows to handle different tools like Node.js, Ruby, Elixir etc.

See Creating Plugins for the plugin API used to support more tools.

Add

Add plugins via their Git URL:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

or via the short-name association in the plugins repository:

shell
asdf plugin add <name>
+# asdf plugin add erlang

Recommendation

Prefer the longer git-url method as it is independent of the short-name repo.

List Installed

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

List All in Short-name Repository

shell
asdf plugin list all

See Plugins Shortname Index for the entire short-name list of plugins.

Update

shell
asdf plugin update --all

If you want to update a specific package, just say so.

shell
asdf plugin update <name>
+# asdf plugin update erlang

This update will fetch the latest commit on the default branch of the origin of the plugin repository. Versioned plugins and updates are currently being developed (#916)

Remove

bash
asdf plugin remove <name>
+# asdf plugin remove erlang

Removing a plugin will remove all installations of the tool made with the plugin. This can be used as a shorthand for cleaning/pruning many unused versions of a tool.

Syncing the asdf Short-name Repository

The short-name repo is synced to your local machine and periodically refreshed. This method to determine a sync is as follows:

  • sync events are triggered by commands:
    • asdf plugin add <name>
    • asdf plugin list all
  • if configuration option disable_plugin_short_name_repository is set to yes, then sync is aborted early. See the asdf config docs for more.
  • if there has not been a synchronization in the last X minutes then the sync will occur.
    • X defaults to 60, but can be configured in your .asdfrc via the plugin_repository_last_check_duration option. See the asdf config docs for more.
+ + + + \ No newline at end of file diff --git a/manage/versions.html b/manage/versions.html new file mode 100644 index 00000000..f1e3d5a7 --- /dev/null +++ b/manage/versions.html @@ -0,0 +1,53 @@ + + + + + + Versions | asdf + + + + + + + + + + + + + +
Skip to content

Versions

Install Version

shell
asdf install <name> <version>
+# asdf install erlang 17.3

If a plugin supports downloading & compiling from source, you can specify ref:foo where foo is a specific branch, tag, or commit. You'll need to use the same name and reference when uninstalling too.

Install Latest Stable Version

shell
asdf install <name> latest
+# asdf install erlang latest

Install latest stable version that begins with a given string.

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

List Installed Versions

shell
asdf list <name>
+# asdf list erlang

Filter versions to those that begin with a given string.

shell
asdf list <name> <version>
+# asdf list erlang 17

List All Available Versions

shell
asdf list all <name>
+# asdf list all erlang

Filter versions to those that begin with a given string.

shell
asdf list all <name> <version>
+# asdf list all erlang 17

Show Latest Stable Version

shell
asdf latest <name>
+# asdf latest erlang

Show latest stable version that begins with a given string.

shell
asdf latest <name> <version>
+# asdf latest erlang 17

Set Current Version

shell
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest

global writes the version to $HOME/.tool-versions.

shell set the version to an environment variable named ASDF_${TOOL}_VERSION, for the current shell session only.

local writes the version to $PWD/.tool-versions, creating it if needed.

See the .tool-versions file in the Configuration section for details.

Alternatively

If you want to set a version only for the current shell session or for executing just a command under a particular tool version, you can set an environment variable like ASDF_${TOOL}_VERSION.

The following example runs tests on an Elixir project with version 1.4.0. The version format is the same supported by the .tool-versions file.

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

Fallback to System Version

To use the system version of tool <name> instead of an asdf managed version you can set the version for the tool to system.

Set system with either global, local or shell as outlined in Set Current Version section above.

shell
asdf local <name> system
+# asdf local python system

View Current Version

shell
asdf current
+# asdf current
+# erlang          17.3          /Users/kim/.tool-versions
+# nodejs          6.11.5        /Users/kim/cool-node-project/.tool-versions
+
+asdf current <name>
+# asdf current erlang
+# erlang          17.3          /Users/kim/.tool-versions

Uninstall Version

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

Shims

When asdf installs a package it creates shims for every executable program in that package in a $ASDF_DATA_DIR/shims directory (default ~/.asdf/shims). This directory being on the $PATH (by means of asdf.sh, asdf.fish, etc) is how the installed programs are made available in the environment.

The shims themselves are really simple wrappers that exec a helper program asdf exec passing it the name of the plugin and path to the executable in the installed package that the shim is wrapping.

The asdf exec helper determines the version of the package to use (as specified in .tool-versions file, selected by asdf local ... or asdf global ...), the final path to the executable in the package installation directory (this can be manipulated by the exec-path callback in the plugin) and the environment to execute in (also provided by the plugin - exec-env script), and finally it executes it.

Note

Because this system uses exec calls, any scripts in the package that are meant to be sourced by the shell instead of executed need to be accessed directly instead of via the shim wrapper. The two asdf commands: which and where can help with this by returning the path to the installed package:

shell
# returns path to main executable in current version
+source $(asdf which ${PLUGIN})/../script.sh
+
+# returns path to the package installation directory
+source $(asdf where ${PLUGIN})/bin/script.sh

By-passing asdf shims

If for some reason you want to by-pass asdf shims or want your environment variables automatically set upon entering your project's directory, the asdf-direnv plugin can be helpful. Be sure to check its README for more details.

+ + + + \ No newline at end of file diff --git a/more/community-projects.html b/more/community-projects.html new file mode 100644 index 00000000..d9e5ab37 --- /dev/null +++ b/more/community-projects.html @@ -0,0 +1,24 @@ + + + + + + Community Projects | asdf + + + + + + + + + + + + + +
Skip to content

Community Projects

Here are some community projects related to asdf:

Note

asdf core team do not own these projects or their code. asdf core are not responsible for the quality or security as they relate to those listed here.

+ + + + \ No newline at end of file diff --git a/more/faq.html b/more/faq.html new file mode 100644 index 00000000..e9df9d35 --- /dev/null +++ b/more/faq.html @@ -0,0 +1,24 @@ + + + + + + FAQ | asdf + + + + + + + + + + + + + +
Skip to content

FAQ

Here are some common questions regarding asdf.

WSL1 support?

WSL1 (Windows Subsystem for Linux 1) is not officially supported. Some aspects of asdf may not work properly. We do not intend to add official support for WSL1.

WSL2 support?

WSL2 (Windows Subsystem for Linux 2) should work using the setup & dependency instructions for you chosen WSL distro.

Importantly, WSL2 is only expected to work properly when the current working directory is a Unix drive and not a bound Windows drive.

We intend to run out test suite on WSL2 when host runner support is available on GitHub Actions, currently this does not appear to be the case.

Newly installed executable not running?

I just npm install -g yarn, but cannot execute yarn. What gives?

asdf uses shims to manage executables. Those installed by plugins have shims automatically created, whereas installing executables via an asdf managed tool will require you to notify asdf of the need to create shims. In this instance, to create a shim for Yarn. See the asdf reshim command docs.

Shell not detecting newly installed shims?

If asdf reshim is not resolving your issue, then it is most-likely due to the sourcing of asdf.sh or asdf.fish not being at the BOTTOM of your Shell config file (.bash_profile, .zshrc, config.fish etc). It needs to be sourced AFTER you have set your $PATH and AFTER you have sourced your framework (oh-my-zsh etc) if any.

+ + + + \ No newline at end of file diff --git a/more/thanks.html b/more/thanks.html new file mode 100644 index 00000000..167f7b40 --- /dev/null +++ b/more/thanks.html @@ -0,0 +1,24 @@ + + + + + + Thanks | asdf + + + + + + + + + + + + + +
Skip to content

Thanks

Thank you page to the asdf authors & contributors!

Credits

Me (@HashNuke), High-fever, cold, cough.

Copyright 2014 to the end of time (MIT License)

Maintainers

Contributors

See the list of contributors 🙏 on GitHub

+ + + + \ No newline at end of file diff --git a/plugins/create.html b/plugins/create.html new file mode 100644 index 00000000..8259536b --- /dev/null +++ b/plugins/create.html @@ -0,0 +1,82 @@ + + + + + + Create a Plugin | asdf + + + + + + + + + + + + + +
Skip to content

Create a Plugin

A plugin is a Git repo with some executable scripts to support versioning a language / tool. These scripts are run by asdf using specific commands to support features such as asdf list-all <name>, asdf install <name> <version> etc.

Quickstart

There are two options to get started with creating your own plugin:

  1. use the asdf-vm/asdf-plugin-template repository to generate a plugin repo (named asdf-<tool_name>) with default scripts implemented. Once generated, clone the repo and run the setup.bash script to interactively update the template.
  2. start your own repo called asdf-<tool_name> and implement the required scripts as listed in the documentation below.

Golden Rules for Plugin Scripts

  • scripts should NOT call other asdf commands
  • keep your dependency list of Shell tools/commands small
  • avoid non-portable tools or command flags. For example, sort -V. See our asdf core list of banned commands

Scripts Overview

The full list of scripts callable from asdf.

ScriptDescription
bin/list-all requiredList all installable versions
bin/download requiredDownload source code or binary for the specified version
bin/install requiredInstalls the specified version
bin/latest-stable recommendedList the latest stable version of the specified tool
bin/help.overviewOutput a general description about the plugin & tool
bin/help.depsOutput a list of dependencies per Operating System
bin/help.configOutput plugin or tool configuration information
bin/help.linksOutput a list of links for the plugin or tool
bin/list-bin-pathsList relative paths to directories with binaries to create shims
bin/exec-envPrepare the environment for running the binaries
bin/exec-pathOutput the executable path for a version of a tool
bin/uninstallUninstall a specific version of a tool
bin/list-legacy-filenamesOutput filenames of legacy version files: .ruby-version
bin/parse-legacy-fileCustom parser for legacy version files
bin/post-plugin-addHook to execute after a plugin has been added
bin/post-plugin-updateHook to execute after a plugin has been updated
bin/pre-plugin-removeHook to execute before a plugin is removed

To see which commands invoke which scripts, see the detailed documentation for each script.

Environment Variables Overview

The full list of Environment Variables used throughout all scripts.

Environment VariablesDescription
ASDF_INSTALL_TYPEversion or ref
ASDF_INSTALL_VERSIONfull version number or Git Ref depending on ASDF_INSTALL_TYPE
ASDF_INSTALL_PATHthe path to where the tool should, or has been installed
ASDF_CONCURRENCYthe number of cores to use when compiling the source code. Useful for setting make -j
ASDF_DOWNLOAD_PATHthe path to where the source code or binary was downloaded to by bin/download
ASDF_PLUGIN_PATHthe path the plugin was installed
ASDF_PLUGIN_SOURCE_URLthe source URL of the plugin
ASDF_PLUGIN_PREV_REFprevous git-ref of the plugin repo
ASDF_PLUGIN_POST_REFupdated git-ref of the plugin repo
ASDF_CMD_FILEresolves to the full path of the file being sourced

NOTE

Not all environment variables are available in all scripts. Check the documentation for each script below to see which env vars are available to it.

Required Scripts

bin/list-all required

Description

List all installable versions.

Output Format

Must print a string with a space-separated list of versions. For example:

txt
1.0.1 1.0.2 1.3.0 1.4

Newest version should be last.

asdf core will print each version on its own line, potentially pushing some versions offscreen.

Sorting

If versions are being pulled from releases page on a website it's recommended to leave the versions in the provided order as they are often already in the correct order. If they are in reverse order piping them through tac should suffice.

If sorting is unavoidable, sort -V is not portable, so we suggest either:

Environment Variables available to script

No environment variables are provided to this script.

Commands that invoke this script

  • asdf list all <name> [version]
  • asdf list all nodejs: lists all versions as returned by this script, one on each line.
  • asdf list all nodejs 18: lists all versions as returned by this script, one on each line, with a filter matching any version beginning with 18 applied.

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}/bin/list-all"

bin/download required

Description

Download the source code or binary for a specific version of a tool to a specified location.

Implementation Details

  • The script must download the source or binary to the directory specified by ASDF_DOWNLOAD_PATH.
  • Only the decompressed source code or binary should be placed in the ASDF_DOWNLOAD_PATH directory.
  • On failure, no files should be placed in ASDF_DOWNLOAD_PATH.
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Legacy Plugins

Though this script is marked as required for all plugins, it is optional for "legacy" plugins which predate its introduction.

If this script is absent, asdf will assume that the bin/install script is present and will download and install the version.

All plugins must include this script as support for legacy plugins will eventually be removed.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.
  • ASDF_DOWNLOAD_PATH: The path to where the source code or binary was downloaded to.

Commands that invoke this script

  • asdf install <tool> [version]
  • asdf install <tool> latest[:version]
  • asdf install nodejs 18.0.0: downloads the source code or binary for Node.js version 18.0.0 and places it in the ASDF_DOWNLOAD_PATH directory. Then runs the bin/install script.

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}"/bin/download

bin/install required

Description

Install a specific version of a tool to a specified location.

Implementation Details

  • The script should install the specified version in the path ASDF_INSTALL_PATH.
  • Shims will be created by default for any files in $ASDF_INSTALL_PATH/bin. This behaviour can be customised with the optional bin/list-bin-paths script.
  • Success should exit with 0.
  • Failure should exit with a non-zero status.
  • To avoid TOCTOU (Time-of-Check-to-Time-of-Use) issues, ensure the script only places files in ASDF_INSTALL_PATH once the build and installation of the tool is deemed a success.

Legacy Plugins

If the bin/download script is absent, this script should download and install the specified version.

For compatibility with versions of the asdf core earlier than 0.7._ and newer than 0.8._, check for the presence of the ASDF_DOWNLOAD_PATH environment variable. If set, assume the bin/download script already downloaded the version, else download the source code in the bin/install script.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.
  • ASDF_CONCURRENCY: The number of cores to use when compiling source code. Useful for setting flags like make -j.
  • ASDF_DOWNLOAD_PATH: The path where the source code or binary was downloaded to.

Commands that invoke this script

  • asdf install
  • asdf install <tool>
  • asdf install <tool> [version]
  • asdf install <tool> latest[:version]
  • asdf install nodejs 18.0.0: installs Node.js version 18.0.0 in the ASDF_INSTALL_PATH directory.

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}"/bin/install

Optional Scripts

bin/latest-stable recommended

Description

Determine the latest stable version of a tool. If absent, the asdf core will tail the bin/list-all output which may be undesirable.

Implementation Details

  • The script should print the latest stable version of the tool to stdout.
  • Non-stable or release candidate versions should be omitted.
  • A filter query is provided as the first argument to the script. This should be used to filter the output by version number or tool provider.
    • For instance, the output of asdf list all ruby from the ruby plugin lists versions of Ruby from many providers: jruby, rbx & truffleruby amongst others. The user provided filter could be used by the plugin to filter the semver versions and/or provider.
      > asdf latest ruby
      +3.2.2
      +> asdf latest ruby 2
      +2.7.8
      +> asdf latest ruby truffleruby
      +truffleruby+graalvm-22.3.1
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf global <tool> latest: set the global version of a tool to the latest stable version for that tool.
  • asdf local <name> latest: set the local version of a tool to the latest stable version for that tool.
  • asdf install <tool> latest: installs the latest version of a tool.
  • asdf latest <tool> [<version>]: outputs the latest version of a tool based on the optional filter.
  • asdf latest --all: outputs the latest version of all tools managed by asdf and whether they are installed.

Call signature from asdf core

The script should accept a single argument, the filter query.

bash
"${plugin_path}"/bin/latest-stable "$query"

bin/help.overview

Description

Output a general description about the plugin and the tool being managed.

Implementation Details

  • This script is required for any help output to be displayed for the plugin.
  • No heading should be printed as asdf core will print headings.
  • Output may be free-form text but ideally only one short paragraph.
  • Must not output any information that is already covered in the core asdf-vm documentation.
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf help <name> [<version>]: Output documentation for plugin and tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.overview

bin/help.deps

Description

Output the list of dependencies tailored to the operating system. One dependency per line.

bash
git
+curl
+sed

Implementation Details

  • This script requires bin/help.overview for its output to be considered.
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf help <name> [<version>]: Output documentation for plugin and tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.deps

bin/help.config

Description

Output any required or optional configuration for the plugin and tool. For example, describe any environment variables or other flags needed to install or compile the tool.

Implementation Details

  • This script requires bin/help.overview for its output to be considered.
  • Output can be free-form text.
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf help <name> [<version>]: Output documentation for plugin and tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.config

Description

Output a list of links relevant to the plugin and tool. One link per line.

bash
Git Repository:	https://github.com/vlang/v
+Documentation:	https://vlang.io

Implementation Details

  • This script requires bin/help.overview for its output to be considered.
  • One link per line.
  • Format must be either:
    • <title>: <link>
    • or just <link>
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf help <name> [<version>]: Output documentation for plugin and tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.links

bin/list-bin-paths

Description

List directories containing executables for the specified version of the tool.

Implementation Details

  • If this script is not present, asdf will look for binaries in the "${ASDF_INSTALL_PATH}"/bin directory & create shims for those.
  • Output a space-separated list of paths containing executables.
  • Paths must be relative to ASDF_INSTALL_PATH. Example output would be:
bash
bin tools veggies

This will instruct asdf to create shims for the files in:

  • "${ASDF_INSTALL_PATH}"/bin
  • "${ASDF_INSTALL_PATH}"/tools
  • "${ASDF_INSTALL_PATH}"/veggies

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf install <tool> [version]: initially create shims for binaries.
  • asdf reshim <tool> <version>: recreate shims for binaries.

Call signature from asdf core

bash
"${plugin_path}/bin/list-bin-paths"

bin/exec-env

Description

Prepare the environment before executing the shims for the binaries for the tool.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf which <command>: Display the path to an executable
  • asdf exec <command> [args...]: Executes the command shim for current version
  • asdf env <command> [util]: Runs util (default: env) inside the environment used for command shim execution.

Call signature from asdf core

bash
"${plugin_path}/bin/exec-env"

bin/exec-path

Get the executable path for the specified version of the tool. Must print a string with the relative executable path. This allows the plugin to conditionally override the shim's specified executable path, otherwise return the default path specified by the shim.

Description

Get the executable path for the specified version of the tool.

Implementation Details

  • Must print a string with the relative executable path.
  • Conditionally override the shim's specified executable path, otherwise return the default path specified by the shim.
shell
Usage:
+  plugin/bin/exec-path <install-path> <command> <executable-path>
+
+Example Call:
+  ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"
+
+Output:
+  bin/foox

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

  • asdf which <command>: Display the path to an executable
  • asdf exec <command> [args...]: Executes the command shim for current version
  • asdf env <command> [util]: Runs util (default: env) inside the environment used for command shim execution.

Call signature from asdf core

bash
"${plugin_path}/bin/exec-path" "$install_path" "$cmd" "$relative_path"

bin/uninstall

Description

Uninstall the provided version of a tool.

Output Format

Output should be sent to stdout or stderr as appropriate for the user. No output is read by subsequent execution in the core.

Environment Variables available to script

No environment variables are provided to this script.

Commands that invoke this script

  • asdf list all <name> <version>
  • asdf uninstall nodejs 18.15.0: Uninstalls the version 18.15.0 of nodejs, removing all shims including those installed global with npm i -g

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}/bin/uninstall"

bin/list-legacy-filenames

Description

List legacy configuration filenames for determining the specified version of the tool.

Implementation Details

  • Output a space-separated list of filenames.
    bash
    .ruby-version .rvmrc
  • Only applies for users who have enabled the legacy_version_file option in their "${HOME}"/.asdfrc.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if ASDF_INSTALL_TYPE=ref.
  • ASDF_INSTALL_PATH: The path to where the tool has been, or should be installed.

Commands that invoke this script

Any command which reads a tool version.

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}/bin/list-legacy-filenames"

bin/parse-legacy-file

Description

Parse the legacy file found by asdf to determine the version of the tool. Useful to extract version numbers from files like JavaScript's package.json or Golangs go.mod.

Implementation Details

  • If not present, asdf will simply cat the legacy file to determine the version.
  • Should be deterministic and always return the same exact version:
    • when parsing the same legacy file.
    • regardless of what is installed on the machine or whether the legacy version is valid or complete. Some legacy file formats may not be suitable.
  • Output a single line with the version:
    bash
    1.2.3

Environment Variables available to script

No environment variables specifically set before this script is called.

Commands that invoke this script

Any command which reads a tool version.

Call signature from asdf core

The script should accept a single argument, the path to the legacy file for reading its contents.

bash
"${plugin_path}/bin/parse-legacy-file" "$file_path"

bin/post-plugin-add

Description

Execute this callback script after the plugin has been added to asdf with asdf plugin add <tool>.

See also the related command hooks:

  • pre_asdf_plugin_add
  • pre_asdf_plugin_add_${plugin_name}
  • post_asdf_plugin_add
  • post_asdf_plugin_add_${plugin_name}

Environment Variables available to script

  • ASDF_PLUGIN_PATH: path where the plugin was installed.
  • ASDF_PLUGIN_SOURCE_URL: URL of the plugin source. Can be a local directory path.

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}/bin/post-plugin-add"

bin/post-plugin-update

Description

Execute this callback script after asdf has downloaded the update plugin with asdf plugin update <tool> [<git-ref>].

See also the related command hooks:

  • pre_asdf_plugin_update
  • pre_asdf_plugin_update_${plugin_name}
  • post_asdf_plugin_update
  • post_asdf_plugin_update_${plugin_name}

Environment Variables available to script

  • ASDF_PLUGIN_PATH: path where the plugin was installed.
  • ASDF_PLUGIN_PREV_REF: the plugin's previous git-ref
  • ASDF_PLUGIN_POST_REF: the plugin's updated git-ref

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}/bin/post-plugin-update"

bin/pre-plugin-remove

Description

Execute this callback script before asdf has removed the plugin with asdf plugin remove <tool>.

See also the related command hooks:

  • pre_asdf_plugin_remove
  • pre_asdf_plugin_remove_${plugin_name}
  • post_asdf_plugin_remove
  • post_asdf_plugin_remove_${plugin_name}

Environment Variables available to script

  • ASDF_PLUGIN_PATH: path where the plugin was installed.

Call signature from asdf core

No parameters provided.

bash
"${plugin_path}/bin/pre-plugin-remove"

Extension Commands for asdf CLI advanced

It's possible for plugins to define new asdf commands by providing lib/commands/command*.bash scripts or executables that will be callable using the asdf command line interface by using the plugin name as a subcommand.

For example, suppose a foo plugin has:

shell
foo/
+  lib/commands/
+    command.bash
+    command-bat.bash
+    command-bat-man.bash
+    command-help.bash

Users can now execute:

shell
$ asdf foo         # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash`
+$ asdf foo bar     # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar`
+$ asdf foo help    # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash`
+$ asdf foo bat man # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash`
+$ asdf foo bat baz # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz`

Plugin authors can use this feature to provide utilities related to their tools, or even create plugins that are just new command extensions of asdf itself.

If the executable bit is set, the script is executed, replacing the asdf execution.

If the executable bit is not set, asdf will source the scripts as Bash scripts.

$ASDF_CMD_FILE resolves to the full path of the file being sourced.

haxe is a great example of a plugin which uses this feature. It provides the asdf haxe neko-dylibs-link to fix an issue where Haxe executables expect to find dynamic libraries relative to the executable directory.

Be sure to list your asdf Extension Commands in your plugins README.

Custom Shim Templates advanced

WARNING

Please only use if absolutely required

asdf allows custom shim templates. For an executable called foo, if there's a shims/foo file in the plugin, then asdf will copy that file instead of using its standard shim template.

This must be used wisely.

As far as the asdf core team is aware, this feature is only in use in the first-party Elixir plugin. This is because an executable is also read as an Elixir file in addition to being an executable. This makes it not possible to use the standard Bash shim.

Testing

asdf contains the plugin-test command to test your plugin:

shell
asdf plugin test <plugin_name> <plugin_url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git_ref>] [test_command...]
  • <plugin_name> & <plugin_url> are required
  • If optional [--asdf-tool-version <version>] is specified, the tool will be installed with that specific version. Defaults to asdf latest <plugin-name>
  • If optional [--asdf-plugin-gitref <git_ref>] is specified, the plugin itself is checked out at that commit/branch/tag. This is useful for testing a pull-request on your plugin's CI. Defaults to the default branch of the plugin's repository.
  • Optional parameter [test_command...] is the command to execute to validate the installed tool works correctly. Typically <tool> --version or <tool> --help. For example, to test the NodeJS plugin, we could run
    shell
    # asdf plugin test <plugin_name>  <plugin_url>                               [test_command]
    +  asdf plugin test nodejs         https://github.com/asdf-vm/asdf-nodejs.git node --version

Note

We recommend testing in both Linux & macOS CI environments

GitHub Action

The asdf-vm/actions repo provides a GitHub Action for testing your plugins hosted on GitHub. A sample .github/workflows/test.yaml Actions Workflow:

yaml
name: Test
+on:
+  push:
+    branches:
+      - main
+  pull_request:
+
+jobs:
+  plugin_test:
+    name: asdf plugin test
+    strategy:
+      matrix:
+        os:
+          - ubuntu-latest
+          - macos-latest
+    runs-on: ${{ matrix.os }}
+    steps:
+      - name: asdf_plugin_test
+        uses: asdf-vm/actions/plugin-test@v2
+        with:
+          command: "<MY_TOOL> --version"

TravisCI Config

A sample .travis.yml file, customize it to your needs

yaml
language: c
+script: asdf plugin test <MY_TOOL> $TRAVIS_BUILD_DIR '<MY_TOOL> --version'
+before_script:
+  - git clone https://github.com/asdf-vm/asdf.git asdf
+  - . asdf/asdf.sh
+os:
+  - linux
+  - osx

NOTE

When using another CI you may need to pass a relative path to the plugin location:

shell
asdf plugin test <tool_name> <path> '<tool_command> --version'

API Rate Limiting

If a command depends on accessing an external API, like bin/list-all or bin/latest-stable, it may experience rate limiting during automated testing. To mitigate this, ensure there is a code-path which provides an authentication token via an environment variable. For example:

shell
cmd="curl --silent"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"

GITHUB_API_TOKEN

To utilise the GITHUB_API_TOKEN, create a new personal token with only public_repo access.

Then add this to your CI pipeline environment variables.

WARNING

NEVER publish your authentication tokens in your code repository

Plugin Shortname Index

TIP

The recommended installation method for a plugin is via direct URL installation:

shell
# asdf plugin add <name> <git_url>
+  asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

If the git_url is not provided, asdf will use the Shortname Index repository to determine the exact git_url to use.

You can add your plugin to the Shortname Index by following the instructions in that repo.

+ + + + \ No newline at end of file diff --git a/pt-br/contribute/core.html b/pt-br/contribute/core.html new file mode 100644 index 00000000..dfdaa5a0 --- /dev/null +++ b/pt-br/contribute/core.html @@ -0,0 +1,48 @@ + + + + + + asdf + + + + + + + + + + + + + +
Skip to content

asdf

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

guia de contribuição principal asdf.

Configuração inicial

Fork asdf no GitHub e/ou Git clone o branch padrão:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

As ferramentas para o desenvolvimento do núcleo estão em .tool-versions deste repositório. Se você deseja gerenciar com o próprio asdf, adicione os plugins:

shell
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git

Instale as versões para desenvolver asdf com:

shell
asdf install

pode ser útil não usar asdf para gerenciar as ferramentas durante o desenvolvimento em sua máquina local, pois você pode precisar quebrar funcionalidades que, então, quebrariam suas ferramentas de desenvolvimento. Aqui está a lista bruta de ferramentas:

  • bats-core: Bash Automated Testing System, para testes unitários de scripts compatíveis com Bash ou POSIX.
  • shellcheck: Ferramenta de análise estática para scripts de shell.
  • shfmt: Um analisador, formatador e interpretador de shell com suporte a bash; inclui shfmt

Desenvolvimento

Se você quiser testar suas alterações sem fazer alterações em seu asdf instalado, você pode definir a variável $ASDF_DIR para o caminho onde você clonou o repositório e anexar temporariamente o diretório bin e shims do diretório para o seu caminho.

É melhor formatar, lint e testar seu código localmente antes de confirmar ou enviar para o controle remoto. Use os seguintes scripts/comandos:

shell
# Shellcheck
+./scripts/shellcheck.bash
+
+# Format
+./scripts/shfmt.bash
+
+# Test: all tests
+bats test/
+# Test: for specific command
+bats test/list_commands.bash

TIP

Adicione testes! - Os testes são necessários para novos recursos e aceleram a revisão de correções de bugs. Por favor, cubra novos caminhos de código antes de criar um Pull Request. Consulte documentação do bats-core

Teste de BATS

É fortemente recomendado examinar o conjunto de testes existente e a documentação do bats-core antes de escrever os testes.

A depuração de BATs pode ser difícil às vezes. Usar a saída TAP com o sinalizador -t permitirá que você imprima saídas com o descritor de arquivo especial >&3 durante a execução do teste, simplificando a depuração. Como um exemplo:

shell
# test/some_tests.bats
+
+printf "%s\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\n" "Will be printed during bats -t test/some_tests.bats" >&3

Isso está documentado em bats-core Imprimindo no Terminal.

Pull Requests, Releases e Commits Convencionais

O asdf está usando uma ferramenta de lançamento automatizada chamada Release Please para aumentar automaticamente a versão SemVer e gerar a Changelog. Essas informações são determinadas lendo o histórico de confirmação desde a última versão.

Mensagens de confirmação convencionais definem o formato do título da solicitação pull que se torna o formato da mensagem de confirmação na ramificação padrão. Isso é aplicado com GitHub Action amannn/action-semantic-pull-request.

O Commit Convencional segue este formato:

<type>[optional scope][optional !]: <description>
+
+<!-- examples -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change

A lista completa de <types> é: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert.

O ! indica uma mudança de ruptura.

fix: will create a new SemVer patchfeat: will create a new SemVer minor<type>!: will create a new SemVer major

O título da solicitação pull deve seguir este formato.

TIP

Use o formato de mensagem de confirmação convencional para seu título de solicitação de pull.

Imagens Docker

Os projetos asdf-alpine e asdf-ubuntu são um esforço contínuo para fornecer imagens de algumas ferramentas asdf. Você pode usar essas imagens docker como base para seus servidores de desenvolvimento ou para executar seus aplicativos de produção.

+ + + + \ No newline at end of file diff --git a/pt-br/contribute/documentation.html b/pt-br/contribute/documentation.html new file mode 100644 index 00000000..3871f15d --- /dev/null +++ b/pt-br/contribute/documentation.html @@ -0,0 +1,52 @@ + + + + + + Docs & Site | asdf + + + + + + + + + + + + + +
Skip to content

Docs & Site

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

Documentação e guia de contribuição do site.

Configuração inicial

Fork asdf no GitHub e/ou Git clone o branch padrão:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

As ferramentas para desenvolvimento de sites Docs são gerenciadas com asdf em docs/.tool-versions. Adicione os plugins com:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

Instale a(s) versão(ões) da ferramenta com:

shell
asdf install
  • Node.js: tempo de execução JavaScript criado no mecanismo JavaScript V8 do Chrome.

Instale as dependências do Node.js do docs/package.json:

shell
npm install

Desenvolvimento

Vuepress (v2) é o Static Site Generator (SSG) que usamos para construir o site de documentação do asdf. Foi escolhido para substituir Docsify.js, pois gostaríamos de oferecer suporte a um substituto somente HTML quando os usuários não tiverem JavaScript disponível ou ativado. Isso não era possível com o Docsify. Fora isso, o conjunto de recursos é basicamente o mesmo, com foco em escrever arquivos Markdown com configuração mínima.

package.json contém os scripts necessários para o desenvolvimento:

@code json{3-5}

Para iniciar o servidor de desenvolvimento local:

shell
npm run dev

Formate o código antes de confirmar:

shell
npm run format

Pull Requests, Releases e Commits Convencionais

asdf está usando um pipeline de lançamento automatizado que depende de Commits Convencionais em títulos de PR. Documentação detalhada encontrada no guia de contribuição principal.

Ao criar um PR para alterações na documentação, por favor, faça o título do PR com o tipo de Commit Convencional docs no formato docs: <description>.

Vuepress

A configuração do site está contida em alguns arquivos JavaScript com objetos JS usados para representar a configuração. Eles estão:

  • docs/.vuepress/config.js: o arquivo de configuração raiz do site. Leia a documentação do Vuepress para obter as especificações.

Para simplificar a configuração raiz, os objetos JS maiores que representam a configuração navbar e sidebar foram extraídos e separados por sua localidade. Veja os dois em:

  • docs/.vuepress/navbar.js
  • docs/.vuepress/sidebar.js

Com a documentação oficial para essas configurações vivendo na Referência de tema padrão.

I18n

Vuepress tem suporte de primeira classe para internacionalização. O root config docs/.vuepress/config.js define os locais suportados com sua URL, título no menu suspenso de seleção e referências de configurações navbar/sidebar.

As configurações da barra de navegação/barra lateral são capturadas nos arquivos de configuração mencionados acima, separadas por localidade e exportadas individualmente.

O conteúdo de markdown para cada localidade deve estar em uma pasta com o mesmo nome das chaves para locales na configuração raiz. Isso é:

js
{
+  ...
+  themeConfig: {
+    locales: {
+      "/": {
+        selectLanguageName: "English (US)",
+        sidebar: sidebar.en,
+        navbar: navbar.en
+      },
+      "/pt-BR/": {
+        selectLanguageName: "Brazilian Portuguese",
+        sidebar: sidebar.pt_br,
+        navbar: navbar.pt_br
+      }
+    }
+  }
+}

/pt-BR/ exigirá o mesmo conjunto de arquivos markdown localizados em docs/pt-BR/, assim:

shell
docs
+├─ README.md
+├─ foo.md
+├─ nested
+  └─ README.md
+└─ pt-BR
+   ├─ README.md
+   ├─ foo.md
+   └─ nested
+      └─ README.md

A documentação oficial do Vuepress i18n entra em mais detalhes.

+ + + + \ No newline at end of file diff --git a/pt-br/contribute/first-party-plugins.html b/pt-br/contribute/first-party-plugins.html new file mode 100644 index 00000000..2d48f4b8 --- /dev/null +++ b/pt-br/contribute/first-party-plugins.html @@ -0,0 +1,24 @@ + + + + + + First-Party Plugins | asdf + + + + + + + + + + + + + +
Skip to content

First-Party Plugins

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

A equipe principal do asdf criou alguns plugins relevantes para sua vida profissional diária. A ajuda é sempre bem-vinda na manutenção e melhoria desses plugins. Veja o repositório associado para cada link abaixo:

Para plugins da comunidade, consulte:

+ + + + \ No newline at end of file diff --git a/pt-br/contribute/github-actions.html b/pt-br/contribute/github-actions.html new file mode 100644 index 00000000..013d83a3 --- /dev/null +++ b/pt-br/contribute/github-actions.html @@ -0,0 +1,24 @@ + + + + + + GitHub Actions | asdf + + + + + + + + + + + + + +
Skip to content

GitHub Actions

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

Obrigado pelo seu interesse, consulte o repositório de ações asdf para ver os problemas, conversas e diretrizes de contribuição existentes.

+ + + + \ No newline at end of file diff --git a/pt-br/guide/getting-started.html b/pt-br/guide/getting-started.html new file mode 100644 index 00000000..16794836 --- /dev/null +++ b/pt-br/guide/getting-started.html @@ -0,0 +1,36 @@ + + + + + + Começando | asdf + + + + + + + + + + + + + +
Skip to content

Começando

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

A instalação do asdf envolve:

  1. Instalar as dependências
  2. Instalar o núcleo do asdf
  3. Adicionar o asdf ao seu shell
  4. Instalar um plugin para cada ferramenta que você gostaria de gerenciar
  5. Instalar uma versão desta ferramenta
  6. Definir uma versão global e uma versão local através do arquivo de configuração .tool-versions

Você pode também acompanhar o passo a passo da instalação através deste vídeo.

1. Instalando as dependências

asdf primarily requires git & curl. Here is a non-exhaustive list of commands to run for your package manager (some might automatically install these tools in later steps).

OSPackage ManagerCommand
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

Note

sudo may be required depending on your system configuration.

2. Download asdf

Official Download

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1

Community Supported Download Methods

We highly recommend using the official git method.

MethodCommand
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper

3. Adicionando ao seu shell

Existem diversas combinações de shells, sistemas operacionais e métodos de instalação que podem impactar a configuração. Abaixo, expanda a seção que se adeque mais com o seu sistema:

Bash & Git

Adicione esta linha ao seu ~/.bashrc:

shell
. "$HOME/.asdf/asdf.sh"

O auto completar deve ser configurado manualmente a partir da adição da seguinte linha ao .bashrc:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

Se você estiver usando o macOS Catalina ou mais recente, o shell padrão mudou para o ZSH. A não ser que você tenha voltado para o bash, siga as instruções de instalação para o ZSH.

Adicione esta linha ao seu ~/.bash_profile:

shell
. "$HOME/.asdf/asdf.sh"

O auto completar deve ser configurado manualmente a partir da adição da seguinte linha ao .bash_profile:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

Adicione asdf.sh ao ~/.bashrc através do comando:

shell
echo -e "\n. $(brew --prefix asdf)/asdf.sh" >> ~/.bashrc

O auto completar deve ser configurado seguindo as instruções da Homebrew, ou as seguintes:

shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bashrc
Bash & Homebrew (macOS)

Se você estiver usando o macOS Catalina ou mais recente, o shell padrão mudou para o ZSH. A não ser que você tenha voltado para o bash, siga as instruções de instalação para o ZSH.

Adicione asdf.sh ao ~/.bash_profile através do comando:

shell
echo -e "\n. $(brew --prefix asdf)/asdf.sh" >> ~/.bash_profile

O auto completar deve ser configurado seguindo as instruções da Homebrew, ou as seguintes:

shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bash_profile
Bash & Pacman

Adicione a seguinte linha ao seu ~/.bashrc:

shell
. /opt/asdf-vm/asdf.sh

O pacote bash-completion precisa ser instalado para o auto completar funcionar.

Fish & Git

Adicione a seguinte linha ao seu ~/.config/fish/config.fish:

shell
source ~/.asdf/asdf.fish

O auto completar deve ser configurado manualmente através do seguinte comando:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

Adicione asdf.fish ao seu ~/.config/fish/config.fish através do comando:

shell
echo -e "\nsource "(brew --prefix asdf)"/asdf.fish" >> ~/.config/fish/config.fish

O auto completar é configurado pela Homebrew para o fish shell.

Fish & Pacman

Adicione a seguinte linha ao seu ~/.config/fish/config.fish:

shell
source /opt/asdf-vm/asdf.fish

O auto completar é configurado automaticamente durante a instalação do pacote AUR.

Elvish & Git

Adicione asdf.elv ao ~/.config/elvish/rc.elv através do comando:

shell
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

Ao concluir atualizará automaticamente

Elvish & Homebrew

Adicione asdf.elv ao ~/.config/elvish/rc.elv através do comando:

shell
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

Ao concluir atualizará automaticamente

Elvish & Pacman

Adicione asdf.elv ao ~/.config/elvish/rc.elv através do comando:

shell
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

Ao concluir atualizará automaticamente

ZSH & Git

Adicione a seguinte linha ao seu ~/.zshrc:

shell
. "$HOME/.asdf/asdf.sh"

OU utilize um framework para ZSH, como asdf para oh-my-zsh que irá adicionar o script e o auto completar.

O auto completar pode ser configurado ou pelo plugin do asdf para framework para ZSH, ou através da adição das seguintes linhas ao seu .zshrc:

shell
# append completions to fpath
+fpath=(${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • Se você está utilizando uma configuração compinit customizada, garanta que compinit esteja abaixo chamada asdf.sh
  • Se você está utilizando uma configuração compinit customizada com um framework para ZSH, garanta que compinit esteja abaixo da chamada do framework.

Aviso

Se você está utilizando um framework para ZSH, o plugin do asdf pode precisar ser atualizado para utilização adequada do novo auto completar do ZSH através do fpath. O plugin do asdf para o oh-my-zsh ainda não foi atualizado, veja: ohmyzsh/ohmyzsh#8837.

ZSH & Homebrew

Adicione asdf.sh ao seu ~/.zshrc através do comando:

shell
echo -e "\n. $(brew --prefix asdf)/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc

OU utilize um framework para ZSH, como asdf para oh-my-zsh que irá adicionar o script e o auto completar.

O auto completar pode ser configurado ou pelo framework para ZSH, ou de acordo com as instruções da Homebrew. Se você está usando um framework para ZSH, pode ser que seja necessário atualizar o plugin do asdf para que o novo auto completar funcione adequadamente através do fpath. O plugin do asdf para o Oh-My-ZSH ainda será atualizado, veja: ohmyzsh/ohmyzsh#8837.

ZSH & Pacman

Adicione a seguinte linha ao seu ~/.zshrc:

shell
. /opt/asdf-vm/asdf.sh
PowerShell Core & Git

Adicione a seguinte linha ao seu ~/.config/powershell/profile.ps1:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

Adicione asdf.ps1 ao seu ~/.config/powershell/profile.ps1 através do comando:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.ps1\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

Adicione a seguinte linha ao seu ~/.config/powershell/profile.ps1:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

Adicione asdf.nu ao seu ~/.config/nushell/config.nu através do comando:

shell
"\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

Ao concluir atualizará automaticamente

Nushell & Homebrew

Adicione asdf.nu ao seu ~/.config/nushell/config.nu através do comando:

shell
"\n$env.ASDF_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\n source " +  (brew --prefix asdf | str trim | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path

Ao concluir atualizará automaticamente

Nushell & Pacman

Adicione asdf.nu ao seu ~/.config/nushell/config.nu através do comando:

shell
"\n$env.ASDF_DIR = '/opt/asdf-vm/'\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

Ao concluir atualizará automaticamente

POSIX Shell & Git

Adicione a seguinte linha ao seu ~/.profile:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

Adicione asdf.sh ao ~/.profile através do comando:

shell
echo -e "\nexport ASDF_DIR=\"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
+echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
POSIX Shell & Pacman

Adicione a seguinte linha ao seu ~/.profile:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

O auto completar é colocado em um local familiar para o ZSH, mas o ZSH deve ser configurado para conseguir utilizá-lo. :::

Os scripts do asdf precisam ser chamados depois de ter configurado a sua variável $PATH e depois de ter chamado o seu framework para ZSH (oh-my-zsh etc).

Reinicie seu shell para que as mudanças na variável PATH tenham efeito. Abrir uma nova janela/sessão de terminal o fará.

4. Instalando um plugin

Para demonstração, vamos instalar e configurar o Node.js através do plugin asdf-nodejs.

Dependências dos plugins

Cada plugin possui algumas dependências, por isso precisamos checar no repositório onde elas estão listadas. Por exemplo, para o asdf-nodejs são:

SOInstalação de dependencia
Linux (Debian)apt-get install dirmngr gpg curl gawk
macOSbrew install gpg gawk

Devemos instalar instalar as dependências primeiro, pois alguns plugins exigem algumas ações após a instalação.

Instalando o plugin

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. Instalando uma versão

Agora temos o plugin para o Node.js, nós podemos instalar uma versão desta ferramenta.

Podemos ver quais versões tão disponíveis através do comando asdf list all nodejs, ou uma lista específica de versões com asdf list all nodejs 14

Vamos instalar somente a última versão disponível, utilizando a tag latest:

shell
asdf install nodejs latest

Nota

asdf exige versões exatas. A palavra latest resulta na instalação da versão atual na data da execução.

6. Definindo uma versão

asdf executa uma verificação das versões das ferramentas a serem utilizadas através do arquivo .tool-versions presente desde diretório atual, até o diretório $HOME. A varredura ocorre no momento em que você executa uma ferramenta que o asdf gerencia.

WARNING

Se uma versão não for especificada para uma ferramenta, ao executá-la resultará em erro. asdf current mostrará a ferramenta e sua versão, ou então a falta dela no seu diretório atual para que você possa observar quais ferramentas falharão ao serem executadas.

Versões globais

Os padrões globais são gerenciados em $HOME/.tool-versions. Defina uma versão global através do comando:

shell
asdf global nodejs latest

$HOME/.tool-versions ficará assim:

nodejs 16.5.0

Alguns sistemas operacionais vêm por padrão com ferramentas que são gerenciadas pelo próprio sistema e não pelo asdf, python é um exemplo. Você precisa indicar para o asdf para devolver o gerenciamento para o sistema. A seção de referência de versões irá guiá-lo.

Versões locais

Versões locais são definidas no arquivo $PWD/.tool-versions (seu diretório atual). Geralmente, será um repositório Git para um projeto. Quando estiver no diretório desejado, execute:

shell
asdf local nodejs latest

$PWD/.tool-versions ficará assim:

nodejs 16.5.0

Usando arquivos de versão existentes

asdf suporta a migração de arquivos de versão provenientes de outros gerenciadores de versão. Por exemplo: .ruby-version para o rbenv. Essa funcionalidade é baseada no plugin de cada ferramenta.

O asdf-nodejs suporta tanto arquivos .nvmrc quanto .node-version. Para ativar essa funcionalidade, adicione a seguinte linha ao seu arquivo de configuração do asdf - $HOME/.asdfrc:

legacy_version_file = yes

Veja a página de refencia da configuração para mais opções de configuração.

Setup finalizado!

A configuração inicial do asdf foi finalizada 🎉. Agora, você pode gerenciar versões do nodejs para o seus projetos. Siga passos semelhantes para cada ferramenta do seu projeto.

O asdf possui diversos outros comandos para se acustomar ainda, você pode ver todos eles através do comando asdf --help ou simplesmente asdf. Eles estão divididos em três categorias:

+ + + + \ No newline at end of file diff --git a/pt-br/guide/introduction.html b/pt-br/guide/introduction.html new file mode 100644 index 00000000..cc47163e --- /dev/null +++ b/pt-br/guide/introduction.html @@ -0,0 +1,24 @@ + + + + + + Introdução | asdf + + + + + + + + + + + + + +
Skip to content

Introdução

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

O asdf é um gerenciador de versões. Todas as definições de versão das ferramentas estão contidas no arquivo (.tool-versions), o qual você pode compartilhar com o seu time no repositório Git de um projeto e garantir que todos estejam usando exatamente a mesma versão das ferramentas.

A maneira antiga de trabalhar necessitava diversos gerenciadores de versão, cada um deles com uma documentação, arquivos de configuração diferentes (manipulação do $PATH, shims e variáveis de ambiente, por exemplo). O asdf provê um único arquivo de configuração e uma única interface para simplificar o fluxo de desenvolvimento, podendo ser ampliado para todas as ferramentas através de um simples plugin.

Funcionamento

Após instalar e configurar o asdf no seu shell, plugins podem ser instalados para gerenciar determinadas ferramentas. Quando uma ferramenta é instalada por um plugin, os executáveis que foram instalados possuem shims criados para cada um deles. Quando você roda algum destes executáveis, o shim é executado, permitindo que o asdf identifique qual versão da ferramenta está configurada no arquivo .tool-versions e execute esta versão.

Projetos relacionados

nvm / n / rbenv etc

Ferramentas como o nvm, n e rbenv são escritas em shell scripts que criam shims para os executáveis instalados para essas ferramentas.

O asdf é bem similar e foi criado para competir neste meio de ferramentas de gerenciamento de versão. O grande diferencial do asdf é que seu sistema de plugins elimina a necessidade de um gerenciador de versões para cada ferramenta, esta com diferentes comandos e arquivos de configuração.

direnv

Aumenta os shells existentes com a possibilidade de utilizar diferentes variáveis de ambiente com base no diretório atual.

O asdf não gerencia variáveis de ambiente, entretanto existe o plugin asdf-direnv para integrar o comportamento do direnv ao asdf.

Veja a documentação do direnv para mais detalhes.

Homebrew

O gerenciador de pacotes faltante para o macOS (ou Linux)

O Homebrew gerencia seus pacotes e dependências destes pacotes. O asdf não gerencia dependencias, não é um gerenciador de pacotes, a escolha do gerenciador de pacotes é reservada ao usuário.

Veja a documentação do Homebrew para mais detalhes.

NixOS

O Nix é uma ferramenta que relaciona o gerenciamento de pacotes e as configurações de sistema.

O NixOS visa construir ambientes verdadeiramente replicáveis através da gerência das versões exatas dos pacotes e dependências de cada ferramenta, algo que o asdf não faz. O NixOS faz isso através da sua própria linguagem de programação, muitas ferramentas da linha de comando e uma coleção de pacotes contendo mais de 60,000 destes.

Novamente, o asdf não gerencia dependências/pacotes e não é um gerenciador de pacotes.

Veja a documentação do NixOS para mais detalhes.

Por que usar o asdf?

O asdf garante que equipes utilizem exatamente a mesma versão de alguma ferramenta, com suporte para diversas delas através do sistema de plugins e a simplicidade e familiaridade de ser um único shell script que você inclui na configuração do seu shell

Nota

O asdf não foi feito para ser o gerenciador de pacotes do seu sistema, mas sim uma ferramenta para gerenciar versões de outras ferramentas. Não é por que é possível criar um plugin para qualquer ferramenta/linguagem com o asdf que esta sempre será a solução mais adequada.

+ + + + \ No newline at end of file diff --git a/pt-br/index.html b/pt-br/index.html new file mode 100644 index 00000000..e859ba54 --- /dev/null +++ b/pt-br/index.html @@ -0,0 +1,24 @@ + + + + + + asdf + + + + + + + + + + + + + +
Skip to content

asdf

O Gerenciador de Múltiplas Versões de Tempo de Execução

Gerencie todas as suas versões de tempo de execução com uma ferramenta!

+ + + + \ No newline at end of file diff --git a/pt-br/manage/commands.html b/pt-br/manage/commands.html new file mode 100644 index 00000000..fa6e05d4 --- /dev/null +++ b/pt-br/manage/commands.html @@ -0,0 +1,89 @@ + + + + + + All Commands | asdf + + + + + + + + + + + + + +
Skip to content

All Commands

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

A lista de todos os comandos disponíveis em asdf. Esta lista é o texto do comando asdf help.

txt
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>]      Add a plugin from the plugin repo OR,
+                                        add a Git repo as a plugin by
+                                        specifying the name and repo url
+asdf plugin list [--urls] [--refs]      List installed plugins. Optionally show
+                                        git urls and git-ref
+asdf plugin list all                    List plugins registered on asdf-plugins
+                                        repository with URLs
+asdf plugin remove <name>               Remove plugin and package versions
+asdf plugin update <name> [<git-ref>]   Update a plugin to latest commit on
+                                        default branch or a particular git-ref
+asdf plugin update --all                Update all plugins to latest commit on
+                                        default branch
+
+
+MANAGE PACKAGES
+asdf current                            Display current version set or being
+                                        used for all packages
+asdf current <name>                     Display current version set or being
+                                        used for package
+asdf global <name> <version>            Set the package global version
+asdf global <name> latest[:<version>]   Set the package global version to the
+                                        latest provided version
+asdf help <name> [<version>]            Output documentation for plugin and tool
+asdf install                            Install all the package versions listed
+                                        in the .tool-versions file
+asdf install <name>                     Install one tool at the version
+                                        specified in the .tool-versions file
+asdf install <name> <version>           Install a specific version of a package
+asdf install <name> latest[:<version>]  Install the latest stable version of a
+                                        package, or with optional version,
+                                        install the latest stable version that
+                                        begins with the given string
+asdf latest <name> [<version>]          Show latest stable version of a package
+asdf latest --all                       Show latest stable version of all the
+                                        packages and if they are installed
+asdf list <name> [version]              List installed versions of a package and
+                                        optionally filter the versions
+asdf list all <name> [<version>]        List all versions of a package and
+                                        optionally filter the returned versions
+asdf local <name> <version>             Set the package local version
+asdf local <name> latest[:<version>]    Set the package local version to the
+                                        latest provided version
+asdf shell <name> <version>             Set the package version to
+                                        `ASDF_${LANG}_VERSION` in the current shell
+asdf uninstall <name> <version>         Remove a specific version of a package
+asdf where <name> [<version>]           Display install path for an installed
+                                        or current version
+asdf which <command>                    Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...]           Executes the command shim for current version
+asdf env <command> [util]               Runs util (default: `env`) inside the
+                                        environment used for command shim execution.
+asdf info                               Print OS, Shell and ASDF debug information.
+asdf version                            Print the currently installed version of ASDF
+asdf reshim <name> <version>            Recreate shims for version of a package
+asdf shim-versions <command>            List the plugins and versions that
+                                        provide a command
+asdf update                             Update asdf to the latest stable release
+asdf update --head                      Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs:   https://asdf-vm.com
+ + + + \ No newline at end of file diff --git a/pt-br/manage/configuration.html b/pt-br/manage/configuration.html new file mode 100644 index 00000000..842bb7c6 --- /dev/null +++ b/pt-br/manage/configuration.html @@ -0,0 +1,25 @@ + + + + + + Configuration | asdf + + + + + + + + + + + + + +
Skip to content

Configuration

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

A configuração do asdf abrange tanto os arquivos .tool-versions compartilháveis quanto as personalizações específicas do usuário com .asdfrc e variáveis de ambiente.

.tool-versions

Sempre que o arquivo .tool-versions estiver presente em um diretório, as versões da ferramenta que ele declara serão usadas nesse diretório e em seus subdiretórios.

Configurações globais podem ser modificadas no arquivo $HOME/.tool-versions

O arquivo .tool-versions se parece assim:

ruby 2.5.3
+nodejs 10.15.0

As versões podem estar no seguinte formato:

  • 10.15.0 - uma versão real. Os plugins que suportam o download de binários farão o download de binários.
  • ref:v1.0.2-a ou ref:39cb398vb39 - tag/commit/branch para download pelo github e compilação um path costumizado e compi
  • path:~/src/elixir - um path para uma versão compilada e personalizada de uma ferramenta pronta para usar. Para uso por linguagens de desenvolvimento e outros.
  • system - faz com que asdf passe para a versão da ferramenta no sistema que não é gerenciada por asdf .

Várias versões podem ser definidas, separando-as com um espaço. Por exemplo, para usar Python 3.7.2, e também Python 2.7.15, use a linha abaixo em seu arquivo .tool-versions.

python 3.7.2 2.7.15 system

Para instalar todas as ferramentas definidas em .tool-versions, execute o camando asdf install sem argumentos no mesmo diretório de .tool-versions.

Para isntalar somente uma ferramenta definida em .tool-versions, execute o camando asdf install sem argumentos no mesmo diretório de .tool-versions. A ferramenta será instalada na versão especificada no arquivo .tool-versions.

Edite o arquivo diretamente no diretório ou use asdf local (ou asdf global) para atualiza-lo.

$HOME/.asdfrc

Adicione um arquivo .asdfrc ao seu diretório home e asdf usará as configurações especificadas no arquivo. O arquivo deve ser formatado assim:

legacy_version_file = yes

Configurações

  • legacy_version_file - por padrão é no. Se definido como yes, fará com que os plug-ins que suportam esse recurso leiam os arquivos de versão usados por outros gerenciadores de versão (por exemplo, .ruby-version no caso do rbenv do Ruby).

  • use_release_candidates - por padrão é no. Se definido como yes, fará com que o comando asdf update atualize para o mais recente em vez da versão semântica mais recente.

  • always_keep_download - por padrão é no. Se definido como yes, fará com que o asdf install sempre mantenha o código-fonte ou binário baixado. Se definido como no, o código fonte ou binário baixado por asdf install será excluído após a instalação bem sucedida.

  • plugin_repository_last_check_duration - por padrão é 60 min (1 hrs). Ele define a duração da última verificação do repositório de plugins asdf. Quando o comando asdf plugin add <nome>, asdf plugin list all for executado, ele verificará a duração da última atualização para atualizar o repositório. Se definido como 0, ele atualizará o repositório de plugins asdf todas as vezes.

Variáveis de ambiente

  • ASDF_CONFIG_FILE - O padrão é ~ /.asdfrc conforme descrito acima. Pode ser definido para qualquer local.
  • ASDF_DEFAULT_TOOL_VERSIONS_FILENAME - O nome do arquivo que armazena os nomes e versões das ferramentas. O padrão é .tool-versions. Pode ser qualquer nome de arquivo válido. Normalmente você não deve substituir o valor padrão, a menos que deseja que o asdf ignore os arquivos .tool-versions.
  • ASDF_DIR - O padrão é ~/.asdf - Localização dos arquivos asdf. Se você instalar asdf em algum outro diretório, defina-o para esse diretório. Por exemplo, se você estiver instalando através do AUR, você deve definir isso para /opt/asdf-vm.
  • ASDF_DATA_DIR - O padrão é ~/.asdf - Local onde asdf instala plugins, correções e instalações. Pode ser definido para qualquer local antes de fornecer asdf.sh ou asdf.fish mencionado na seção acima. Para Elvish, isso pode ser definido acima de use asdf.
+ + + + \ No newline at end of file diff --git a/pt-br/manage/core.html b/pt-br/manage/core.html new file mode 100644 index 00000000..0a734147 --- /dev/null +++ b/pt-br/manage/core.html @@ -0,0 +1,41 @@ + + + + + + Core | asdf + + + + + + + + + + + + + +
Skip to content

Core

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

A lista de comandos do núcleo asdf é bastante pequena, mas pode facilitar muitos fluxos de trabalho.

Instalação e configuração

Baseado no Guia de Introdução.

Execute

shell
asdf exec <command> [args...]

Executa o comando shim para a versão atual

Variável de Ambiente

shell
asdf env <command> [util]

Informações

shell
asdf info

Um comando auxiliar para imprimir as informações de depuração do SO, Shell e asdf. Compartilhe isso ao fazer um relatório de bug.

Reshim

shell
asdf reshim <name> <version>

Isso recria os shims para a versão atual de um pacote. Por padrão, os calços são criados por plugins durante a instalação de uma ferramenta. Algumas ferramentas como a npm CLI permitem a instalação global de executáveis, por exemplo, instalando Yarn via npm install -g fio. Como este executável não foi instalado por meio do ciclo de vida do plug-in, ainda não existe shim para ele. asdf reshim nodejs <version> forçará o recálculo de shims para quaisquer novos executáveis, como yarn, para <version> de nodejs.

Versionamento do Shim

shell
asdf shim-versions <command>

Lista os plugins e versões que fornecem shims para um comando.

Como exemplo, o Node.js vem com dois executáveis, node e npm. Quando muitas versões das ferramentas são instaladas com asdf-nodejs shim-versions pode retornar:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

Atualizar

asdf tem um comando embutido para atualização que depende do Git (nosso método de instalação recomendado). Se você instalou usando um método diferente, siga as etapas para esse método:

MethodLatest Stable ReleaseLatest commit on master
asdf (via Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
PacmanObter manualmente um novo PKGBUILD e
reconstruir ou usar suas preferências de AUR.

Desinstalar

Para desinstalar asdf siga os passos:

Bash & Git
  1. Em seu ~/.bashrc remova as linhas do asdf.sh e seus complementos:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. Em seu ~/.bash_profile remova as linhas do asdf.sh e remova seus complementos:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. Em seu ~/.bashrc remova as linhas do asdf.sh e remova seus complementos:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

?> Os complementos precisam instruções de configuração do Homebrew e siga o guia de remoção.

  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

Caso esteja usando macOs Catalina ou mais recente, por padrão o shell é ZSH. Se não achar alguma configuração em seu ~/.bash_profile talvez esteja em ~/.zshrc em cada caso siga as intruções do ZSH.

  1. Em seu ~/.bash_profile remova as linhas do asdf.sh e remova seus complementos:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

?> Os complementos precisam instruções de configuração do Homebrew e siga o guia de remoção.

  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. Em seu ~/.bashrc remova as linhas do asdf.sh e seus complementos:
shell
. /opt/asdf-vm/asdf.sh
  1. Desinstale usando seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. Em seu ~/.config/fish/config.fish remova as linhas do asdf.sh:
shell
source ~/.asdf/asdf.fish

e remova os complementos de com esse comando:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. Em seu ~/.config/fish/config.fish remova as linhas do asdf.fish:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. Em seu ~/.config/fish/config.fish remova as linhas do asdf.fish:
shell
source /opt/asdf-vm/asdf.fish
  1. Desinstale usando seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. Em seu ~/.config/elvish/rc.elv remova as linhas que importa o módulo asdf:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

e desinstale o módulo asdf com este comando:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Remova o diretório $HOME/.asdf:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Execute este comando para remover todos os arquivos de configuração asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. Em seu ~/.config/elvish/rc.elv remova as linhas que importa o módulo asdf:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

e desinstale o módulo asdf com este comando:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Desinstale com seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute este comando para remover todos os arquivos de configuração asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. Em seu ~/.config/elvish/rc.elv remova as linhas que importa o módulo asdf:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

e desinstale o módulo asdf com este comando:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Desinstale com seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $ HOME/.asdf:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Execute este comando para remover todos os arquivos de configuração asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. Em seu ~/.zshrc remova as linhas do asdf.sh e seus complementos:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

Ou use ZSH Framework plugin.

  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. Em seu ~/.zshrc remova as linhas do asdf.sh:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. Em seu ~/.zshrc remova as linhas do asdf.sh:
shell
. /opt/asdf-vm/asdf.sh
  1. Desinstale usando seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"

Tudo pronto! 🎉

+ + + + \ No newline at end of file diff --git a/pt-br/manage/plugins.html b/pt-br/manage/plugins.html new file mode 100644 index 00000000..a04091e6 --- /dev/null +++ b/pt-br/manage/plugins.html @@ -0,0 +1,34 @@ + + + + + + Plugins | asdf + + + + + + + + + + + + + +
Skip to content

Plugins

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

Plugins são como asdf sabe lidar com diferentes ferramentas, tais quais Node.js, Ruby, Elixir etc.

Veja Criando Plugins para a API do plugin usada para suportar mais ferramentas.

Adicionar

Adicione os plugins via sua Url Git:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

ou pelo nome abreviado dentro do repositório de plugins:

shell
asdf plugin add <name>
+# asdf plugin add erlang

Recommendation

Prefira o método mais longo git-url, pois ele é independente do repositório de nome abreviado.

Listar Instalados

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

Listar todos nomes abreviados no repositório

shell
asdf plugin list all

Veja Plugins Shortname Index para toda a lista de nomes curtos de plugins.

Atualizar

shell
asdf plugin update --all

Se você quiser atualizar um pacote específico, apenas use.

shell
asdf plugin update <name>
+# asdf plugin update erlang

Esta atualização irá buscar o último commit na branch padrão no origin de seu respositório. Plugins e atualizações das versões estão sendo desenvolvidas (#916)

Remover

bash
asdf plugin remove <name>
+# asdf plugin remove erlang

Removendo o plugin irá remover todas as instalações feitas com o plugin. Isso pode ser usado como um atalho para apagar/remover sujeiras de versões não utilizadas de uma ferramenta.

Sincronizar nome abreviado no repositório

O nome abreviado do repositório é sincronizado em seu máquina local e periodicamente atualizado. Esse período pode ser determinado com o seguinte método:

  • comandos asdf plugin add <name> ou asdf plugin list all disparam a sincronização
  • ocorre uma sincronização se não houver nenhuma nos últimos X minutos
  • X por padrão é 60, mas pode ser mudado em .asdfrc via as opções do plugin_repository_last_check_duration. Seja mais em asdf documentação de configuração.
+ + + + \ No newline at end of file diff --git a/pt-br/manage/versions.html b/pt-br/manage/versions.html new file mode 100644 index 00000000..5deae60c --- /dev/null +++ b/pt-br/manage/versions.html @@ -0,0 +1,53 @@ + + + + + + Versões | asdf + + + + + + + + + + + + + +
Skip to content

Versões

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

Instalar Versão

shell
asdf install <name> <version>
+# asdf install erlang 17.3

Se um plugin suporta o download e compilação do código-fonte, você pode especificar ref:foo no qual foo é uma 'branch' especifica, 'tag', ou 'commit'. Você também precisará usar o mesmo nome e referência ao desinstalar.

Instalar última versão estável

shell
asdf install <name> latest
+# asdf install erlang latest

Instale a última versão estável que inicia com um texto.

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

Listar versões instaladas

shell
asdf list <name>
+# asdf list erlang

Limite as versões que inicie com um determinado texto.

shell
asdf list <name> <version>
+# asdf list erlang 17

Listar todas as versões disponíveis

shell
asdf list all <name>
+# asdf list all erlang

Limite as versões que inicie com um determinado texto.

shell
asdf list all <name> <version>
+# asdf list all erlang 17

Mostrar última versão estável

shell
asdf latest <name>
+# asdf latest erlang

Mostrar última versão estável que inicie com um determinado texto.

shell
asdf latest <name> <version>
+# asdf latest erlang 17

Selecionar versão atual

shell
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest

global escreve a versão para $HOME/.tool-versions.

shell selecione a versão na variável de ambiente ASDF_${LANG}_VERSION, para a atual seção do shell.

local escreve a versão para $PWD/.tool-versions, crie se necessário .

Veja em .tool-versions arquivo de seleção de configuração para mais detalhes.

Alternativa

Se você quiser selecionar a versão atual do seu shell ou para executar um comando em uma versão específica de sua ferramenta, você pode selecionar a versão na variável de ambiente ASDF_${TOOL}_VERSION.

O seguinte exemplo executa os testes em um projeto Elixir na versão 1.4.0. O formato da versão é o mesmo suportado pelo arquivo .tool-versions.

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

Resposta do sistema de versão

Para usar o sistema de versão da ferramenta <name> inicie um gerenciador de versões do asdf para selecionar a versão na ferramenta do system.

Selecione o sistema com global, local ou shell Set system with either global, local or shell conforme descrito em Selecionar versão atual.

shell
asdf local <name> system
+# asdf local python system

Verificar a versão atual

shell
asdf current
+# asdf current
+# erlang 17.3 (set by /Users/kim/.tool-versions)
+# nodejs 6.11.5 (set by /Users/kim/cool-node-project/.tool-versions)
+
+asdf current <name>
+# asdf current erlang
+# 17.3 (set by /Users/kim/.tool-versions)

Desinstalar versão

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

Shims

Quando asdf instala um pacote é criado shims para cada programa executado no pacote do diretório $ASDF_DATA_DIR/shims (padrão ~/.asdf/shims). Esse diretório começa no $PATH (pelos asdf.sh, asdf.fish, etc) é como o programa instalado é disponibilizado no ambiente do sistema.

Os shims em si são atalhos simples que executam um programa auxiliar asdf exec passando o nome do plugin e o caminho para o executável no pacote instalado que o shim está contido.

O asdf exec ajuda a determinar a versão do pacote usado (como especificado no arquivo .tool-versions, pelo asdf local ... ou asdf global ...), o final do path do executavél no pacote instalado no diretório (pode ser manipulado pelo exec-path no callback do plugin) e o ambiente executado em (também fornecido pelo plugin - exec-env) e finalmente executado.

Observação

Observe que, como este sistema usa chamadas exec, qualquer scripts no pacote devem ser fornecidos pelo shell, a instancia em execução precisa ser aessado diretamente ao invés do shim. Os dois comandos do asdf: which e where pode ajudar com o retorno do caminho para o pacote instalado:

shell
# retorna o 'path' da versão atual em execução
+source $(asdf which ${PLUGIN})/../script.sh
+
+# retorna o 'path' do pacote instalado no diretório
+source $(asdf where ${PLUGIN} $(asdf current ${PLUGIN}))/bin/script.sh

Ignorando shims do asdf

Se por algum motivo você deseja ignorar shims do asdf ou deseja que suas variáveis de ambiente sejam definidas automaticamente ao entrar no diretório do seu projeto, pode ser útil o asdf-direnv. Verifique o README para mais detalhes.

+ + + + \ No newline at end of file diff --git a/pt-br/more/community-projects.html b/pt-br/more/community-projects.html new file mode 100644 index 00000000..abfa2ad6 --- /dev/null +++ b/pt-br/more/community-projects.html @@ -0,0 +1,24 @@ + + + + + + Community Projects | asdf + + + + + + + + + + + + + +
Skip to content

Community Projects

Here are some community projects related to asdf:

Note

asdf core do not own these projects or their code. asdf core are not responsible for the quality or security as they relate to those listed here.

+ + + + \ No newline at end of file diff --git a/pt-br/more/faq.html b/pt-br/more/faq.html new file mode 100644 index 00000000..f3e51ba2 --- /dev/null +++ b/pt-br/more/faq.html @@ -0,0 +1,24 @@ + + + + + + Perguntas frequentes | asdf + + + + + + + + + + + + + +
Skip to content

Perguntas frequentes

Aqui estão algumas perguntas comuns sobre asdf.

Suporte WSL1?

WSL1 (Windows Subsystem for Linux 1) não é oficialmente suportado. Alguns aspectos do asdf podem não funcionar corretamente. Não temos a intenção de adicionar suporte oficial para WSL1.

Suporte WSL2?

WSL2 (Subsistema Windows para Linux 2) deve funcionar usando as instruções de configuração e dependência para a distribuição WSL escolhida.

É importante ressaltar que o WSL2 apenas deve funcionar corretamente quando o diretório de trabalho atual é uma unidade Unix e não uma unidade Windows vinculada.

Pretendemos executar o conjunto de testes no WSL2 quando o suporte ao host runner estiver disponível nas Ações do GitHub; atualmente, esse não parece ser o caso.

Exectable recém-instalado não está funcionando?

Acabei de instalar o npm -g yarn, mas não consigo executar o yarn. O que da?

asdf usa shims para gerenciar executáveis. Aqueles instalados por plug-ins têm shims criados automaticamente, enquanto a instalação de executáveis ​​por meio de uma ferramenta gerenciada asdf exigirá que você notifique oasdf sobre a necessidade de criar shims. Neste caso, para criar um shim para Yarn. Veja a documentação do comando [asdf reshim](/ manage / core.md # reshim).

Shell não detecta shims recém-instalados?

Se asdf reshim não está resolvendo seu problema, então é mais provável devido ao sourcing deasdf.sh ou asdf.fish não estar no ** BOTTOM ** de seu arquivo de configuração Shell (.bash_profile, .zshrc, config.fish, etc). Ele precisa ser fornecido DEPOIS de você definir seu $PATH e DEPOIS de ter fornecido seu framework (oh-meu-zsh etc), se houver.

+ + + + \ No newline at end of file diff --git a/pt-br/more/thanks.html b/pt-br/more/thanks.html new file mode 100644 index 00000000..17c9a507 --- /dev/null +++ b/pt-br/more/thanks.html @@ -0,0 +1,24 @@ + + + + + + Créditos | asdf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pt-br/plugins/create.html b/pt-br/plugins/create.html new file mode 100644 index 00000000..1300db61 --- /dev/null +++ b/pt-br/plugins/create.html @@ -0,0 +1,58 @@ + + + + + + Criar um plug-in | asdf + + + + + + + + + + + + + +
Skip to content

Criar um plug-in

Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.

O que há em um plug-in

Um plugin é um repositório git, com alguns scripts executáveis, para dar suporte ao versionamento de outra linguagem ou ferramenta. Esses scripts são executados quando os comandos list-all, install ou uninstall são executados. Você pode definir ou desmarcar env vars e fazer qualquer coisa necessária para configurar o ambiente para a ferramenta.

Scripts obrigatórios

  • bin/list-all - lista todas as versões instaláveis
  • bin/download - baixe o código fonte ou binário para a versão especificada
  • bin/install - instala a versão especificada

Variavéis de Ambiente

Todos os scripts, exceto bin/list-all, terão acesso aos seguintes env vars para agir:

  • ASDF_INSTALL_TYPE - version ou ref
  • ASDF_INSTALL_VERSION - se ASDF_INSTALL_TYPE é version então este será o número da versão. Caso contrário, será o git ref que será passado. Pode apontar para uma tag/commit/branch no repositório.
  • ASDF_INSTALL_PATH - o diretório onde foi instalado (ou deve ser instalado no caso do script bin/install)

Essas variáveis de ambiente adicionais estarão disponíveis para o script bin/install:

  • ASDF_CONCURRENCY - o número de núcleos a serem usados ao compilar o código-fonte. Útil para definir make -j.
  • ASDF_DOWNLOAD_PATH - o caminho para onde o código fonte ou binário foi baixado pelo script bin/download.

Essas variáveis de ambiente adicionais estarão disponíveis para o script bin/download:

  • ASDF_DOWNLOAD_PATH - o caminho para onde o código-fonte ou binário deve ser baixado.

bin/list-all

Deve imprimir uma string com uma lista de versões separadas por espaço. A saída de exemplo seria a seguinte:

shell
1.0.1 1.0.2 1.3.0 1.4

Observe que a versão mais recente deve ser listada por último para que apareça mais próxima do prompt do usuário. Isso é útil já que o comando list-all imprime cada versão em sua própria linha. Se houver muitas versões, é possível que as primeiras versões fiquem fora da tela.

Se as versões estiverem sendo extraídas da página de lançamentos em um site, é recomendável não classificar as versões, se possível. Muitas vezes as versões já estão na ordem correta ou, na ordem inversa, nesse caso algo como tac deve ser suficiente. Se você precisar classificar as versões manualmente, não poderá confiar em sort -V, pois não é suportado no OSX. Uma função de classificação alternativa como esta é uma escolha melhor.

bin/download

Este script deve baixar o código fonte ou binário, no caminho contido na variável de ambiente ASDF_DOWNLOAD_PATH. Se o código-fonte ou binário baixado estiver compactado, apenas o código-fonte ou binário descompactado poderá ser colocado no diretório ASDF_DOWNLOAD_PATH.

O script deve sair com um status de 0 quando o download for bem-sucedido. Se o download falhar, o script deve sair com qualquer status de saída diferente de zero.

Se possível, o script deve apenas colocar arquivos no ASDF_DOWNLOAD_PATH. Se o download falhar, nenhum arquivo deve ser colocado no diretório.

Se este script não estiver presente, o asdf assumirá que o script bin/install está presente e fará o download e instalará a versão. asdf só funciona sem este script para suportar plugins legados. Todos os plugins devem incluir este script e, eventualmente, o suporte para plugins legados será removido.

bin/install

Este script deve instalar a versão, no caminho mencionado em ASDF_INSTALL_PATH. Por padrão, o asdf criará shims para qualquer arquivo em $ASDF_INSTALL_PATH/bin (isso pode ser personalizado com o script opcional bin/list-bin-paths).

O script de instalação deve sair com um status de 0 quando a instalação for bem-sucedida. Se a instalação falhar, o script deve sair com qualquer status de saída diferente de zero.

Se possível, o script deve apenas colocar os arquivos no diretório ASDF_INSTALL_PATH uma vez que a compilação e instalação da ferramenta são consideradas bem sucedidas pelo script de instalação. asdf verifica a existência do diretório ASDF_INSTALL_PATH para determinar se essa versão da ferramenta está instalado. Se o diretório ASDF_INSTALL_PATH for preenchido no início do processo de instalação, outros comandos asdf executados em outros terminais durante a instalação podem considerar essa versão da ferramenta instalada, mesmo quando não estiver totalmente instalada.

Se você quiser que seu plugin funcione com asdf versão 0.7._ e anterior e versão 0.8._ e mais recente, verifique a presença da variável de ambiente ASDF_DOWNLOAD_PATH. Se não estiver definido, baixe o código-fonte no retorno de chamada bin/install. Se estiver definido, suponha que o script bin/download já tenha baixado.

Scripts Opcional

scripts bin/help

Este não é um script de retorno de chamada, mas sim um conjunto de scripts de retorno de chamada que imprimem documentação diferente para STDOUT. Os scripts de retorno de chamada possíveis estão listados abaixo. Observe que bin/help.overview é um caso especial, pois deve estar presente para que qualquer saída de ajuda seja exibida para o script.

  • bin/help.overview - Este script deve gerar uma descrição geral sobre o plugin e a ferramenta que está sendo gerenciada. Nenhum título deve ser impresso, pois o asdf imprimirá títulos. A saída pode ser um texto de formato livre, mas idealmente apenas um parágrafo curto. Este script deve estar presente se você quiser que o asdf forneça informações de ajuda para seu plugin. Todos os outros scripts de retorno de chamada de ajuda são opcionais.
  • bin/help.deps - Esse script deve gerar a lista de dependências adaptadas ao sistema operacional. Uma dependência por linha.
  • bin/help.config - Este script deve imprimir qualquer configuração obrigatória ou opcional que possa estar disponível para o plug-in e a ferramenta. Quaisquer variáveis de ambiente ou outros sinalizadores necessários para instalar ou compilar a ferramenta (para o sistema operacional dos usuários quando possível). A saída pode ser texto de formato livre.
  • bin/help.links - Esta deve ser uma lista de links relevantes para o plug-in e a ferramenta (mais uma vez, adaptados ao sistema operacional atual, quando possível). Um link por linha. As linhas podem estar no formato <title>: <link> ou apenas <link>.

Cada um desses scripts deve adaptar sua saída ao sistema operacional atual. Por exemplo, quando no Ubuntu, o script deps pode gerar as dependências como pacotes apt-get que devem ser instalados. O script também deve adaptar sua saída ao valor de ASDF_INSTALL_VERSION e ASDF_INSTALL_TYPE quando as variáveis forem definidas. Eles são opcionais e nem sempre serão definidos.

O script de retorno de chamada de ajuda NÃO DEVE gerar nenhuma informação que já esteja coberta na documentação principal do asdf-vm. As informações gerais de uso do asdf não devem estar presentes.

bin/list-bin-paths

Liste os executáveis para a versão especificada da ferramenta. Deve imprimir uma string com uma lista separada por espaços de caminhos de diretórios que contêm executáveis. Os caminhos devem ser relativos ao caminho de instalação passado. A saída de exemplo seria:

shell
bin tools veggies

Isso instruirá o asdf a criar shims para os arquivos em <install-path>/bin, <install-path>/tools e <install-path>/veggies

Se este script não for especificado, o asdf procurará o diretório bin em uma instalação e criará shims para eles.

bin/exec-env

Configure o env para executar os binários no pacote.

bin/exec-path

Obtenha o caminho executável para a versão especificada da ferramenta. Deve imprimir uma string com o caminho executável relativo. Isso permite que o plug-in substitua condicionalmente o caminho executável especificado do shim, caso contrário, retorne o caminho padrão especificado pelo shim.

shell
Usage:
+  plugin/bin/exec-path <install-path> <command> <executable-path>
+
+Example Call:
+  ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"
+
+Output:
+  bin/foox

bin/uninstall

Desinstala uma versão específica de uma ferramenta.

bin/list-legacy-filenames

Registre arquivos setter adicionais para este plugin. Deve imprimir uma string com uma lista de nomes de arquivos separados por espaços.

shell
.ruby-version .rvmrc

Nota: Isso só se aplica a usuários que habilitaram a opção legacy_version_file em seu ~/.asdfrc.

bin/parse-legacy-file

Isso pode ser usado para analisar ainda mais o arquivo legado encontrado pelo asdf. Se o parse-legacy-file não for implementado, o asdf simplesmente irá cat o arquivo para determinar a versão. O script receberá o caminho do arquivo como seu primeiro argumento.

bin/post-plugin-add

Isso pode ser usado para executar qualquer ação pós-instalação depois que o plug-in for adicionado ao asdf.

O script tem acesso ao caminho em que o plugin foi instalado (${ASDF_PLUGIN_PATH}) e o URL de origem (${ASDF_PLUGIN_SOURCE_URL}), se algum foi usado.

Veja também os ganchos relacionados:

  • pre_asdf_plugin_add
  • pre_asdf_plugin_add_${plugin_name}
  • post_asdf_plugin_add
  • post_asdf_plugin_add_${plugin_name}

bin/pre-plugin-remove

Isso pode ser usado para executar qualquer ação de pré-remoção antes que o plug-in seja removido do asdf.

O script tem acesso ao caminho em que o plugin foi instalado (${ASDF_PLUGIN_PATH}).

Veja também os ganchos relacionados:

  • pre_asdf_plugin_remove
  • pre_asdf_plugin_remove_${plugin_name}
  • post_asdf_plugin_remove
  • post_asdf_plugin_remove_${plugin_name}

Comandos de extensão para asdf CLI.

É possível que plugins definam novos comandos asdf fornecendo scripts ou executáveis lib/commands/command*.bash que será chamado usando a interface de linha de comando asdf usando o nome do plug-in como um subcomando.

Por exemplo, suponha que um plugin foo tenha:

shell
foo/
+  lib/commands/
+    command.bash
+    command-bat.bash
+    command-bat-man.bash
+    command-help.bash

Os usuários agora podem executar

shell
$ asdf foo         # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash`
+$ asdf foo bar     # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar`
+$ asdf foo help    # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash`
+$ asdf foo bat man # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash`
+$ asdf foo bat baz # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz`

Os autores de plugins podem usar esse recurso para fornecer utilitários relacionados às suas ferramentas, ou até mesmo criar plugins que são apenas novas extensões de comando para o próprio asdf.

Quando invocados, se os comandos de extensão não tiverem seus bits executáveis definidos, eles serão originado como scripts bash, tendo todas as funções de $ASDF_DIR/lib/utils.bash disponíveis. Além disso, o $ASDF_CMD_FILE resolve para o caminho completo do arquivo que está sendo originado. Se o bit executável estiver definido, eles são apenas executados e substituem a execução do asdf.

Um bom exemplo desse recurso é para plugins como haxe que fornece o asdf haxe neko-dylibs-link para corrigir um problema onde os executáveis haxe esperam encontrar bibliotecas dinâmicas relativas ao diretório executável.

Se o seu plug-in fornecer um comando de extensão asdf, certifique-se de mencioná-lo no README do seu plug-in.

Modelos de calços personalizados

POR FAVOR, use este recurso apenas se for absolutamente necessário

asdf permite modelos de calços personalizados. Para um executável chamado foo, se houver um arquivo shims/foo no plug-in, o asdf copiará esse arquivo em vez de usar seu modelo padrão de shim.

Isso deve ser usado com sabedoria. Por enquanto AFAIK, está sendo usado apenas no plugin Elixir, porque um executável também é lido como um arquivo Elixir, além de ser apenas um executável. O que torna impossível usar o calço bash padrão.

Testando plug-ins

asdf contém o comando plugin-test para testar seu plugin. Você pode usá-lo da seguinte forma

shell
asdf plugin test <plugin-name> <plugin-url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git-ref>] [test-command*]

Apenas os dois primeiros argumentos são necessários. Se _version for especificado, a ferramenta será instalada com essa versão específica. O padrão é o que retorna asdf latest <plugin-name>. Se git-ref for especificado, o plug-in em si é verificado nesse commit/branch/tag, útil para testar um pull-request no CI do seu plug-in. O padrão é o branch default do repositório do plugin.

Os argumentos Rest são considerados o comando a ser executado para garantir que a ferramenta instalada funcione corretamente. Normalmente seria algo que leva --version ou --help. Por exemplo, para testar o plugin NodeJS, podemos executar

shell
asdf plugin test nodejs https://github.com/asdf-vm/asdf-nodejs.git node --version

É altamente recomendável que você teste seu plug-in em um ambiente CI e verifique se ele funciona no Linux e no OSX.

Exemplo GitHub Action

O repositório asdf-vm/actions fornece uma ação do GitHub para testar seus plugins hospedados no github.

yaml
steps:
+  - name: asdf_plugin_test
+    uses: asdf-vm/actions/plugin-test@v1
+    with:
+      command: "my_tool --version"
+    env:
+      GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} # automatically provided

Exemplo de configuração do TravisCI

Aqui está um arquivo .travis.yml de amostra, personalize-o de acordo com suas necessidades

yaml
language: c
+script: asdf plugin test nodejs $TRAVIS_BUILD_DIR 'node --version'
+before_script:
+  - git clone https://github.com/asdf-vm/asdf.git asdf
+  - . asdf/asdf.sh
+os:
+  - linux
+  - osx

Notas: Ao usar outro IC, você precisará verificar qual variável mapeia para o caminho do repositório.

Você também tem a opção de passar um caminho relativo para plugin-test.

Por exemplo, se o script de teste for executado no diretório: asdf plugin test nodejs . 'node --version'.

Limitação de taxa da API do GitHub

Se o list-all do seu plug-in depender do acesso à API do GitHub, certifique-se de fornecer um token de autorização ao acessá-lo, caso contrário, seus testes podem falhar devido à limitação de taxa.

Para fazer isso, crie um novo token pessoal com apenas acesso public_repo.

Em seguida, nas configurações de compilação do travis.ci, adicione uma variável de ambiente secure para ela chamada algo como GITHUB_API_TOKEN. E NUNCA publique seu token em seu código.

Finalmente, adicione algo como o seguinte para bin/list-all

shell
cmd="curl -s"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"

Enviando plugins para o repositório oficial de plugins

asdf pode facilmente instalar plugins especificando o url do repositório de plugins, por exemplo. plugin add my-plugin https://github.com/user/asdf-my-plugin.git.

Para facilitar para seus usuários, você pode adicionar seu plugin ao repositório oficial de plugins para ter seu plugin listado e facilmente instalável usando um comando mais curto, por exemplo asdf plugin add my-plugin.

Siga as instruções no repositório de plugins: asdf-vm/asdf-plugins.

+ + + + \ No newline at end of file diff --git a/zh-hans/contribute/core.html b/zh-hans/contribute/core.html new file mode 100644 index 00000000..956e2bbd --- /dev/null +++ b/zh-hans/contribute/core.html @@ -0,0 +1,48 @@ + + + + + + asdf + + + + + + + + + + + + + +
Skip to content

asdf

asdf 核心贡献指南.

初始化安装

在 Github 上 fork asdf 并且/或者使用 Git 克隆默认分支:

shell
# 克隆你 fork 的 asdf
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# 或者直接克隆 asdf
+git clone https://github.com/asdf-vm/asdf.git

核心开发所需的工具都列举在这个存储库的 .tool-versions 文件中。如果你想要使用 asdf 自身来管理它,请使用以下命令添加这些插件:

shell
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git

使用以下命令安装这些版本来开发 asdf

shell
asdf install

在本地机器的开发过程中不使用 asdf 来管理工具 或许 对你有帮助,因为你可能需要打破某些可能会影响到你的开发工具链的功能。以下是所需工具的原始列表:

  • bats-core:Bash 自动化测试系统,用于单元测试 Bash 或 POSIX 兼容脚本。
  • shellcheck:Shell 脚本的静态分析工具。
  • shfmt:支持 Bash 的 Shell 解析器、格式化器和解释器;包含 shfmt。

开发

如果你想要在不更改已安装的 asdf 的情况下尝试应用你的更改,可以将 $ASDF_DIR 变量设置为克隆存储库的路径,并临时将目录的 binshims 目录添加到你的路径中。

最好在提交或推送到远程之前,在本地做好格式化、lint 检查和测试你的代码。可以使用以下脚本/命令:

shell
# 脚本检查
+./scripts/shellcheck.bash
+
+# 格式化
+./scripts/shfmt.bash
+
+# 测试:所有案例
+bats test/
+# 测试:特定命令
+bats test/list_commands.bash

提示

增加测试! - 新特性需要进行测试,并加快错误修复的审查速度。请在创建拉取请求之前覆盖新的代码路径。查看 bats-core 文档 了解更多。

Bats 测试

强烈建议在编写测试之前检查现有的测试套件和 bats-core 文档

Bats 调试有时可能很困难。使用带有 -t 标识的 TAP 输出将使你能够在测试执行期间打印带有特殊文件描述符 >&3 的输出,从而简化调试。例如:

shell
# test/some_tests.bats
+
+printf "%s\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\n" "Will be printed during bats -t test/some_tests.bats" >&3

进一步相关文档请查看 bats-core 的 Printing to the Terminal 部分.

拉取请求、发布以及约定式提交

asdf 正在使用一个名为 Release Please 的自动发布工具来自动碰撞 SemVer 版本并生成 变更日志。这个信息是通过读取自上次发布以来的提交历史记录来确定的。

约定式提交 定义了拉取请求标题的格式,该标题成为默认分支上的提交消息格式。这是通过 Github Action amannn/action-semantic-pull-request 强制执行的。

约定式提交遵循以下格式:

<type>[optional scope][optional !]: <description>
+
+<!-- 例子 -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change

<types> 的所有类型包含: featfixdocsstylerefactorperftestbuildcichorerevert

  • !:表示重大更改
  • fix:将会创建一个新的 SemVer patch 补丁
  • feat:将会创建一个新的 SemVer minor 小版本
  • <type>!:将会创建一个新的 SemVer major 大版本

拉取请求标题必须遵循这种格式。

提示

请使用约定式提交信息格式作为拉取请求标题。

Docker 镜像

asdf-alpineasdf-ubuntu 项目正在努力提供一些 asdf 工具的容器化镜像。你可以使用这些容器镜像作为开发服务器的基础镜像,或者运行生产应用。

+ + + + \ No newline at end of file diff --git a/zh-hans/contribute/documentation.html b/zh-hans/contribute/documentation.html new file mode 100644 index 00000000..9171ba45 --- /dev/null +++ b/zh-hans/contribute/documentation.html @@ -0,0 +1,52 @@ + + + + + + 文档 & 网站 | asdf + + + + + + + + + + + + + +
Skip to content

文档 & 网站

文档 & 网站贡献指南。

初始化设置

在 Github 上 fork asdf 并且/或者使用 Git 克隆默认分支:

shell
# 克隆你 fork 的 asdf
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# 或者直接克隆 asdf
+git clone https://github.com/asdf-vm/asdf.git

文档网站开发所需的工具都在文件 docs/.tool-versions 中使用 asdf 进行管理。使用以下命令添加插件:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

使用以下命令安装工具版本:

shell
asdf install
  • Node.js:基于 Chrome 的 V8 引擎的 JavaScript 运行环境。

根据 docs/package.json 文件安装 Node.js 依赖:

shell
npm install

开发

Vuepress (v2) 是我们用来构建 asdf 文档网站的静态站点生成器(SSG)。它被选中来取代 Docsify.js,因为我们希望在用户没有可用或未启用 JavaScript 时支持仅依靠 HTML。Docsify 无法做到这一点。除此之外,两者特性集合大致相同,重点是 Vuepress 可以用最少的配置编写 Markdown 文件。

package.json 包含了开发所需的脚本:

@code json{3-5}

启动本地开发服务器:

shell
npm run dev

在提交之前格式化代码:

shell
npm run format

拉取请求、发布以及约定式提交

asdf 正在使用依赖 PR 标题中的约定式提交的自动化发布流水线。具体的文档可以查看 核心贡献指南.

当为文档更改创建 PR 请求时,请确保 PR 标题使用了约定式提交类型 docs 以及 docs: <description> 的格式。

Vuepress

网站的配置包含在几个 JavaScript 文件中,其中 JS 对象用于表示配置。它们是:

  • docs/.vuepress/config.js:网站的根配置文件。请查看 Vuepress 文档 了解更多详情。

为了简化根配置文件,更大的 JS 对象表示 导航栏和侧边栏 配置已经被提取并按照语言类型分隔开来。请参考以下文件:

  • docs/.vuepress/navbar.js
  • docs/.vuepress/sidebar.js

这些配置的官方文档位于 默认主题参考

I18n 国际化

Vuepress 有一流的国际化支持。根配置文件 docs/.vuepress/config.js 定义了支持的语言类型及其 URL、在选择下拉菜单中的标题以及导航栏/侧边栏配置引用。

导航栏/侧边栏配置在上述配置文件中捕获,按语言类型分隔开并单独导出。

每种语言的 markdown 内容必须位于与根配置文件中 locale 键同名的目录位置。也就是:

js
{
+  ...
+  themeConfig: {
+    locales: {
+      "/": {
+        selectLanguageName: "English (US)",
+        sidebar: sidebar.en,
+        navbar: navbar.en
+      },
+      "/pt-BR/": {
+        selectLanguageName: "Brazilian Portuguese",
+        sidebar: sidebar.pt_br,
+        navbar: navbar.pt_br
+      }
+    }
+  }
+}

/pt-BR/ 将要求 markdown 文件的同一集合位于 docs/pt-BR/ 目录下,如下所示:

shell
docs
+├─ README.md
+├─ foo.md
+├─ nested
+  └─ README.md
+└─ pt-BR
+   ├─ README.md
+   ├─ foo.md
+   └─ nested
+      └─ README.md

请查看 Vuepress i18n 国际化官方文档 了解更多详情。

+ + + + \ No newline at end of file diff --git a/zh-hans/contribute/first-party-plugins.html b/zh-hans/contribute/first-party-plugins.html new file mode 100644 index 00000000..2201c74d --- /dev/null +++ b/zh-hans/contribute/first-party-plugins.html @@ -0,0 +1,24 @@ + + + + + + 官方插件 | asdf + + + + + + + + + + + + + +
Skip to content

官方插件

asdf 核心团队已经开发了一些与他们日常工作相关的插件。随时欢迎大家维护和改进这些插件。这些插件所对应的存储库链接如下所示:

对于社区插件,请参考:

+ + + + \ No newline at end of file diff --git a/zh-hans/contribute/github-actions.html b/zh-hans/contribute/github-actions.html new file mode 100644 index 00000000..d580d68c --- /dev/null +++ b/zh-hans/contribute/github-actions.html @@ -0,0 +1,24 @@ + + + + + + GitHub Actions | asdf + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/zh-hans/guide/getting-started.html b/zh-hans/guide/getting-started.html new file mode 100644 index 00000000..169019f9 --- /dev/null +++ b/zh-hans/guide/getting-started.html @@ -0,0 +1,36 @@ + + + + + + 快速入门 | asdf + + + + + + + + + + + + + +
Skip to content

快速入门

asdf 安装过程包括:

  1. 安装依赖
  2. 下载 asdf 核心
  3. 安装 asdf
  4. 为每一个你想要管理的工具/运行环境安装插件
  5. 安装工具/运行环境的一个版本
  6. 通过 .tool-versions 配置文件设置全局和项目版本

1. 安装依赖

asdf primarily requires git & curl. Here is a non-exhaustive list of commands to run for your package manager (some might automatically install these tools in later steps).

OSPackage ManagerCommand
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

Note

sudo may be required depending on your system configuration.

2. 下载 asdf

Official Download

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1

Community Supported Download Methods

We highly recommend using the official git method.

MethodCommand
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper

3. 安装 asdf

根据 Shell 脚本、操作系统和安装方法的组合不同,相应的配置也会不同。展开以下与你的系统最匹配的选项:

Bash & Git

~/.bashrc 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.sh"

补全功能必须在 .bashrc 文件中加入以下内容来配置完成:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

如果你正在使用 macOS Catalina 或者更新的版本, 默认的 shell 已经被修改为 ZSH。除非修改回 Bash, 否则请遵循 ZSH 的说明。

~/.bash_profile 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.sh"

补全功能必须在 .bash_profile 文件中使用以下内容手动配置完成:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

使用以下命令将 asdf.sh 加入到 ~/.bashrc 文件中:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.bashrc

补全功能将需要 按照 Homebrew 的说明完成配置 或者执行以下命令:

shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bashrc
Bash & Homebrew (macOS)

如果你正在使用 macOS Catalina 或者更新的版本, 默认的 shell 已经被修改为 ZSH。除非修改回 Bash, 否则请遵循 ZSH 的说明。

使用以下命令将 asdf.sh 加入到 ~/.bash_profile 文件中:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.bash_profile

补全功能将需要 按照 Homebrew 的说明完成配置 或者执行以下命令:

shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bash_profile
Bash & Pacman

~/.bashrc 文件中加入以下内容:

shell
. /opt/asdf-vm/asdf.sh

为了让补全功能正常工作需要安装 bash-completion

Fish & Git

~/.config/fish/config.fish 文件中加入以下内容:

shell
source ~/.asdf/asdf.fish

补全功能必须按照以下命令手动配置完成:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

使用以下命令将 asdf.fish 加入到 ~/.config/fish/config.fish 文件中:

shell
echo -e "\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

Fish shell 的补全功能可以交给 Homebrew 处理. 很友好!

Fish & Pacman

~/.config/fish/config.fish 文件中加入以下内容:

shell
source /opt/asdf-vm/asdf.fish

补全功能将会在安装过程中由 AUR 包管理器自动配置完成。

Elvish & Git

使用以下命令将 asdf.elv 加入到 ~/.config/elvish/rc.elv 文件中:

shell
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

补全功能将会自动配置。

Elvish & Homebrew

使用以下命令将 asdf.elv 加入到 ~/.config/elvish/rc.elv 文件中:

shell
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

补全功能将会自动配置。

Elvish & Pacman

使用以下命令将 asdf.elv 加入到 ~/.config/elvish/rc.elv 文件中:

shell
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv

补全功能将会自动配置。

ZSH & Git

~/.zshrc 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.sh"

或者 使用 ZSH 框架插件,比如 asdf for oh-my-zsh 将会使脚本生效并安装补全功能。

补全功能会被 ZSH 框架 asdf 插件或者通过在 .zshrc 文件中加入以下内容自动配置:

shell
# append completions to fpath
+fpath=(${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • 如果你正在使用自定义的 compinit 配置,请确保 compinitasdf.sh 生效位置的下方
  • 如果你正在使用自定义的 compinit 配置和 ZSH 框架,请确保 compinit 在框架生效位置的下方

警告

如果你正在使用 ZSH 框架,有关的 asdf 插件或许需要更新才能通过 fpath 正确地使用最新的 ZSH 补全功能。Oh-My-ZSH asdf 插件还在更新中,请查看 ohmyzsh/ohmyzsh#8837 了解更多。

ZSH & Homebrew

使用以下命令将 asdf.sh 加入到 ~/.zshrc 文件中:

shell
echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc

或者 使用 ZSH 框架插件,比如 asdf for oh-my-zsh 将会使脚本生效并安装补全功能。

补全功能可以被 ZSH 框架 asdf 或者 按照 Homebrew 的指引 完成配置。如果你正在使用 ZSH 框架,有关的 asdf 插件或许需要更新才能通过 fpath 正确地使用最新的 ZSH 补全功能。Oh-My-ZSH asdf 插件还在更新中,请查看 ohmyzsh/ohmyzsh#8837 了解更多。

ZSH & Pacman

~/.zshrc 文件中加入以下内容:

shell
. /opt/asdf-vm/asdf.sh

补全功能会被放在一个对 ZSH 很友好的位置,但是 ZSH 必须使用自动补全完成配置

PowerShell Core & Git

~/.config/powershell/profile.ps1 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

使用以下命令将 asdf.ps1 加入到 ~/.config/powershell/profile.ps1 文件中:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.ps1\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

~/.config/powershell/profile.ps1 文件中加入以下内容:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

使用以下命令将 asdf.nu 加入到 ~/.config/nushell/config.nu 文件中:

shell
"\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

补全功能将会自动配置。

Nushell & Homebrew

使用以下命令将 asdf.nu 加入到 ~/.config/nushell/config.nu 文件中:

shell
"\n$env.ASDF_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\n source " +  (brew --prefix asdf | str trim | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path

补全功能将会自动配置。

Nushell & Pacman

使用以下命令将 asdf.nu 加入到 ~/.config/nushell/config.nu 文件中:

shell
"\n$env.ASDF_DIR = '/opt/asdf-vm/'\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

补全功能将会自动配置。

POSIX Shell & Git

~/.profile 文件中加入以下内容:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

使用以下命令将 asdf.sh 加入到 ~/.profile 文件中:

shell
echo -e "\nexport ASDF_DIR=\"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
+echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
POSIX Shell & Pacman

~/.profile 文件中加入以下内容:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

asdf 脚本需要在设置好的 $PATH 之后和已经生效的框架(比如 oh-my-zsh 等等)之后的位置生效。

通常打开一个新的终端标签页来重启你的 shell 让 PATH 更改即时生效。

核心安装完成!

这样就完成了 asdf 核心的安装 🎉

asdf 仅在你安装插件工具和管理它们的版本时才开始真正发挥作用。请继续阅读下面的指南来了解这些是如何做到的。

4. 安装插件

出于演示目的,我们将通过 asdf-nodejs 插件来安装和设置 Node.js

插件依赖

每个插件都有依赖,所以我们需要确认应该列举了这些依赖的插件源码。对于 asdf-nodejs 来说,它们是:

操作系统安装依赖
Linux (Debian)apt-get install dirmngr gpg curl gawk
macOSbrew install gpg gawk

我们应该提前安装这些依赖,因为有些插件有 post-install 钩子。

安装插件

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. 安装指定版本

现在我们已经有了 Node.js 插件,所以我们可以开始安装某个版本了。

我们通过 asdf list all nodejs 可以看到所有可用的版本或者通过 asdf list all nodejs 14 查看版本子集。

我们将只安装最新可用的 latest 版本:

shell
asdf install nodejs latest

注意

asdf 强制使用准确的版本。latest 是一个通过 asdf 来解析到执行时刻的实际版本号的辅助工具。

6. 设置默认版本

asdf 在从当前工作目录一直到 $HOME 目录的所有 .tool-versions 文件中进行工具的版本查找。查找在执行 asdf 管理的工具时实时发生。

警告

如果没有为工具找到指定的版本,则会出现错误asdf current 将显示当前目录中的工具和版本解析结果,或者不存在,以便你可以观察哪些工具将无法执行。

全局

全局默认配置在 $HOME/.tool-versions 文件中进行管理。使用以下命令可以设置一个全局版本:

shell
asdf global nodejs latest

$HOME/.tool-versions 文件内容将会如下所示:

nodejs 16.5.0

某些操作系统已经有一些由系统而非 asdf 安装和管理的工具了,python 就是一个常见的例子。你需要告诉 asdf 将管理权还给系统。版本参考部分 将会引导你。

本地

本地版本被定义在 $PWD/.tool-versions 文件中(当前工作目录)。通常,这将会是一个项目的 Git 存储库。当在你想要的目录执行:

shell
asdf local nodejs latest

$PWD/.tool-versions 文件内容将会如下所示:

nodejs 16.5.0

使用现有工具版本文件

asdf 支持从其他版本管理器的现有版本文件中迁移过来,比如 rbenv.ruby-version 文件。这在每个插件中都原生支持。

asdf-nodejs 支持从 .nvmrc.node-version 文件进行迁移。为了启用此功能,请在 asdf 配置文件 $HOME/.asdfrc 中加入以下内容:

legacy_version_file = yes

请查看 配置 参考页面可以了解更多配置选项。

完成指南!

恭喜你完成了 asdf 的快速上手 🎉 你现在可以管理你的项目的 nodejs 版本了。对于项目中的其他工具类型可以执行类似步骤即可!

asdf 还有更多命令需要熟悉,你可以通过运行 asdf --help 或者 asdf 来查看它们。命令主要分为三类:

+ + + + \ No newline at end of file diff --git a/zh-hans/guide/introduction.html b/zh-hans/guide/introduction.html new file mode 100644 index 00000000..ab68d21e --- /dev/null +++ b/zh-hans/guide/introduction.html @@ -0,0 +1,24 @@ + + + + + + 项目简介 | asdf + + + + + + + + + + + + + +
Skip to content

项目简介

asdf 是一个工具版本管理器。所有的工具版本定义都包含在一个文件(.tool-versions)中,你可以将配置文件放在项目的 Git 存储库中以便于和团队其他成员共享,从而确保每个人都使用完全相同的工具版本。

传统工作方式需要多个命令行版本管理器,而且每个管理器都有其不同的 API、配置文件和实现方式(比如,$PATH 操作、垫片、环境变量等等)。asdf 提供单个交互方式和配置文件来简化开发工作流程,并可通过简单的插件接口扩展到所有工具和运行环境。

它是如何工作的

一旦 asdf 核心在 Shell 配置中设置好之后,你可以安装插件来管理特定的工具。当通过插件安装工具时,安装的可执行程序会为每个可执行程序创建 垫片。当你尝试运行其中一个可执行程序时,将运行垫片,从而允许 asdf 识别 .tool-versions 文件中设置的工具版本并执行该版本。

相关项目

nvm / n / rbenv 等

nvm, nrbenv 等工具都是用 Shell 脚本写的,这些脚本能为工具安装的可执行程序创建垫片。

asdf 非常相似,目的是在工具/运行环境版本管理领域竞争。asdf 的区别之处在于它的插件系统,它消除了每个工具/运行环境对管理工具的需求、每个管理工具的不同命令以及存储库中不同的*-版本文件。

direnv

使用可以根据当前目录加载和卸载环境变量的新功能增强现有 shell。

asdf 不管理环境变量,但是有一个插件 asdf-direnv 可以用来集成 direnv 的特性到 asdf 中。

请查看 direnv 文档 了解更多。

Homebrew

macOS(或者 Linux)上缺失包的管理器

Homebrew 管理你的软件包及其上游依赖。asdf 不管理上游依赖,它不是包管理器。这个责任取决于用户,尽管我们试图保持依赖关系列表很小。

请查看 Homebrew 文档 了解更多。

NixOS

Nix 是一种采用独特方法进行软件包管理和系统配置的工具

NixOS 旨在通过管理每个工具的整个依赖关系树中软件包的确切版本来构建真正可重复的环境,有些是 asdf 无法做到的。NixOS 使用自己的编程语言、许多命令行工具和超过 60,000 个包的包集合来实现这一点。

同样,asdf 不管理上游依赖,并且它不是一个包管理器。

请查看 NixOS 文档 了解更多。

为什么使用 asdf?

asdf 确保团队可以使用完全相同的工具版本,通过插件系统支持很多工具,以及作为 Shell 配置中包含的单个 Shell 脚本的 简单性和熟悉性

注意

asdf 并不打算成为一个系统包管理器。它是一个工具版本管理器。仅仅因为你可以为任何工具创建插件并使用 asdf 管理其版本,并不意味着这是这个特定工具的最佳实践方案。

+ + + + \ No newline at end of file diff --git a/zh-hans/index.html b/zh-hans/index.html new file mode 100644 index 00000000..2101bb26 --- /dev/null +++ b/zh-hans/index.html @@ -0,0 +1,24 @@ + + + + + + asdf + + + + + + + + + + + + + +
Skip to content

asdf

多运行时版本管理器

使用一个工具管理所有运行时版本!

+ + + + \ No newline at end of file diff --git a/zh-hans/manage/commands.html b/zh-hans/manage/commands.html new file mode 100644 index 00000000..621cca02 --- /dev/null +++ b/zh-hans/manage/commands.html @@ -0,0 +1,89 @@ + + + + + + 所有命令 | asdf + + + + + + + + + + + + + +
Skip to content

所有命令

asdf 中所有可用命令的列表。这个列表就是 asdf help 命令的打印内容。

txt
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>]      Add a plugin from the plugin repo OR,
+                                        add a Git repo as a plugin by
+                                        specifying the name and repo url
+asdf plugin list [--urls] [--refs]      List installed plugins. Optionally show
+                                        git urls and git-ref
+asdf plugin list all                    List plugins registered on asdf-plugins
+                                        repository with URLs
+asdf plugin remove <name>               Remove plugin and package versions
+asdf plugin update <name> [<git-ref>]   Update a plugin to latest commit on
+                                        default branch or a particular git-ref
+asdf plugin update --all                Update all plugins to latest commit on
+                                        default branch
+
+
+MANAGE PACKAGES
+asdf current                            Display current version set or being
+                                        used for all packages
+asdf current <name>                     Display current version set or being
+                                        used for package
+asdf global <name> <version>            Set the package global version
+asdf global <name> latest[:<version>]   Set the package global version to the
+                                        latest provided version
+asdf help <name> [<version>]            Output documentation for plugin and tool
+asdf install                            Install all the package versions listed
+                                        in the .tool-versions file
+asdf install <name>                     Install one tool at the version
+                                        specified in the .tool-versions file
+asdf install <name> <version>           Install a specific version of a package
+asdf install <name> latest[:<version>]  Install the latest stable version of a
+                                        package, or with optional version,
+                                        install the latest stable version that
+                                        begins with the given string
+asdf latest <name> [<version>]          Show latest stable version of a package
+asdf latest --all                       Show latest stable version of all the
+                                        packages and if they are installed
+asdf list <name> [version]              List installed versions of a package and
+                                        optionally filter the versions
+asdf list all <name> [<version>]        List all versions of a package and
+                                        optionally filter the returned versions
+asdf local <name> <version>             Set the package local version
+asdf local <name> latest[:<version>]    Set the package local version to the
+                                        latest provided version
+asdf shell <name> <version>             Set the package version to
+                                        `ASDF_${LANG}_VERSION` in the current shell
+asdf uninstall <name> <version>         Remove a specific version of a package
+asdf where <name> [<version>]           Display install path for an installed
+                                        or current version
+asdf which <command>                    Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...]           Executes the command shim for current version
+asdf env <command> [util]               Runs util (default: `env`) inside the
+                                        environment used for command shim execution.
+asdf info                               Print OS, Shell and ASDF debug information.
+asdf version                            Print the currently installed version of ASDF
+asdf reshim <name> <version>            Recreate shims for version of a package
+asdf shim-versions <command>            List the plugins and versions that
+                                        provide a command
+asdf update                             Update asdf to the latest stable release
+asdf update --head                      Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs:   https://asdf-vm.com
+ + + + \ No newline at end of file diff --git a/zh-hans/manage/configuration.html b/zh-hans/manage/configuration.html new file mode 100644 index 00000000..027f552d --- /dev/null +++ b/zh-hans/manage/configuration.html @@ -0,0 +1,32 @@ + + + + + + 配置 | asdf + + + + + + + + + + + + + +
Skip to content

配置

asdf 配置既包括可共享的 .tool-versions 文件,也包括用户特定的自定义 .asdfrc 和环境变量。

.tool-versions

无论何时 .tool-versions 出现在目录中,它所声明的工具版本将会被用于该目录和任意子目录。

注意

全局默认配置将设置在文件$HOME/.tool-versions

一个 .tool-versions 文件示例如下所示:

ruby 2.5.3
+nodejs 10.15.0

你也可以包含注释在里面:

ruby 2.5.3 # 这是一个注释
+# 这是另一个注释
+nodejs 10.15.0

版本号可以有如下格式:

  • 10.15.0 - 实际的版本号。支持下载二进制文件的插件将会下载二进制文件。
  • ref:v1.0.2-a 或者 ref:39cb398vb39 - 指定标签/提交/分支从 github 下载并编译。
  • path:~/src/elixir - 要使用的工具的自定义编译版本的路径。这种方式供语言开发者等使用。
  • system - 此关键字会导致 asdf 传递系统上未由 asdf 管理的工具版本。

提示

多版本可以通过空格将它们分隔开来。比如,使用 Python 3.7.2 回退到 Python 2.7.15 最后回退到 system Python,可以将以下行的内容添加到 .tool-versions 文件中。

python 3.7.2 2.7.15 system

为了安装 .tool-versions 文件中定义的所有工具,在包含 .tool-versions 文件的目录中不带其他参数执行 asdf install 命令。

为了安装 .tool-versions 文件中定义的某个工具,在包含 .tool-versions 文件的目录中运行 asdf install <name> 命令。这个工具将会安装 .tool-versions 文件所指定的版本。

可以直接编辑这个文件或者使用 asdf local (或者 asdf global)来更新工具版本。

$HOME/.asdfrc

给你的家目录添加一个 .asdfrc 文件然后 asdf 将会使用这个文件所指定的配置。下面的文件展示了所需的格式,其中包含用于演示的默认值:

txt
legacy_version_file = no
+use_release_candidates = no
+always_keep_download = no
+plugin_repository_last_check_duration = 60
+disable_plugin_short_name_repository = no
+concurrency = auto

legacy_version_file

插件 支持 读取其他版本管理器使用的版本文件,比如,Ruby 的 rbenv.ruby-version 文件。

选项描述
no 默认.tool-versions 文件读取版本
yes如果可行的话,从传统版本文件读取版本(.ruby-versions

use_release_candidates

配置 asdf update 命令以升级到最新的候选版本,而不是最新的语义版本。

选项描述
no 默认语义版本被使用
yes候选版本被使用

always_keep_download

配置 asdf install 命令以保留或删除下载的源代码或二进制文件。

选项描述
no 默认在成功安装后删除源代码或二进制文件
yes在成功安装后保留源代码或二进制文件

plugin_repository_last_check_duration

配置自上次 asdf 插件存储库同步到下一次存储库同步的持续时间。命令 asdf plugin add <name> 或者 asdf plugin list all 将会触发持续时间的检查,如果持续时间已过,则进行同步。

选项描述
1999999999 的数字
默认60
如果已过自上次同步的持续时间,触发器事件发生时同步
0每个触发器事件发生时同步
never从不同步

环境变量

  • ASDF_CONFIG_FILE - 如上所述默认为 ~/.asdfrc 文件。可以被设置在任何位置。
  • ASDF_DEFAULT_TOOL_VERSIONS_FILENAME - 存储工具名称和版本的文件名。默认为 .tool-versions。可以是任何有效的文件名。通常,除非你知道你希望 asdf 忽略 .tool-versions 文件,否则不应该覆盖默认值。
  • ASDF_DIR - 默认为 ~/.asdf - asdf 脚本的位置。如果你把 asdf 安装到了其他目录,请设置该变量到那个目录。比如,如果通过 AUR 进行安装,则应设置该变量为 /opt/asdf-vm
  • ASDF_DATA_DIR - 默认为 ~/.asdf - asdf 安装插件、垫片和安装器的位置。可以被设置在上一节提到的生效 asdf.sh 或者 asdf.fish 之间的任何位置。对于 Elvish,这可以设置在 use asdf 上面。

内部配置

用户不必担心本节,因为它描述了对包管理器和集成者有用的 asdf 的内部配置。

  • $ASDF_DIR/asdf_updates_disabled:当此文件存在时(内容无关),通过 asdf update 命令进行的更新 将会被禁用。像 Pacman 或者 Homebrew 等包管理器使用它来确保个性化安装的正确的更新方法。
+ + + + \ No newline at end of file diff --git a/zh-hans/manage/core.html b/zh-hans/manage/core.html new file mode 100644 index 00000000..7a4c1fd0 --- /dev/null +++ b/zh-hans/manage/core.html @@ -0,0 +1,41 @@ + + + + + + 核心 | asdf + + + + + + + + + + + + + +
Skip to content

核心

核心 asdf 命令列表很小,但可以促进很多工作流。

安装和配置

请查看 快速上手 了解更多详情。

Exec

shell
asdf exec <command> [args...]

执行当前版本的命令垫片。

Env

shell
asdf env <command> [util]

Info

shell
asdf info

用于打印操作系统、Shell 和 asdf 调试信息的辅助命令。在报告 bug 时需要共享这些信息。

Reshim

shell
asdf reshim <name> <version>

这将为某个包的当前版本重新创建垫片。默认情况下,垫片是在某个工具安装的过程中由插件创建。一些工具像 npm 命令行 允许全局安装可执行程序,比如使用 npm install -g yarn 命令安装 Yarn。因为这个可执行程序不是通过插件生命周期安装的,所以还没有对应的垫片存在。asdf reshim nodejs <version> 命令将会强制重新计算任何新可执行程序的垫片,类似 nodejsversions 版本下的 yarn

Shim-versions

shell
asdf shim-versions <command>

列举为命令提供垫片的插件和版本。

例如,Node.js 附带了两个可执行程序,nodenpm。当使用 asdf-nodejs插件安装了这些工具的很多版本时,执行shim-versions` 命令会返回:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

更新

asdf 有一个依赖于 Git (我们推荐的安装方法)的内置命令用于更新。如果你使用了其他方法安装,则应按照该方法的步骤操作:

方法最新稳定版本master 分支上的最新提交
asdf (Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
Pacman下载一个新的 PKGBUILD 并且重新编译
或者使用你习惯的 AUR helper

卸载

根据以下步骤卸载 asdf

Bash & Git
  1. ~/.bashrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. ~/.bash_profile 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. ~/.bashrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

补全功能可能已经如 Homebrew 的指南 那样配置了,因此请按照他们的指南找出要删除的内容。

  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

如果你正在使用 macOS Catalina 以及更新版本,默认的 shell 已经变成了 ZSH。如果你在 ~/.bash_profile 文件中找不到任何配置,则可能位于 ~/.zshrc 中。在这种情况下,请按照 ZSH 指南进行操作。

  1. ~/.bash_profile 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

补全功能可能已经如 Homebrew 的指南 那样配置了,因此请按照他们的指南找出要删除的内容。

  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. ~/.bashrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. /opt/asdf-vm/asdf.sh
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. ~/.config/fish/config.fish 配置文件中移除生效 asdf.fish 的行:
shell
source ~/.asdf/asdf.fish

以及使用以下命令移除补全功能:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. ~/.config/fish/config.fish 配置文件中移除生效 asdf.fish 的行:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. ~/.config/fish/config.fish 配置文件中移除生效 asdf.fish 的行:
shell
source /opt/asdf-vm/asdf.fish
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. ~/.config/elvish/rc.elv 配置文件中移除使用 asdf 模块的行:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

以及使用以下命令卸载 asdf 模块:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 移除 $HOME/.asdf 目录:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. ~/.config/elvish/rc.elv 配置文件中移除使用 asdf 模块的行:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

以及使用以下命令卸载 asdf 模块:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. ~/.config/elvish/rc.elv 配置文件中移除使用 asdf 模块的行:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

以及使用以下命令卸载 asdf 模块:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. ~/.zshrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

或者 ZSH 框架插件(如果用了的话)

  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. ~/.zshrc 配置文件中移除生效 asdf.sh 的行:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. 用包管理器卸载:
shell
brew uninstall asdf --force && brew autoremove
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. ~/.zshrc 配置文件中移除生效 asdf.sh 的行:
shell
. /opt/asdf-vm/asdf.sh
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"

恭喜你完成了 🎉

+ + + + \ No newline at end of file diff --git a/zh-hans/manage/plugins.html b/zh-hans/manage/plugins.html new file mode 100644 index 00000000..6b6878d5 --- /dev/null +++ b/zh-hans/manage/plugins.html @@ -0,0 +1,34 @@ + + + + + + 插件 | asdf + + + + + + + + + + + + + +
Skip to content

插件

插件告诉 asdf 如何处理不同的工具,如 Node.js、 Ruby、 Elixir 等。

请参考 创建插件 了解用于支持更多工具的插件 API。

添加

通过 Git URL 地址添加插件:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

或者通过插件存储库中的缩写添加插件:

shell
asdf plugin add <name>
+# asdf plugin add erlang

建议

推荐独立于缩写存储库的、更长的 git-url 方法。

列举已安装

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

列举缩写存储库中的所有插件

shell
asdf plugin list all

请参考 插件缩写索引 了解插件的完整缩写列表。

更新

shell
asdf plugin update --all

如果你想要更新特定的包,如下所示。

shell
asdf plugin update <name>
+# asdf plugin update erlang

这种更新方式将会获取插件存储库的 源代码默认分支最新提交。版本化的插件和更新正在开发中 (#916)。

移除

bash
asdf plugin remove <name>
+# asdf plugin remove erlang

移除一个插件将会移除该插件安装的所有工具。这可以当作是清理/修剪工具的许多未使用版本的简单方法。

同步缩写存储库

缩写存储库将同步到你的本地计算机并定期刷新。这个周期由以下方法确定:

  • 命令 asdf plugin add <name> 或者 asdf plugin list all 将会触发同步
  • 如果在过去的 X 分钟内没有同步,则进行同步
  • X 默认是 60,但可以通过在 .asdfrc 文件中配置 plugin_repository_last_check_duration 选项来进行配置。请查看 asdf 配置文档 了解更多。
+ + + + \ No newline at end of file diff --git a/zh-hans/manage/versions.html b/zh-hans/manage/versions.html new file mode 100644 index 00000000..89c26cc5 --- /dev/null +++ b/zh-hans/manage/versions.html @@ -0,0 +1,53 @@ + + + + + + 版本 | asdf + + + + + + + + + + + + + +
Skip to content

版本

安装版本

shell
asdf install <name> <version>
+# asdf install erlang 17.3

如果一个插件支持从源代码下载和编译,你可以指定 ref:foo,其中 foo 是特定的分支、标签或者提交。卸载该版本时,你也需要使用相同的名称和引用。

安装最新稳定版本

shell
asdf install <name> latest
+# asdf install erlang latest

安装给定字符串开头的最新稳定版本。

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

列举已安装版本

shell
asdf list <name>
+# asdf list erlang

筛选出以给定字符串开头的版本。

shell
asdf list <name> <version>
+# asdf list erlang 17

列举所有可用版本

shell
asdf list all <name>
+# asdf list all erlang

筛选出以给定字符串开头的版本。

shell
asdf list all <name> <version>
+# asdf list all erlang 17

显示最新稳定版本

shell
asdf latest <name>
+# asdf latest erlang

显示以给定字符串开头的最新稳定版本。

shell
asdf latest <name> <version>
+# asdf latest erlang 17

设置当前版本

shell
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest

global 将版本写到 $HOME/.tool-versions 文件中。

shell 仅为当前 shell 会话将版本设置为一个名为 ASDF_${LANG}_VERSION 的环境变量。

local 将版本写到 $PWD/.tool-versions 文件中,如果有需要也会创建此文件。

请查看 配置部分.tool-versions 文件了解更多详情。

可选

如果你只是想为当前 shell 会话或者在特定工具版本下执行一条命令,你可以设置一个类似 ASDF_${TOOL}_VERSION 的环境变量。

下面的示例在版本为 1.4.0 的 Elixir 项目上运行测试。 版本格式与 .tool-versions 文件支持的版本格式相同。

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

回退到系统版本

要使用工具 <name> 的系统版本而非 asdf 管理版本,你可以将工具的版本设置为 system

使用 globallocal 或者 shell 设置系统,如上面的 设置当前版本 部分所述。

shell
asdf local <name> system
+# asdf local python system

显示当前版本

shell
asdf current
+# asdf current
+# erlang 17.3 (set by /Users/kim/.tool-versions)
+# nodejs 6.11.5 (set by /Users/kim/cool-node-project/.tool-versions)
+
+asdf current <name>
+# asdf current erlang
+# 17.3 (set by /Users/kim/.tool-versions)

卸载版本

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

垫片(Shims)

当 asdf 安装一个包时,它会在 $ASDF_DATA_DIR/shims 目录(默认为 ~/.asdf/shims)中为该包中的每个可执行程序创建垫片。这个位于 $PATH 中(通过 asdf.shasdf.fish 等等实现)的目录是已安装程序在环境中可用的方式。

垫片本身是非常简单的包装器,它 exec (执行)一个辅助程序 asdf exec,向其传递插件的名称和垫片正在包装的已安装包中的可执行程序的路径。

asdf exec 辅助程序确定要使用的软件包版本(比如在 .tool-versions 文件中指定,通过 asdf local ... 或者 asdf global ... 命令选择)、软件包安装目录中的可执行程序的最终路径(这可以在插件中通过 exec-path 回调来操作)以及要在其中执行的环境(也由插件 - exec-env 脚本提供),最后完成执行。

注意

因为此系统使用 exec 调用,所以软件包中的任何脚本如果要由 shell 生效而不是执行的脚本都需要直接访问,而不是通过垫片包装器进行访问。两个 asdf 命令:whichwhere 可以通过返回已安装软件包的路径来帮助解决这个问题。

shell
# 返回当前版本中主要可执行程序的路径
+source $(asdf which ${PLUGIN})/../script.sh
+
+# 返回软件包安装目录的路径
+source $(asdf where ${PLUGIN} $(asdf current ${PLUGIN}))/bin/script.sh

绕过 asdf 垫片

如果由于某种原因,你希望绕过 asdf 垫片,或者希望在进入项目目录时自动设置环境变量,则 asdf-direnv 插件可能会有所帮助。请务必查看其 README 文件了解更多详情。

+ + + + \ No newline at end of file diff --git a/zh-hans/more/community-projects.html b/zh-hans/more/community-projects.html new file mode 100644 index 00000000..e61ce4b5 --- /dev/null +++ b/zh-hans/more/community-projects.html @@ -0,0 +1,24 @@ + + + + + + Community Projects | asdf + + + + + + + + + + + + + +
Skip to content

Community Projects

Here are some community projects related to asdf:

Note

asdf core do not own these projects or their code. asdf core are not responsible for the quality or security as they relate to those listed here.

+ + + + \ No newline at end of file diff --git a/zh-hans/more/faq.html b/zh-hans/more/faq.html new file mode 100644 index 00000000..146e6469 --- /dev/null +++ b/zh-hans/more/faq.html @@ -0,0 +1,24 @@ + + + + + + FAQ | asdf + + + + + + + + + + + + + +
Skip to content

FAQ

以下是 asdf 相关的一些常见问题。

支持 WSL1 吗?

WSL1 (Windows Subsystem for Linux 1) 不受官方支持。asdf 的某些方面可能无法正常工作。我们不打算添加对 WSL1 的官方支持。

支持 WSL2 吗?

WSL2 (Windows Subsystem for Linux 2) 应该作为你选择的 WSL 发行版来使用本设置和依赖说明。

重要的是,只有当前工作目录是 Unix 驱动器而不是绑定的 Windows 驱动器时,WSL2 才能 正常工作。

当 Github Actions 上提供主机运行器支持时,我们打算在 WSL2 上运行测试套件。(Github Actions 目前还未提供 WSL2 支持)

新安装的可执行程序无法运行?

我执行了 npm install -g yarn 命令,但是之后不能运行 yarn 命令。这是为什么?

asdf 使用 垫片 来管理可执行程序。插件所安装的那些命令会自动创建垫片,而通过 asdf 管理工具安装过的可执行程序则需要通知 asdf 创建垫片的需要。在这个例子中,为 Yarn 创建一个垫片即可。请查看 asdf reshim 命令文档 了解更多。

Shell 没有检测到新安装的垫片?

如果 asdf reshim 没有解决你的问题,那么很有可能是在 asdf.sh 或者 asdf.fish 的生效不在你的 Shell 配置文件(.bash_profile.zshrcconfig.fish 等等)的下方。这需要你在设置你的 $PATH 之后和生效你的框架(oh-my-zsh 等等)(如果有的话)之后再生效。

+ + + + \ No newline at end of file diff --git a/zh-hans/more/thanks.html b/zh-hans/more/thanks.html new file mode 100644 index 00000000..04c043c5 --- /dev/null +++ b/zh-hans/more/thanks.html @@ -0,0 +1,24 @@ + + + + + + 致谢 | asdf + + + + + + + + + + + + + +
Skip to content

致谢

asdf 作者和贡献者的感谢页!

作者

我 (@HashNuke),高烧、感冒、咳嗽。

版权 2014 直到时间尽头 (MIT License)

维护者

贡献者

请查看 Github 上的 贡献者名单 🙏 了解更多。

+ + + + \ No newline at end of file diff --git a/zh-hans/plugins/create.html b/zh-hans/plugins/create.html new file mode 100644 index 00000000..31cedff3 --- /dev/null +++ b/zh-hans/plugins/create.html @@ -0,0 +1,58 @@ + + + + + + 创建插件 | asdf + + + + + + + + + + + + + +
Skip to content

创建插件

插件里有什么

插件是一个包含几个可执行脚本的 git 存储库,用于支持对某种语言或工具进行版本控制。这些脚本在执行 list-allinstall 或者 uninstall 命令时被执行。你可以设定或取消设定环境变量,并执行设置工具环境所需的任何操作。

必要的脚本

  • bin/list-all - 列举所有可安装的版本
  • bin/download - 下载指定版本的源代码或二进制文件
  • bin/install - 安装指定版本

环境变量

所有脚本除了 bin/list-all 之外对以下环境变量有权限进行操作:

  • ASDF_INSTALL_TYPE - version 或者 ref
  • ASDF_INSTALL_VERSION - 如果 ASDF_INSTALL_TYPEversion,那么这将是版本号。否则它将传递为 git 的 ref。可能指向存储库的一个标签/提交/分支。
  • ASDF_INSTALL_PATH - 已经 安装到的目录(或 bin/install 脚本执行情况下 应该 安装到的目录)

这些附加的环境变量将可用于 bin/install 脚本:

  • ASDF_CONCURRENCY - 编译源代码时使用的内核数。对于配置 make -j 非常有用。
  • ASDF_DOWNLOAD_PATH - bin/download 脚本下载源代码或二进制文件的路径。

这些附加的环境变量将可用于 bin/download 脚本:

  • ASDF_DOWNLOAD_PATH - 源代码或二进制文件应该下载到的路径。

bin/list-all

必须打印一个带有空格分隔的版本列表的字符串,示例输出如下所示:

shell
1.0.1 1.0.2 1.3.0 1.4

请注意,最新版本应列在最后,以便它看起来更接近用户的提示。这很有帮助,因为 list-all 命令会在自己的行打印每个版本。如果有很多版本,那么早期版本可能会不在屏幕上。

如果从网站上的发布页面拉取版本,建议尽可能不对版本进行排序。通常,版本已经按照正确的顺序排列,或者以相反的顺序排列,在这种情况下,像 tac 这样的东西就足够了。如果必须手动对版本进行排序,则不能依赖 sort -V,因为 OSX 操作系统不支持。一种可以替代的排序功能是 更好的选择

bin/download

此脚本必须下载源代码或者二进制文件到 ASDF_DOWNLOAD_PATH 环境变量包含的路径。如果下载的源代码或者二进制文件是压缩的,则只有未压缩的源代码或二进制文件会放置在 ASDF_DOWNLOAD_PATH 目录中。

下载成功后脚本必须以 0 状态退出。如果下载失败,脚本必须以任何非零退出状态退出。

如果可能,脚本应该仅将文件放在 ASDF_DOWNLOAD_PATH 中。如果下载失败,则不应将任何文件放在目录中。

如果此脚本不存在,asdf 将假设存在 bin/install 脚本,将下载并安装该版本。asdf 仅在没有此脚本的情况下才能支持传统插件。所有插件都必须包含此脚本,最终将删除对传统插件的支持。

bin/install

本脚本应在 ASDF_INSTALL_PATH 中安装版本。默认情况下,asdf 将为 $ASDF_INSTALL_PATH/bin (可以通过可选的 bin/list-bin-paths 脚本自定义)目录中的任意文件创建垫片。

安装成功时,安装脚本应以 0 状态退出。如果安装失败,脚本应以任何非零退出状态退出。

如果可能,脚本应仅在安装脚本认为工具的生成和安装成功后,才将文件放在 ASDF_INSTALL_PATH 目录中。asdf 检查 ASDF_INSTALL_PATH 目录的 扩展 以确认是否安装了该工具版本。如果在安装过程开始时填充了 ASDF_INSTALL_PATH 目录,则在安装过程中在其他终端中运行的其他 asdf 命令可能会认为该工具版本已经安装,即使它还未完全安装。

如果你希望你的插件使用 asdf 0.7._ 及更早版本和 0.8._ 及更高版本,请检查是否存在 ASDF_DOWNLOAD_PATH 环境变量。如果未设置,请在 bin/install 脚本回调时下载源代码。如果设置,则假设 bin/downlaod 脚本已经下载源代码。

可选脚本

bin/help 脚本

这不是一个回调脚本,而是一组回调脚本,每个脚本将打印不同的文档到 STDOUT。下面列出了可能的回调脚本。请注意,bin/help.overview 是一种特殊情况,因为必须存在才能为脚本显示任何帮助输出。

  • bin/help.overview - 此脚本应该输出有关插件和所管理工具的一般描述。不应该打印任何标题,因为 asdf 将打印标题。输出可以是自由格式的文本,但理想情况下只有一个短段落。如果你希望 asdf 为你的插件提供帮助信息,则必须存在此脚本。所有其他的帮助回调脚本都是可选的。
  • bin/help.deps - 此脚本应该输出为操作系统量身定制的依赖项列表。每行一个依赖项。
  • bin/help.config - 此脚本应该打印对插件和工具可能有用的任何必需或可选配置。安装或编译该工具所需的任何环境变量或其他标志(尽可能针对用户的操作系统)。输出可以是自由格式的文本。
  • bin/help.links - 这应该是与插件和工具相关的链接列表(同样,尽可能针对当前操作系统量身定制)。每行一个链接。行的格式可以是 <title>: <link> 或只是 <link>

这些脚本的每一个都应根据当前操作系统调整其输出。例如,在 Ubuntu 上,依赖脚本可以将依赖项输出为必须安装的 apt-get 包。设置变量时,脚本还应该根据设置变量 ASDF_INSTALL_VERSIONASDF_INSTALL_TYPE 的值。它们是可选的,并不总是被设置。

帮助回调脚本不得输出核心 asdf-vm 文档中已涵盖的任何信息。不得出现一般的 asdf 使用信息。

bin/latest-stable

如果实现了此回调,asdf 将使用它来确定工具的最新稳定版本,而不是尝试自行判断。asdf latest 通过查看由 list-all 回调打印的最新版本,在从输出中排除了几种类型的版本(如发布候选版本)之后推断出最新版本。当你的插件的 list-all 回调打印同一工具的不同变体并且最新版本不是你希望默认使用的变体的最新稳定版本时,这种默认行为是不可取的。例如,对于 Ruby,最新的稳定版本应该是 Ruby(MRI)的常规实现,但最后 list-all 回调打印的是 truffleruby 版本。

此回调使用单个 “过滤器” 字符串调用,因为它是唯一的参数。这应该用于过滤所有最新稳定版本。例如对于 Ruby,用户可以选择传入 jruby 以选择 jruby 的最新稳定版本。

bin/list-bin-paths

列举指定工具版本的可执行程序。必须打印一个带有空格分隔的包含可执行文件的目录路径列表的字符串。路径必须相对于传递的安装路径。示例输出如下所示:

shell
bin tools veggies

这将指示 asdf 为 <install-path>/bin<install-path>/tools<install-path>/veggies 中的文件创建垫片。

如果未指定此脚本,asdf 将在安装中查找 bin 目录并为这些脚本创建垫片。

bin/exec-env

设置环境变量以运行包中的二进制文件。

bin/exec-path

获取工具的指定版本的可执行程序路径。必须打印具有相对可执行程序路径的字符串。这允许插件有条件地覆盖垫片指定的可执行程序路径,否则返回垫片指定的默认路径。

shell
用法:
+  plugin/bin/exec-path <install-path> <command> <executable-path>
+
+例子调用:
+  ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"
+
+输出:
+  bin/foox

bin/uninstall

卸载某个工具的指定版本。

bin/list-legacy-filenames

为此插件注册其他设置器文件。必须打印一个带有空格分隔的文件名列表的字符串。

shell
.ruby-version .rvmrc

注意:这仅适用于在 ~/.asdfrc 配置文件中启用了 legacy_version_file 选项的用户。

bin/parse-legacy-file

这可用于进一步解析 asdf 找到的传统文件。如果 parse-legacy-file 未实现,asdf 将会简单读取文件来确定版本。脚本将传递文件路径作为其第一个参数。

bin/post-plugin-add

这可用于在插件添加到 asdf 后运行任何安装后操作。

该脚本可以访问插件的安装路径(${ASDF_PLUGIN_PATH})和源 URL(${ASDF_PLUGIN_SOURCE_URL}),如果有的话。

其他请参考相关钩子:

  • pre_asdf_plugin_add
  • pre_asdf_plugin_add_${plugin_name}
  • post_asdf_plugin_add
  • post_asdf_plugin_add_${plugin_name}

bin/post-plugin-update

这可用于在 asdf 下载更新的插件后运行任何插件更新后操作。

该脚本可以访问插件的安装路径(${ASDF_PLUGIN_PATH})、更新前的 git-ref(${ASDF_PLUGIN_PREV_REF})和更新后的 git-ref(${ASDF_PLUGIN_POST_REF})。

其他请参考相关钩子:

  • pre_asdf_plugin_update
  • pre_asdf_plugin_update_${plugin_name}
  • post_asdf_plugin_update
  • post_asdf_plugin_update_${plugin_name}

bin/pre-plugin-remove

这可用于在从 asdf 中删除插件之前运行任何预删除操作。

该脚本可以访问安装插件的路径(${ASDF_PLUGIN_PATH})。

其他请参考相关钩子:

  • pre_asdf_plugin_remove
  • pre_asdf_plugin_remove_${plugin_name}
  • post_asdf_plugin_remove
  • post_asdf_plugin_remove_${plugin_name}

asdf 命令行的扩展命令

插件可以通过提供 lib/commands/command*.bash 脚本或者可执行程序来定义新的 asdf 命令,这些脚本或可执行程序将使用插件名称作为 asdf 命令的子命令进行调用。

例如,假设一个 foo 插件有以下文件:

shell
foo/
+  lib/commands/
+    command.bash
+    command-bat.bash
+    command-bat-man.bash
+    command-help.bash

用户现在可以执行:

shell
$ asdf foo         # 等同于运行 `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash`
+$ asdf foo bar     # 等同于运行 `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar`
+$ asdf foo help    # 等同于运行 `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash`
+$ asdf foo bat man # 等同于运行 `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash`
+$ asdf foo bat baz # 等同于运行 `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz`

插件作者可以使用此功能来提供与其工具相关的实用命令,或者可以创建 asdf 本身的新命令扩展的插件。

调用时,如果扩展命令未设置其可执行位,则它们将作为 bash 脚本获取,且具有来自 $ASDF_DIR/lib/utils.bash 的所有可用功能。 此外,$ASDF_CMD_FILE 解析所获取文件的完整路径。 如果设置了可执行位,则只是执行它们并替换 asdf 执行。

这个功能的一个很好的例子是像 haxe 这样的插件。 它提供了 asdf haxe neko-dylibs-link 来修复 haxe 可执行文件期望找到相对于可执行目录的动态链接库的问题。

如果你的插件提供了 asdf 扩展命令,请务必在插件的 README 文件中提及。

自定义垫片模板

请仅在真的需要时才使用此功能

asdf 允许自定义垫片模板。对于名为 foo 的可执行程序,如果有一个 shims/foo 的文件在插件中,那么 asdf 将复制这个文件替代使用标准垫片模板。

必须明智地使用这一点。对于目前的 AFAIK,它仅仅被使用在了 Elixir 插件中,因为一个可执行程序除了是可执行程序文件之外,还被读作为 Elixir 文件,这使得无法使用标准的 bash 垫片。

测试插件

asdf 包含 plugin-test 命令用于测试插件。你可以像下面这样使用它:

shell
asdf plugin test <plugin-name> <plugin-url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git-ref>] [test-command*]

只有前两个参数是必须的。 如果指定了 _version,则该工具将随指定版本一起安装。默认返回为 asdf latest <plugin-name>。 如果指定了 git-ref,则插件将检查提交/分支/标签。这对于在该插件的 CI 上测试拉取请求非常有用。默认值是插件仓库的默认分支。

剩下的参数被视为要执行的命令,以确保安装的工具正常工作。通常情况下,它需要带 --version 或者 --help。例如,要测试 NodeJS 插件,我们可以运行:

shell
asdf plugin test nodejs https://github.com/asdf-vm/asdf-nodejs.git node --version

我们强烈建议你在 CI 环境中测试你的插件,并确保它可以在 Linux 和 OSX 上运行。

GitHub Action 示例

asdf-vm/actions 存储库为托管在 github 的项目提供了使用 Github Action 来测试插件的可能。

yaml
steps:
+  - name: asdf_plugin_test
+    uses: asdf-vm/actions/plugin-test@v1
+    with:
+      command: "my_tool --version"
+    env:
+      GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} # 自动提供

TravisCI 配置示例

这是一个 .travis.yml 示例文件,请根据你的需要进行自定义:

yaml
language: c
+script: asdf plugin test nodejs $TRAVIS_BUILD_DIR 'node --version'
+before_script:
+  - git clone https://github.com/asdf-vm/asdf.git asdf
+  - . asdf/asdf.sh
+os:
+  - linux
+  - osx

注意: 当使用其他 CI 时,你将需要确认哪些变量映射到存储库路径。

你还可以选择将相对路径传递给 plugin-test

例如,如果在存储库目录中运行测试脚本:asdf plugin test nodejs . 'node --version'

GitHub API 频率限制

如果你的插件的 list-all 依赖于访问 GitHub API,请确保在访问时提供授权令牌,否则你的测试可能会因频率限制而失败。

为此,创建一个仅具有 public_repo 权限的 新个人令牌

然后,在 travis.ci 构建设置中添加一个名为 GITHUB_API_TOKEN安全 环境变量。并且 绝对不要 在你的代码中公布你的 token。

最后,添加如下内容到 bin/list-all

shell
cmd="curl -s"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"

向官方插件存储库提交插件

asdf 可以通过指定插件存储库 url 轻松安装插件,比如 plugin add my-plugin https://github.com/user/asdf-my-plugin.git

为了使你的用户更轻松,你可以将插件添加到官方插件存储库中,以列出你的插件并使用较短的命令轻松安装,比如 asdf plugin add my-plugin

请查看插件存储库 asdf-vm/asdf-plugins 中的说明了解更多。

+ + + + \ No newline at end of file

asdf