From b970a83201a1f5b5cbf894520fbff237237a64ce Mon Sep 17 00:00:00 2001 From: crazywhalecc Date: Sun, 31 Aug 2025 05:45:13 +0000 Subject: [PATCH] deploy: 0c9130ab6caf72c292b24ce9dd7276b353fe9874 --- 404.html | 8 +- assets/{app.DQMp3l4I.js => app.C9FYtCRt.js} | 2 +- assets/chunks/CliGenerator.CXyXM4cX.js | 12 +++ assets/chunks/CliGenerator.u1Ew-M_q.js | 12 --- assets/chunks/SearchTable.Cw3TiMBP.js | 1 - assets/chunks/SearchTable.Dddvtmwz.js | 1 + assets/chunks/VPAlgoliaSearchBox.nRDYEdJs.js | 80 +++++++++++++++++++ assets/chunks/framework.Bhsyh9kO.js | 19 +++++ assets/chunks/framework.PeLcR_tw.js | 18 ----- assets/chunks/theme.DbVD3jYa.js | 1 - assets/chunks/theme.MOrVMOSc.js | 2 + assets/deps-craft-yml.md.DWPKeuXi.lean.js | 1 - ...KeuXi.js => deps-craft-yml.md.DqNYV3B0.js} | 4 +- assets/deps-craft-yml.md.DqNYV3B0.lean.js | 1 + assets/deps-map-ext.md.B9knsysL.js | 1 - assets/deps-map-ext.md.B9knsysL.lean.js | 1 - assets/deps-map-ext.md.BVAR3McO.js | 1 + assets/deps-map-ext.md.BVAR3McO.lean.js | 1 + assets/deps-map-lib.md.BnsDnV_s.js | 1 + assets/deps-map-lib.md.BnsDnV_s.lean.js | 1 + assets/deps-map-lib.md.DOtBR8NX.js | 1 - assets/deps-map-lib.md.DOtBR8NX.lean.js | 1 - assets/en_contributing_index.md.C8tXDL1f.js | 1 - assets/en_contributing_index.md.fCA6lXnW.js | 1 + ...en_contributing_index.md.fCA6lXnW.lean.js} | 2 +- .../en_develop_craft-yml.md.BDq8uWIr.lean.js | 1 - ...js => en_develop_craft-yml.md.Ci97ssL7.js} | 4 +- .../en_develop_craft-yml.md.Ci97ssL7.lean.js | 1 + ...> en_develop_doctor-module.md.BTDyp-aK.js} | 4 +- ..._develop_doctor-module.md.BTDyp-aK.lean.js | 1 + ..._develop_doctor-module.md.DYVfKght.lean.js | 1 - assets/en_develop_index.md.DSlquryN.js | 1 - assets/en_develop_index.md.DSlquryN.lean.js | 1 - assets/en_develop_index.md.DUNrUVP9.js | 1 + assets/en_develop_index.md.DUNrUVP9.lean.js | 1 + .../en_develop_php-src-changes.md.DadHFaGC.js | 1 - ...evelop_php-src-changes.md.DadHFaGC.lean.js | 1 - .../en_develop_php-src-changes.md.dN8aSiwg.js | 1 + ...evelop_php-src-changes.md.dN8aSiwg.lean.js | 1 + ..._develop_source-module.md.CeJEgS_j.lean.js | 1 - ...> en_develop_source-module.md.hhJuiZD0.js} | 4 +- ..._develop_source-module.md.hhJuiZD0.lean.js | 1 + assets/en_develop_structure.md.D1kBTweh.js | 10 --- .../en_develop_structure.md.D1kBTweh.lean.js | 1 - assets/en_develop_structure.md.X2JId3N9.js | 10 +++ .../en_develop_structure.md.X2JId3N9.lean.js | 1 + ...develop_system-build-tools.md.BmQhyTle.js} | 4 +- ...lop_system-build-tools.md.BmQhyTle.lean.js | 1 + ...lop_system-build-tools.md.DK4AaCy_.lean.js | 1 - ...nHLgGcl.js => en_faq_index.md.B89Sredc.js} | 4 +- assets/en_faq_index.md.B89Sredc.lean.js | 1 + assets/en_faq_index.md.DnHLgGcl.lean.js | 1 - assets/en_guide_action-build.md.BCJvLz8l.js | 1 - .../en_guide_action-build.md.BCJvLz8l.lean.js | 1 - assets/en_guide_action-build.md.Dnzq6gNC.js | 1 + .../en_guide_action-build.md.Dnzq6gNC.lean.js | 1 + ...guide_build-on-windows.md.CG23CkLK.lean.js | 1 - ... en_guide_build-on-windows.md.DiYVSaPG.js} | 4 +- ...guide_build-on-windows.md.DiYVSaPG.lean.js | 1 + .../en_guide_build-with-glibc.md.BDBCsGWa.js | 1 - ...guide_build-with-glibc.md.BDBCsGWa.lean.js | 1 - .../en_guide_build-with-glibc.md.CkVR75n5.js | 1 + ...guide_build-with-glibc.md.CkVR75n5.lean.js | 1 + ... => en_guide_cli-generator.md.Dw8fQLl3.js} | 2 +- ...n_guide_cli-generator.md.Dw8fQLl3.lean.js} | 2 +- assets/en_guide_deps-map.md.BUF4uebw.js | 1 + assets/en_guide_deps-map.md.BUF4uebw.lean.js | 1 + assets/en_guide_deps-map.md.C4W5Fd15.js | 1 - assets/en_guide_deps-map.md.C4W5Fd15.lean.js | 1 - ...tO.js => en_guide_env-vars.md.51DQ7bvx.js} | 4 +- assets/en_guide_env-vars.md.51DQ7bvx.lean.js | 1 + assets/en_guide_env-vars.md.DzVATbtO.lean.js | 1 - .../en_guide_extension-notes.md.C-_d-XlC.js | 1 - ..._guide_extension-notes.md.C-_d-XlC.lean.js | 1 - .../en_guide_extension-notes.md.CHFGRiKx.js | 1 + ..._guide_extension-notes.md.CHFGRiKx.lean.js | 1 + ....js => en_guide_extensions.md.UqRV3ESR.js} | 2 +- ...> en_guide_extensions.md.UqRV3ESR.lean.js} | 2 +- assets/en_guide_index.md.BC5dTAQW.js | 1 + assets/en_guide_index.md.BC5dTAQW.lean.js | 1 + assets/en_guide_index.md.By6XUN6E.js | 1 - assets/en_guide_index.md.By6XUN6E.lean.js | 1 - .../en_guide_manual-build.md.BS1NEyZX.lean.js | 1 - ...s => en_guide_manual-build.md.D7BTH2HF.js} | 4 +- .../en_guide_manual-build.md.D7BTH2HF.lean.js | 1 + .../en_guide_troubleshooting.md.BvJgQKvb.js | 1 - ..._guide_troubleshooting.md.BvJgQKvb.lean.js | 1 - .../en_guide_troubleshooting.md.D19jRB1K.js | 1 + ..._guide_troubleshooting.md.D19jRB1K.lean.js | 1 + ...md.kO-e39M0.js => en_index.md.WiGlW8EH.js} | 2 +- ...0.lean.js => en_index.md.WiGlW8EH.lean.js} | 2 +- ...Dq7p.js => extension-notes.md.BB7Xlw1w.js} | 2 +- ...js => extension-notes.md.BB7Xlw1w.lean.js} | 2 +- assets/extensions.md.Cm2bD6Wz.js | 1 - assets/extensions.md.Cm2bD6Wz.lean.js | 1 - assets/extensions.md.hO1GVZPt.js | 1 + assets/extensions.md.hO1GVZPt.lean.js | 1 + ...ex.md.wJBxKTzp.js => index.md.AJG02Jxt.js} | 2 +- ...KTzp.lean.js => index.md.AJG02Jxt.lean.js} | 2 +- assets/style.384sric5.css | 1 - assets/style.DJGBIVuD.css | 1 + assets/zh_contributing_index.md.22akXfoC.js | 1 - .../zh_contributing_index.md.22akXfoC.lean.js | 1 - assets/zh_contributing_index.md.fiiKMXnj.js | 1 + .../zh_contributing_index.md.fiiKMXnj.lean.js | 1 + ...js => zh_develop_craft-yml.md.CAUu6v38.js} | 4 +- .../zh_develop_craft-yml.md.CAUu6v38.lean.js | 1 + .../zh_develop_craft-yml.md.Dfv1fXuq.lean.js | 1 - ...> zh_develop_doctor-module.md.1NRXIINs.js} | 4 +- ..._develop_doctor-module.md.1NRXIINs.lean.js | 1 + ..._develop_doctor-module.md.B8r2lbU8.lean.js | 1 - assets/zh_develop_index.md.CRxnJZDt.js | 1 + assets/zh_develop_index.md.CRxnJZDt.lean.js | 1 + assets/zh_develop_index.md.DecU9Y3b.js | 1 - assets/zh_develop_index.md.DecU9Y3b.lean.js | 1 - .../zh_develop_php-src-changes.md.CkjaMIky.js | 1 - ...evelop_php-src-changes.md.CkjaMIky.lean.js | 1 - .../zh_develop_php-src-changes.md.CwVUc0oE.js | 1 + ...evelop_php-src-changes.md.CwVUc0oE.lean.js | 1 + ...> zh_develop_source-module.md.3iGbQTPs.js} | 4 +- ..._develop_source-module.md.3iGbQTPs.lean.js | 1 + ..._develop_source-module.md.DoBnezP5.lean.js | 1 - assets/zh_develop_structure.md.CEd1RycZ.js | 10 +++ .../zh_develop_structure.md.CEd1RycZ.lean.js | 1 + assets/zh_develop_structure.md.DStJTsYD.js | 10 --- .../zh_develop_structure.md.DStJTsYD.lean.js | 1 - ...develop_system-build-tools.md.CQ4BvPVa.js} | 4 +- ...lop_system-build-tools.md.CQ4BvPVa.lean.js | 1 + ...lop_system-build-tools.md.CxPkPV_h.lean.js | 1 - ...E1d0aPt.js => zh_faq_index.md.BihV7puH.js} | 4 +- assets/zh_faq_index.md.BihV7puH.lean.js | 1 + assets/zh_faq_index.md.nE1d0aPt.lean.js | 1 - assets/zh_guide_action-build.md.CQ3Vf3i9.js | 1 + .../zh_guide_action-build.md.CQ3Vf3i9.lean.js | 1 + assets/zh_guide_action-build.md.CYeVjGhJ.js | 1 - .../zh_guide_action-build.md.CYeVjGhJ.lean.js | 1 - ...guide_build-on-windows.md.6JBREABQ.lean.js | 1 - ... zh_guide_build-on-windows.md.oogWrPn_.js} | 4 +- ...guide_build-on-windows.md.oogWrPn_.lean.js | 1 + .../zh_guide_build-with-glibc.md.CGbU937o.js | 1 - ...guide_build-with-glibc.md.CGbU937o.lean.js | 1 - .../zh_guide_build-with-glibc.md.CHXyK61r.js | 1 + ...guide_build-with-glibc.md.CHXyK61r.lean.js | 1 + ... => zh_guide_cli-generator.md.BoINN2LK.js} | 2 +- ...h_guide_cli-generator.md.BoINN2LK.lean.js} | 2 +- assets/zh_guide_deps-map.md.BK_n00u9.js | 1 - assets/zh_guide_deps-map.md.BK_n00u9.lean.js | 1 - assets/zh_guide_deps-map.md.Cu7XhPTT.js | 1 + assets/zh_guide_deps-map.md.Cu7XhPTT.lean.js | 1 + ...fS.js => zh_guide_env-vars.md.CtNlqGk4.js} | 4 +- assets/zh_guide_env-vars.md.CtNlqGk4.lean.js | 1 + assets/zh_guide_env-vars.md.DqYHbUfS.lean.js | 1 - .../zh_guide_extension-notes.md.BCwDjBZH.js | 1 + ..._guide_extension-notes.md.BCwDjBZH.lean.js | 1 + .../zh_guide_extension-notes.md.D1f-13YX.js | 1 - ..._guide_extension-notes.md.D1f-13YX.lean.js | 1 - ....js => zh_guide_extensions.md.DEhoyCES.js} | 2 +- ...> zh_guide_extensions.md.DEhoyCES.lean.js} | 2 +- assets/zh_guide_index.md.C3GV6eqU.js | 1 + assets/zh_guide_index.md.C3GV6eqU.lean.js | 1 + assets/zh_guide_index.md.DWAO4_zO.js | 1 - assets/zh_guide_index.md.DWAO4_zO.lean.js | 1 - .../zh_guide_manual-build.md.DAnA1dt8.lean.js | 1 - ...s => zh_guide_manual-build.md.DVCjR4yy.js} | 4 +- .../zh_guide_manual-build.md.DVCjR4yy.lean.js | 1 + .../zh_guide_troubleshooting.md.BRQLW2WP.js | 1 + ..._guide_troubleshooting.md.BRQLW2WP.lean.js | 1 + .../zh_guide_troubleshooting.md.DSUIb51x.js | 1 - ..._guide_troubleshooting.md.DSUIb51x.lean.js | 1 - ...md.DcikGFee.js => zh_index.md.Dv99zA_s.js} | 2 +- ...e.lean.js => zh_index.md.Dv99zA_s.lean.js} | 2 +- deps-craft-yml.html | 18 ++--- deps-map-ext.html | 16 ++-- deps-map-lib.html | 16 ++-- en/contributing/index.html | 16 ++-- en/develop/craft-yml.html | 18 ++--- en/develop/doctor-module.html | 18 ++--- en/develop/index.html | 16 ++-- en/develop/php-src-changes.html | 16 ++-- en/develop/source-module.html | 18 ++--- en/develop/structure.html | 18 ++--- en/develop/system-build-tools.html | 18 ++--- en/faq/index.html | 18 ++--- en/guide/action-build.html | 16 ++-- en/guide/build-on-windows.html | 18 ++--- en/guide/build-with-glibc.html | 16 ++-- en/guide/cli-generator.html | 20 ++--- en/guide/deps-map.html | 16 ++-- en/guide/env-vars.html | 18 ++--- en/guide/extension-notes.html | 16 ++-- en/guide/extensions.html | 18 ++--- en/guide/index.html | 16 ++-- en/guide/manual-build.html | 18 ++--- en/guide/troubleshooting.html | 16 ++-- en/index.html | 16 ++-- extension-notes.html | 16 ++-- extensions.html | 16 ++-- hashmap.json | 2 +- index.html | 16 ++-- zh/contributing/index.html | 16 ++-- zh/develop/craft-yml.html | 18 ++--- zh/develop/doctor-module.html | 18 ++--- zh/develop/index.html | 16 ++-- zh/develop/php-src-changes.html | 16 ++-- zh/develop/source-module.html | 18 ++--- zh/develop/structure.html | 18 ++--- zh/develop/system-build-tools.html | 18 ++--- zh/faq/index.html | 18 ++--- zh/guide/action-build.html | 16 ++-- zh/guide/build-on-windows.html | 18 ++--- zh/guide/build-with-glibc.html | 16 ++-- zh/guide/cli-generator.html | 20 ++--- zh/guide/deps-map.html | 16 ++-- zh/guide/env-vars.html | 18 ++--- zh/guide/extension-notes.html | 16 ++-- zh/guide/extensions.html | 18 ++--- zh/guide/index.html | 16 ++-- zh/guide/manual-build.html | 18 ++--- zh/guide/troubleshooting.html | 16 ++-- zh/index.html | 16 ++-- 220 files changed, 661 insertions(+), 579 deletions(-) rename assets/{app.DQMp3l4I.js => app.C9FYtCRt.js} (81%) create mode 100644 assets/chunks/CliGenerator.CXyXM4cX.js delete mode 100644 assets/chunks/CliGenerator.u1Ew-M_q.js delete mode 100644 assets/chunks/SearchTable.Cw3TiMBP.js create mode 100644 assets/chunks/SearchTable.Dddvtmwz.js create mode 100644 assets/chunks/VPAlgoliaSearchBox.nRDYEdJs.js create mode 100644 assets/chunks/framework.Bhsyh9kO.js delete mode 100644 assets/chunks/framework.PeLcR_tw.js delete mode 100644 assets/chunks/theme.DbVD3jYa.js create mode 100644 assets/chunks/theme.MOrVMOSc.js delete mode 100644 assets/deps-craft-yml.md.DWPKeuXi.lean.js rename assets/{deps-craft-yml.md.DWPKeuXi.js => deps-craft-yml.md.DqNYV3B0.js} (94%) create mode 100644 assets/deps-craft-yml.md.DqNYV3B0.lean.js delete mode 100644 assets/deps-map-ext.md.B9knsysL.js delete mode 100644 assets/deps-map-ext.md.B9knsysL.lean.js create mode 100644 assets/deps-map-ext.md.BVAR3McO.js create mode 100644 assets/deps-map-ext.md.BVAR3McO.lean.js create mode 100644 assets/deps-map-lib.md.BnsDnV_s.js create mode 100644 assets/deps-map-lib.md.BnsDnV_s.lean.js delete mode 100644 assets/deps-map-lib.md.DOtBR8NX.js delete mode 100644 assets/deps-map-lib.md.DOtBR8NX.lean.js delete mode 100644 assets/en_contributing_index.md.C8tXDL1f.js create mode 100644 assets/en_contributing_index.md.fCA6lXnW.js rename assets/{en_contributing_index.md.C8tXDL1f.lean.js => en_contributing_index.md.fCA6lXnW.lean.js} (60%) delete mode 100644 assets/en_develop_craft-yml.md.BDq8uWIr.lean.js rename assets/{en_develop_craft-yml.md.BDq8uWIr.js => en_develop_craft-yml.md.Ci97ssL7.js} (93%) create mode 100644 assets/en_develop_craft-yml.md.Ci97ssL7.lean.js rename assets/{en_develop_doctor-module.md.DYVfKght.js => en_develop_doctor-module.md.BTDyp-aK.js} (87%) create mode 100644 assets/en_develop_doctor-module.md.BTDyp-aK.lean.js delete mode 100644 assets/en_develop_doctor-module.md.DYVfKght.lean.js delete mode 100644 assets/en_develop_index.md.DSlquryN.js delete mode 100644 assets/en_develop_index.md.DSlquryN.lean.js create mode 100644 assets/en_develop_index.md.DUNrUVP9.js create mode 100644 assets/en_develop_index.md.DUNrUVP9.lean.js delete mode 100644 assets/en_develop_php-src-changes.md.DadHFaGC.js delete mode 100644 assets/en_develop_php-src-changes.md.DadHFaGC.lean.js create mode 100644 assets/en_develop_php-src-changes.md.dN8aSiwg.js create mode 100644 assets/en_develop_php-src-changes.md.dN8aSiwg.lean.js delete mode 100644 assets/en_develop_source-module.md.CeJEgS_j.lean.js rename assets/{en_develop_source-module.md.CeJEgS_j.js => en_develop_source-module.md.hhJuiZD0.js} (95%) create mode 100644 assets/en_develop_source-module.md.hhJuiZD0.lean.js delete mode 100644 assets/en_develop_structure.md.D1kBTweh.js delete mode 100644 assets/en_develop_structure.md.D1kBTweh.lean.js create mode 100644 assets/en_develop_structure.md.X2JId3N9.js create mode 100644 assets/en_develop_structure.md.X2JId3N9.lean.js rename assets/{en_develop_system-build-tools.md.DK4AaCy_.js => en_develop_system-build-tools.md.BmQhyTle.js} (68%) create mode 100644 assets/en_develop_system-build-tools.md.BmQhyTle.lean.js delete mode 100644 assets/en_develop_system-build-tools.md.DK4AaCy_.lean.js rename assets/{en_faq_index.md.DnHLgGcl.js => en_faq_index.md.B89Sredc.js} (65%) create mode 100644 assets/en_faq_index.md.B89Sredc.lean.js delete mode 100644 assets/en_faq_index.md.DnHLgGcl.lean.js delete mode 100644 assets/en_guide_action-build.md.BCJvLz8l.js delete mode 100644 assets/en_guide_action-build.md.BCJvLz8l.lean.js create mode 100644 assets/en_guide_action-build.md.Dnzq6gNC.js create mode 100644 assets/en_guide_action-build.md.Dnzq6gNC.lean.js delete mode 100644 assets/en_guide_build-on-windows.md.CG23CkLK.lean.js rename assets/{en_guide_build-on-windows.md.CG23CkLK.js => en_guide_build-on-windows.md.DiYVSaPG.js} (81%) create mode 100644 assets/en_guide_build-on-windows.md.DiYVSaPG.lean.js delete mode 100644 assets/en_guide_build-with-glibc.md.BDBCsGWa.js delete mode 100644 assets/en_guide_build-with-glibc.md.BDBCsGWa.lean.js create mode 100644 assets/en_guide_build-with-glibc.md.CkVR75n5.js create mode 100644 assets/en_guide_build-with-glibc.md.CkVR75n5.lean.js rename assets/{en_guide_cli-generator.md.BsPNkB0u.js => en_guide_cli-generator.md.Dw8fQLl3.js} (81%) rename assets/{en_guide_cli-generator.md.BsPNkB0u.lean.js => en_guide_cli-generator.md.Dw8fQLl3.lean.js} (62%) create mode 100644 assets/en_guide_deps-map.md.BUF4uebw.js create mode 100644 assets/en_guide_deps-map.md.BUF4uebw.lean.js delete mode 100644 assets/en_guide_deps-map.md.C4W5Fd15.js delete mode 100644 assets/en_guide_deps-map.md.C4W5Fd15.lean.js rename assets/{en_guide_env-vars.md.DzVATbtO.js => en_guide_env-vars.md.51DQ7bvx.js} (72%) create mode 100644 assets/en_guide_env-vars.md.51DQ7bvx.lean.js delete mode 100644 assets/en_guide_env-vars.md.DzVATbtO.lean.js delete mode 100644 assets/en_guide_extension-notes.md.C-_d-XlC.js delete mode 100644 assets/en_guide_extension-notes.md.C-_d-XlC.lean.js create mode 100644 assets/en_guide_extension-notes.md.CHFGRiKx.js create mode 100644 assets/en_guide_extension-notes.md.CHFGRiKx.lean.js rename assets/{en_guide_extensions.md.8tYHqn_N.js => en_guide_extensions.md.UqRV3ESR.js} (92%) rename assets/{en_guide_extensions.md.8tYHqn_N.lean.js => en_guide_extensions.md.UqRV3ESR.lean.js} (73%) create mode 100644 assets/en_guide_index.md.BC5dTAQW.js create mode 100644 assets/en_guide_index.md.BC5dTAQW.lean.js delete mode 100644 assets/en_guide_index.md.By6XUN6E.js delete mode 100644 assets/en_guide_index.md.By6XUN6E.lean.js delete mode 100644 assets/en_guide_manual-build.md.BS1NEyZX.lean.js rename assets/{en_guide_manual-build.md.BS1NEyZX.js => en_guide_manual-build.md.D7BTH2HF.js} (98%) create mode 100644 assets/en_guide_manual-build.md.D7BTH2HF.lean.js delete mode 100644 assets/en_guide_troubleshooting.md.BvJgQKvb.js delete mode 100644 assets/en_guide_troubleshooting.md.BvJgQKvb.lean.js create mode 100644 assets/en_guide_troubleshooting.md.D19jRB1K.js create mode 100644 assets/en_guide_troubleshooting.md.D19jRB1K.lean.js rename assets/{en_index.md.kO-e39M0.js => en_index.md.WiGlW8EH.js} (93%) rename assets/{en_index.md.kO-e39M0.lean.js => en_index.md.WiGlW8EH.lean.js} (93%) rename assets/{extension-notes.md.DkpYDq7p.js => extension-notes.md.BB7Xlw1w.js} (81%) rename assets/{extension-notes.md.DkpYDq7p.lean.js => extension-notes.md.BB7Xlw1w.lean.js} (81%) delete mode 100644 assets/extensions.md.Cm2bD6Wz.js delete mode 100644 assets/extensions.md.Cm2bD6Wz.lean.js create mode 100644 assets/extensions.md.hO1GVZPt.js create mode 100644 assets/extensions.md.hO1GVZPt.lean.js rename assets/{index.md.wJBxKTzp.js => index.md.AJG02Jxt.js} (91%) rename assets/{index.md.wJBxKTzp.lean.js => index.md.AJG02Jxt.lean.js} (91%) delete mode 100644 assets/style.384sric5.css create mode 100644 assets/style.DJGBIVuD.css delete mode 100644 assets/zh_contributing_index.md.22akXfoC.js delete mode 100644 assets/zh_contributing_index.md.22akXfoC.lean.js create mode 100644 assets/zh_contributing_index.md.fiiKMXnj.js create mode 100644 assets/zh_contributing_index.md.fiiKMXnj.lean.js rename assets/{zh_develop_craft-yml.md.Dfv1fXuq.js => zh_develop_craft-yml.md.CAUu6v38.js} (93%) create mode 100644 assets/zh_develop_craft-yml.md.CAUu6v38.lean.js delete mode 100644 assets/zh_develop_craft-yml.md.Dfv1fXuq.lean.js rename assets/{zh_develop_doctor-module.md.B8r2lbU8.js => zh_develop_doctor-module.md.1NRXIINs.js} (87%) create mode 100644 assets/zh_develop_doctor-module.md.1NRXIINs.lean.js delete mode 100644 assets/zh_develop_doctor-module.md.B8r2lbU8.lean.js create mode 100644 assets/zh_develop_index.md.CRxnJZDt.js create mode 100644 assets/zh_develop_index.md.CRxnJZDt.lean.js delete mode 100644 assets/zh_develop_index.md.DecU9Y3b.js delete mode 100644 assets/zh_develop_index.md.DecU9Y3b.lean.js delete mode 100644 assets/zh_develop_php-src-changes.md.CkjaMIky.js delete mode 100644 assets/zh_develop_php-src-changes.md.CkjaMIky.lean.js create mode 100644 assets/zh_develop_php-src-changes.md.CwVUc0oE.js create mode 100644 assets/zh_develop_php-src-changes.md.CwVUc0oE.lean.js rename assets/{zh_develop_source-module.md.DoBnezP5.js => zh_develop_source-module.md.3iGbQTPs.js} (95%) create mode 100644 assets/zh_develop_source-module.md.3iGbQTPs.lean.js delete mode 100644 assets/zh_develop_source-module.md.DoBnezP5.lean.js create mode 100644 assets/zh_develop_structure.md.CEd1RycZ.js create mode 100644 assets/zh_develop_structure.md.CEd1RycZ.lean.js delete mode 100644 assets/zh_develop_structure.md.DStJTsYD.js delete mode 100644 assets/zh_develop_structure.md.DStJTsYD.lean.js rename assets/{zh_develop_system-build-tools.md.CxPkPV_h.js => zh_develop_system-build-tools.md.CQ4BvPVa.js} (70%) create mode 100644 assets/zh_develop_system-build-tools.md.CQ4BvPVa.lean.js delete mode 100644 assets/zh_develop_system-build-tools.md.CxPkPV_h.lean.js rename assets/{zh_faq_index.md.nE1d0aPt.js => zh_faq_index.md.BihV7puH.js} (64%) create mode 100644 assets/zh_faq_index.md.BihV7puH.lean.js delete mode 100644 assets/zh_faq_index.md.nE1d0aPt.lean.js create mode 100644 assets/zh_guide_action-build.md.CQ3Vf3i9.js create mode 100644 assets/zh_guide_action-build.md.CQ3Vf3i9.lean.js delete mode 100644 assets/zh_guide_action-build.md.CYeVjGhJ.js delete mode 100644 assets/zh_guide_action-build.md.CYeVjGhJ.lean.js delete mode 100644 assets/zh_guide_build-on-windows.md.6JBREABQ.lean.js rename assets/{zh_guide_build-on-windows.md.6JBREABQ.js => zh_guide_build-on-windows.md.oogWrPn_.js} (81%) create mode 100644 assets/zh_guide_build-on-windows.md.oogWrPn_.lean.js delete mode 100644 assets/zh_guide_build-with-glibc.md.CGbU937o.js delete mode 100644 assets/zh_guide_build-with-glibc.md.CGbU937o.lean.js create mode 100644 assets/zh_guide_build-with-glibc.md.CHXyK61r.js create mode 100644 assets/zh_guide_build-with-glibc.md.CHXyK61r.lean.js rename assets/{zh_guide_cli-generator.md.DVBBaW5t.js => zh_guide_cli-generator.md.BoINN2LK.js} (86%) rename assets/{zh_guide_cli-generator.md.DVBBaW5t.lean.js => zh_guide_cli-generator.md.BoINN2LK.lean.js} (74%) delete mode 100644 assets/zh_guide_deps-map.md.BK_n00u9.js delete mode 100644 assets/zh_guide_deps-map.md.BK_n00u9.lean.js create mode 100644 assets/zh_guide_deps-map.md.Cu7XhPTT.js create mode 100644 assets/zh_guide_deps-map.md.Cu7XhPTT.lean.js rename assets/{zh_guide_env-vars.md.DqYHbUfS.js => zh_guide_env-vars.md.CtNlqGk4.js} (72%) create mode 100644 assets/zh_guide_env-vars.md.CtNlqGk4.lean.js delete mode 100644 assets/zh_guide_env-vars.md.DqYHbUfS.lean.js create mode 100644 assets/zh_guide_extension-notes.md.BCwDjBZH.js create mode 100644 assets/zh_guide_extension-notes.md.BCwDjBZH.lean.js delete mode 100644 assets/zh_guide_extension-notes.md.D1f-13YX.js delete mode 100644 assets/zh_guide_extension-notes.md.D1f-13YX.lean.js rename assets/{zh_guide_extensions.md.CRNxXzeG.js => zh_guide_extensions.md.DEhoyCES.js} (92%) rename assets/{zh_guide_extensions.md.CRNxXzeG.lean.js => zh_guide_extensions.md.DEhoyCES.lean.js} (73%) create mode 100644 assets/zh_guide_index.md.C3GV6eqU.js create mode 100644 assets/zh_guide_index.md.C3GV6eqU.lean.js delete mode 100644 assets/zh_guide_index.md.DWAO4_zO.js delete mode 100644 assets/zh_guide_index.md.DWAO4_zO.lean.js delete mode 100644 assets/zh_guide_manual-build.md.DAnA1dt8.lean.js rename assets/{zh_guide_manual-build.md.DAnA1dt8.js => zh_guide_manual-build.md.DVCjR4yy.js} (97%) create mode 100644 assets/zh_guide_manual-build.md.DVCjR4yy.lean.js create mode 100644 assets/zh_guide_troubleshooting.md.BRQLW2WP.js create mode 100644 assets/zh_guide_troubleshooting.md.BRQLW2WP.lean.js delete mode 100644 assets/zh_guide_troubleshooting.md.DSUIb51x.js delete mode 100644 assets/zh_guide_troubleshooting.md.DSUIb51x.lean.js rename assets/{zh_index.md.DcikGFee.js => zh_index.md.Dv99zA_s.js} (94%) rename assets/{zh_index.md.DcikGFee.lean.js => zh_index.md.Dv99zA_s.lean.js} (94%) diff --git a/404.html b/404.html index ab690c1a..cc6d5991 100644 --- a/404.html +++ b/404.html @@ -5,18 +5,18 @@ 404 | static-php-cli - - + + - +
- + \ No newline at end of file diff --git a/assets/app.DQMp3l4I.js b/assets/app.C9FYtCRt.js similarity index 81% rename from assets/app.DQMp3l4I.js rename to assets/app.C9FYtCRt.js index ed4ab189..9d0a07ba 100644 --- a/assets/app.DQMp3l4I.js +++ b/assets/app.C9FYtCRt.js @@ -1 +1 @@ -import{R as p}from"./chunks/theme.DbVD3jYa.js";import{C as o,a1 as i,a2 as u,a3 as c,a4 as l,a5 as f,a6 as d,a7 as m,a8 as h,a9 as g,aa as A,d as y,u as C,p as v,y as w,ab as P,ac as R,ad as b,ae as E}from"./chunks/framework.PeLcR_tw.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=y({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=C();return v(()=>{w(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&P(),R(),b(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=L(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function L(){let e=o;return h(a=>{let t=g(a),s=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),s=import(t)),o&&(e=!1),s},n.NotFound)}o&&T().then(({app:e,router:a,data:t})=>{a.go(location.href,{initialLoad:!0}).then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp}; +import{R as p}from"./chunks/theme.MOrVMOSc.js";import{C as o,a3 as i,a4 as u,a5 as c,a6 as l,a7 as f,a8 as d,a9 as m,aa as h,ab as g,ac as A,d as y,u as C,p as v,y as w,ad as P,ae as R,af as b,ag as E}from"./chunks/framework.Bhsyh9kO.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=y({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=C();return v(()=>{w(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&P(),R(),b(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=L(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function L(){let e=o;return h(a=>{let t=g(a),s=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),s=import(t)),o&&(e=!1),s},n.NotFound)}o&&T().then(({app:e,router:a,data:t})=>{a.go(location.href,{initialLoad:!0}).then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp}; diff --git a/assets/chunks/CliGenerator.CXyXM4cX.js b/assets/chunks/CliGenerator.CXyXM4cX.js new file mode 100644 index 00000000..67d69384 --- /dev/null +++ b/assets/chunks/CliGenerator.CXyXM4cX.js @@ -0,0 +1,12 @@ +import{d as fe,x as w,h as k,z as ae,c as g,o as x,j as e,e as $,ai as m,t as l,G as V,H as T,aj as S,ak as te,al as de,am as le,n as I,_ as ze}from"./framework.Bhsyh9kO.js";const ke={support:{BSD:"wip"},type:"external","arg-type":"custom",source:"amqp","lib-depends":["librabbitmq"],"ext-depends-windows":["openssl"]},Se={type:"external",source:"apcu"},De={type:"external",source:"ast"},Be={type:"builtin"},Ce={type:"external",source:"ext-brotli","arg-type":"enable","lib-depends":["brotli"]},qe={type:"builtin","arg-type-unix":"with-path","arg-type-windows":"with","lib-depends":["bzip2"]},Ee={type:"builtin"},$e={type:"builtin"},We={notes:!0,type:"builtin","arg-type":"with","lib-depends":["curl"],"ext-depends-windows":["zlib","openssl"]},Pe={type:"builtin","arg-type":"custom","lib-suggests":["qdbm"]},Ie={support:{BSD:"wip"},type:"external",source:"dio"},Le={support:{BSD:"wip"},type:"builtin","arg-type":"custom","arg-type-windows":"with","lib-depends":["libxml2","zlib"],"ext-depends-windows":["xml"]},Ue={type:"external",source:"ext-ds"},je={support:{Windows:"wip",BSD:"wip",Darwin:"wip",Linux:"wip"},type:"wip"},Ae={type:"external",source:"ev","arg-type-windows":"with","ext-depends":["sockets"]},Ne={support:{Windows:"wip",BSD:"wip"},notes:!0,type:"external",source:"ext-event","arg-type":"custom","lib-depends":["libevent"],"ext-depends":["openssl"],"ext-suggests":["sockets"]},Oe={type:"builtin"},Ve={support:{Linux:"partial",BSD:"wip"},notes:!0,"arg-type":"custom",type:"builtin","lib-depends-unix":["libffi"],"lib-depends-windows":["libffi-win"]},Te={type:"builtin"},Me={type:"builtin"},Ge={type:"builtin","lib-suggests":["openssl"]},Xe={support:{BSD:"wip"},notes:!0,type:"builtin","arg-type":"custom","arg-type-windows":"with","lib-depends":["zlib","libpng"],"ext-depends":["zlib"],"lib-suggests":["libavif","libwebp","libjpeg","freetype"]},He={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["gettext"]},Re={support:{Windows:"wip",BSD:"no",Linux:"no"},notes:!0,type:"external","arg-type":"custom",source:"ext-glfw","lib-depends":["glfw"],"lib-depends-windows":[]},Fe={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["gmp"]},Ze={support:{BSD:"wip"},type:"external",source:"ext-gmssl","lib-depends":["gmssl"]},Qe={support:{Windows:"wip",BSD:"wip"},type:"external",source:"grpc","arg-type-unix":"enable-path","cpp-extension":!0,"lib-depends":["grpc"]},Ke={support:{BSD:"wip"},type:"builtin","arg-type":"with-path","arg-type-windows":"with","lib-depends-unix":["libiconv"],"lib-depends-windows":["libiconv-win"]},Ye={support:{BSD:"wip"},type:"external",source:"igbinary","ext-suggests":["session","apcu"]},Je={support:{Windows:"wip",BSD:"wip"},notes:!0,type:"external",source:"ext-imagick","arg-type":"custom","lib-depends":["imagemagick"]},_e={support:{Windows:"wip",BSD:"wip"},notes:!0,type:"external",source:"ext-imap","arg-type":"custom","lib-depends":["imap"],"ext-suggests":["openssl"]},ei={support:{Windows:"no",BSD:"wip",Darwin:"no"},type:"external",source:"inotify"},ii={support:{BSD:"wip"},type:"builtin","lib-depends-unix":["icu"],"lib-depends-windows":["icu-static-win"]},si={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["ldap"],"lib-suggests":["gmp","libsodium"],"ext-suggests":["openssl"]},ti={support:{BSD:"wip"},type:"builtin","arg-type":"none","ext-depends":["xml"],target:["static"]},li={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-lz4","arg-type":"custom","lib-depends":["liblz4"]},ni={type:"builtin","arg-type":"custom",target:["static"],"ext-depends":["mbstring"],"lib-depends":["onig"]},oi={type:"builtin","arg-type":"custom"},ai={type:"wip",support:{Windows:"no",BSD:"no",Darwin:"no",Linux:"no"},notes:!0},di={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-memcache","arg-type":"custom","ext-depends":["zlib","session"],"build-with-php":!0},ui={support:{Windows:"wip",BSD:"wip"},type:"external",source:"memcached","arg-type":"custom","cpp-extension":!0,"lib-depends":["libmemcached"],"lib-depends-unix":["libmemcached","fastlz"],"ext-depends":["session","zlib"]},pi={support:{BSD:"wip",Windows:"wip"},type:"external",source:"mongodb","arg-type":"custom","lib-suggests":["icu","openssl","zstd","zlib"],frameworks:["CoreFoundation","Security"]},ci={support:{BSD:"wip"},type:"external",source:"msgpack","arg-type-unix":"with","arg-type-win":"enable","ext-depends":["session"]},ri={type:"builtin","arg-type":"with","ext-depends":["mysqlnd"]},bi={type:"builtin","arg-type-windows":"with","lib-depends":["zlib"]},wi={type:"wip",support:{Windows:"wip",BSD:"no",Darwin:"no",Linux:"no"},notes:!0},gi={support:{BSD:"wip",Windows:"wip"},type:"builtin","arg-type-unix":"custom","lib-depends-unix":["unixodbc"]},xi={type:"builtin","arg-type-unix":"custom","arg-type-windows":"enable","zend-extension":!0},mi={notes:!0,type:"builtin","arg-type":"custom","arg-type-windows":"with","build-with-php":!0,"lib-depends":["openssl","zlib"],"ext-depends":["zlib"]},hi={support:{BSD:"wip"},type:"external",source:"opentelemetry"},vi={support:{BSD:"wip"},notes:!0,type:"external",source:"parallel","arg-type-windows":"with","lib-depends-windows":["pthreads4w"]},yi={support:{Windows:"no"},type:"builtin","unix-only":!0},fi={type:"builtin"},zi={type:"builtin","arg-type":"with","ext-depends":["pdo","mysqlnd"]},ki={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends-unix":["unixodbc"],"ext-depends":["pdo","odbc"]},Si={support:{BSD:"wip"},type:"builtin","arg-type":"with-path","arg-type-windows":"custom","ext-depends":["pdo","pgsql"],"lib-depends-unix":["postgresql"],"lib-depends-windows":["postgresql-win"]},Di={support:{BSD:"wip"},type:"builtin","arg-type":"with","ext-depends":["pdo","sqlite3"],"lib-depends":["sqlite"]},Bi={support:{BSD:"wip"},type:"external",source:"pdo_sqlsrv","arg-type":"with","ext-depends":["pdo","sqlsrv"]},Ci={support:{BSD:"wip"},notes:!0,type:"builtin","arg-type":"custom","lib-depends-unix":["postgresql"],"lib-depends-windows":["postgresql-win"]},qi={type:"builtin","ext-depends":["zlib"]},Ei={support:{Windows:"no"},type:"builtin","unix-only":!0},$i={support:{Windows:"wip",BSD:"wip"},type:"external",source:"protobuf"},Wi={support:{BSD:"wip",Darwin:"partial"},notes:!0,type:"external",source:"rar","cpp-extension":!0},Pi={support:{BSD:"wip",Windows:"wip"},type:"external",source:"ext-rdkafka","arg-type":"custom","cpp-extension":!0,"lib-depends":["librdkafka"]},Ii={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["readline"],target:["static"]},Li={support:{BSD:"wip"},type:"external",source:"redis","arg-type":"custom","ext-suggests":["session","igbinary","msgpack"],"lib-suggests-unix":["zstd","liblz4"]},Ui={type:"builtin","build-with-php":!0},ji={type:"builtin","build-with-php":!0},Ai={type:"external",source:"ext-simdjson","cpp-extension":!0},Ni={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends":["libxml2"],"ext-depends-windows":["xml"],"build-with-php":!0},Oi={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-snappy","cpp-extension":!0,"arg-type":"custom","lib-depends":["snappy"],"ext-suggests":["apcu"]},Vi={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends":["libxml2"],"ext-depends-windows":["xml"]},Ti={type:"builtin"},Mi={support:{BSD:"wip"},type:"builtin","arg-type":"with","lib-depends":["libsodium"]},Gi={support:{BSD:"wip",Windows:"no"},notes:!0,type:"external",source:"spx","arg-type":"custom","lib-depends":["zlib"]},Xi={support:{BSD:"wip"},type:"builtin","arg-type":"with-path","arg-type-windows":"with","lib-depends":["sqlite"]},Hi={support:{BSD:"wip"},type:"external",source:"sqlsrv","lib-depends-unix":["unixodbc"],"ext-depends-linux":["pcntl"],"cpp-extension":!0},Ri={support:{BSD:"wip"},type:"external",source:"ext-ssh2","arg-type":"with-path","arg-type-windows":"with","lib-depends":["libssh2"],"ext-depends":["openssl","zlib"]},Fi={support:{Windows:"no",BSD:"wip"},notes:!0,type:"external",source:"swoole","arg-type":"custom","cpp-extension":!0,"unix-only":!0,"lib-depends":["libcares","brotli","nghttp2","zlib"],"lib-suggests":["zstd"],"lib-suggests-linux":["zstd","liburing"],"ext-depends":["openssl","curl"],"ext-suggests":["sockets","swoole-hook-pgsql","swoole-hook-mysql","swoole-hook-sqlite","swoole-hook-odbc"]},Zi={support:{BSD:"wip"},notes:!0,type:"external",source:"swow","arg-type":"custom","lib-suggests":["openssl","curl"],"ext-suggests":["openssl","curl"]},Qi={support:{Windows:"no",BSD:"wip"},type:"builtin","unix-only":!0},Ki={support:{Windows:"no",BSD:"wip"},type:"builtin","unix-only":!0},Yi={support:{BSD:"wip"},type:"builtin"},Ji={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["tidy"]},_i={type:"builtin","build-with-php":!0},es={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-uuid","arg-type":"with-path","lib-depends":["libuuid"]},is={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-uv","arg-type":"with-path","lib-depends":["libuv"],"ext-depends":["sockets"]},ss={type:"external",source:"xdebug",target:["shared"],support:{Windows:"wip",BSD:"no",Darwin:"partial",Linux:"partial"},notes:!0,"zend-extension":!0},ts={support:{Windows:"wip",BSD:"wip"},notes:!0,type:"external",source:"xhprof","ext-depends":["ctype"],"build-with-php":!0},ls={support:{BSD:"wip"},type:"external",source:"xlswriter","arg-type":"custom","ext-depends":["zlib","zip"],"lib-suggests":["openssl"]},ns={support:{BSD:"wip"},notes:!0,type:"builtin","arg-type":"custom","arg-type-windows":"with","lib-depends":["libxml2"],"ext-depends-windows":["iconv"],"build-with-php":!0},os={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends":["libxml2"],"ext-depends-windows":["xml","dom"],"build-with-php":!0},as={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends":["libxml2"],"ext-depends-windows":["xml"],"build-with-php":!0},ds={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["libxslt"],"ext-depends":["xml","dom"]},us={type:"external",source:"ext-xz","arg-type":"with","lib-depends":["xz"]},ps={support:{BSD:"wip"},type:"external",source:"yac","arg-type-unix":"custom","lib-depends-unix":["fastlz"],"ext-depends-unix":["igbinary"]},cs={support:{BSD:"wip"},type:"external",source:"yaml","arg-type-unix":"with-path","arg-type-windows":"with","lib-depends":["libyaml"]},rs={support:{BSD:"wip"},type:"builtin","arg-type":"with-path","arg-type-windows":"enable","lib-depends-unix":["libzip"],"ext-depends-windows":["zlib","bz2"],"lib-depends-windows":["libzip","zlib","bzip2","xz"]},bs={type:"builtin","arg-type":"custom","arg-type-windows":"enable","lib-depends":["zlib"],target:["static"]},ws={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-zstd","arg-type":"custom","lib-depends":["zstd"]},gs={amqp:ke,apcu:Se,ast:De,bcmath:Be,brotli:Ce,bz2:qe,calendar:Ee,ctype:$e,curl:We,dba:Pe,dio:Ie,dom:Le,ds:Ue,enchant:je,ev:Ae,event:Ne,exif:Oe,ffi:Ve,fileinfo:Te,filter:Me,ftp:Ge,gd:Xe,gettext:He,glfw:Re,gmp:Fe,gmssl:Ze,grpc:Qe,iconv:Ke,igbinary:Ye,imagick:Je,imap:_e,inotify:ei,intl:ii,ldap:si,libxml:ti,lz4:li,mbregex:ni,mbstring:oi,mcrypt:ai,memcache:di,memcached:ui,mongodb:pi,msgpack:ci,mysqli:ri,mysqlnd:bi,oci8:wi,odbc:gi,opcache:xi,openssl:mi,opentelemetry:hi,parallel:vi,"password-argon2":{support:{Windows:"wip",BSD:"wip"},notes:!0,type:"builtin","arg-type":"custom","lib-depends":["libargon2","openssl"]},pcntl:yi,pdo:fi,pdo_mysql:zi,pdo_odbc:ki,pdo_pgsql:Si,pdo_sqlite:Di,pdo_sqlsrv:Bi,pgsql:Ci,phar:qi,posix:Ei,protobuf:$i,rar:Wi,rdkafka:Pi,readline:Ii,redis:Li,session:Ui,shmop:ji,simdjson:Ai,simplexml:Ni,snappy:Oi,soap:Vi,sockets:Ti,sodium:Mi,spx:Gi,sqlite3:Xi,sqlsrv:Hi,ssh2:Ri,swoole:Fi,"swoole-hook-mysql":{support:{Windows:"no",BSD:"wip"},notes:!0,type:"addon","arg-type":"none","ext-depends":["mysqlnd","pdo","pdo_mysql","swoole"],"ext-suggests":["mysqli"]},"swoole-hook-pgsql":{support:{Windows:"no",BSD:"wip",Darwin:"partial"},notes:!0,type:"addon","arg-type":"none","ext-depends":["pgsql","pdo","swoole"]},"swoole-hook-sqlite":{support:{Windows:"no",BSD:"wip"},notes:!0,type:"addon","arg-type":"none","ext-depends":["sqlite3","pdo","swoole"]},"swoole-hook-odbc":{support:{Windows:"no",BSD:"wip"},notes:!0,type:"addon","arg-type":"none","ext-depends":["pdo","swoole"],"lib-depends":["unixodbc"]},swow:Zi,sysvmsg:Qi,sysvsem:Ki,sysvshm:Yi,tidy:Ji,tokenizer:_i,uuid:es,uv:is,xdebug:ss,xhprof:ts,xlswriter:ls,xml:ns,xmlreader:os,xmlwriter:as,xsl:ds,xz:us,yac:ps,yaml:cs,zip:rs,zlib:bs,zstd:ws},xs={type:"root",source:"php-src","lib-depends":["lib-base","micro"],"lib-suggests-linux":["libacl","brotli","watcher"],"lib-suggests-unix":["brotli","watcher"]},ms={type:"target",source:"micro"},hs={source:"attr","static-libs-unix":["libattr.a"]},vs={source:"brotli","pkg-configs":["libbrotlicommon","libbrotlidec","libbrotlienc"],"static-libs-windows":["brotlicommon.lib","brotlienc.lib","brotlidec.lib"],headers:["brotli"]},ys={source:"bzip2","static-libs-unix":["libbz2.a"],"static-libs-windows":["libbz2.lib","libbz2_a.lib"],headers:["bzlib.h"]},fs={source:"curl","static-libs-unix":["libcurl.a"],"static-libs-windows":["libcurl_a.lib"],headers:["curl"],"lib-depends-unix":["openssl","zlib"],"lib-depends-windows":["zlib","libssh2","nghttp2"],"lib-suggests-unix":["libssh2","brotli","nghttp2","nghttp3","ngtcp2","zstd","libcares","ldap"],"lib-suggests-windows":["brotli","zstd"],frameworks:["CoreFoundation","CoreServices","SystemConfiguration"]},zs={source:"fastlz","static-libs-unix":["libfastlz.a"],headers:["fastlz/fastlz.h"]},ks={source:"freetype","static-libs-unix":["libfreetype.a"],"static-libs-windows":["libfreetype_a.lib"],"headers-unix":["freetype2/freetype/freetype.h","freetype2/ft2build.h"],"lib-depends":["zlib"],"lib-suggests":["libpng","bzip2","brotli"]},Ss={source:"gettext","static-libs-unix":["libintl.a"],"lib-depends":["libiconv"],"lib-suggests":["ncurses","libxml2"],frameworks:["CoreFoundation"]},Ds={source:"ext-glfw","static-libs-unix":["libglfw3.a"],frameworks:["CoreVideo","OpenGL","Cocoa","IOKit"]},Bs={source:"gmp","static-libs-unix":["libgmp.a"],"static-libs-windows":["libgmp.lib"],headers:["gmp.h"]},Cs={source:"gmssl","static-libs-unix":["libgmssl.a"],"static-libs-windows":["gmssl.lib"],frameworks:["Security"]},qs={source:"grpc","pkg-configs":["grpc"],"lib-depends":["zlib","openssl","libcares"],"provide-pre-built":!0,frameworks:["CoreFoundation"]},Es={source:"icu","cpp-library":!0,"pkg-configs":["icu-uc","icu-i18n","icu-io"]},$s={source:"imagemagick","pkg-configs":["Magick++-7.Q16HDRI","MagickCore-7.Q16HDRI","MagickWand-7.Q16HDRI"],"lib-depends":["zlib","libjpeg","libjxl","libpng","libwebp","freetype","libtiff","libheif","bzip2"],"lib-suggests":["zstd","xz","libzip","libxml2"]},Ws={source:"imap","static-libs-unix":["libc-client.a"],"lib-suggests":["openssl"]},Ps={source:"jbig","static-libs-unix":["libjbig.a","libjbig85.a"],headers:["jbig.h","jbig85.h","jbig_ar.h"]},Is={source:"ldap","pkg-configs":["ldap","lber"],"lib-depends":["openssl","zlib","gmp","libsodium"]},Ls={source:"lerc","static-libs-unix":["libLerc.a"],"cpp-library":!0},Us={source:"libacl","static-libs-unix":["libacl.a"],"lib-depends":["attr"]},js={source:"libaom","static-libs-unix":["libaom.a"],"cpp-library":!0},As={source:"libargon2","static-libs-unix":["libargon2.a"]},Ns={source:"libavif","static-libs-unix":["libavif.a"],"static-libs-windows":["avif.lib"]},Os={source:"libcares","static-libs-unix":["libcares.a"],"headers-unix":["ares.h","ares_dns.h","ares_nameser.h"]},Vs={source:"libde265","static-libs-unix":["libde265.a"],"cpp-library":!0},Ts={source:"libevent","static-libs-unix":["libevent.a","libevent_core.a","libevent_extra.a","libevent_openssl.a"],"lib-depends":["openssl"]},Ms={source:"libffi","static-libs-unix":["libffi.a"],"static-libs-windows":["libffi.lib"],"headers-unix":["ffi.h","ffitarget.h"],"headers-windows":["ffi.h","fficonfig.h","ffitarget.h"]},Gs={source:"libheif","static-libs-unix":["libheif.a"],"lib-depends":["libde265","libwebp","libaom","zlib","brotli"]},Xs={source:"libiconv","static-libs-unix":["libiconv.a","libcharset.a"],headers:["iconv.h","libcharset.h","localcharset.h"]},Hs={source:"libjpeg","static-libs-unix":["libjpeg.a","libturbojpeg.a"],"static-libs-windows":["libjpeg_a.lib"],"lib-suggests-windows":["zlib"]},Rs={source:"libjxl","pkg-configs":["libjxl","libjxl_cms","libjxl_threads","libhwy"],"lib-depends":["brotli","libjpeg","libpng","libwebp"]},Fs={source:"liblz4","static-libs-unix":["liblz4.a"]},Zs={source:"libmemcached","static-libs-unix":["libmemcached.a","libmemcachedprotocol.a","libmemcachedutil.a","libhashkit.a"]},Qs={source:"libpng","static-libs-unix":["libpng16.a"],"static-libs-windows":["libpng16_static.lib","libpng_a.lib"],"headers-unix":["png.h","pngconf.h","pnglibconf.h"],"headers-windows":["png.h","pngconf.h"],"lib-depends":["zlib"]},Ks={source:"librabbitmq","static-libs-unix":["librabbitmq.a"],"static-libs-windows":["rabbitmq.4.lib"],"lib-depends":["openssl"]},Ys={source:"librdkafka","static-libs-unix":["librdkafka.a","librdkafka++.a","librdkafka-static.a"],"cpp-library":!0,"lib-suggests":["zstd"]},Js={source:"libsodium","static-libs-unix":["libsodium.a"],"static-libs-windows":["libsodium.lib"]},_s={source:"libssh2","static-libs-unix":["libssh2.a"],"static-libs-windows":["libssh2.lib"],headers:["libssh2.h","libssh2_publickey.h","libssh2_sftp.h"],"lib-depends":["openssl"]},et={source:"libtiff","static-libs-unix":["libtiff.a"],"lib-depends":["zlib","libjpeg"],"lib-suggests-unix":["lerc","libwebp","jbig","xz","zstd"]},it={source:"libuuid","static-libs-unix":["libuuid.a"],headers:["uuid/uuid.h"]},st={source:"libuv","static-libs-unix":["libuv.a"]},tt={source:"libwebp","pkg-configs":["libwebp","libwebpdecoder","libwebpdemux","libwebpmux","libsharpyuv"],"static-libs-windows":["libwebp.lib","libwebpdecoder.lib","libwebpdemux.lib","libsharpyuv.lib"]},lt={source:"libxml2","static-libs-unix":["libxml2.a"],"static-libs-windows":["libxml2s.lib","libxml2_a.lib"],headers:["libxml2"],"lib-depends-unix":["libiconv"],"lib-suggests-unix":["xz","icu","zlib"],"lib-depends-windows":["libiconv-win"],"lib-suggests-windows":["zlib"]},nt={source:"libxslt","static-libs-unix":["libxslt.a","libexslt.a"],"lib-depends":["libxml2"]},ot={source:"libyaml","static-libs-unix":["libyaml.a"],"static-libs-windows":["yaml.lib"],headers:["yaml.h"]},at={source:"libzip","static-libs-unix":["libzip.a"],"static-libs-windows":["zip.lib","libzip_a.lib"],headers:["zip.h","zipconf.h"],"lib-depends-unix":["zlib"],"lib-suggests-unix":["bzip2","xz","zstd","openssl"],"lib-depends-windows":["zlib","bzip2","xz"],"lib-suggests-windows":["zstd","openssl"]},dt={source:"mimalloc","static-libs-unix":["libmimalloc.a"]},ut={source:"ncurses","static-libs-unix":["libncurses.a"]},pt={source:"nghttp2","static-libs-unix":["libnghttp2.a"],"static-libs-windows":["nghttp2.lib"],headers:["nghttp2"],"lib-depends":["zlib","openssl"],"lib-suggests":["libxml2","nghttp3","ngtcp2"]},ct={source:"nghttp3","static-libs-unix":["libnghttp3.a"],"static-libs-windows":["nghttp3.lib"],headers:["nghttp3"],"lib-depends":["openssl"]},rt={source:"ngtcp2","static-libs-unix":["libngtcp2.a","libngtcp2_crypto_ossl.a"],"static-libs-windows":["ngtcp2.lib","ngtcp2_crypto_ossl.lib"],headers:["ngtcp2"],"lib-depends":["openssl"],"lib-suggests":["nghttp3","brotli"]},bt={source:"onig","static-libs-unix":["libonig.a"],"static-libs-windows":["onig.lib","onig_a.lib"],headers:["oniggnu.h","oniguruma.h"]},wt={source:"openssl","static-libs-unix":["libssl.a","libcrypto.a"],"static-libs-windows":["libssl.lib","libcrypto.lib"],headers:["openssl"],"lib-depends":["zlib"]},gt={source:"postgresql","pkg-configs":["libpq"],"lib-depends":["libiconv","libxml2","openssl","zlib","readline"],"lib-suggests":["icu","libxslt","ldap","zstd"]},xt={source:"pthreads4w","static-libs-windows":["libpthreadVC3.lib"]},mt={source:"qdbm","static-libs-unix":["libqdbm.a"],"static-libs-windows":["qdbm_a.lib"],"headers-windows":["depot.h"]},ht={source:"re2c","bin-unix":["re2c"]},vt={source:"readline","static-libs-unix":["libreadline.a"],"lib-depends":["ncurses"]},yt={source:"snappy","static-libs-unix":["libsnappy.a"],"headers-unix":["snappy.h","snappy-c.h","snappy-sinksource.h","snappy-stubs-public.h"],"lib-depends":["zlib"]},ft={source:"sqlite","static-libs-unix":["libsqlite3.a"],"static-libs-windows":["libsqlite3_a.lib"],headers:["sqlite3.h","sqlite3ext.h"]},zt={source:"tidy","static-libs-unix":["libtidy.a"]},kt={source:"unixodbc","static-libs-unix":["libodbc.a","libodbccr.a","libodbcinst.a"],"lib-depends":["libiconv"]},St={source:"watcher","static-libs-unix":["libwatcher-c.a"],headers:["wtr/watcher-c.h"]},Dt={source:"xz","static-libs-unix":["liblzma.a"],"static-libs-windows":["lzma.lib","liblzma_a.lib"],"headers-unix":["lzma"],"headers-windows":["lzma","lzma.h"],"lib-depends-unix":["libiconv"]},Bt={source:"zlib","static-libs-unix":["libz.a"],"static-libs-windows":["zlib_a.lib"],headers:["zlib.h","zconf.h"]},Ct={source:"zstd","static-libs-unix":["libzstd.a"],"static-libs-windows":[["zstd.lib","zstd_static.lib"]],"headers-unix":["zdict.h","zstd.h","zstd_errors.h"],"headers-windows":["zstd.h","zstd_errors.h"]},qt={source:"liburing","pkg-configs":["liburing","liburing-ffi"],"static-libs-linux":["liburing.a","liburing-ffi.a"],"headers-linux":["liburing/","liburing.h"]},Et={"lib-base":{type:"root","lib-depends-unix":["pkg-config"]},php:xs,micro:ms,"pkg-config":{type:"package",source:"pkg-config","bin-unix":["pkg-config"]},attr:hs,brotli:vs,bzip2:ys,curl:fs,fastlz:zs,freetype:ks,gettext:Ss,glfw:Ds,gmp:Bs,gmssl:Cs,grpc:qs,icu:Es,"icu-static-win":{source:"icu-static-win","static-libs-windows":["icudt.lib","icuin.lib","icuio.lib","icuuc.lib"],"headers-windows":["unicode"]},imagemagick:$s,imap:Ws,jbig:Ps,ldap:Is,lerc:Ls,libacl:Us,libaom:js,libargon2:As,libavif:Ns,libcares:Os,libde265:Vs,libevent:Ts,libffi:Ms,"libffi-win":{source:"libffi-win","static-libs-windows":["libffi.lib"],"headers-windows":["ffi.h","ffitarget.h","fficonfig.h"]},libheif:Gs,libiconv:Xs,"libiconv-win":{source:"libiconv-win","static-libs-windows":["libiconv.lib","libiconv_a.lib"]},libjpeg:Hs,libjxl:Rs,liblz4:Fs,libmemcached:Zs,libpng:Qs,librabbitmq:Ks,librdkafka:Ys,libsodium:Js,libssh2:_s,libtiff:et,libuuid:it,libuv:st,libwebp:tt,libxml2:lt,libxslt:nt,libyaml:ot,libzip:at,mimalloc:dt,ncurses:ut,nghttp2:pt,nghttp3:ct,ngtcp2:rt,onig:bt,openssl:wt,postgresql:gt,"postgresql-win":{source:"postgresql-win","static-libs":["libpq.lib","libpgport.lib","libpgcommon.lib"]},pthreads4w:xt,qdbm:mt,re2c:ht,readline:vt,snappy:yt,sqlite:ft,tidy:zt,unixodbc:kt,watcher:St,xz:Dt,zlib:Bt,zstd:Ct,liburing:qt};function j(i,o,d,p){return i.os==="linux"?i[o][d][p+"-linux"]??i[o][d][p+"-unix"]??i[o][d][p]??[]:i.os==="macos"?i[o][d][p+"-macos"]??i[o][d][p+"-unix"]??i[o][d][p]??[]:i.os==="windows"?i[o][d][p+"-windows"]??i[o][d][p]??[]:[]}function ue(i,o){return j(i,"ext",o,"ext-depends")}function $t(i,o){return j(i,"ext",o,"ext-suggests")}function Wt(i,o){return j(i,"ext",o,"lib-depends")}function Pt(i,o){return j(i,"ext",o,"lib-suggests")}function pe(i,o){return j(i,"lib",o,"lib-depends")}function It(i,o){return j(i,"lib",o,"lib-suggests")}function Lt(i,o){const d=[],p=new Set,u=[];o.forEach(D=>{p.has(D)||At(i,D,p,d)});const h=[];return d.forEach(D=>{o.indexOf(D)===-1&&u.push(D),[...Wt(i,D),...Pt(i,D)].forEach(v=>{h.indexOf(v)===-1&&h.push(v)})}),{exts:d,libs:Ut(i,h),notIncludedExts:u}}function Ut(i,o){const d=[],p=new Set;return o.forEach(u=>{p.has(u)||(console.log("before visited"),console.log(p),jt(i,u,p,d),console.log("after visited"),console.log(p))}),d}function jt(i,o,d,p){if(d.has(o))return;d.add(o),[...pe(i,o),...It(i,o)].forEach(h=>{ce(i,h,d,p)}),p.push(o)}function ce(i,o,d,p){d.has(o)||(d.add(o),pe(i,o).forEach(u=>{ce(i,u,d,p)}),p.push(o))}function re(i,o,d,p){d.has(d)||(d.add(o),ue(i,o).forEach(u=>{re(i,u,d,p)}),p.push(o))}function At(i,o,d,p){if(d.has(o))return;d.add(o),[...ue(i,o),...$t(i,o)].forEach(h=>{re(i,h,d,p)}),p.push(o)}const Nt={class:"option-line"},Ot=["id","value","disabled"],Vt=["for"],Tt={class:"option-line"},Mt=["disabled"],Gt={class:"box"},Xt=["placeholder"],Ht=["id","value","disabled"],Rt=["for"],Ft={style:{color:"orangered","font-weight":"bolder"}},Zt={class:"details custom-block",open:""},Qt={class:"box"},Kt=["id","value","disabled"],Yt=["for"],Jt={class:"tip custom-block"},_t={class:"box"},el=["id","value"],il=["for"],sl={key:2,class:"warning custom-block"},tl={key:3,class:"warning custom-block"},ll={value:"native"},nl={value:"spc"},ol={key:0,value:"docker"},al=["value"],dl={for:"debug-yes"},ul={for:"debug-no"},pl={for:"zts-yes"},cl={for:"zts-no"},rl={for:"show-download-yes"},bl={for:"show-download-no"},wl={for:"pre-built-yes"},gl={for:"pre-built-no"},xl={key:0},ml={for:"upx-yes"},hl={for:"upx-no"},vl=["placeholder"],yl={key:4,class:"command-container"},fl={key:0,class:"command-preview"},zl={class:"command-content"},kl={key:1},Sl={class:"warning custom-block"},Dl={key:5,class:"command-container"},Bl={class:"command-preview"},Cl={class:"command-content"},ql={key:6,class:"command-container"},El={class:"command-preview"},$l={class:"command-content"},Wl={key:7,class:"command-container"},Pl={class:"command-preview"},Il={class:"command-content"},Ll={class:"command-container"},Ul={class:"command-preview"},jl={class:"command-content"},Al={class:"command-container"},Nl={class:"command-preview"},Ol={class:"command-content"},Vl={class:"command-container"},Tl={class:"command-preview pre"},Ml={class:"command-content"},Gl={name:"CliGenerator"},Xl=fe({...Gl,props:{lang:{type:String,default:"zh"}},setup(i){const o=new Map([["linux","Linux"],["macos","Darwin"],["windows","Windows"]]),d=["cli","fpm","micro","embed","frankenphp","all"],p=["8.0","8.1","8.2","8.3","8.4","8.5"],u=w(gs),h=w(Et),D=w([]),C=w(""),v=w([]),q=w([]),H=w([]),M=w([]),z=w(["cli"]),G=w("spc"),L=w("8.4"),r=w("linux"),X=w("x86_64"),B=w(0),U=w(0),A=w(1),W=w(1),E=w(0),R=w(""),ne=w("--build-cli"),y=w({spcDownload:!1,downloadExt:!1,downloadAll:!1,downloadPkg:!1,build:!1,craft:!1,doctor:!1}),be=[{os:"linux",label:"Linux",disabled:!1},{os:"macos",label:"macOS",disabled:!1},{os:"windows",label:"Windows",disabled:!1}],oe=k(()=>Object.entries(u.value).filter(([a])=>ge(a,r.value)).map(([a])=>a)),F=k(()=>v.value.join(",")),Z=k(()=>{const a=q.value.filter(t=>M.value.indexOf(t)===-1);return a.length>0?` --with-libs="${a.join(",")}"`:""}),N=k(()=>{switch(G.value){case"native":return"bin/spc";case"spc":return r.value==="windows"?".\\spc.exe":"./spc";case"docker":return"bin/spc-alpine-docker";default:return""}}),Q=k(()=>r.value==="windows"?"":`curl -fsSL -o spc.tgz https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-${r.value}-${X.value}.tar.gz && tar -zxvf spc.tgz && rm spc.tgz`),we=k(()=>{const t=R.value.split(` +`).filter(s=>s.indexOf("=")>=1);return t.length>0?" "+t.map(s=>`-I "${s}"`).join(" "):""}),K=k(()=>`${N.value} download --all --with-php=${L.value}${W.value?" --prefer-pre-built":""}${B.value?" --debug":""}`),Y=k(()=>`${N.value} download --with-php=${L.value} --for-extensions "${F.value}"${W.value?" --prefer-pre-built":""}${B.value?" --debug":""}`),J=k(()=>`${N.value} install-pkg upx${B.value?" --debug":""}`),_=k(()=>`${N.value} doctor --auto-fix${B.value?" --debug":""}`),ee=k(()=>`${N.value} build ${ne.value} "${F.value}"${Z.value}${B.value?" --debug":""}${U.value?" --enable-zts":""}${E.value?" --with-upx-pack":""}${we.value}`),ie=k(()=>{let a=`php-version: ${L.value} +`;return a+=`extensions: "${F.value}" +`,z.value.join(",")==="all"?a+="sapi: "+["cli","fpm","micro","embed","frankenphp"].join(",")+` +`:a+=`sapi: ${z.value.join(",")} +`,Z.value&&(a+=`libs: ${Z.value.replace('--with-libs="',"").replace('"',"").trim()} +`),B.value&&(a+=`debug: true +`),a+="{{position_hold}}",E.value&&(a+=` with-upx-pack: true +`),U.value&&(a+=` enable-zts: true +`),W.value&&(a+=` prefer-pre-built: true +`),a.endsWith("{{position_hold}}")?a=a.replace("{{position_hold}}",""):a=a.replace("{{position_hold}}",`build-options: +`),a}),ge=(a,t)=>{const s=o.get(t),b=u.value[a]?.support?.[s]??"yes";return b==="yes"||b==="partial"},xe=()=>{v.value=["apcu","bcmath","calendar","ctype","curl","dba","dom","exif","filter","fileinfo","gd","iconv","intl","mbstring","mbregex","mysqli","mysqlnd","openssl","opcache","pcntl","pdo","pdo_mysql","pdo_sqlite","pdo_pgsql","pgsql","phar","posix","readline","redis","session","simplexml","sockets","sodium","sqlite3","tokenizer","xml","xmlreader","xmlwriter","xsl","zip","zlib"]},me=()=>{v.value=[...oe.value]},he=a=>{if(a.target.value==="all")z.value=["all"];else{const s=z.value.indexOf("all");s!==-1&&z.value.splice(s,1)}ne.value=z.value.map(s=>`--build-${s}`).join(" ")},se=(a,t)=>{if(!C.value||!a.includes(C.value))return t===0?a:"";const s=a.indexOf(C.value);switch(t){case 0:return a.substring(0,s);case 1:return C.value;case 2:return a.substring(s+C.value.length);default:return""}},P=async a=>{try{await navigator.clipboard.writeText(a);const s={[Q.value]:"spcDownload",[Y.value]:"downloadExt",[K.value]:"downloadAll",[J.value]:"downloadPkg",[_.value]:"doctor",[ee.value]:"build",[ie.value]:"craft"}[a];s&&(y.value[s]=!0,setTimeout(()=>{y.value[s]=!1},2e3))}catch(t){console.error("Failed to copy text: ",t);const s=document.createElement("textarea");s.value=a,document.body.appendChild(s),s.select(),document.execCommand("copy"),document.body.removeChild(s)}},ve=a=>{const t=new Set,s=b=>{let c=[];r.value==="linux"?c=u.value[b]?.["ext-depends-linux"]??u.value[b]?.["ext-depends-unix"]??u.value[b]?.["ext-depends"]??[]:r.value==="macos"?c=u.value[b]?.["ext-depends-macos"]??u.value[b]?.["ext-depends-unix"]??u.value[b]?.["ext-depends"]??[]:r.value==="windows"&&(c=u.value[b]?.["ext-depends-windows"]??u.value[b]?.["ext-depends"]??[]),c.length!==0&&c.forEach(f=>{t.add(f),s(f)})};return a.forEach(s),Array.from(t)},ye=a=>{const t=new Set,s=c=>{let f=[];r.value==="linux"?f=h.value[c]?.["lib-depends-linux"]??h.value[c]?.["lib-depends-unix"]??h.value[c]?.["lib-depends"]??[]:r.value==="macos"?f=h.value[c]?.["lib-depends-macos"]??h.value[c]?.["lib-depends-unix"]??h.value[c]?.["lib-depends"]??[]:r.value==="windows"&&(f=h.value[c]?.["lib-depends-windows"]??h.value[c]?.["lib-depends"]??[]),f.length!==0&&f.forEach(O=>{t.add(O),s(O)})},b=c=>{let f=[];r.value==="linux"?f=u.value[c]?.["lib-depends-linux"]??u.value[c]?.["lib-depends-unix"]??u.value[c]?.["lib-depends"]??[]:r.value==="macos"?f=u.value[c]?.["lib-depends-macos"]??u.value[c]?.["lib-depends-unix"]??u.value[c]?.["lib-depends"]??[]:r.value==="windows"&&(f=u.value[c]?.["lib-depends-windows"]??u.value[c]?.["lib-depends"]??[]),f.length!==0&&f.forEach(O=>{t.add(O),s(O)})};return a.forEach(b),Array.from(t)};ae(r,()=>{r.value==="windows"&&(X.value="x86_64"),v.value=[],E.value=0}),ae(v,a=>{H.value=ve(a),H.value.forEach(s=>{v.value.indexOf(s)===-1&&v.value.push(s)}),v.value.sort();const t=Lt({ext:u.value,lib:h.value,os:r.value},v.value);D.value=t.libs.sort(),q.value=[],M.value=ye(t.exts),M.value.forEach(s=>{q.value.indexOf(s)===-1&&q.value.push(s)})},{deep:!0});const n={zh:{selectExt:"选择扩展",buildTarget:"选择编译目标",buildOptions:"编译选项",buildEnvironment:"编译环境",buildEnvNative:"本地构建(Git 源码)",buildEnvSpc:"本地构建(独立 spc 二进制)",buildEnvDocker:"Alpine Docker 构建",useDebug:"是否开启调试输出",yes:"是",no:"否",resultShow:"结果展示",selectCommon:"选择常用扩展",selectAll:"选择全部",selectNone:"全部取消选择",useZTS:"是否编译线程安全版",hardcodedINI:"硬编码 INI 选项",hardcodedINIPlacehoder:"如需要硬编码 ini,每行写一个,例如:memory_limit=2G",resultShowDownload:"是否展示仅下载对应扩展依赖的命令",downloadExtOnlyCommand:"只下载对应扩展的依赖包命令",downloadAllCommand:"下载所有依赖包命令",downloadUPXCommand:"下载 UPX 命令",compileCommand:"编译命令",downloadPhpVersion:"下载 PHP 版本",downloadSPCBinaryCommand:"下载 spc 二进制命令",selectedArch:"选择系统架构",selectedSystem:"选择操作系统",buildLibs:"要构建的库",depTips:"选择扩展后,不可选中的项目为必需的依赖,编译的依赖库列表中可选的为现有扩展和依赖库的可选依赖。选择可选依赖后,将生成 --with-libs 参数。",depTips2:"无法同时构建所有扩展,因为有些扩展之间相互冲突。请根据需要选择扩展。",microUnavailable:"micro 不支持 PHP 7.4 及更早版本!",windowsSAPIUnavailable:"Windows 目前不支持 fpm、embed、frankenphp 构建!",useUPX:"是否开启 UPX 压缩(减小二进制体积)",windowsDownSPCWarning:"Windows 下请手动下载 spc.exe 二进制文件,解压到当前目录并重命名为 spc.exe!",usePreBuilt:"如果可能,下载预编译的依赖库(减少编译时间)",searchPlaceholder:"搜索扩展...",copy:"复制",copied:"已复制",doctorCommand:"自动检查和准备构建环境命令"},en:{selectExt:"Select Extensions",buildTarget:"Build Target",buildOptions:"Build Options",buildEnvironment:"Build Environment",buildEnvNative:"Native build (Git source code)",buildEnvSpc:"Native build (standalone spc binary)",buildEnvDocker:"Alpine docker build",useDebug:"Enable debug message",yes:"Yes",no:"No",resultShow:"Result",selectCommon:"Select common extensions",selectAll:"Select all",selectNone:"Unselect all",useZTS:"Enable ZTS",hardcodedINI:"Hardcoded INI options",hardcodedINIPlacehoder:"If you need to hardcode ini, write one per line, for example: memory_limit=2G",resultShowDownload:"Download with corresponding extension dependencies",downloadExtOnlyCommand:"Download sources by extensions command",downloadAllCommand:"Download all sources command",downloadUPXCommand:"Download UPX command",compileCommand:"Compile command",downloadPhpVersion:"Download PHP version",downloadSPCBinaryCommand:"Download spc binary command",selectedArch:"Select build architecture",selectedSystem:"Select Build OS",buildLibs:"Select Dependencies",depTips:"After selecting the extensions, the unselectable items are essential dependencies. In the compiled dependencies list, optional dependencies consist of existing extensions and optional dependencies of libraries. Optional dependencies will be added in --with-libs parameter.",depTips2:"It is not possible to build all extensions at the same time, as some extensions conflict with each other. Please select the extensions you need.",microUnavailable:"Micro does not support PHP 7.4 and earlier versions!",windowsSAPIUnavailable:"Windows does not support fpm, embed and frankenphp build!",useUPX:"Enable UPX compression (reduce binary size)",windowsDownSPCWarning:"Please download the binary file manually, extract it to the current directory and rename to spc.exe on Windows!",usePreBuilt:"Download pre-built dependencies if possible (reduce compile time)",searchPlaceholder:"Search extensions...",copy:"Copy",copied:"Copied",doctorCommand:"Auto-check and prepare build environment command"}};return(a,t)=>(x(),g("div",null,[e("h2",null,l(n[i.lang].selectedSystem),1),e("div",Nt,[(x(),g(V,null,T(be,(s,b)=>e("span",{key:b,style:{"margin-right":"8px"}},[m(e("input",{type:"radio",id:"os-"+s.os,value:s.os,disabled:s.disabled===!0,"onUpdate:modelValue":t[0]||(t[0]=c=>r.value=c)},null,8,Ot),[[S,r.value]]),e("label",{for:"os-"+s.os},l(s.label),9,Vt)])),64))]),e("div",Tt,[m(e("select",{"onUpdate:modelValue":t[1]||(t[1]=s=>X.value=s)},[t[27]||(t[27]=e("option",{value:"x86_64"},"x86_64",-1)),e("option",{value:"aarch64",disabled:r.value==="windows"},"aarch64",8,Mt)],512),[[te,X.value]])]),e("h2",null,l(n[i.lang].selectExt)+l(v.value.length>0?" ("+v.value.length+")":""),1),e("div",Gt,[m(e("input",{class:"input","onUpdate:modelValue":t[2]||(t[2]=s=>C.value=s),placeholder:n[i.lang].searchPlaceholder},null,8,Xt),[[de,C.value]]),t[28]||(t[28]=e("br",null,null,-1)),(x(!0),g(V,null,T(oe.value,s=>(x(),g("div",{key:s,class:"ext-item"},[e("span",null,[m(e("input",{type:"checkbox",id:s,value:s,"onUpdate:modelValue":t[3]||(t[3]=b=>v.value=b),disabled:H.value.indexOf(s)!==-1},null,8,Ht),[[le,v.value]]),e("label",{for:s},[e("span",null,l(se(s,0)),1),e("span",Ft,l(se(s,1)),1),e("span",null,l(se(s,2)),1)],8,Rt)])]))),128))]),r.value!=="windows"?(x(),g("div",{key:0,class:"my-btn",onClick:xe},l(n[i.lang].selectCommon),1)):$("",!0),r.value!=="windows"?(x(),g("div",{key:1,class:"my-btn",onClick:me},l(n[i.lang].selectAll),1)):$("",!0),e("div",{class:"my-btn",onClick:t[4]||(t[4]=s=>v.value=[])},l(n[i.lang].selectNone),1),e("details",Zt,[e("summary",null,l(n[i.lang].buildLibs)+l(q.value.length>0?" ("+q.value.length+")":""),1),e("div",Qt,[(x(!0),g(V,null,T(D.value,(s,b)=>(x(),g("div",{key:b,class:"ext-item"},[m(e("input",{type:"checkbox",id:b,value:s,"onUpdate:modelValue":t[5]||(t[5]=c=>q.value=c),disabled:M.value.indexOf(s)!==-1},null,8,Kt),[[le,q.value]]),e("label",{for:b},l(s),9,Yt)]))),128))])]),e("div",Jt,[t[29]||(t[29]=e("p",{class:"custom-block-title"},"TIP",-1)),e("p",null,l(n[i.lang].depTips),1),e("p",null,l(n[i.lang].depTips2),1)]),e("h2",null,l(n[i.lang].buildTarget),1),e("div",_t,[(x(),g(V,null,T(d,s=>e("div",{key:s,class:"ext-item"},[m(e("input",{type:"checkbox",id:"build_"+s,value:s,"onUpdate:modelValue":t[6]||(t[6]=b=>z.value=b),onChange:he},null,40,el),[[le,z.value]]),e("label",{for:"build_"+s},l(s),9,il)])),64))]),L.value==="7.4"&&(z.value.indexOf("micro")!==-1||z.value.indexOf("all")!==-1)?(x(),g("div",sl,[t[30]||(t[30]=e("p",{class:"custom-block-title"},"WARNING",-1)),e("p",null,l(n[i.lang].microUnavailable),1)])):$("",!0),r.value==="windows"&&(z.value.indexOf("fpm")!==-1||z.value.indexOf("embed")!==-1||z.value.indexOf("frankenphp")!==-1)?(x(),g("div",tl,[t[31]||(t[31]=e("p",{class:"custom-block-title"},"WARNING",-1)),e("p",null,l(n[i.lang].windowsSAPIUnavailable),1)])):$("",!0),e("h2",null,l(n[i.lang].buildOptions),1),e("table",null,[e("tr",null,[e("td",null,l(n[i.lang].buildEnvironment),1),e("td",null,[m(e("select",{"onUpdate:modelValue":t[7]||(t[7]=s=>G.value=s)},[e("option",ll,l(n[i.lang].buildEnvNative),1),e("option",nl,l(n[i.lang].buildEnvSpc),1),r.value!=="windows"?(x(),g("option",ol,l(n[i.lang].buildEnvDocker),1)):$("",!0)],512),[[te,G.value]])])]),e("tr",null,[e("td",null,l(n[i.lang].downloadPhpVersion),1),e("td",null,[m(e("select",{"onUpdate:modelValue":t[8]||(t[8]=s=>L.value=s)},[(x(),g(V,null,T(p,s=>e("option",{key:s,value:s},l(s),9,al)),64))],512),[[te,L.value]])])]),e("tr",null,[e("td",null,l(n[i.lang].useDebug),1),e("td",null,[m(e("input",{type:"radio",id:"debug-yes",value:1,"onUpdate:modelValue":t[9]||(t[9]=s=>B.value=s)},null,512),[[S,B.value]]),e("label",dl,l(n[i.lang].yes),1),m(e("input",{type:"radio",id:"debug-no",value:0,"onUpdate:modelValue":t[10]||(t[10]=s=>B.value=s)},null,512),[[S,B.value]]),e("label",ul,l(n[i.lang].no),1)])]),e("tr",null,[e("td",null,l(n[i.lang].useZTS),1),e("td",null,[m(e("input",{type:"radio",id:"zts-yes",value:1,"onUpdate:modelValue":t[11]||(t[11]=s=>U.value=s)},null,512),[[S,U.value]]),e("label",pl,l(n[i.lang].yes),1),m(e("input",{type:"radio",id:"zts-no",value:0,"onUpdate:modelValue":t[12]||(t[12]=s=>U.value=s)},null,512),[[S,U.value]]),e("label",cl,l(n[i.lang].no),1)])]),e("tr",null,[e("td",null,l(n[i.lang].resultShowDownload),1),e("td",null,[m(e("input",{type:"radio",id:"show-download-yes",value:1,"onUpdate:modelValue":t[13]||(t[13]=s=>A.value=s)},null,512),[[S,A.value]]),e("label",rl,l(n[i.lang].yes),1),m(e("input",{type:"radio",id:"show-download-no",value:0,"onUpdate:modelValue":t[14]||(t[14]=s=>A.value=s)},null,512),[[S,A.value]]),e("label",bl,l(n[i.lang].no),1)])]),e("tr",null,[e("td",null,l(n[i.lang].usePreBuilt),1),e("td",null,[m(e("input",{type:"radio",id:"pre-built-yes",value:1,"onUpdate:modelValue":t[15]||(t[15]=s=>W.value=s)},null,512),[[S,W.value]]),e("label",wl,l(n[i.lang].yes),1),m(e("input",{type:"radio",id:"pre-built-no",value:0,"onUpdate:modelValue":t[16]||(t[16]=s=>W.value=s)},null,512),[[S,W.value]]),e("label",gl,l(n[i.lang].no),1)])]),r.value!=="macos"?(x(),g("tr",xl,[e("td",null,l(n[i.lang].useUPX),1),e("td",null,[m(e("input",{type:"radio",id:"upx-yes",value:1,"onUpdate:modelValue":t[17]||(t[17]=s=>E.value=s)},null,512),[[S,E.value]]),e("label",ml,l(n[i.lang].yes),1),m(e("input",{type:"radio",id:"upx-no",value:0,"onUpdate:modelValue":t[18]||(t[18]=s=>E.value=s)},null,512),[[S,E.value]]),e("label",hl,l(n[i.lang].no),1)])])):$("",!0)]),e("h2",null,l(n[i.lang].hardcodedINI),1),m(e("textarea",{class:"textarea",placeholder:n[i.lang].hardcodedINIPlacehoder,"onUpdate:modelValue":t[19]||(t[19]=s=>R.value=s),rows:"5"},null,8,vl),[[de,R.value]]),e("h2",null,l(n[i.lang].resultShow),1),G.value==="spc"?(x(),g("div",yl,[e("b",null,l(n[i.lang].downloadSPCBinaryCommand),1),r.value!=="windows"?(x(),g("div",fl,[e("div",zl,l(Q.value),1),e("button",{class:I(["copy-btn",{copied:y.value.spcDownload}]),onClick:t[20]||(t[20]=s=>P(Q.value))},l(y.value.spcDownload?n[i.lang].copied:n[i.lang].copy),3)])):(x(),g("div",kl,[e("div",Sl,[t[32]||(t[32]=e("p",{class:"custom-block-title"},"WARNING",-1)),e("p",null,l(n[i.lang].windowsDownSPCWarning),1),t[33]||(t[33]=e("a",{href:"https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-windows-x64.exe",target:"_blank"},"https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-windows-x64.exe",-1))])]))])):$("",!0),A.value?(x(),g("div",Dl,[e("b",null,l(n[i.lang].downloadExtOnlyCommand),1),e("div",Bl,[e("div",Cl,l(Y.value),1),e("button",{class:I(["copy-btn",{copied:y.value.downloadExt}]),onClick:t[21]||(t[21]=s=>P(Y.value))},l(y.value.downloadExt?n[i.lang].copied:n[i.lang].copy),3)])])):(x(),g("div",ql,[e("b",null,l(n[i.lang].downloadAllCommand),1),e("div",El,[e("div",$l,l(K.value),1),e("button",{class:I(["copy-btn",{copied:y.value.downloadAll}]),onClick:t[22]||(t[22]=s=>P(K.value))},l(y.value.downloadAll?n[i.lang].copied:n[i.lang].copy),3)])])),E.value?(x(),g("div",Wl,[e("b",null,l(n[i.lang].downloadUPXCommand),1),e("div",Pl,[e("div",Il,l(J.value),1),e("button",{class:I(["copy-btn",{copied:y.value.downloadPkg}]),onClick:t[23]||(t[23]=s=>P(J.value))},l(y.value.downloadPkg?n[i.lang].copied:n[i.lang].copy),3)])])):$("",!0),e("div",Ll,[e("b",null,l(n[i.lang].doctorCommand),1),e("div",Ul,[e("div",jl,l(_.value),1),e("button",{class:I(["copy-btn",{copied:y.value.doctor}]),onClick:t[24]||(t[24]=s=>P(_.value))},l(y.value.doctor?n[i.lang].copied:n[i.lang].copy),3)])]),e("div",Al,[e("b",null,l(n[i.lang].compileCommand),1),e("div",Nl,[e("div",Ol,l(ee.value),1),e("button",{class:I(["copy-btn",{copied:y.value.build}]),onClick:t[25]||(t[25]=s=>P(ee.value))},l(y.value.build?n[i.lang].copied:n[i.lang].copy),3)])]),e("div",Vl,[t[34]||(t[34]=e("b",null,"craft.yml",-1)),e("div",Tl,[e("div",Ml,l(ie.value),1),e("button",{class:I(["copy-btn",{copied:y.value.craft}]),onClick:t[26]||(t[26]=s=>P(ie.value))},l(y.value.craft?n[i.lang].copied:n[i.lang].copy),3)])])]))}}),Rl=ze(Xl,[["__scopeId","data-v-9e57994f"]]);export{Rl as C}; diff --git a/assets/chunks/CliGenerator.u1Ew-M_q.js b/assets/chunks/CliGenerator.u1Ew-M_q.js deleted file mode 100644 index fc9e4172..00000000 --- a/assets/chunks/CliGenerator.u1Ew-M_q.js +++ /dev/null @@ -1,12 +0,0 @@ -import{d as Ee,x as w,h as k,z as ge,c as g,o as x,j as e,e as N,ag as m,t as l,G as Z,H as Q,ah as S,ai as ce,aj as xe,ak as re,n as T,_ as $e}from"./framework.PeLcR_tw.js";const We={support:{BSD:"wip"},type:"external","arg-type":"custom",source:"amqp","lib-depends":["librabbitmq"],"ext-depends-windows":["openssl"]},Pe={type:"external",source:"apcu"},Ie={type:"external",source:"ast"},Le={type:"builtin"},Ue={type:"external",source:"ext-brotli","arg-type":"enable","lib-depends":["brotli"]},je={type:"builtin","arg-type-unix":"with-path","arg-type-windows":"with","lib-depends":["bzip2"]},Ae={type:"builtin"},Ne={type:"builtin"},Oe={notes:!0,type:"builtin","arg-type":"with","lib-depends":["curl"],"ext-depends-windows":["zlib","openssl"]},Ve={type:"builtin","arg-type":"custom","lib-suggests":["qdbm"]},Te={support:{BSD:"wip"},type:"external",source:"dio"},Me={support:{BSD:"wip"},type:"builtin","arg-type":"custom","arg-type-windows":"with","lib-depends":["libxml2","zlib"],"ext-depends-windows":["xml"]},Ge={type:"external",source:"ext-ds"},Xe={support:{Windows:"wip",BSD:"wip",Darwin:"wip",Linux:"wip"},type:"wip"},He={type:"external",source:"ev","arg-type-windows":"with","ext-depends":["sockets"]},Re={support:{Windows:"wip",BSD:"wip"},notes:!0,type:"external",source:"ext-event","arg-type":"custom","lib-depends":["libevent"],"ext-depends":["openssl"],"ext-suggests":["sockets"]},Fe={type:"builtin"},Ze={support:{Linux:"partial",BSD:"wip"},notes:!0,"arg-type":"custom",type:"builtin","lib-depends-unix":["libffi"],"lib-depends-windows":["libffi-win"]},Qe={type:"builtin"},Ke={type:"builtin"},Ye={type:"builtin","lib-suggests":["openssl"]},Je={support:{BSD:"wip"},notes:!0,type:"builtin","arg-type":"custom","arg-type-windows":"with","lib-depends":["zlib","libpng"],"ext-depends":["zlib"],"lib-suggests":["libavif","libwebp","libjpeg","freetype"]},_e={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["gettext"]},ei={support:{Windows:"wip",BSD:"no",Linux:"no"},notes:!0,type:"external","arg-type":"custom",source:"ext-glfw","lib-depends":["glfw"],"lib-depends-windows":[]},ii={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["gmp"]},si={support:{BSD:"wip"},type:"external",source:"ext-gmssl","lib-depends":["gmssl"]},ti={support:{Windows:"wip",BSD:"wip"},type:"external",source:"grpc","arg-type-unix":"enable-path","cpp-extension":!0,"lib-depends":["grpc"]},li={support:{BSD:"wip"},type:"builtin","arg-type":"with-path","arg-type-windows":"with","lib-depends-unix":["libiconv"],"lib-depends-windows":["libiconv-win"]},ni={support:{BSD:"wip"},type:"external",source:"igbinary","ext-suggests":["session","apcu"]},oi={support:{Windows:"wip",BSD:"wip"},notes:!0,type:"external",source:"ext-imagick","arg-type":"custom","lib-depends":["imagemagick"]},ai={support:{Windows:"wip",BSD:"wip"},notes:!0,type:"external",source:"ext-imap","arg-type":"custom","lib-depends":["imap"],"ext-suggests":["openssl"]},di={support:{Windows:"no",BSD:"wip",Darwin:"no"},type:"external",source:"inotify"},ui={support:{BSD:"wip"},type:"builtin","lib-depends-unix":["icu"],"lib-depends-windows":["icu-static-win"]},pi={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["ldap"],"lib-suggests":["gmp","libsodium"],"ext-suggests":["openssl"]},ci={support:{BSD:"wip"},type:"builtin","arg-type":"none","ext-depends":["xml"],target:["static"]},ri={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-lz4","arg-type":"custom","lib-depends":["liblz4"]},bi={type:"builtin","arg-type":"custom",target:["static"],"ext-depends":["mbstring"],"lib-depends":["onig"]},wi={type:"builtin","arg-type":"custom"},gi={type:"wip",support:{Windows:"no",BSD:"no",Darwin:"no",Linux:"no"},notes:!0},xi={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-memcache","arg-type":"custom","ext-depends":["zlib","session"],"build-with-php":!0},mi={support:{Windows:"wip",BSD:"wip"},type:"external",source:"memcached","arg-type":"custom","cpp-extension":!0,"lib-depends":["libmemcached"],"lib-depends-unix":["libmemcached","fastlz"],"ext-depends":["session","zlib"]},hi={support:{BSD:"wip",Windows:"wip"},type:"external",source:"mongodb","arg-type":"custom","lib-suggests":["icu","openssl","zstd","zlib"],frameworks:["CoreFoundation","Security"]},vi={support:{BSD:"wip"},type:"external",source:"msgpack","arg-type-unix":"with","arg-type-win":"enable","ext-depends":["session"]},yi={type:"builtin","arg-type":"with","ext-depends":["mysqlnd"]},fi={type:"builtin","arg-type-windows":"with","lib-depends":["zlib"]},zi={type:"wip",support:{Windows:"wip",BSD:"no",Darwin:"no",Linux:"no"},notes:!0},ki={support:{BSD:"wip",Windows:"wip"},type:"builtin","arg-type-unix":"custom","lib-depends-unix":["unixodbc"]},Si={type:"builtin","arg-type-unix":"custom","arg-type-windows":"enable","zend-extension":!0},Di={notes:!0,type:"builtin","arg-type":"custom","arg-type-windows":"with","build-with-php":!0,"lib-depends":["openssl","zlib"],"ext-depends":["zlib"]},Bi={support:{BSD:"wip"},type:"external",source:"opentelemetry"},Ci={support:{BSD:"wip"},notes:!0,type:"external",source:"parallel","arg-type-windows":"with","lib-depends-windows":["pthreads4w"]},qi={support:{Windows:"no"},type:"builtin","unix-only":!0},Ei={type:"builtin"},$i={type:"builtin","arg-type":"with","ext-depends":["pdo","mysqlnd"]},Wi={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends-unix":["unixodbc"],"ext-depends":["pdo","odbc"]},Pi={support:{BSD:"wip"},type:"builtin","arg-type":"with-path","arg-type-windows":"custom","ext-depends":["pdo","pgsql"],"lib-depends-unix":["postgresql"],"lib-depends-windows":["postgresql-win"]},Ii={support:{BSD:"wip"},type:"builtin","arg-type":"with","ext-depends":["pdo","sqlite3"],"lib-depends":["sqlite"]},Li={support:{BSD:"wip"},type:"external",source:"pdo_sqlsrv","arg-type":"with","ext-depends":["pdo","sqlsrv"]},Ui={support:{BSD:"wip"},notes:!0,type:"builtin","arg-type":"custom","lib-depends-unix":["postgresql"],"lib-depends-windows":["postgresql-win"]},ji={type:"builtin","ext-depends":["zlib"]},Ai={support:{Windows:"no"},type:"builtin","unix-only":!0},Ni={support:{Windows:"wip",BSD:"wip"},type:"external",source:"protobuf"},Oi={support:{BSD:"wip",Darwin:"partial"},notes:!0,type:"external",source:"rar","cpp-extension":!0},Vi={support:{BSD:"wip",Windows:"wip"},type:"external",source:"ext-rdkafka","arg-type":"custom","cpp-extension":!0,"lib-depends":["librdkafka"]},Ti={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["readline"],target:["static"]},Mi={support:{BSD:"wip"},type:"external",source:"redis","arg-type":"custom","ext-suggests":["session","igbinary","msgpack"],"lib-suggests-unix":["zstd","liblz4"]},Gi={type:"builtin","build-with-php":!0},Xi={type:"builtin","build-with-php":!0},Hi={type:"external",source:"ext-simdjson","cpp-extension":!0},Ri={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends":["libxml2"],"ext-depends-windows":["xml"],"build-with-php":!0},Fi={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-snappy","cpp-extension":!0,"arg-type":"custom","lib-depends":["snappy"],"ext-suggests":["apcu"]},Zi={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends":["libxml2"],"ext-depends-windows":["xml"]},Qi={type:"builtin"},Ki={support:{BSD:"wip"},type:"builtin","arg-type":"with","lib-depends":["libsodium"]},Yi={support:{BSD:"wip",Windows:"no"},notes:!0,type:"external",source:"spx","arg-type":"custom","lib-depends":["zlib"]},Ji={support:{BSD:"wip"},type:"builtin","arg-type":"with-path","arg-type-windows":"with","lib-depends":["sqlite"]},_i={support:{BSD:"wip"},type:"external",source:"sqlsrv","lib-depends-unix":["unixodbc"],"ext-depends-linux":["pcntl"],"cpp-extension":!0},es={support:{BSD:"wip"},type:"external",source:"ext-ssh2","arg-type":"with-path","arg-type-windows":"with","lib-depends":["libssh2"],"ext-depends":["openssl","zlib"]},is={support:{Windows:"no",BSD:"wip"},notes:!0,type:"external",source:"swoole","arg-type":"custom","cpp-extension":!0,"unix-only":!0,"lib-depends":["libcares","brotli","nghttp2","zlib"],"lib-suggests":["zstd"],"lib-suggests-linux":["zstd","liburing"],"ext-depends":["openssl","curl"],"ext-suggests":["sockets","swoole-hook-pgsql","swoole-hook-mysql","swoole-hook-sqlite","swoole-hook-odbc"]},ss={support:{BSD:"wip"},notes:!0,type:"external",source:"swow","arg-type":"custom","lib-suggests":["openssl","curl"],"ext-suggests":["openssl","curl"]},ts={support:{Windows:"no",BSD:"wip"},type:"builtin","unix-only":!0},ls={support:{Windows:"no",BSD:"wip"},type:"builtin","unix-only":!0},ns={support:{BSD:"wip"},type:"builtin"},os={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["tidy"]},as={type:"builtin","build-with-php":!0},ds={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-uuid","arg-type":"with-path","lib-depends":["libuuid"]},us={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-uv","arg-type":"with-path","lib-depends":["libuv"],"ext-depends":["sockets"]},ps={type:"external",source:"xdebug",target:["shared"],support:{Windows:"wip",BSD:"no",Darwin:"partial",Linux:"partial"},notes:!0,"zend-extension":!0},cs={support:{Windows:"wip",BSD:"wip"},notes:!0,type:"external",source:"xhprof","ext-depends":["ctype"],"build-with-php":!0},rs={support:{BSD:"wip"},type:"external",source:"xlswriter","arg-type":"custom","ext-depends":["zlib","zip"],"lib-suggests":["openssl"]},bs={support:{BSD:"wip"},notes:!0,type:"builtin","arg-type":"custom","arg-type-windows":"with","lib-depends":["libxml2"],"ext-depends-windows":["iconv"],"build-with-php":!0},ws={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends":["libxml2"],"ext-depends-windows":["xml","dom"],"build-with-php":!0},gs={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends":["libxml2"],"ext-depends-windows":["xml"],"build-with-php":!0},xs={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["libxslt"],"ext-depends":["xml","dom"]},ms={type:"external",source:"ext-xz","arg-type":"with","lib-depends":["xz"]},hs={support:{BSD:"wip"},type:"external",source:"yac","arg-type-unix":"custom","lib-depends-unix":["fastlz"],"ext-depends-unix":["igbinary"]},vs={support:{BSD:"wip"},type:"external",source:"yaml","arg-type-unix":"with-path","arg-type-windows":"with","lib-depends":["libyaml"]},ys={support:{BSD:"wip"},type:"builtin","arg-type":"with-path","arg-type-windows":"enable","lib-depends-unix":["libzip"],"ext-depends-windows":["zlib","bz2"],"lib-depends-windows":["libzip","zlib","bzip2","xz"]},fs={type:"builtin","arg-type":"custom","arg-type-windows":"enable","lib-depends":["zlib"],target:["static"]},zs={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-zstd","arg-type":"custom","lib-depends":["zstd"]},ks={amqp:We,apcu:Pe,ast:Ie,bcmath:Le,brotli:Ue,bz2:je,calendar:Ae,ctype:Ne,curl:Oe,dba:Ve,dio:Te,dom:Me,ds:Ge,enchant:Xe,ev:He,event:Re,exif:Fe,ffi:Ze,fileinfo:Qe,filter:Ke,ftp:Ye,gd:Je,gettext:_e,glfw:ei,gmp:ii,gmssl:si,grpc:ti,iconv:li,igbinary:ni,imagick:oi,imap:ai,inotify:di,intl:ui,ldap:pi,libxml:ci,lz4:ri,mbregex:bi,mbstring:wi,mcrypt:gi,memcache:xi,memcached:mi,mongodb:hi,msgpack:vi,mysqli:yi,mysqlnd:fi,oci8:zi,odbc:ki,opcache:Si,openssl:Di,opentelemetry:Bi,parallel:Ci,"password-argon2":{support:{Windows:"wip",BSD:"wip"},notes:!0,type:"builtin","arg-type":"custom","lib-depends":["libargon2","openssl"]},pcntl:qi,pdo:Ei,pdo_mysql:$i,pdo_odbc:Wi,pdo_pgsql:Pi,pdo_sqlite:Ii,pdo_sqlsrv:Li,pgsql:Ui,phar:ji,posix:Ai,protobuf:Ni,rar:Oi,rdkafka:Vi,readline:Ti,redis:Mi,session:Gi,shmop:Xi,simdjson:Hi,simplexml:Ri,snappy:Fi,soap:Zi,sockets:Qi,sodium:Ki,spx:Yi,sqlite3:Ji,sqlsrv:_i,ssh2:es,swoole:is,"swoole-hook-mysql":{support:{Windows:"no",BSD:"wip"},notes:!0,type:"addon","arg-type":"none","ext-depends":["mysqlnd","pdo","pdo_mysql","swoole"],"ext-suggests":["mysqli"]},"swoole-hook-pgsql":{support:{Windows:"no",BSD:"wip",Darwin:"partial"},notes:!0,type:"addon","arg-type":"none","ext-depends":["pgsql","pdo","swoole"]},"swoole-hook-sqlite":{support:{Windows:"no",BSD:"wip"},notes:!0,type:"addon","arg-type":"none","ext-depends":["sqlite3","pdo","swoole"]},"swoole-hook-odbc":{support:{Windows:"no",BSD:"wip"},notes:!0,type:"addon","arg-type":"none","ext-depends":["pdo","swoole"],"lib-depends":["unixodbc"]},swow:ss,sysvmsg:ts,sysvsem:ls,sysvshm:ns,tidy:os,tokenizer:as,uuid:ds,uv:us,xdebug:ps,xhprof:cs,xlswriter:rs,xml:bs,xmlreader:ws,xmlwriter:gs,xsl:xs,xz:ms,yac:hs,yaml:vs,zip:ys,zlib:fs,zstd:zs},Ss={type:"root",source:"php-src","lib-depends":["lib-base","micro"],"lib-suggests-linux":["libacl","brotli","watcher"],"lib-suggests-unix":["brotli","watcher"]},Ds={type:"target",source:"micro"},Bs={source:"attr","static-libs-unix":["libattr.a"]},Cs={source:"brotli","pkg-configs":["libbrotlicommon","libbrotlidec","libbrotlienc"],"static-libs-windows":["brotlicommon.lib","brotlienc.lib","brotlidec.lib"],headers:["brotli"]},qs={source:"bzip2","static-libs-unix":["libbz2.a"],"static-libs-windows":["libbz2.lib","libbz2_a.lib"],headers:["bzlib.h"]},Es={source:"curl","static-libs-unix":["libcurl.a"],"static-libs-windows":["libcurl_a.lib"],headers:["curl"],"lib-depends-unix":["openssl","zlib"],"lib-depends-windows":["zlib","libssh2","nghttp2"],"lib-suggests-unix":["libssh2","brotli","nghttp2","nghttp3","ngtcp2","zstd","libcares","ldap"],"lib-suggests-windows":["brotli","zstd"],frameworks:["CoreFoundation","CoreServices","SystemConfiguration"]},$s={source:"fastlz","static-libs-unix":["libfastlz.a"],headers:["fastlz/fastlz.h"]},Ws={source:"freetype","static-libs-unix":["libfreetype.a"],"static-libs-windows":["libfreetype_a.lib"],"headers-unix":["freetype2/freetype/freetype.h","freetype2/ft2build.h"],"lib-depends":["zlib"],"lib-suggests":["libpng","bzip2","brotli"]},Ps={source:"gettext","static-libs-unix":["libintl.a"],"lib-depends":["libiconv"],"lib-suggests":["ncurses","libxml2"],frameworks:["CoreFoundation"]},Is={source:"ext-glfw","static-libs-unix":["libglfw3.a"],frameworks:["CoreVideo","OpenGL","Cocoa","IOKit"]},Ls={source:"gmp","static-libs-unix":["libgmp.a"],"static-libs-windows":["libgmp.lib"],headers:["gmp.h"]},Us={source:"gmssl","static-libs-unix":["libgmssl.a"],"static-libs-windows":["gmssl.lib"],frameworks:["Security"]},js={source:"grpc","pkg-configs":["grpc"],"lib-depends":["zlib","openssl","libcares"],"provide-pre-built":!0,frameworks:["CoreFoundation"]},As={source:"icu","cpp-library":!0,"pkg-configs":["icu-uc","icu-i18n","icu-io"]},Ns={source:"imagemagick","pkg-configs":["Magick++-7.Q16HDRI","MagickCore-7.Q16HDRI","MagickWand-7.Q16HDRI"],"lib-depends":["zlib","libjpeg","libjxl","libpng","libwebp","freetype","libtiff","libheif","bzip2"],"lib-suggests":["zstd","xz","libzip","libxml2"]},Os={source:"imap","static-libs-unix":["libc-client.a"],"lib-suggests":["openssl"]},Vs={source:"jbig","static-libs-unix":["libjbig.a","libjbig85.a"],headers:["jbig.h","jbig85.h","jbig_ar.h"]},Ts={source:"ldap","pkg-configs":["ldap","lber"],"lib-depends":["openssl","zlib","gmp","libsodium"]},Ms={source:"lerc","static-libs-unix":["libLerc.a"],"cpp-library":!0},Gs={source:"libacl","static-libs-unix":["libacl.a"],"lib-depends":["attr"]},Xs={source:"libaom","static-libs-unix":["libaom.a"],"cpp-library":!0},Hs={source:"libargon2","static-libs-unix":["libargon2.a"]},Rs={source:"libavif","static-libs-unix":["libavif.a"],"static-libs-windows":["avif.lib"]},Fs={source:"libcares","static-libs-unix":["libcares.a"],"headers-unix":["ares.h","ares_dns.h","ares_nameser.h"]},Zs={source:"libde265","static-libs-unix":["libde265.a"],"cpp-library":!0},Qs={source:"libevent","static-libs-unix":["libevent.a","libevent_core.a","libevent_extra.a","libevent_openssl.a"],"lib-depends":["openssl"]},Ks={source:"libffi","static-libs-unix":["libffi.a"],"static-libs-windows":["libffi.lib"],"headers-unix":["ffi.h","ffitarget.h"],"headers-windows":["ffi.h","fficonfig.h","ffitarget.h"]},Ys={source:"libheif","static-libs-unix":["libheif.a"],"lib-depends":["libde265","libwebp","libaom","zlib","brotli"]},Js={source:"libiconv","static-libs-unix":["libiconv.a","libcharset.a"],headers:["iconv.h","libcharset.h","localcharset.h"]},_s={source:"libjpeg","static-libs-unix":["libjpeg.a","libturbojpeg.a"],"static-libs-windows":["libjpeg_a.lib"],"lib-suggests-windows":["zlib"]},et={source:"libjxl","pkg-configs":["libjxl","libjxl_cms","libjxl_threads","libhwy"],"lib-depends":["brotli","libjpeg","libpng","libwebp"]},it={source:"liblz4","static-libs-unix":["liblz4.a"]},st={source:"libmemcached","static-libs-unix":["libmemcached.a","libmemcachedprotocol.a","libmemcachedutil.a","libhashkit.a"]},tt={source:"libpng","static-libs-unix":["libpng16.a"],"static-libs-windows":["libpng16_static.lib","libpng_a.lib"],"headers-unix":["png.h","pngconf.h","pnglibconf.h"],"headers-windows":["png.h","pngconf.h"],"lib-depends":["zlib"]},lt={source:"librabbitmq","static-libs-unix":["librabbitmq.a"],"static-libs-windows":["rabbitmq.4.lib"],"lib-depends":["openssl"]},nt={source:"librdkafka","static-libs-unix":["librdkafka.a","librdkafka++.a","librdkafka-static.a"],"cpp-library":!0,"lib-suggests":["zstd"]},ot={source:"libsodium","static-libs-unix":["libsodium.a"],"static-libs-windows":["libsodium.lib"]},at={source:"libssh2","static-libs-unix":["libssh2.a"],"static-libs-windows":["libssh2.lib"],headers:["libssh2.h","libssh2_publickey.h","libssh2_sftp.h"],"lib-depends":["openssl"]},dt={source:"libtiff","static-libs-unix":["libtiff.a"],"lib-depends":["zlib","libjpeg"],"lib-suggests-unix":["lerc","libwebp","jbig","xz","zstd"]},ut={source:"libuuid","static-libs-unix":["libuuid.a"],headers:["uuid/uuid.h"]},pt={source:"libuv","static-libs-unix":["libuv.a"]},ct={source:"libwebp","pkg-configs":["libwebp","libwebpdecoder","libwebpdemux","libwebpmux","libsharpyuv"],"static-libs-windows":["libwebp.lib","libwebpdecoder.lib","libwebpdemux.lib","libsharpyuv.lib"]},rt={source:"libxml2","static-libs-unix":["libxml2.a"],"static-libs-windows":["libxml2s.lib","libxml2_a.lib"],headers:["libxml2"],"lib-depends-unix":["libiconv"],"lib-suggests-unix":["xz","icu","zlib"],"lib-depends-windows":["libiconv-win"],"lib-suggests-windows":["zlib"]},bt={source:"libxslt","static-libs-unix":["libxslt.a","libexslt.a"],"lib-depends":["libxml2"]},wt={source:"libyaml","static-libs-unix":["libyaml.a"],"static-libs-windows":["yaml.lib"],headers:["yaml.h"]},gt={source:"libzip","static-libs-unix":["libzip.a"],"static-libs-windows":["zip.lib","libzip_a.lib"],headers:["zip.h","zipconf.h"],"lib-depends-unix":["zlib"],"lib-suggests-unix":["bzip2","xz","zstd","openssl"],"lib-depends-windows":["zlib","bzip2","xz"],"lib-suggests-windows":["zstd","openssl"]},xt={source:"mimalloc","static-libs-unix":["libmimalloc.a"]},mt={source:"ncurses","static-libs-unix":["libncurses.a"]},ht={source:"nghttp2","static-libs-unix":["libnghttp2.a"],"static-libs-windows":["nghttp2.lib"],headers:["nghttp2"],"lib-depends":["zlib","openssl"],"lib-suggests":["libxml2","nghttp3","ngtcp2"]},vt={source:"nghttp3","static-libs-unix":["libnghttp3.a"],"static-libs-windows":["nghttp3.lib"],headers:["nghttp3"],"lib-depends":["openssl"]},yt={source:"ngtcp2","static-libs-unix":["libngtcp2.a","libngtcp2_crypto_ossl.a"],"static-libs-windows":["ngtcp2.lib","ngtcp2_crypto_ossl.lib"],headers:["ngtcp2"],"lib-depends":["openssl"],"lib-suggests":["nghttp3","brotli"]},ft={source:"onig","static-libs-unix":["libonig.a"],"static-libs-windows":["onig.lib","onig_a.lib"],headers:["oniggnu.h","oniguruma.h"]},zt={source:"openssl","static-libs-unix":["libssl.a","libcrypto.a"],"static-libs-windows":["libssl.lib","libcrypto.lib"],headers:["openssl"],"lib-depends":["zlib"]},kt={source:"postgresql","pkg-configs":["libpq"],"lib-depends":["libiconv","libxml2","openssl","zlib","readline"],"lib-suggests":["icu","libxslt","ldap","zstd"]},St={source:"pthreads4w","static-libs-windows":["libpthreadVC3.lib"]},Dt={source:"qdbm","static-libs-unix":["libqdbm.a"],"static-libs-windows":["qdbm_a.lib"],"headers-windows":["depot.h"]},Bt={source:"re2c","bin-unix":["re2c"]},Ct={source:"readline","static-libs-unix":["libreadline.a"],"lib-depends":["ncurses"]},qt={source:"snappy","static-libs-unix":["libsnappy.a"],"headers-unix":["snappy.h","snappy-c.h","snappy-sinksource.h","snappy-stubs-public.h"],"lib-depends":["zlib"]},Et={source:"sqlite","static-libs-unix":["libsqlite3.a"],"static-libs-windows":["libsqlite3_a.lib"],headers:["sqlite3.h","sqlite3ext.h"]},$t={source:"tidy","static-libs-unix":["libtidy.a"]},Wt={source:"unixodbc","static-libs-unix":["libodbc.a","libodbccr.a","libodbcinst.a"],"lib-depends":["libiconv"]},Pt={source:"watcher","static-libs-unix":["libwatcher-c.a"],headers:["wtr/watcher-c.h"]},It={source:"xz","static-libs-unix":["liblzma.a"],"static-libs-windows":["lzma.lib","liblzma_a.lib"],"headers-unix":["lzma"],"headers-windows":["lzma","lzma.h"],"lib-depends-unix":["libiconv"]},Lt={source:"zlib","static-libs-unix":["libz.a"],"static-libs-windows":["zlib_a.lib"],headers:["zlib.h","zconf.h"]},Ut={source:"zstd","static-libs-unix":["libzstd.a"],"static-libs-windows":[["zstd.lib","zstd_static.lib"]],"headers-unix":["zdict.h","zstd.h","zstd_errors.h"],"headers-windows":["zstd.h","zstd_errors.h"]},jt={source:"liburing","pkg-configs":["liburing","liburing-ffi"],"static-libs-linux":["liburing.a","liburing-ffi.a"],"headers-linux":["liburing/","liburing.h"]},At={"lib-base":{type:"root","lib-depends-unix":["pkg-config"]},php:Ss,micro:Ds,"pkg-config":{type:"package",source:"pkg-config","bin-unix":["pkg-config"]},attr:Bs,brotli:Cs,bzip2:qs,curl:Es,fastlz:$s,freetype:Ws,gettext:Ps,glfw:Is,gmp:Ls,gmssl:Us,grpc:js,icu:As,"icu-static-win":{source:"icu-static-win","static-libs-windows":["icudt.lib","icuin.lib","icuio.lib","icuuc.lib"],"headers-windows":["unicode"]},imagemagick:Ns,imap:Os,jbig:Vs,ldap:Ts,lerc:Ms,libacl:Gs,libaom:Xs,libargon2:Hs,libavif:Rs,libcares:Fs,libde265:Zs,libevent:Qs,libffi:Ks,"libffi-win":{source:"libffi-win","static-libs-windows":["libffi.lib"],"headers-windows":["ffi.h","ffitarget.h","fficonfig.h"]},libheif:Ys,libiconv:Js,"libiconv-win":{source:"libiconv-win","static-libs-windows":["libiconv.lib","libiconv_a.lib"]},libjpeg:_s,libjxl:et,liblz4:it,libmemcached:st,libpng:tt,librabbitmq:lt,librdkafka:nt,libsodium:ot,libssh2:at,libtiff:dt,libuuid:ut,libuv:pt,libwebp:ct,libxml2:rt,libxslt:bt,libyaml:wt,libzip:gt,mimalloc:xt,ncurses:mt,nghttp2:ht,nghttp3:vt,ngtcp2:yt,onig:ft,openssl:zt,postgresql:kt,"postgresql-win":{source:"postgresql-win","static-libs":["libpq.lib","libpgport.lib","libpgcommon.lib"]},pthreads4w:St,qdbm:Dt,re2c:Bt,readline:Ct,snappy:qt,sqlite:Et,tidy:$t,unixodbc:Wt,watcher:Pt,xz:It,zlib:Lt,zstd:Ut,liburing:jt};function X(i,o,d,p){return i.os==="linux"?i[o][d][p+"-linux"]??i[o][d][p+"-unix"]??i[o][d][p]??[]:i.os==="macos"?i[o][d][p+"-macos"]??i[o][d][p+"-unix"]??i[o][d][p]??[]:i.os==="windows"?i[o][d][p+"-windows"]??i[o][d][p]??[]:[]}function me(i,o){return X(i,"ext",o,"ext-depends")}function Nt(i,o){return X(i,"ext",o,"ext-suggests")}function Ot(i,o){return X(i,"ext",o,"lib-depends")}function Vt(i,o){return X(i,"ext",o,"lib-suggests")}function he(i,o){return X(i,"lib",o,"lib-depends")}function Tt(i,o){return X(i,"lib",o,"lib-suggests")}function Mt(i,o){const d=[],p=new Set,u=[];o.forEach(D=>{p.has(D)||Ht(i,D,p,d)});const h=[];return d.forEach(D=>{o.indexOf(D)===-1&&u.push(D),[...Ot(i,D),...Vt(i,D)].forEach(v=>{h.indexOf(v)===-1&&h.push(v)})}),{exts:d,libs:Gt(i,h),notIncludedExts:u}}function Gt(i,o){const d=[],p=new Set;return o.forEach(u=>{p.has(u)||(console.log("before visited"),console.log(p),Xt(i,u,p,d),console.log("after visited"),console.log(p))}),d}function Xt(i,o,d,p){if(d.has(o))return;d.add(o),[...he(i,o),...Tt(i,o)].forEach(h=>{ve(i,h,d,p)}),p.push(o)}function ve(i,o,d,p){d.has(o)||(d.add(o),he(i,o).forEach(u=>{ve(i,u,d,p)}),p.push(o))}function ye(i,o,d,p){d.has(d)||(d.add(o),me(i,o).forEach(u=>{ye(i,u,d,p)}),p.push(o))}function Ht(i,o,d,p){if(d.has(o))return;d.add(o),[...me(i,o),...Nt(i,o)].forEach(h=>{ye(i,h,d,p)}),p.push(o)}const Rt={class:"option-line"},Ft=["id","value","disabled"],Zt=["for"],Qt={class:"option-line"},Kt=["disabled"],Yt={class:"box"},Jt=["placeholder"],_t=["id","value","disabled"],el=["for"],il={style:{color:"orangered","font-weight":"bolder"}},sl={class:"details custom-block",open:""},tl={class:"box"},ll=["id","value","disabled"],nl=["for"],ol={class:"tip custom-block"},al={class:"box"},dl=["id","value"],ul=["for"],pl={key:2,class:"warning custom-block"},cl={key:3,class:"warning custom-block"},rl={value:"native"},bl={value:"spc"},wl={key:0,value:"docker"},gl=["value"],xl={for:"debug-yes"},ml={for:"debug-no"},hl={for:"zts-yes"},vl={for:"zts-no"},yl={for:"show-download-yes"},fl={for:"show-download-no"},zl={for:"pre-built-yes"},kl={for:"pre-built-no"},Sl={key:0},Dl={for:"upx-yes"},Bl={for:"upx-no"},Cl=["placeholder"],ql={key:4,class:"command-container"},El={key:0,class:"command-preview"},$l={class:"command-content"},Wl={key:1},Pl={class:"warning custom-block"},Il={key:5,class:"command-container"},Ll={class:"command-preview"},Ul={class:"command-content"},jl={key:6,class:"command-container"},Al={class:"command-preview"},Nl={class:"command-content"},Ol={key:7,class:"command-container"},Vl={class:"command-preview"},Tl={class:"command-content"},Ml={class:"command-container"},Gl={class:"command-preview"},Xl={class:"command-content"},Hl={class:"command-container"},Rl={class:"command-preview"},Fl={class:"command-content"},Zl={class:"command-container"},Ql={class:"command-preview pre"},Kl={class:"command-content"},Yl={name:"CliGenerator"},Jl=Ee({...Yl,props:{lang:{type:String,default:"zh"}},setup(i){const o=new Map([["linux","Linux"],["macos","Darwin"],["windows","Windows"]]),d=["cli","fpm","micro","embed","frankenphp","all"],p=["8.0","8.1","8.2","8.3","8.4","8.5"],u=w(ks),h=w(At),D=w([]),C=w(""),v=w([]),q=w([]),_=w([]),K=w([]),z=w(["cli"]),Y=w("spc"),M=w("8.4"),r=w("linux"),J=w("x86_64"),B=w(0),G=w(0),H=w(1),O=w(1),E=w(0),ee=w(""),be=w("--build-cli"),f=w({spcDownload:!1,downloadExt:!1,downloadAll:!1,downloadPkg:!1,build:!1,craft:!1,doctor:!1}),fe=[{os:"linux",label:"Linux",disabled:!1},{os:"macos",label:"macOS",disabled:!1},{os:"windows",label:"Windows",disabled:!1}],we=k(()=>Object.entries(u.value).filter(([a])=>ke(a,r.value)).map(([a])=>a)),ie=k(()=>v.value.join(",")),se=k(()=>{const a=q.value.filter(t=>K.value.indexOf(t)===-1);return a.length>0?` --with-libs="${a.join(",")}"`:""}),R=k(()=>{switch(Y.value){case"native":return"bin/spc";case"spc":return r.value==="windows"?".\\spc.exe":"./spc";case"docker":return"bin/spc-alpine-docker";default:return""}}),te=k(()=>r.value==="windows"?"":`curl -fsSL -o spc.tgz https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-${r.value}-${J.value}.tar.gz && tar -zxvf spc.tgz && rm spc.tgz`),ze=k(()=>{const t=ee.value.split(` -`).filter(s=>s.indexOf("=")>=1);return t.length>0?" "+t.map(s=>`-I "${s}"`).join(" "):""}),le=k(()=>`${R.value} download --all --with-php=${M.value}${O.value?" --prefer-pre-built":""}${B.value?" --debug":""}`),ne=k(()=>`${R.value} download --with-php=${M.value} --for-extensions "${ie.value}"${O.value?" --prefer-pre-built":""}${B.value?" --debug":""}`),oe=k(()=>`${R.value} install-pkg upx${B.value?" --debug":""}`),ae=k(()=>`${R.value} doctor --auto-fix${B.value?" --debug":""}`),de=k(()=>`${R.value} build ${be.value} "${ie.value}"${se.value}${B.value?" --debug":""}${G.value?" --enable-zts":""}${E.value?" --with-upx-pack":""}${ze.value}`),ue=k(()=>{let a=`php-version: ${M.value} -`;return a+=`extensions: "${ie.value}" -`,z.value.join(",")==="all"?a+="sapi: "+["cli","fpm","micro","embed","frankenphp"].join(",")+` -`:a+=`sapi: ${z.value.join(",")} -`,se.value&&(a+=`libs: ${se.value.replace('--with-libs="',"").replace('"',"").trim()} -`),B.value&&(a+=`debug: true -`),a+="{{position_hold}}",E.value&&(a+=` with-upx-pack: true -`),G.value&&(a+=` enable-zts: true -`),O.value&&(a+=` prefer-pre-built: true -`),a.endsWith("{{position_hold}}")?a=a.replace("{{position_hold}}",""):a=a.replace("{{position_hold}}",`build-options: -`),a}),ke=(a,t)=>{var c,y;const s=o.get(t),b=((y=(c=u.value[a])==null?void 0:c.support)==null?void 0:y[s])??"yes";return b==="yes"||b==="partial"},Se=()=>{v.value=["apcu","bcmath","calendar","ctype","curl","dba","dom","exif","filter","fileinfo","gd","iconv","intl","mbstring","mbregex","mysqli","mysqlnd","openssl","opcache","pcntl","pdo","pdo_mysql","pdo_sqlite","pdo_pgsql","pgsql","phar","posix","readline","redis","session","simplexml","sockets","sodium","sqlite3","tokenizer","xml","xmlreader","xmlwriter","xsl","zip","zlib"]},De=()=>{v.value=[...we.value]},Be=a=>{if(a.target.value==="all")z.value=["all"];else{const s=z.value.indexOf("all");s!==-1&&z.value.splice(s,1)}be.value=z.value.map(s=>`--build-${s}`).join(" ")},pe=(a,t)=>{if(!C.value||!a.includes(C.value))return t===0?a:"";const s=a.indexOf(C.value);switch(t){case 0:return a.substring(0,s);case 1:return C.value;case 2:return a.substring(s+C.value.length);default:return""}},V=async a=>{try{await navigator.clipboard.writeText(a);const s={[te.value]:"spcDownload",[ne.value]:"downloadExt",[le.value]:"downloadAll",[oe.value]:"downloadPkg",[ae.value]:"doctor",[de.value]:"build",[ue.value]:"craft"}[a];s&&(f.value[s]=!0,setTimeout(()=>{f.value[s]=!1},2e3))}catch(t){console.error("Failed to copy text: ",t);const s=document.createElement("textarea");s.value=a,document.body.appendChild(s),s.select(),document.execCommand("copy"),document.body.removeChild(s)}},Ce=a=>{const t=new Set,s=b=>{var y,$,W,P,I,L,U,j;let c=[];r.value==="linux"?c=((y=u.value[b])==null?void 0:y["ext-depends-linux"])??(($=u.value[b])==null?void 0:$["ext-depends-unix"])??((W=u.value[b])==null?void 0:W["ext-depends"])??[]:r.value==="macos"?c=((P=u.value[b])==null?void 0:P["ext-depends-macos"])??((I=u.value[b])==null?void 0:I["ext-depends-unix"])??((L=u.value[b])==null?void 0:L["ext-depends"])??[]:r.value==="windows"&&(c=((U=u.value[b])==null?void 0:U["ext-depends-windows"])??((j=u.value[b])==null?void 0:j["ext-depends"])??[]),c.length!==0&&c.forEach(A=>{t.add(A),s(A)})};return a.forEach(s),Array.from(t)},qe=a=>{const t=new Set,s=c=>{var $,W,P,I,L,U,j,A;let y=[];r.value==="linux"?y=(($=h.value[c])==null?void 0:$["lib-depends-linux"])??((W=h.value[c])==null?void 0:W["lib-depends-unix"])??((P=h.value[c])==null?void 0:P["lib-depends"])??[]:r.value==="macos"?y=((I=h.value[c])==null?void 0:I["lib-depends-macos"])??((L=h.value[c])==null?void 0:L["lib-depends-unix"])??((U=h.value[c])==null?void 0:U["lib-depends"])??[]:r.value==="windows"&&(y=((j=h.value[c])==null?void 0:j["lib-depends-windows"])??((A=h.value[c])==null?void 0:A["lib-depends"])??[]),y.length!==0&&y.forEach(F=>{t.add(F),s(F)})},b=c=>{var $,W,P,I,L,U,j,A;let y=[];r.value==="linux"?y=(($=u.value[c])==null?void 0:$["lib-depends-linux"])??((W=u.value[c])==null?void 0:W["lib-depends-unix"])??((P=u.value[c])==null?void 0:P["lib-depends"])??[]:r.value==="macos"?y=((I=u.value[c])==null?void 0:I["lib-depends-macos"])??((L=u.value[c])==null?void 0:L["lib-depends-unix"])??((U=u.value[c])==null?void 0:U["lib-depends"])??[]:r.value==="windows"&&(y=((j=u.value[c])==null?void 0:j["lib-depends-windows"])??((A=u.value[c])==null?void 0:A["lib-depends"])??[]),y.length!==0&&y.forEach(F=>{t.add(F),s(F)})};return a.forEach(b),Array.from(t)};ge(r,()=>{r.value==="windows"&&(J.value="x86_64"),v.value=[],E.value=0}),ge(v,a=>{_.value=Ce(a),_.value.forEach(s=>{v.value.indexOf(s)===-1&&v.value.push(s)}),v.value.sort();const t=Mt({ext:u.value,lib:h.value,os:r.value},v.value);D.value=t.libs.sort(),q.value=[],K.value=qe(t.exts),K.value.forEach(s=>{q.value.indexOf(s)===-1&&q.value.push(s)})},{deep:!0});const n={zh:{selectExt:"选择扩展",buildTarget:"选择编译目标",buildOptions:"编译选项",buildEnvironment:"编译环境",buildEnvNative:"本地构建(Git 源码)",buildEnvSpc:"本地构建(独立 spc 二进制)",buildEnvDocker:"Alpine Docker 构建",useDebug:"是否开启调试输出",yes:"是",no:"否",resultShow:"结果展示",selectCommon:"选择常用扩展",selectAll:"选择全部",selectNone:"全部取消选择",useZTS:"是否编译线程安全版",hardcodedINI:"硬编码 INI 选项",hardcodedINIPlacehoder:"如需要硬编码 ini,每行写一个,例如:memory_limit=2G",resultShowDownload:"是否展示仅下载对应扩展依赖的命令",downloadExtOnlyCommand:"只下载对应扩展的依赖包命令",downloadAllCommand:"下载所有依赖包命令",downloadUPXCommand:"下载 UPX 命令",compileCommand:"编译命令",downloadPhpVersion:"下载 PHP 版本",downloadSPCBinaryCommand:"下载 spc 二进制命令",selectedArch:"选择系统架构",selectedSystem:"选择操作系统",buildLibs:"要构建的库",depTips:"选择扩展后,不可选中的项目为必需的依赖,编译的依赖库列表中可选的为现有扩展和依赖库的可选依赖。选择可选依赖后,将生成 --with-libs 参数。",depTips2:"无法同时构建所有扩展,因为有些扩展之间相互冲突。请根据需要选择扩展。",microUnavailable:"micro 不支持 PHP 7.4 及更早版本!",windowsSAPIUnavailable:"Windows 目前不支持 fpm、embed、frankenphp 构建!",useUPX:"是否开启 UPX 压缩(减小二进制体积)",windowsDownSPCWarning:"Windows 下请手动下载 spc.exe 二进制文件,解压到当前目录并重命名为 spc.exe!",usePreBuilt:"如果可能,下载预编译的依赖库(减少编译时间)",searchPlaceholder:"搜索扩展...",copy:"复制",copied:"已复制",doctorCommand:"自动检查和准备构建环境命令"},en:{selectExt:"Select Extensions",buildTarget:"Build Target",buildOptions:"Build Options",buildEnvironment:"Build Environment",buildEnvNative:"Native build (Git source code)",buildEnvSpc:"Native build (standalone spc binary)",buildEnvDocker:"Alpine docker build",useDebug:"Enable debug message",yes:"Yes",no:"No",resultShow:"Result",selectCommon:"Select common extensions",selectAll:"Select all",selectNone:"Unselect all",useZTS:"Enable ZTS",hardcodedINI:"Hardcoded INI options",hardcodedINIPlacehoder:"If you need to hardcode ini, write one per line, for example: memory_limit=2G",resultShowDownload:"Download with corresponding extension dependencies",downloadExtOnlyCommand:"Download sources by extensions command",downloadAllCommand:"Download all sources command",downloadUPXCommand:"Download UPX command",compileCommand:"Compile command",downloadPhpVersion:"Download PHP version",downloadSPCBinaryCommand:"Download spc binary command",selectedArch:"Select build architecture",selectedSystem:"Select Build OS",buildLibs:"Select Dependencies",depTips:"After selecting the extensions, the unselectable items are essential dependencies. In the compiled dependencies list, optional dependencies consist of existing extensions and optional dependencies of libraries. Optional dependencies will be added in --with-libs parameter.",depTips2:"It is not possible to build all extensions at the same time, as some extensions conflict with each other. Please select the extensions you need.",microUnavailable:"Micro does not support PHP 7.4 and earlier versions!",windowsSAPIUnavailable:"Windows does not support fpm, embed and frankenphp build!",useUPX:"Enable UPX compression (reduce binary size)",windowsDownSPCWarning:"Please download the binary file manually, extract it to the current directory and rename to spc.exe on Windows!",usePreBuilt:"Download pre-built dependencies if possible (reduce compile time)",searchPlaceholder:"Search extensions...",copy:"Copy",copied:"Copied",doctorCommand:"Auto-check and prepare build environment command"}};return(a,t)=>(x(),g("div",null,[e("h2",null,l(n[i.lang].selectedSystem),1),e("div",Rt,[(x(),g(Z,null,Q(fe,(s,b)=>e("span",{key:b,style:{"margin-right":"8px"}},[m(e("input",{type:"radio",id:"os-"+s.os,value:s.os,disabled:s.disabled===!0,"onUpdate:modelValue":t[0]||(t[0]=c=>r.value=c)},null,8,Ft),[[S,r.value]]),e("label",{for:"os-"+s.os},l(s.label),9,Zt)])),64))]),e("div",Qt,[m(e("select",{"onUpdate:modelValue":t[1]||(t[1]=s=>J.value=s)},[t[27]||(t[27]=e("option",{value:"x86_64"},"x86_64",-1)),e("option",{value:"aarch64",disabled:r.value==="windows"},"aarch64",8,Kt)],512),[[ce,J.value]])]),e("h2",null,l(n[i.lang].selectExt)+l(v.value.length>0?" ("+v.value.length+")":""),1),e("div",Yt,[m(e("input",{class:"input","onUpdate:modelValue":t[2]||(t[2]=s=>C.value=s),placeholder:n[i.lang].searchPlaceholder},null,8,Jt),[[xe,C.value]]),t[28]||(t[28]=e("br",null,null,-1)),(x(!0),g(Z,null,Q(we.value,s=>(x(),g("div",{key:s,class:"ext-item"},[e("span",null,[m(e("input",{type:"checkbox",id:s,value:s,"onUpdate:modelValue":t[3]||(t[3]=b=>v.value=b),disabled:_.value.indexOf(s)!==-1},null,8,_t),[[re,v.value]]),e("label",{for:s},[e("span",null,l(pe(s,0)),1),e("span",il,l(pe(s,1)),1),e("span",null,l(pe(s,2)),1)],8,el)])]))),128))]),r.value!=="windows"?(x(),g("div",{key:0,class:"my-btn",onClick:Se},l(n[i.lang].selectCommon),1)):N("",!0),r.value!=="windows"?(x(),g("div",{key:1,class:"my-btn",onClick:De},l(n[i.lang].selectAll),1)):N("",!0),e("div",{class:"my-btn",onClick:t[4]||(t[4]=s=>v.value=[])},l(n[i.lang].selectNone),1),e("details",sl,[e("summary",null,l(n[i.lang].buildLibs)+l(q.value.length>0?" ("+q.value.length+")":""),1),e("div",tl,[(x(!0),g(Z,null,Q(D.value,(s,b)=>(x(),g("div",{key:b,class:"ext-item"},[m(e("input",{type:"checkbox",id:b,value:s,"onUpdate:modelValue":t[5]||(t[5]=c=>q.value=c),disabled:K.value.indexOf(s)!==-1},null,8,ll),[[re,q.value]]),e("label",{for:b},l(s),9,nl)]))),128))])]),e("div",ol,[t[29]||(t[29]=e("p",{class:"custom-block-title"},"TIP",-1)),e("p",null,l(n[i.lang].depTips),1),e("p",null,l(n[i.lang].depTips2),1)]),e("h2",null,l(n[i.lang].buildTarget),1),e("div",al,[(x(),g(Z,null,Q(d,s=>e("div",{key:s,class:"ext-item"},[m(e("input",{type:"checkbox",id:"build_"+s,value:s,"onUpdate:modelValue":t[6]||(t[6]=b=>z.value=b),onChange:Be},null,40,dl),[[re,z.value]]),e("label",{for:"build_"+s},l(s),9,ul)])),64))]),M.value==="7.4"&&(z.value.indexOf("micro")!==-1||z.value.indexOf("all")!==-1)?(x(),g("div",pl,[t[30]||(t[30]=e("p",{class:"custom-block-title"},"WARNING",-1)),e("p",null,l(n[i.lang].microUnavailable),1)])):N("",!0),r.value==="windows"&&(z.value.indexOf("fpm")!==-1||z.value.indexOf("embed")!==-1||z.value.indexOf("frankenphp")!==-1)?(x(),g("div",cl,[t[31]||(t[31]=e("p",{class:"custom-block-title"},"WARNING",-1)),e("p",null,l(n[i.lang].windowsSAPIUnavailable),1)])):N("",!0),e("h2",null,l(n[i.lang].buildOptions),1),e("table",null,[e("tr",null,[e("td",null,l(n[i.lang].buildEnvironment),1),e("td",null,[m(e("select",{"onUpdate:modelValue":t[7]||(t[7]=s=>Y.value=s)},[e("option",rl,l(n[i.lang].buildEnvNative),1),e("option",bl,l(n[i.lang].buildEnvSpc),1),r.value!=="windows"?(x(),g("option",wl,l(n[i.lang].buildEnvDocker),1)):N("",!0)],512),[[ce,Y.value]])])]),e("tr",null,[e("td",null,l(n[i.lang].downloadPhpVersion),1),e("td",null,[m(e("select",{"onUpdate:modelValue":t[8]||(t[8]=s=>M.value=s)},[(x(),g(Z,null,Q(p,s=>e("option",{key:s,value:s},l(s),9,gl)),64))],512),[[ce,M.value]])])]),e("tr",null,[e("td",null,l(n[i.lang].useDebug),1),e("td",null,[m(e("input",{type:"radio",id:"debug-yes",value:1,"onUpdate:modelValue":t[9]||(t[9]=s=>B.value=s)},null,512),[[S,B.value]]),e("label",xl,l(n[i.lang].yes),1),m(e("input",{type:"radio",id:"debug-no",value:0,"onUpdate:modelValue":t[10]||(t[10]=s=>B.value=s)},null,512),[[S,B.value]]),e("label",ml,l(n[i.lang].no),1)])]),e("tr",null,[e("td",null,l(n[i.lang].useZTS),1),e("td",null,[m(e("input",{type:"radio",id:"zts-yes",value:1,"onUpdate:modelValue":t[11]||(t[11]=s=>G.value=s)},null,512),[[S,G.value]]),e("label",hl,l(n[i.lang].yes),1),m(e("input",{type:"radio",id:"zts-no",value:0,"onUpdate:modelValue":t[12]||(t[12]=s=>G.value=s)},null,512),[[S,G.value]]),e("label",vl,l(n[i.lang].no),1)])]),e("tr",null,[e("td",null,l(n[i.lang].resultShowDownload),1),e("td",null,[m(e("input",{type:"radio",id:"show-download-yes",value:1,"onUpdate:modelValue":t[13]||(t[13]=s=>H.value=s)},null,512),[[S,H.value]]),e("label",yl,l(n[i.lang].yes),1),m(e("input",{type:"radio",id:"show-download-no",value:0,"onUpdate:modelValue":t[14]||(t[14]=s=>H.value=s)},null,512),[[S,H.value]]),e("label",fl,l(n[i.lang].no),1)])]),e("tr",null,[e("td",null,l(n[i.lang].usePreBuilt),1),e("td",null,[m(e("input",{type:"radio",id:"pre-built-yes",value:1,"onUpdate:modelValue":t[15]||(t[15]=s=>O.value=s)},null,512),[[S,O.value]]),e("label",zl,l(n[i.lang].yes),1),m(e("input",{type:"radio",id:"pre-built-no",value:0,"onUpdate:modelValue":t[16]||(t[16]=s=>O.value=s)},null,512),[[S,O.value]]),e("label",kl,l(n[i.lang].no),1)])]),r.value!=="macos"?(x(),g("tr",Sl,[e("td",null,l(n[i.lang].useUPX),1),e("td",null,[m(e("input",{type:"radio",id:"upx-yes",value:1,"onUpdate:modelValue":t[17]||(t[17]=s=>E.value=s)},null,512),[[S,E.value]]),e("label",Dl,l(n[i.lang].yes),1),m(e("input",{type:"radio",id:"upx-no",value:0,"onUpdate:modelValue":t[18]||(t[18]=s=>E.value=s)},null,512),[[S,E.value]]),e("label",Bl,l(n[i.lang].no),1)])])):N("",!0)]),e("h2",null,l(n[i.lang].hardcodedINI),1),m(e("textarea",{class:"textarea",placeholder:n[i.lang].hardcodedINIPlacehoder,"onUpdate:modelValue":t[19]||(t[19]=s=>ee.value=s),rows:"5"},null,8,Cl),[[xe,ee.value]]),e("h2",null,l(n[i.lang].resultShow),1),Y.value==="spc"?(x(),g("div",ql,[e("b",null,l(n[i.lang].downloadSPCBinaryCommand),1),r.value!=="windows"?(x(),g("div",El,[e("div",$l,l(te.value),1),e("button",{class:T(["copy-btn",{copied:f.value.spcDownload}]),onClick:t[20]||(t[20]=s=>V(te.value))},l(f.value.spcDownload?n[i.lang].copied:n[i.lang].copy),3)])):(x(),g("div",Wl,[e("div",Pl,[t[32]||(t[32]=e("p",{class:"custom-block-title"},"WARNING",-1)),e("p",null,l(n[i.lang].windowsDownSPCWarning),1),t[33]||(t[33]=e("a",{href:"https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-windows-x64.exe",target:"_blank"},"https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-windows-x64.exe",-1))])]))])):N("",!0),H.value?(x(),g("div",Il,[e("b",null,l(n[i.lang].downloadExtOnlyCommand),1),e("div",Ll,[e("div",Ul,l(ne.value),1),e("button",{class:T(["copy-btn",{copied:f.value.downloadExt}]),onClick:t[21]||(t[21]=s=>V(ne.value))},l(f.value.downloadExt?n[i.lang].copied:n[i.lang].copy),3)])])):(x(),g("div",jl,[e("b",null,l(n[i.lang].downloadAllCommand),1),e("div",Al,[e("div",Nl,l(le.value),1),e("button",{class:T(["copy-btn",{copied:f.value.downloadAll}]),onClick:t[22]||(t[22]=s=>V(le.value))},l(f.value.downloadAll?n[i.lang].copied:n[i.lang].copy),3)])])),E.value?(x(),g("div",Ol,[e("b",null,l(n[i.lang].downloadUPXCommand),1),e("div",Vl,[e("div",Tl,l(oe.value),1),e("button",{class:T(["copy-btn",{copied:f.value.downloadPkg}]),onClick:t[23]||(t[23]=s=>V(oe.value))},l(f.value.downloadPkg?n[i.lang].copied:n[i.lang].copy),3)])])):N("",!0),e("div",Ml,[e("b",null,l(n[i.lang].doctorCommand),1),e("div",Gl,[e("div",Xl,l(ae.value),1),e("button",{class:T(["copy-btn",{copied:f.value.doctor}]),onClick:t[24]||(t[24]=s=>V(ae.value))},l(f.value.doctor?n[i.lang].copied:n[i.lang].copy),3)])]),e("div",Hl,[e("b",null,l(n[i.lang].compileCommand),1),e("div",Rl,[e("div",Fl,l(de.value),1),e("button",{class:T(["copy-btn",{copied:f.value.build}]),onClick:t[25]||(t[25]=s=>V(de.value))},l(f.value.build?n[i.lang].copied:n[i.lang].copy),3)])]),e("div",Zl,[t[34]||(t[34]=e("b",null,"craft.yml",-1)),e("div",Ql,[e("div",Kl,l(ue.value),1),e("button",{class:T(["copy-btn",{copied:f.value.craft}]),onClick:t[26]||(t[26]=s=>V(ue.value))},l(f.value.craft?n[i.lang].copied:n[i.lang].copy),3)])])]))}}),en=$e(Jl,[["__scopeId","data-v-9e57994f"]]);export{en as C}; diff --git a/assets/chunks/SearchTable.Cw3TiMBP.js b/assets/chunks/SearchTable.Cw3TiMBP.js deleted file mode 100644 index 38cda704..00000000 --- a/assets/chunks/SearchTable.Cw3TiMBP.js +++ /dev/null @@ -1 +0,0 @@ -import{x as d,c as p,o as i,j as t,e as z,ag as W,aj as v,G as q,H as k,t as n}from"./framework.PeLcR_tw.js";const _={support:{BSD:"wip"},type:"external","arg-type":"custom",source:"amqp","lib-depends":["librabbitmq"],"ext-depends-windows":["openssl"]},L={type:"external",source:"apcu"},j={type:"external",source:"ast"},F={type:"builtin"},C={type:"external",source:"ext-brotli","arg-type":"enable","lib-depends":["brotli"]},N={type:"builtin","arg-type-unix":"with-path","arg-type-windows":"with","lib-depends":["bzip2"]},O={type:"builtin"},T={type:"builtin"},V={notes:!0,type:"builtin","arg-type":"with","lib-depends":["curl"],"ext-depends-windows":["zlib","openssl"]},E={type:"builtin","arg-type":"custom","lib-suggests":["qdbm"]},I={support:{BSD:"wip"},type:"external",source:"dio"},G={support:{BSD:"wip"},type:"builtin","arg-type":"custom","arg-type-windows":"with","lib-depends":["libxml2","zlib"],"ext-depends-windows":["xml"]},H={type:"external",source:"ext-ds"},M={support:{Windows:"wip",BSD:"wip",Darwin:"wip",Linux:"wip"},type:"wip"},U={type:"external",source:"ev","arg-type-windows":"with","ext-depends":["sockets"]},A={support:{Windows:"wip",BSD:"wip"},notes:!0,type:"external",source:"ext-event","arg-type":"custom","lib-depends":["libevent"],"ext-depends":["openssl"],"ext-suggests":["sockets"]},J={type:"builtin"},K={support:{Linux:"partial",BSD:"wip"},notes:!0,"arg-type":"custom",type:"builtin","lib-depends-unix":["libffi"],"lib-depends-windows":["libffi-win"]},P={type:"builtin"},Q={type:"builtin"},R={type:"builtin","lib-suggests":["openssl"]},X={support:{BSD:"wip"},notes:!0,type:"builtin","arg-type":"custom","arg-type-windows":"with","lib-depends":["zlib","libpng"],"ext-depends":["zlib"],"lib-suggests":["libavif","libwebp","libjpeg","freetype"]},Y={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["gettext"]},Z={support:{Windows:"wip",BSD:"no",Linux:"no"},notes:!0,type:"external","arg-type":"custom",source:"ext-glfw","lib-depends":["glfw"],"lib-depends-windows":[]},$={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["gmp"]},ee={support:{BSD:"wip"},type:"external",source:"ext-gmssl","lib-depends":["gmssl"]},te={support:{Windows:"wip",BSD:"wip"},type:"external",source:"grpc","arg-type-unix":"enable-path","cpp-extension":!0,"lib-depends":["grpc"]},se={support:{BSD:"wip"},type:"builtin","arg-type":"with-path","arg-type-windows":"with","lib-depends-unix":["libiconv"],"lib-depends-windows":["libiconv-win"]},pe={support:{BSD:"wip"},type:"external",source:"igbinary","ext-suggests":["session","apcu"]},ie={support:{Windows:"wip",BSD:"wip"},notes:!0,type:"external",source:"ext-imagick","arg-type":"custom","lib-depends":["imagemagick"]},ne={support:{Windows:"wip",BSD:"wip"},notes:!0,type:"external",source:"ext-imap","arg-type":"custom","lib-depends":["imap"],"ext-suggests":["openssl"]},oe={support:{Windows:"no",BSD:"wip",Darwin:"no"},type:"external",source:"inotify"},re={support:{BSD:"wip"},type:"builtin","lib-depends-unix":["icu"],"lib-depends-windows":["icu-static-win"]},le={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["ldap"],"lib-suggests":["gmp","libsodium"],"ext-suggests":["openssl"]},ue={support:{BSD:"wip"},type:"builtin","arg-type":"none","ext-depends":["xml"],target:["static"]},de={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-lz4","arg-type":"custom","lib-depends":["liblz4"]},ae={type:"builtin","arg-type":"custom",target:["static"],"ext-depends":["mbstring"],"lib-depends":["onig"]},we={type:"builtin","arg-type":"custom"},ce={type:"wip",support:{Windows:"no",BSD:"no",Darwin:"no",Linux:"no"},notes:!0},ye={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-memcache","arg-type":"custom","ext-depends":["zlib","session"],"build-with-php":!0},be={support:{Windows:"wip",BSD:"wip"},type:"external",source:"memcached","arg-type":"custom","cpp-extension":!0,"lib-depends":["libmemcached"],"lib-depends-unix":["libmemcached","fastlz"],"ext-depends":["session","zlib"]},xe={support:{BSD:"wip",Windows:"wip"},type:"external",source:"mongodb","arg-type":"custom","lib-suggests":["icu","openssl","zstd","zlib"],frameworks:["CoreFoundation","Security"]},ge={support:{BSD:"wip"},type:"external",source:"msgpack","arg-type-unix":"with","arg-type-win":"enable","ext-depends":["session"]},me={type:"builtin","arg-type":"with","ext-depends":["mysqlnd"]},he={type:"builtin","arg-type-windows":"with","lib-depends":["zlib"]},De={type:"wip",support:{Windows:"wip",BSD:"no",Darwin:"no",Linux:"no"},notes:!0},Se={support:{BSD:"wip",Windows:"wip"},type:"builtin","arg-type-unix":"custom","lib-depends-unix":["unixodbc"]},Be={type:"builtin","arg-type-unix":"custom","arg-type-windows":"enable","zend-extension":!0},fe={notes:!0,type:"builtin","arg-type":"custom","arg-type-windows":"with","build-with-php":!0,"lib-depends":["openssl","zlib"],"ext-depends":["zlib"]},ze={support:{BSD:"wip"},type:"external",source:"opentelemetry"},We={support:{BSD:"wip"},notes:!0,type:"external",source:"parallel","arg-type-windows":"with","lib-depends-windows":["pthreads4w"]},ve={support:{Windows:"no"},type:"builtin","unix-only":!0},qe={type:"builtin"},ke={type:"builtin","arg-type":"with","ext-depends":["pdo","mysqlnd"]},_e={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends-unix":["unixodbc"],"ext-depends":["pdo","odbc"]},Le={support:{BSD:"wip"},type:"builtin","arg-type":"with-path","arg-type-windows":"custom","ext-depends":["pdo","pgsql"],"lib-depends-unix":["postgresql"],"lib-depends-windows":["postgresql-win"]},je={support:{BSD:"wip"},type:"builtin","arg-type":"with","ext-depends":["pdo","sqlite3"],"lib-depends":["sqlite"]},Fe={support:{BSD:"wip"},type:"external",source:"pdo_sqlsrv","arg-type":"with","ext-depends":["pdo","sqlsrv"]},Ce={support:{BSD:"wip"},notes:!0,type:"builtin","arg-type":"custom","lib-depends-unix":["postgresql"],"lib-depends-windows":["postgresql-win"]},Ne={type:"builtin","ext-depends":["zlib"]},Oe={support:{Windows:"no"},type:"builtin","unix-only":!0},Te={support:{Windows:"wip",BSD:"wip"},type:"external",source:"protobuf"},Ve={support:{BSD:"wip",Darwin:"partial"},notes:!0,type:"external",source:"rar","cpp-extension":!0},Ee={support:{BSD:"wip",Windows:"wip"},type:"external",source:"ext-rdkafka","arg-type":"custom","cpp-extension":!0,"lib-depends":["librdkafka"]},Ie={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["readline"],target:["static"]},Ge={support:{BSD:"wip"},type:"external",source:"redis","arg-type":"custom","ext-suggests":["session","igbinary","msgpack"],"lib-suggests-unix":["zstd","liblz4"]},He={type:"builtin","build-with-php":!0},Me={type:"builtin","build-with-php":!0},Ue={type:"external",source:"ext-simdjson","cpp-extension":!0},Ae={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends":["libxml2"],"ext-depends-windows":["xml"],"build-with-php":!0},Je={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-snappy","cpp-extension":!0,"arg-type":"custom","lib-depends":["snappy"],"ext-suggests":["apcu"]},Ke={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends":["libxml2"],"ext-depends-windows":["xml"]},Pe={type:"builtin"},Qe={support:{BSD:"wip"},type:"builtin","arg-type":"with","lib-depends":["libsodium"]},Re={support:{BSD:"wip",Windows:"no"},notes:!0,type:"external",source:"spx","arg-type":"custom","lib-depends":["zlib"]},Xe={support:{BSD:"wip"},type:"builtin","arg-type":"with-path","arg-type-windows":"with","lib-depends":["sqlite"]},Ye={support:{BSD:"wip"},type:"external",source:"sqlsrv","lib-depends-unix":["unixodbc"],"ext-depends-linux":["pcntl"],"cpp-extension":!0},Ze={support:{BSD:"wip"},type:"external",source:"ext-ssh2","arg-type":"with-path","arg-type-windows":"with","lib-depends":["libssh2"],"ext-depends":["openssl","zlib"]},$e={support:{Windows:"no",BSD:"wip"},notes:!0,type:"external",source:"swoole","arg-type":"custom","cpp-extension":!0,"unix-only":!0,"lib-depends":["libcares","brotli","nghttp2","zlib"],"lib-suggests":["zstd"],"lib-suggests-linux":["zstd","liburing"],"ext-depends":["openssl","curl"],"ext-suggests":["sockets","swoole-hook-pgsql","swoole-hook-mysql","swoole-hook-sqlite","swoole-hook-odbc"]},et={support:{BSD:"wip"},notes:!0,type:"external",source:"swow","arg-type":"custom","lib-suggests":["openssl","curl"],"ext-suggests":["openssl","curl"]},tt={support:{Windows:"no",BSD:"wip"},type:"builtin","unix-only":!0},st={support:{Windows:"no",BSD:"wip"},type:"builtin","unix-only":!0},pt={support:{BSD:"wip"},type:"builtin"},it={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["tidy"]},nt={type:"builtin","build-with-php":!0},ot={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-uuid","arg-type":"with-path","lib-depends":["libuuid"]},rt={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-uv","arg-type":"with-path","lib-depends":["libuv"],"ext-depends":["sockets"]},lt={type:"external",source:"xdebug",target:["shared"],support:{Windows:"wip",BSD:"no",Darwin:"partial",Linux:"partial"},notes:!0,"zend-extension":!0},ut={support:{Windows:"wip",BSD:"wip"},notes:!0,type:"external",source:"xhprof","ext-depends":["ctype"],"build-with-php":!0},dt={support:{BSD:"wip"},type:"external",source:"xlswriter","arg-type":"custom","ext-depends":["zlib","zip"],"lib-suggests":["openssl"]},at={support:{BSD:"wip"},notes:!0,type:"builtin","arg-type":"custom","arg-type-windows":"with","lib-depends":["libxml2"],"ext-depends-windows":["iconv"],"build-with-php":!0},wt={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends":["libxml2"],"ext-depends-windows":["xml","dom"],"build-with-php":!0},ct={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends":["libxml2"],"ext-depends-windows":["xml"],"build-with-php":!0},yt={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["libxslt"],"ext-depends":["xml","dom"]},bt={type:"external",source:"ext-xz","arg-type":"with","lib-depends":["xz"]},xt={support:{BSD:"wip"},type:"external",source:"yac","arg-type-unix":"custom","lib-depends-unix":["fastlz"],"ext-depends-unix":["igbinary"]},gt={support:{BSD:"wip"},type:"external",source:"yaml","arg-type-unix":"with-path","arg-type-windows":"with","lib-depends":["libyaml"]},mt={support:{BSD:"wip"},type:"builtin","arg-type":"with-path","arg-type-windows":"enable","lib-depends-unix":["libzip"],"ext-depends-windows":["zlib","bz2"],"lib-depends-windows":["libzip","zlib","bzip2","xz"]},ht={type:"builtin","arg-type":"custom","arg-type-windows":"enable","lib-depends":["zlib"],target:["static"]},Dt={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-zstd","arg-type":"custom","lib-depends":["zstd"]},St={amqp:_,apcu:L,ast:j,bcmath:F,brotli:C,bz2:N,calendar:O,ctype:T,curl:V,dba:E,dio:I,dom:G,ds:H,enchant:M,ev:U,event:A,exif:J,ffi:K,fileinfo:P,filter:Q,ftp:R,gd:X,gettext:Y,glfw:Z,gmp:$,gmssl:ee,grpc:te,iconv:se,igbinary:pe,imagick:ie,imap:ne,inotify:oe,intl:re,ldap:le,libxml:ue,lz4:de,mbregex:ae,mbstring:we,mcrypt:ce,memcache:ye,memcached:be,mongodb:xe,msgpack:ge,mysqli:me,mysqlnd:he,oci8:De,odbc:Se,opcache:Be,openssl:fe,opentelemetry:ze,parallel:We,"password-argon2":{support:{Windows:"wip",BSD:"wip"},notes:!0,type:"builtin","arg-type":"custom","lib-depends":["libargon2","openssl"]},pcntl:ve,pdo:qe,pdo_mysql:ke,pdo_odbc:_e,pdo_pgsql:Le,pdo_sqlite:je,pdo_sqlsrv:Fe,pgsql:Ce,phar:Ne,posix:Oe,protobuf:Te,rar:Ve,rdkafka:Ee,readline:Ie,redis:Ge,session:He,shmop:Me,simdjson:Ue,simplexml:Ae,snappy:Je,soap:Ke,sockets:Pe,sodium:Qe,spx:Re,sqlite3:Xe,sqlsrv:Ye,ssh2:Ze,swoole:$e,"swoole-hook-mysql":{support:{Windows:"no",BSD:"wip"},notes:!0,type:"addon","arg-type":"none","ext-depends":["mysqlnd","pdo","pdo_mysql","swoole"],"ext-suggests":["mysqli"]},"swoole-hook-pgsql":{support:{Windows:"no",BSD:"wip",Darwin:"partial"},notes:!0,type:"addon","arg-type":"none","ext-depends":["pgsql","pdo","swoole"]},"swoole-hook-sqlite":{support:{Windows:"no",BSD:"wip"},notes:!0,type:"addon","arg-type":"none","ext-depends":["sqlite3","pdo","swoole"]},"swoole-hook-odbc":{support:{Windows:"no",BSD:"wip"},notes:!0,type:"addon","arg-type":"none","ext-depends":["pdo","swoole"],"lib-depends":["unixodbc"]},swow:et,sysvmsg:tt,sysvsem:st,sysvshm:pt,tidy:it,tokenizer:nt,uuid:ot,uv:rt,xdebug:lt,xhprof:ut,xlswriter:dt,xml:at,xmlreader:wt,xmlwriter:ct,xsl:yt,xz:bt,yac:xt,yaml:gt,zip:mt,zlib:ht,zstd:Dt},Bt={class:"DocSearch-SearchBar",style:{padding:"0"}},ft={class:"DocSearch-Form searchinput"},zt={key:0},Wt={key:1},vt=["href"],qt={key:0,style:{margin:"0 4px 20px 4px",color:"var(--vp-c-text-2)","font-size":"14px"}},kt={name:"SearchTable"},jt=Object.assign(kt,{setup(_t){var a,w,c,y,b,x,g,m,h,D,S,B;const o=d([]);for(const[u,e]of Object.entries(St))o.value.push({name:u,linux:((a=e.support)==null?void 0:a.Linux)===void 0?"yes":((w=e.support)==null?void 0:w.Linux)==="wip"?"":(c=e.support)==null?void 0:c.Linux,macos:((y=e.support)==null?void 0:y.Darwin)===void 0?"yes":((b=e.support)==null?void 0:b.Darwin)==="wip"?"":(x=e.support)==null?void 0:x.Darwin,freebsd:((g=e.support)==null?void 0:g.BSD)===void 0?"yes":((m=e.support)==null?void 0:m.BSD)==="wip"?"":(h=e.support)==null?void 0:h.BSD,windows:((D=e.support)==null?void 0:D.Windows)===void 0?"yes":((S=e.support)==null?void 0:S.Windows)==="wip"?"":(B=e.support)==null?void 0:B.Windows,notes:e.notes===!0});const r=d(o.value),l=d(""),f=()=>{if(l.value===""){r.value=o.value;return}r.value=o.value.filter(u=>u.name.toLowerCase().includes(l.value.toLowerCase()))};return(u,e)=>(i(),p("div",null,[t("header",Bt,[t("form",ft,[W(t("input",{class:"DocSearch-Input","onUpdate:modelValue":e[0]||(e[0]=s=>l.value=s),placeholder:"Filter name...",onInput:f},null,544),[[v,l.value]])])]),t("table",null,[e[1]||(e[1]=t("thead",null,[t("tr",null,[t("th",null,"Extension Name"),t("th",null,"Linux"),t("th",null,"macOS"),t("th",null,"FreeBSD"),t("th",null,"Windows")])],-1)),t("tbody",null,[(i(!0),p(q,null,k(r.value,s=>(i(),p("tr",null,[s.notes?(i(),p("td",Wt,[t("a",{href:"./extension-notes.html#"+s.name},n(s.name),9,vt)])):(i(),p("td",zt,n(s.name),1)),t("td",null,n(s.linux),1),t("td",null,n(s.macos),1),t("td",null,n(s.freebsd),1),t("td",null,n(s.windows),1)]))),256))])]),r.value.length===0?(i(),p("div",qt," No result, please try another keyword. ")):z("",!0)]))}});export{jt as _}; diff --git a/assets/chunks/SearchTable.Dddvtmwz.js b/assets/chunks/SearchTable.Dddvtmwz.js new file mode 100644 index 00000000..18202091 --- /dev/null +++ b/assets/chunks/SearchTable.Dddvtmwz.js @@ -0,0 +1 @@ +import{x as d,c as p,o as i,j as t,e as w,ai as c,al as y,G as b,H as x,t as n}from"./framework.Bhsyh9kO.js";const g={support:{BSD:"wip"},type:"external","arg-type":"custom",source:"amqp","lib-depends":["librabbitmq"],"ext-depends-windows":["openssl"]},m={type:"external",source:"apcu"},h={type:"external",source:"ast"},D={type:"builtin"},S={type:"external",source:"ext-brotli","arg-type":"enable","lib-depends":["brotli"]},B={type:"builtin","arg-type-unix":"with-path","arg-type-windows":"with","lib-depends":["bzip2"]},f={type:"builtin"},z={type:"builtin"},W={notes:!0,type:"builtin","arg-type":"with","lib-depends":["curl"],"ext-depends-windows":["zlib","openssl"]},v={type:"builtin","arg-type":"custom","lib-suggests":["qdbm"]},q={support:{BSD:"wip"},type:"external",source:"dio"},k={support:{BSD:"wip"},type:"builtin","arg-type":"custom","arg-type-windows":"with","lib-depends":["libxml2","zlib"],"ext-depends-windows":["xml"]},_={type:"external",source:"ext-ds"},L={support:{Windows:"wip",BSD:"wip",Darwin:"wip",Linux:"wip"},type:"wip"},j={type:"external",source:"ev","arg-type-windows":"with","ext-depends":["sockets"]},F={support:{Windows:"wip",BSD:"wip"},notes:!0,type:"external",source:"ext-event","arg-type":"custom","lib-depends":["libevent"],"ext-depends":["openssl"],"ext-suggests":["sockets"]},C={type:"builtin"},N={support:{Linux:"partial",BSD:"wip"},notes:!0,"arg-type":"custom",type:"builtin","lib-depends-unix":["libffi"],"lib-depends-windows":["libffi-win"]},O={type:"builtin"},T={type:"builtin"},V={type:"builtin","lib-suggests":["openssl"]},E={support:{BSD:"wip"},notes:!0,type:"builtin","arg-type":"custom","arg-type-windows":"with","lib-depends":["zlib","libpng"],"ext-depends":["zlib"],"lib-suggests":["libavif","libwebp","libjpeg","freetype"]},I={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["gettext"]},G={support:{Windows:"wip",BSD:"no",Linux:"no"},notes:!0,type:"external","arg-type":"custom",source:"ext-glfw","lib-depends":["glfw"],"lib-depends-windows":[]},H={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["gmp"]},M={support:{BSD:"wip"},type:"external",source:"ext-gmssl","lib-depends":["gmssl"]},U={support:{Windows:"wip",BSD:"wip"},type:"external",source:"grpc","arg-type-unix":"enable-path","cpp-extension":!0,"lib-depends":["grpc"]},A={support:{BSD:"wip"},type:"builtin","arg-type":"with-path","arg-type-windows":"with","lib-depends-unix":["libiconv"],"lib-depends-windows":["libiconv-win"]},J={support:{BSD:"wip"},type:"external",source:"igbinary","ext-suggests":["session","apcu"]},K={support:{Windows:"wip",BSD:"wip"},notes:!0,type:"external",source:"ext-imagick","arg-type":"custom","lib-depends":["imagemagick"]},P={support:{Windows:"wip",BSD:"wip"},notes:!0,type:"external",source:"ext-imap","arg-type":"custom","lib-depends":["imap"],"ext-suggests":["openssl"]},Q={support:{Windows:"no",BSD:"wip",Darwin:"no"},type:"external",source:"inotify"},R={support:{BSD:"wip"},type:"builtin","lib-depends-unix":["icu"],"lib-depends-windows":["icu-static-win"]},X={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["ldap"],"lib-suggests":["gmp","libsodium"],"ext-suggests":["openssl"]},Y={support:{BSD:"wip"},type:"builtin","arg-type":"none","ext-depends":["xml"],target:["static"]},Z={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-lz4","arg-type":"custom","lib-depends":["liblz4"]},$={type:"builtin","arg-type":"custom",target:["static"],"ext-depends":["mbstring"],"lib-depends":["onig"]},ee={type:"builtin","arg-type":"custom"},te={type:"wip",support:{Windows:"no",BSD:"no",Darwin:"no",Linux:"no"},notes:!0},se={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-memcache","arg-type":"custom","ext-depends":["zlib","session"],"build-with-php":!0},pe={support:{Windows:"wip",BSD:"wip"},type:"external",source:"memcached","arg-type":"custom","cpp-extension":!0,"lib-depends":["libmemcached"],"lib-depends-unix":["libmemcached","fastlz"],"ext-depends":["session","zlib"]},ie={support:{BSD:"wip",Windows:"wip"},type:"external",source:"mongodb","arg-type":"custom","lib-suggests":["icu","openssl","zstd","zlib"],frameworks:["CoreFoundation","Security"]},ne={support:{BSD:"wip"},type:"external",source:"msgpack","arg-type-unix":"with","arg-type-win":"enable","ext-depends":["session"]},oe={type:"builtin","arg-type":"with","ext-depends":["mysqlnd"]},re={type:"builtin","arg-type-windows":"with","lib-depends":["zlib"]},le={type:"wip",support:{Windows:"wip",BSD:"no",Darwin:"no",Linux:"no"},notes:!0},ue={support:{BSD:"wip",Windows:"wip"},type:"builtin","arg-type-unix":"custom","lib-depends-unix":["unixodbc"]},de={type:"builtin","arg-type-unix":"custom","arg-type-windows":"enable","zend-extension":!0},ae={notes:!0,type:"builtin","arg-type":"custom","arg-type-windows":"with","build-with-php":!0,"lib-depends":["openssl","zlib"],"ext-depends":["zlib"]},we={support:{BSD:"wip"},type:"external",source:"opentelemetry"},ce={support:{BSD:"wip"},notes:!0,type:"external",source:"parallel","arg-type-windows":"with","lib-depends-windows":["pthreads4w"]},ye={support:{Windows:"no"},type:"builtin","unix-only":!0},be={type:"builtin"},xe={type:"builtin","arg-type":"with","ext-depends":["pdo","mysqlnd"]},ge={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends-unix":["unixodbc"],"ext-depends":["pdo","odbc"]},me={support:{BSD:"wip"},type:"builtin","arg-type":"with-path","arg-type-windows":"custom","ext-depends":["pdo","pgsql"],"lib-depends-unix":["postgresql"],"lib-depends-windows":["postgresql-win"]},he={support:{BSD:"wip"},type:"builtin","arg-type":"with","ext-depends":["pdo","sqlite3"],"lib-depends":["sqlite"]},De={support:{BSD:"wip"},type:"external",source:"pdo_sqlsrv","arg-type":"with","ext-depends":["pdo","sqlsrv"]},Se={support:{BSD:"wip"},notes:!0,type:"builtin","arg-type":"custom","lib-depends-unix":["postgresql"],"lib-depends-windows":["postgresql-win"]},Be={type:"builtin","ext-depends":["zlib"]},fe={support:{Windows:"no"},type:"builtin","unix-only":!0},ze={support:{Windows:"wip",BSD:"wip"},type:"external",source:"protobuf"},We={support:{BSD:"wip",Darwin:"partial"},notes:!0,type:"external",source:"rar","cpp-extension":!0},ve={support:{BSD:"wip",Windows:"wip"},type:"external",source:"ext-rdkafka","arg-type":"custom","cpp-extension":!0,"lib-depends":["librdkafka"]},qe={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["readline"],target:["static"]},ke={support:{BSD:"wip"},type:"external",source:"redis","arg-type":"custom","ext-suggests":["session","igbinary","msgpack"],"lib-suggests-unix":["zstd","liblz4"]},_e={type:"builtin","build-with-php":!0},Le={type:"builtin","build-with-php":!0},je={type:"external",source:"ext-simdjson","cpp-extension":!0},Fe={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends":["libxml2"],"ext-depends-windows":["xml"],"build-with-php":!0},Ce={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-snappy","cpp-extension":!0,"arg-type":"custom","lib-depends":["snappy"],"ext-suggests":["apcu"]},Ne={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends":["libxml2"],"ext-depends-windows":["xml"]},Oe={type:"builtin"},Te={support:{BSD:"wip"},type:"builtin","arg-type":"with","lib-depends":["libsodium"]},Ve={support:{BSD:"wip",Windows:"no"},notes:!0,type:"external",source:"spx","arg-type":"custom","lib-depends":["zlib"]},Ee={support:{BSD:"wip"},type:"builtin","arg-type":"with-path","arg-type-windows":"with","lib-depends":["sqlite"]},Ie={support:{BSD:"wip"},type:"external",source:"sqlsrv","lib-depends-unix":["unixodbc"],"ext-depends-linux":["pcntl"],"cpp-extension":!0},Ge={support:{BSD:"wip"},type:"external",source:"ext-ssh2","arg-type":"with-path","arg-type-windows":"with","lib-depends":["libssh2"],"ext-depends":["openssl","zlib"]},He={support:{Windows:"no",BSD:"wip"},notes:!0,type:"external",source:"swoole","arg-type":"custom","cpp-extension":!0,"unix-only":!0,"lib-depends":["libcares","brotli","nghttp2","zlib"],"lib-suggests":["zstd"],"lib-suggests-linux":["zstd","liburing"],"ext-depends":["openssl","curl"],"ext-suggests":["sockets","swoole-hook-pgsql","swoole-hook-mysql","swoole-hook-sqlite","swoole-hook-odbc"]},Me={support:{BSD:"wip"},notes:!0,type:"external",source:"swow","arg-type":"custom","lib-suggests":["openssl","curl"],"ext-suggests":["openssl","curl"]},Ue={support:{Windows:"no",BSD:"wip"},type:"builtin","unix-only":!0},Ae={support:{Windows:"no",BSD:"wip"},type:"builtin","unix-only":!0},Je={support:{BSD:"wip"},type:"builtin"},Ke={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["tidy"]},Pe={type:"builtin","build-with-php":!0},Qe={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-uuid","arg-type":"with-path","lib-depends":["libuuid"]},Re={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-uv","arg-type":"with-path","lib-depends":["libuv"],"ext-depends":["sockets"]},Xe={type:"external",source:"xdebug",target:["shared"],support:{Windows:"wip",BSD:"no",Darwin:"partial",Linux:"partial"},notes:!0,"zend-extension":!0},Ye={support:{Windows:"wip",BSD:"wip"},notes:!0,type:"external",source:"xhprof","ext-depends":["ctype"],"build-with-php":!0},Ze={support:{BSD:"wip"},type:"external",source:"xlswriter","arg-type":"custom","ext-depends":["zlib","zip"],"lib-suggests":["openssl"]},$e={support:{BSD:"wip"},notes:!0,type:"builtin","arg-type":"custom","arg-type-windows":"with","lib-depends":["libxml2"],"ext-depends-windows":["iconv"],"build-with-php":!0},et={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends":["libxml2"],"ext-depends-windows":["xml","dom"],"build-with-php":!0},tt={support:{BSD:"wip"},type:"builtin","arg-type":"custom","lib-depends":["libxml2"],"ext-depends-windows":["xml"],"build-with-php":!0},st={support:{Windows:"wip",BSD:"wip"},type:"builtin","arg-type":"with-path","lib-depends":["libxslt"],"ext-depends":["xml","dom"]},pt={type:"external",source:"ext-xz","arg-type":"with","lib-depends":["xz"]},it={support:{BSD:"wip"},type:"external",source:"yac","arg-type-unix":"custom","lib-depends-unix":["fastlz"],"ext-depends-unix":["igbinary"]},nt={support:{BSD:"wip"},type:"external",source:"yaml","arg-type-unix":"with-path","arg-type-windows":"with","lib-depends":["libyaml"]},ot={support:{BSD:"wip"},type:"builtin","arg-type":"with-path","arg-type-windows":"enable","lib-depends-unix":["libzip"],"ext-depends-windows":["zlib","bz2"],"lib-depends-windows":["libzip","zlib","bzip2","xz"]},rt={type:"builtin","arg-type":"custom","arg-type-windows":"enable","lib-depends":["zlib"],target:["static"]},lt={support:{Windows:"wip",BSD:"wip"},type:"external",source:"ext-zstd","arg-type":"custom","lib-depends":["zstd"]},ut={amqp:g,apcu:m,ast:h,bcmath:D,brotli:S,bz2:B,calendar:f,ctype:z,curl:W,dba:v,dio:q,dom:k,ds:_,enchant:L,ev:j,event:F,exif:C,ffi:N,fileinfo:O,filter:T,ftp:V,gd:E,gettext:I,glfw:G,gmp:H,gmssl:M,grpc:U,iconv:A,igbinary:J,imagick:K,imap:P,inotify:Q,intl:R,ldap:X,libxml:Y,lz4:Z,mbregex:$,mbstring:ee,mcrypt:te,memcache:se,memcached:pe,mongodb:ie,msgpack:ne,mysqli:oe,mysqlnd:re,oci8:le,odbc:ue,opcache:de,openssl:ae,opentelemetry:we,parallel:ce,"password-argon2":{support:{Windows:"wip",BSD:"wip"},notes:!0,type:"builtin","arg-type":"custom","lib-depends":["libargon2","openssl"]},pcntl:ye,pdo:be,pdo_mysql:xe,pdo_odbc:ge,pdo_pgsql:me,pdo_sqlite:he,pdo_sqlsrv:De,pgsql:Se,phar:Be,posix:fe,protobuf:ze,rar:We,rdkafka:ve,readline:qe,redis:ke,session:_e,shmop:Le,simdjson:je,simplexml:Fe,snappy:Ce,soap:Ne,sockets:Oe,sodium:Te,spx:Ve,sqlite3:Ee,sqlsrv:Ie,ssh2:Ge,swoole:He,"swoole-hook-mysql":{support:{Windows:"no",BSD:"wip"},notes:!0,type:"addon","arg-type":"none","ext-depends":["mysqlnd","pdo","pdo_mysql","swoole"],"ext-suggests":["mysqli"]},"swoole-hook-pgsql":{support:{Windows:"no",BSD:"wip",Darwin:"partial"},notes:!0,type:"addon","arg-type":"none","ext-depends":["pgsql","pdo","swoole"]},"swoole-hook-sqlite":{support:{Windows:"no",BSD:"wip"},notes:!0,type:"addon","arg-type":"none","ext-depends":["sqlite3","pdo","swoole"]},"swoole-hook-odbc":{support:{Windows:"no",BSD:"wip"},notes:!0,type:"addon","arg-type":"none","ext-depends":["pdo","swoole"],"lib-depends":["unixodbc"]},swow:Me,sysvmsg:Ue,sysvsem:Ae,sysvshm:Je,tidy:Ke,tokenizer:Pe,uuid:Qe,uv:Re,xdebug:Xe,xhprof:Ye,xlswriter:Ze,xml:$e,xmlreader:et,xmlwriter:tt,xsl:st,xz:pt,yac:it,yaml:nt,zip:ot,zlib:rt,zstd:lt},dt={class:"DocSearch-SearchBar",style:{padding:"0"}},at={class:"DocSearch-Form searchinput"},wt={key:0},ct={key:1},yt=["href"],bt={key:0,style:{margin:"0 4px 20px 4px",color:"var(--vp-c-text-2)","font-size":"14px"}},xt={name:"SearchTable"},ht=Object.assign(xt,{setup(gt){const o=d([]);for(const[u,e]of Object.entries(ut))o.value.push({name:u,linux:e.support?.Linux===void 0?"yes":e.support?.Linux==="wip"?"":e.support?.Linux,macos:e.support?.Darwin===void 0?"yes":e.support?.Darwin==="wip"?"":e.support?.Darwin,freebsd:e.support?.BSD===void 0?"yes":e.support?.BSD==="wip"?"":e.support?.BSD,windows:e.support?.Windows===void 0?"yes":e.support?.Windows==="wip"?"":e.support?.Windows,notes:e.notes===!0});const r=d(o.value),l=d(""),a=()=>{if(l.value===""){r.value=o.value;return}r.value=o.value.filter(u=>u.name.toLowerCase().includes(l.value.toLowerCase()))};return(u,e)=>(i(),p("div",null,[t("header",dt,[t("form",at,[c(t("input",{class:"DocSearch-Input","onUpdate:modelValue":e[0]||(e[0]=s=>l.value=s),placeholder:"Filter name...",onInput:a},null,544),[[y,l.value]])])]),t("table",null,[e[1]||(e[1]=t("thead",null,[t("tr",null,[t("th",null,"Extension Name"),t("th",null,"Linux"),t("th",null,"macOS"),t("th",null,"FreeBSD"),t("th",null,"Windows")])],-1)),t("tbody",null,[(i(!0),p(b,null,x(r.value,s=>(i(),p("tr",null,[s.notes?(i(),p("td",ct,[t("a",{href:"./extension-notes.html#"+s.name},n(s.name),9,yt)])):(i(),p("td",wt,n(s.name),1)),t("td",null,n(s.linux),1),t("td",null,n(s.macos),1),t("td",null,n(s.freebsd),1),t("td",null,n(s.windows),1)]))),256))])]),r.value.length===0?(i(),p("div",bt," No result, please try another keyword. ")):w("",!0)]))}});export{ht as _}; diff --git a/assets/chunks/VPAlgoliaSearchBox.nRDYEdJs.js b/assets/chunks/VPAlgoliaSearchBox.nRDYEdJs.js new file mode 100644 index 00000000..7dcd9753 --- /dev/null +++ b/assets/chunks/VPAlgoliaSearchBox.nRDYEdJs.js @@ -0,0 +1,80 @@ +import{d as fs,an as ps,p as hs,z as ds,R as ms,c as vs,o as Fs}from"./framework.Bhsyh9kO.js";import{u as gs}from"./theme.MOrVMOSc.js";/*! @docsearch/js 4.0.0-beta.8 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */function au(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(l){throw l},f:u}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var o,a=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var l=n.next();return a=l.done,l},e:function(l){i=!0,o=l},f:function(){try{a||n.return==null||n.return()}finally{if(i)throw o}}}}function iu(e,t,n){return(t=$a(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function su(){return su=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0;--B){var k=this.tryEntries[B],N=k.completion;if(k.tryLoc==="root")return y("end");if(k.tryLoc<=this.prev){var H=r.call(k,"catchLoc"),V=r.call(k,"finallyLoc");if(H&&V){if(this.prev=0;--y){var B=this.tryEntries[y];if(B.tryLoc<=this.prev&&r.call(B,"finallyLoc")&&this.prev=0;--m){var y=this.tryEntries[m];if(y.finallyLoc===v)return this.complete(y.completion,y.afterLoc),j(y),A}},catch:function(v){for(var m=this.tryEntries.length-1;m>=0;--m){var y=this.tryEntries[m];if(y.tryLoc===v){var B=y.completion;if(B.type==="throw"){var k=B.arg;j(y)}return k}}throw Error("illegal catch attempt")},delegateYield:function(v,m,y){return this.delegate={iterator:U(v),resultName:m,nextLoc:y},this.method==="next"&&(this.arg=e),A}},t}function Mn(e,t){return Mn=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(n,r){return n.__proto__=r,n},Mn(e,t)}function Xe(e,t){return(function(n){if(Array.isArray(n))return n})(e)||(function(n,r){var u=n==null?null:typeof Symbol<"u"&&n[Symbol.iterator]||n["@@iterator"];if(u!=null){var o,a,i,l,s=[],f=!0,D=!1;try{if(i=(u=u.call(n)).next,r===0){if(Object(u)!==u)return;f=!1}else for(;!(f=(o=i.call(u)).done)&&(s.push(o.value),s.length!==r);f=!0);}catch(h){D=!0,a=h}finally{try{if(!f&&u.return!=null&&(l=u.return(),Object(l)!==l))return}finally{if(D)throw a}}return s}})(e,t)||Ru(e,t)||(function(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)})()}function Ft(e){return(function(t){if(Array.isArray(t))return au(t)})(e)||(function(t){if(typeof Symbol<"u"&&t[Symbol.iterator]!=null||t["@@iterator"]!=null)return Array.from(t)})(e)||Ru(e)||(function(){throw new TypeError(`Invalid attempt to spread non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)})()}function $a(e){var t=(function(n,r){if(typeof n!="object"||!n)return n;var u=n[Symbol.toPrimitive];if(u!==void 0){var o=u.call(n,r);if(typeof o!="object")return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return(r==="string"?String:Number)(n)})(e,"string");return typeof t=="symbol"?t:t+""}function q(e){return q=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},q(e)}function Ru(e,t){if(e){if(typeof e=="string")return au(e,t);var n={}.toString.call(e).slice(8,-1);return n==="Object"&&e.constructor&&(n=e.constructor.name),n==="Map"||n==="Set"?Array.from(e):n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?au(e,t):void 0}}function lu(e){var t=typeof Map=="function"?new Map:void 0;return lu=function(n){if(n===null||!(function(u){try{return Function.toString.call(u).indexOf("[native code]")!==-1}catch{return typeof u=="function"}})(n))return n;if(typeof n!="function")throw new TypeError("Super expression must either be null or a function");if(t!==void 0){if(t.has(n))return t.get(n);t.set(n,r)}function r(){return(function(u,o,a){if(ju())return Reflect.construct.apply(null,arguments);var i=[null];i.push.apply(i,o);var l=new(u.bind.apply(u,i));return a&&Mn(l,a.prototype),l})(n,arguments,Ln(this).constructor)}return r.prototype=Object.create(n.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),Mn(r,n)},lu(e)}var Kn,ne,Ka,$t,Do,Wa,cu,Za,Nu,Du,fu,Ja,qn={},Qa=[],Es=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,Ir=Array.isArray;function _t(e,t){for(var n in t)e[n]=t[n];return e}function Lu(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function gt(e,t,n){var r,u,o,a={};for(o in t)o=="key"?r=t[o]:o=="ref"?u=t[o]:a[o]=t[o];if(arguments.length>2&&(a.children=arguments.length>3?Kn.call(arguments,2):n),typeof e=="function"&&e.defaultProps!=null)for(o in e.defaultProps)a[o]===void 0&&(a[o]=e.defaultProps[o]);return Cn(e,a,r,u,null)}function Cn(e,t,n,r,u){var o={type:e,props:t,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:u??++Ka,__i:-1,__u:0};return u==null&&ne.vnode!=null&&ne.vnode(o),o}function Et(e){return e.children}function yt(e,t){this.props=e,this.context=t}function on(e,t){if(t==null)return e.__?on(e.__,e.__i+1):null;for(var n;tt&&$t.sort(cu));yr.__r=0}function Ya(e,t,n,r,u,o,a,i,l,s,f){var D,h,p,d,F,A,C=r&&r.__k||Qa,g=t.length;for(l=(function(E,b,w,S,O){var P,x,R,_,T,j=w.length,M=j,U=0;for(E.__k=new Array(O),P=0;P0?Cn(x.type,x.props,x.key,x.ref?x.ref:null,x.__v):x).__=E,x.__b=E.__b+1,R=null,(T=x.__i=ys(x,w,_,M))!==-1&&(M--,(R=w[T])&&(R.__u|=2)),R==null||R.__v===null?(T==-1&&U--,typeof x.type!="function"&&(x.__u|=4)):T!=_&&(T==_-1?U--:T==_+1?U++:(T>_?U--:U++,x.__u|=4))):E.__k[P]=null;if(M)for(P=0;P(l==null||2&l.__u?0:1))for(u=n-1,o=n+1;u>=0||o=0){if((l=t[u])&&!(2&l.__u)&&a==l.key&&i===l.type)return u;u--}if(o2&&(i.children=arguments.length>3?Kn.call(arguments,2):n),Cn(e.type,i,r||e.key,u||e.ref,null)}function ri(e,t){var n={__c:t="__cC"+Ja++,__:e,Consumer:function(r,u){return r.children(u)},Provider:function(r){var u,o;return this.getChildContext||(u=new Set,(o={})[t]=this,this.getChildContext=function(){return o},this.componentWillUnmount=function(){u=null},this.shouldComponentUpdate=function(a){this.props.value!==a.value&&u.forEach((function(i){i.__e=!0,pu(i)}))},this.sub=function(a){u.add(a);var i=a.componentWillUnmount;a.componentWillUnmount=function(){u&&u.delete(a),i&&i.call(a)}}),r.children}};return n.Provider.__=n.Consumer.contextType=n}Kn=Qa.slice,ne={__e:function(e,t,n,r){for(var u,o,a;t=t.__;)if((u=t.__c)&&!u.__)try{if((o=u.constructor)&&o.getDerivedStateFromError!=null&&(u.setState(o.getDerivedStateFromError(e)),a=u.__d),u.componentDidCatch!=null&&(u.componentDidCatch(e,r||{}),a=u.__d),a)return u.__E=u}catch(i){e=i}throw e}},Ka=0,yt.prototype.setState=function(e,t){var n;n=this.__s!=null&&this.__s!==this.state?this.__s:this.__s=_t({},this.state),typeof e=="function"&&(e=e(_t({},n),this.props)),e&&_t(n,e),e!=null&&this.__v&&(t&&this._sb.push(t),pu(this))},yt.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),pu(this))},yt.prototype.render=Et,$t=[],Wa=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,cu=function(e,t){return e.__v.__b-t.__v.__b},yr.__r=0,Za=/(PointerCapture)$|Capture$/i,Nu=0,Du=po(!1),fu=po(!0),Ja=0;var jt,xe,Rr,ho,an=0,ui=[],Te=ne,mo=Te.__b,vo=Te.__r,Fo=Te.diffed,go=Te.__c,Eo=Te.unmount,yo=Te.__;function ln(e,t){Te.__h&&Te.__h(xe,e,an||t),an=0;var n=xe.__H||(xe.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function Ot(e){return an=1,Hu(ii,e)}function Hu(e,t,n){var r=ln(jt++,2);if(r.t=e,!r.__c&&(r.__=[n?n(t):ii(void 0,t),function(i){var l=r.__N?r.__N[0]:r.__[0],s=r.t(l,i);l!==s&&(r.__N=[s,r.__[1]],r.__c.setState({}))}],r.__c=xe,!xe.u)){var u=function(i,l,s){if(!r.__c.__H)return!0;var f=r.__c.__H.__.filter((function(h){return!!h.__c}));if(f.every((function(h){return!h.__N})))return!o||o.call(this,i,l,s);var D=r.__c.props!==i;return f.forEach((function(h){if(h.__N){var p=h.__[0];h.__=h.__N,h.__N=void 0,p!==h.__[0]&&(D=!0)}})),o&&o.call(this,i,l,s)||D};xe.u=!0;var o=xe.shouldComponentUpdate,a=xe.componentWillUpdate;xe.componentWillUpdate=function(i,l,s){if(this.__e){var f=o;o=void 0,u(i,l,s),o=f}a&&a.call(this,i,l,s)},xe.shouldComponentUpdate=u}return r.__N||r.__}function it(e,t){var n=ln(jt++,3);!Te.__s&&Vu(n.__H,t)&&(n.__=e,n.i=t,xe.__H.__h.push(n))}function cn(e,t){var n=ln(jt++,4);!Te.__s&&Vu(n.__H,t)&&(n.__=e,n.i=t,xe.__h.push(n))}function ot(e){return an=5,Rt((function(){return{current:e}}),[])}function oi(e,t,n){an=6,cn((function(){return typeof e=="function"?(e(t()),function(){return e(null)}):e?(e.current=t(),function(){return e.current=null}):void 0}),n==null?n:n.concat(e))}function Rt(e,t){var n=ln(jt++,7);return Vu(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function ut(e,t){return an=8,Rt((function(){return e}),t)}function Uu(e){var t=xe.context[e.__c],n=ln(jt++,9);return n.c=e,t?(n.__==null&&(n.__=!0,t.sub(xe)),t.props.value):e.__}function zu(e,t){Te.useDebugValue&&Te.useDebugValue(t?t(e):e)}function ai(){var e=ln(jt++,11);if(!e.__){for(var t=xe.__v;t!==null&&!t.__m&&t.__!==null;)t=t.__;var n=t.__m||(t.__m=[0,0]);e.__="P"+n[0]+"-"+n[1]++}return e.__}function _s(){for(var e;e=ui.shift();)if(e.__P&&e.__H)try{e.__H.__h.forEach(pr),e.__H.__h.forEach(hu),e.__H.__h=[]}catch(t){e.__H.__h=[],Te.__e(t,e.__v)}}Te.__b=function(e){xe=null,mo&&mo(e)},Te.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),yo&&yo(e,t)},Te.__r=function(e){vo&&vo(e),jt=0;var t=(xe=e.__c).__H;t&&(Rr===xe?(t.__h=[],xe.__h=[],t.__.forEach((function(n){n.__N&&(n.__=n.__N),n.i=n.__N=void 0}))):(t.__h.forEach(pr),t.__h.forEach(hu),t.__h=[],jt=0)),Rr=xe},Te.diffed=function(e){Fo&&Fo(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(ui.push(t)!==1&&ho===Te.requestAnimationFrame||((ho=Te.requestAnimationFrame)||ks)(_s)),t.__H.__.forEach((function(n){n.i&&(n.__H=n.i),n.i=void 0}))),Rr=xe=null},Te.__c=function(e,t){t.some((function(n){try{n.__h.forEach(pr),n.__h=n.__h.filter((function(r){return!r.__||hu(r)}))}catch(r){t.some((function(u){u.__h&&(u.__h=[])})),t=[],Te.__e(r,n.__v)}})),go&&go(e,t)},Te.unmount=function(e){Eo&&Eo(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.forEach((function(r){try{pr(r)}catch(u){t=u}})),n.__H=void 0,t&&Te.__e(t,n.__v))};var Co=typeof requestAnimationFrame=="function";function ks(e){var t,n=function(){clearTimeout(r),Co&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,100);Co&&(t=requestAnimationFrame(n))}function pr(e){var t=xe,n=e.__c;typeof n=="function"&&(e.__c=void 0,n()),xe=t}function hu(e){var t=xe;e.__c=e.__(),xe=t}function Vu(e,t){return!e||e.length!==t.length||t.some((function(n,r){return n!==e[r]}))}function ii(e,t){return typeof t=="function"?t(e):t}function si(e,t){for(var n in t)e[n]=t[n];return e}function du(e,t){for(var n in e)if(n!=="__source"&&!(n in t))return!0;for(var r in t)if(r!=="__source"&&e[r]!==t[r])return!0;return!1}function li(e,t){var n=t(),r=Ot({t:{__:n,u:t}}),u=r[0].t,o=r[1];return cn((function(){u.__=n,u.u=t,Nr(u)&&o({t:u})}),[e,n,t]),it((function(){return Nr(u)&&o({t:u}),e((function(){Nr(u)&&o({t:u})}))}),[e]),n}function Nr(e){var t,n,r=e.u,u=e.__;try{var o=r();return!((t=u)===(n=o)&&(t!==0||1/t==1/n)||t!=t&&n!=n)}catch{return!0}}function ci(e){e()}function Di(e){return e}function fi(){return[!1,ci]}var pi=cn;function mu(e,t){this.props=e,this.context=t}function hi(e,t){function n(u){var o=this.props.ref,a=o==u.ref;return!a&&o&&(o.call?o(null):o.current=null),t?!t(this.props,u)||!a:du(this.props,u)}function r(u){return this.shouldComponentUpdate=n,gt(e,u)}return r.displayName="Memo("+(e.displayName||e.name)+")",r.prototype.isReactComponent=!0,r.__f=!0,r}(mu.prototype=new yt).isPureReactComponent=!0,mu.prototype.shouldComponentUpdate=function(e,t){return du(this.props,e)||du(this.state,t)};var Ao=ne.__b;ne.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),Ao&&Ao(e)};var ws=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.forward_ref")||3911,bo=function(e,t){return e==null?null:xt(xt(e).map(t))},Ss={map:bo,forEach:bo,count:function(e){return e?xt(e).length:0},only:function(e){var t=xt(e);if(t.length!==1)throw"Children.only";return t[0]},toArray:xt},xs=ne.__e;ne.__e=function(e,t,n,r){if(e.then){for(var u,o=t;o=o.__;)if((u=o.__c)&&u.__c)return t.__e==null&&(t.__e=n.__e,t.__k=n.__k),u.__c(e,t)}xs(e,t,n,r)};var _o=ne.unmount;function di(e,t,n){return e&&(e.__c&&e.__c.__H&&(e.__c.__H.__.forEach((function(r){typeof r.__c=="function"&&r.__c()})),e.__c.__H=null),(e=si({},e)).__c!=null&&(e.__c.__P===n&&(e.__c.__P=t),e.__c=null),e.__k=e.__k&&e.__k.map((function(r){return di(r,t,n)}))),e}function mi(e,t,n){return e&&n&&(e.__v=null,e.__k=e.__k&&e.__k.map((function(r){return mi(r,t,n)})),e.__c&&e.__c.__P===t&&(e.__e&&n.appendChild(e.__e),e.__c.__e=!0,e.__c.__P=n)),e}function hr(){this.__u=0,this.o=null,this.__b=null}function vi(e){var t=e.__.__c;return t&&t.__a&&t.__a(e)}function En(){this.i=null,this.l=null}ne.unmount=function(e){var t=e.__c;t&&t.__R&&t.__R(),t&&32&e.__u&&(e.type=null),_o&&_o(e)},(hr.prototype=new yt).__c=function(e,t){var n=t.__c,r=this;r.o==null&&(r.o=[]),r.o.push(n);var u=vi(r.__v),o=!1,a=function(){o||(o=!0,n.__R=null,u?u(i):i())};n.__R=a;var i=function(){if(!--r.__u){if(r.state.__a){var l=r.state.__a;r.__v.__k[0]=mi(l,l.__c.__P,l.__c.__O)}var s;for(r.setState({__a:r.__b=null});s=r.o.pop();)s.forceUpdate()}};r.__u++||32&t.__u||r.setState({__a:r.__b=r.__v.__k[0]}),e.then(a,a)},hr.prototype.componentWillUnmount=function(){this.o=[]},hr.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var n=document.createElement("div"),r=this.__v.__k[0].__c;this.__v.__k[0]=di(this.__b,n,r.__O=r.__P)}this.__b=null}var u=t.__a&>(Et,null,e.fallback);return u&&(u.__u&=-33),[gt(Et,null,t.__a?null:e.children),u]};var ko=function(e,t,n){if(++n[1]===n[0]&&e.l.delete(t),e.props.revealOrder&&(e.props.revealOrder[0]!=="t"||!e.l.size))for(n=e.i;n;){for(;n.length>3;)n.pop()();if(n[1]>>1,1),t.h.removeChild(r)}}),Hn(gt(Bs,{context:t.context},e.__v),t.v)}function Fi(e,t){var n=gt(Os,{__v:e,h:t});return n.containerInfo=t,n}(En.prototype=new yt).__a=function(e){var t=this,n=vi(t.__v),r=t.l.get(e);return r[0]++,function(u){var o=function(){t.props.revealOrder?(r.push(u),ko(t,e,r)):u()};n?n(o):o()}},En.prototype.render=function(e){this.i=null,this.l=new Map;var t=xt(e.children);e.revealOrder&&e.revealOrder[0]==="b"&&t.reverse();for(var n=t.length;n--;)this.l.set(t[n],this.i=[1,0,this.i]);return e.children},En.prototype.componentDidUpdate=En.prototype.componentDidMount=function(){var e=this;this.l.forEach((function(t,n){ko(e,n,t)}))};var gi=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.element")||60103,Is=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Ts=/^on(Ani|Tra|Tou|BeforeInp|Compo)/,Ps=/[A-Z0-9]/g,js=typeof document<"u",Rs=function(e){return(typeof Symbol<"u"&&q(Symbol())=="symbol"?/fil|che|rad/:/fil|che|ra/).test(e)};function Ei(e,t,n){return t.__k==null&&(t.textContent=""),Hn(e,t),typeof n=="function"&&n(),e?e.__c:null}yt.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(yt.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var wo=ne.event;function Ns(){}function Ls(){return this.cancelBubble}function Ms(){return this.defaultPrevented}ne.event=function(e){return wo&&(e=wo(e)),e.persist=Ns,e.isPropagationStopped=Ls,e.isDefaultPrevented=Ms,e.nativeEvent=e};var $u,qs={enumerable:!1,configurable:!0,get:function(){return this.class}},So=ne.vnode;ne.vnode=function(e){typeof e.type=="string"&&(function(t){var n=t.props,r=t.type,u={},o=r.indexOf("-")===-1;for(var a in n){var i=n[a];if(!(a==="value"&&"defaultValue"in n&&i==null||js&&a==="children"&&r==="noscript"||a==="class"||a==="className")){var l=a.toLowerCase();a==="defaultValue"&&"value"in n&&n.value==null?a="value":a==="download"&&i===!0?i="":l==="translate"&&i==="no"?i=!1:l[0]==="o"&&l[1]==="n"?l==="ondoubleclick"?a="ondblclick":l!=="onchange"||r!=="input"&&r!=="textarea"||Rs(n.type)?l==="onfocus"?a="onfocusin":l==="onblur"?a="onfocusout":Ts.test(a)&&(a=l):l=a="oninput":o&&Is.test(a)?a=a.replace(Ps,"-$&").toLowerCase():i===null&&(i=void 0),l==="oninput"&&u[a=l]&&(a="oninputCapture"),u[a]=i}}r=="select"&&u.multiple&&Array.isArray(u.value)&&(u.value=xt(n.children).forEach((function(s){s.props.selected=u.value.indexOf(s.props.value)!=-1}))),r=="select"&&u.defaultValue!=null&&(u.value=xt(n.children).forEach((function(s){s.props.selected=u.multiple?u.defaultValue.indexOf(s.props.value)!=-1:u.defaultValue==s.props.value}))),n.class&&!n.className?(u.class=n.class,Object.defineProperty(u,"className",qs)):(n.className&&!n.class||n.class&&n.className)&&(u.class=u.className=n.className),t.props=u})(e),e.$$typeof=gi,So&&So(e)};var xo=ne.__r;ne.__r=function(e){xo&&xo(e),$u=e.__c};var Bo=ne.diffed;ne.diffed=function(e){Bo&&Bo(e);var t=e.props,n=e.__e;n!=null&&e.type==="textarea"&&"value"in t&&t.value!==n.value&&(n.value=t.value==null?"":t.value),$u=null};var Hs={ReactCurrentDispatcher:{current:{readContext:function(e){return $u.__n[e.__c].props.value},useCallback:ut,useContext:Uu,useDebugValue:zu,useDeferredValue:Di,useEffect:it,useId:ai,useImperativeHandle:oi,useInsertionEffect:pi,useLayoutEffect:cn,useMemo:Rt,useReducer:Hu,useRef:ot,useState:Ot,useSyncExternalStore:li,useTransition:fi}}};function Xn(e){return!!e&&e.$$typeof===gi}function yi(e){return!!e.__k&&(Hn(null,e),!0)}var c={useState:Ot,useId:ai,useReducer:Hu,useEffect:it,useLayoutEffect:cn,useInsertionEffect:pi,useTransition:fi,useDeferredValue:Di,useSyncExternalStore:li,startTransition:ci,useRef:ot,useImperativeHandle:oi,useMemo:Rt,useCallback:ut,useContext:Uu,useDebugValue:zu,version:"18.3.1",Children:Ss,render:Ei,hydrate:function(e,t,n){return ni(e,t),typeof n=="function"&&n(),e?e.__c:null},unmountComponentAtNode:yi,createPortal:Fi,createElement:gt,createContext:ri,createFactory:function(e){return gt.bind(null,e)},cloneElement:function(e){return Xn(e)?bs.apply(null,arguments):e},createRef:function(){return{current:null}},Fragment:Et,isValidElement:Xn,isElement:Xn,isFragment:function(e){return Xn(e)&&e.type===Et},isMemo:function(e){return!!e&&!!e.displayName&&(typeof e.displayName=="string"||e.displayName instanceof String)&&e.displayName.startsWith("Memo(")},findDOMNode:function(e){return e&&(e.base||e.nodeType===1&&e)||null},Component:yt,PureComponent:mu,memo:hi,forwardRef:function(e){function t(n){var r=si({},n);return delete r.ref,e(r,n.ref||null)}return t.$$typeof=ws,t.render=t,t.prototype.isReactComponent=t.__f=!0,t.displayName="ForwardRef("+(e.displayName||e.name)+")",t},flushSync:function(e,t){return e(t)},unstable_batchedUpdates:function(e,t){return e(t)},StrictMode:Et,Suspense:hr,SuspenseList:En,lazy:function(e){var t,n,r;function u(o){if(t||(t=e()).then((function(a){n=a.default||a}),(function(a){r=a})),r)throw r;if(!n)throw t;return gt(n,o)}return u.displayName="Lazy",u.__f=!0,u},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:Hs};function vu(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(l){throw l},f:u}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var o,a=!0,i=!1;return{s:function(){n=n.call(e)},n:function(){var l=n.next();return a=l.done,l},e:function(l){i=!0,o=l},f:function(){try{a||n.return==null||n.return()}finally{if(i)throw o}}}}function ve(e,t,n){return(t=Ci(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Pe(){return Pe=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0;--B){var k=this.tryEntries[B],N=k.completion;if(k.tryLoc==="root")return y("end");if(k.tryLoc<=this.prev){var H=r.call(k,"catchLoc"),V=r.call(k,"finallyLoc");if(H&&V){if(this.prev=0;--y){var B=this.tryEntries[y];if(B.tryLoc<=this.prev&&r.call(B,"finallyLoc")&&this.prev=0;--m){var y=this.tryEntries[m];if(y.finallyLoc===v)return this.complete(y.completion,y.afterLoc),j(y),A}},catch:function(v){for(var m=this.tryEntries.length-1;m>=0;--m){var y=this.tryEntries[m];if(y.tryLoc===v){var B=y.completion;if(B.type==="throw"){var k=B.arg;j(y)}return k}}throw Error("illegal catch attempt")},delegateYield:function(v,m,y){return this.delegate={iterator:U(v),resultName:m,nextLoc:y},this.method==="next"&&(this.arg=e),A}},t}function zn(e,t){return zn=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(n,r){return n.__proto__=r,n},zn(e,t)}function qe(e,t){return(function(n){if(Array.isArray(n))return n})(e)||(function(n,r){var u=n==null?null:typeof Symbol<"u"&&n[Symbol.iterator]||n["@@iterator"];if(u!=null){var o,a,i,l,s=[],f=!0,D=!1;try{if(i=(u=u.call(n)).next,r===0){if(Object(u)!==u)return;f=!1}else for(;!(f=(o=i.call(u)).done)&&(s.push(o.value),s.length!==r);f=!0);}catch(h){D=!0,a=h}finally{try{if(!f&&u.return!=null&&(l=u.return(),Object(l)!==l))return}finally{if(D)throw a}}return s}})(e,t)||Wu(e,t)||(function(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)})()}function Ct(e){return(function(t){if(Array.isArray(t))return vu(t)})(e)||(function(t){if(typeof Symbol<"u"&&t[Symbol.iterator]!=null||t["@@iterator"]!=null)return Array.from(t)})(e)||Wu(e)||(function(){throw new TypeError(`Invalid attempt to spread non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)})()}function Ci(e){var t=(function(n){if(q(n)!="object"||!n)return n;var r=n[Symbol.toPrimitive];if(r!==void 0){var u=r.call(n,"string");if(q(u)!="object")return u;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(n)})(e);return q(t)=="symbol"?t:t+""}function Zt(e){return Zt=typeof Symbol=="function"&&q(Symbol.iterator)=="symbol"?function(t){return q(t)}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":q(t)},Zt(e)}function Wu(e,t){if(e){if(typeof e=="string")return vu(e,t);var n={}.toString.call(e).slice(8,-1);return n==="Object"&&e.constructor&&(n=e.constructor.name),n==="Map"||n==="Set"?Array.from(e):n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?vu(e,t):void 0}}function Fu(e){var t=typeof Map=="function"?new Map:void 0;return Fu=function(n){if(n===null||!(function(u){try{return Function.toString.call(u).indexOf("[native code]")!==-1}catch{return typeof u=="function"}})(n))return n;if(typeof n!="function")throw new TypeError("Super expression must either be null or a function");if(t!==void 0){if(t.has(n))return t.get(n);t.set(n,r)}function r(){return(function(u,o,a){if(Ku())return Reflect.construct.apply(null,arguments);var i=[null];i.push.apply(i,o);var l=new(u.bind.apply(u,i));return a&&zn(l,a.prototype),l})(n,arguments,Un(this).constructor)}return r.prototype=Object.create(n.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),zn(r,n)},Fu(e)}function Us(){return c.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg"},c.createElement("path",{d:"M8.19531 8.76758H7.33398C7.02539 8.76758 6.74414 8.69531 6.49023 8.55078C6.23633 8.40234 6.0332 8.20312 5.88086 7.95312C5.73242 7.70312 5.6582 7.42188 5.6582 7.10938C5.6582 6.80078 5.73242 6.51953 5.88086 6.26562C6.0332 6.01172 6.23633 5.80859 6.49023 5.65625C6.74414 5.50391 7.02539 5.42773 7.33398 5.42773C7.64258 5.42773 7.92383 5.50391 8.17773 5.65625C8.43164 5.80859 8.63281 6.01172 8.78125 6.26562C8.93359 6.51953 9.00977 6.80078 9.00977 7.10938V7.96484H10.9902V7.10938C10.9902 6.80078 11.0664 6.51953 11.2188 6.26562C11.3711 6.01172 11.5723 5.80859 11.8223 5.65625C12.0762 5.50391 12.3574 5.42773 12.666 5.42773C12.9746 5.42773 13.2559 5.50391 13.5098 5.65625C13.7637 5.80859 13.9648 6.01172 14.1133 6.26562C14.2656 6.51953 14.3418 6.80078 14.3418 7.10938C14.3418 7.42188 14.2656 7.70312 14.1133 7.95312C13.9648 8.20312 13.7637 8.40234 13.5098 8.55078C13.2559 8.69531 12.9746 8.76758 12.666 8.76758H11.8105V10.7773H12.666C12.9746 10.7773 13.2559 10.8516 13.5098 11C13.7637 11.1445 13.9648 11.3418 14.1133 11.5918C14.2656 11.8418 14.3418 12.123 14.3418 12.4355C14.3418 12.7441 14.2656 13.0254 14.1133 13.2793C13.9648 13.5332 13.7637 13.7363 13.5098 13.8887C13.2559 14.041 12.9746 14.1172 12.666 14.1172C12.3574 14.1172 12.0762 14.041 11.8223 13.8887C11.5723 13.7363 11.3711 13.5332 11.2188 13.2793C11.0664 13.0254 10.9902 12.7441 10.9902 12.4355V11.5801H9.00977V12.4355C9.00977 12.7441 8.93359 13.0254 8.78125 13.2793C8.63281 13.5332 8.43164 13.7363 8.17773 13.8887C7.92383 14.041 7.64258 14.1172 7.33398 14.1172C7.02539 14.1172 6.74414 14.041 6.49023 13.8887C6.23633 13.7363 6.0332 13.5332 5.88086 13.2793C5.73242 13.0254 5.6582 12.7441 5.6582 12.4355C5.6582 12.123 5.73242 11.8418 5.88086 11.5918C6.0332 11.3418 6.23633 11.1445 6.49023 11C6.74414 10.8516 7.02539 10.7773 7.33398 10.7773H8.19531V8.76758ZM7.33398 7.97656H8.19531V7.10938C8.19531 6.875 8.10938 6.67383 7.9375 6.50586C7.76953 6.33398 7.56836 6.24805 7.33398 6.24805C7.09961 6.24805 6.89648 6.33398 6.72461 6.50586C6.55664 6.67383 6.47266 6.875 6.47266 7.10938C6.47266 7.34766 6.55664 7.55273 6.72461 7.72461C6.89648 7.89258 7.09961 7.97656 7.33398 7.97656ZM12.666 7.97656C12.9004 7.97656 13.1016 7.89258 13.2695 7.72461C13.4414 7.55273 13.5273 7.34766 13.5273 7.10938C13.5273 6.875 13.4414 6.67383 13.2695 6.50586C13.1016 6.33398 12.9004 6.24805 12.666 6.24805C12.4316 6.24805 12.2305 6.33398 12.0625 6.50586C11.8945 6.67383 11.8105 6.875 11.8105 7.10938V7.97656H12.666ZM9.00977 10.7773H10.9902V8.76758H9.00977V10.7773ZM7.33398 11.5625C7.09961 11.5625 6.89648 11.6484 6.72461 11.8203C6.55664 11.9883 6.47266 12.1914 6.47266 12.4297C6.47266 12.6641 6.55664 12.8672 6.72461 13.0391C6.89648 13.207 7.09961 13.291 7.33398 13.291C7.56836 13.291 7.76953 13.207 7.9375 13.0391C8.10938 12.8672 8.19531 12.6641 8.19531 12.4297V11.5625H7.33398ZM12.666 11.5625H11.8105V12.4297C11.8105 12.6641 11.8945 12.8672 12.0625 13.0391C12.2305 13.207 12.4316 13.291 12.666 13.291C12.9004 13.291 13.1016 13.207 13.2695 13.0391C13.4414 12.8672 13.5273 12.6641 13.5273 12.4297C13.5273 12.1914 13.4414 11.9883 13.2695 11.8203C13.1016 11.6484 12.9004 11.5625 12.666 11.5625Z",fill:"currentColor"}))}function zs(){return c.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20",fill:"none",xmlns:"http://www.w3.org/2000/svg"},c.createElement("path",{d:"M8.01562 11.1758L7.95703 9.65234H8.22656L11.9297 5.54492H13.2539L9.75586 9.32422L9.26367 9.79883L8.01562 11.1758ZM7.07812 14V5.54492H8.13281V14H7.07812ZM12.1992 14L9.04102 9.78711L9.76758 9.05469L13.5645 14H12.1992Z",fill:"currentColor"}))}function Vs(){return c.createElement("svg",{width:"33",height:"20",viewBox:"0 0 33 20",fill:"none",xmlns:"http://www.w3.org/2000/svg"},c.createElement("path",{d:"M10.4824 14.1992C9.7168 14.1992 9.05469 14.0195 8.49609 13.6602C7.9375 13.3008 7.50586 12.791 7.20117 12.1309C6.90039 11.4707 6.75 10.6875 6.75 9.78125V9.76953C6.75 8.85938 6.90039 8.07422 7.20117 7.41406C7.50586 6.75391 7.93555 6.24414 8.49023 5.88477C9.04883 5.52539 9.71094 5.3457 10.4766 5.3457C11.0703 5.3457 11.6094 5.46289 12.0938 5.69727C12.582 5.92773 12.9844 6.25 13.3008 6.66406C13.6172 7.07422 13.8164 7.54883 13.8984 8.08789L13.8926 8.09961H12.832L12.8262 8.08789C12.7324 7.72461 12.5742 7.41211 12.3516 7.15039C12.1289 6.88477 11.8574 6.67969 11.5371 6.53516C11.2207 6.39062 10.8672 6.31836 10.4766 6.31836C9.9375 6.31836 9.46875 6.45898 9.07031 6.74023C8.67578 7.02148 8.37109 7.41992 8.15625 7.93555C7.94141 8.45117 7.83398 9.0625 7.83398 9.76953V9.78125C7.83398 10.4844 7.94141 11.0938 8.15625 11.6094C8.37109 12.125 8.67578 12.5234 9.07031 12.8047C9.46875 13.0859 9.93945 13.2266 10.4824 13.2266C10.877 13.2266 11.2344 13.1641 11.5547 13.0391C11.875 12.9102 12.1445 12.7285 12.3633 12.4941C12.582 12.2559 12.7344 11.9746 12.8203 11.6504L12.832 11.6387H13.8984V11.6504C13.8047 12.166 13.6016 12.6152 13.2891 12.998C12.9766 13.377 12.5801 13.6719 12.0996 13.8828C11.623 14.0938 11.084 14.1992 10.4824 14.1992ZM17.7832 14.0469C17.1348 14.0469 16.6641 13.916 16.3711 13.6543C16.082 13.3926 15.9375 12.9609 15.9375 12.3594V8.52734H14.9414V7.68359H15.9375V6.04883H16.9922V7.68359H18.375V8.52734H16.9922V12.1016C16.9922 12.4727 17.0625 12.7402 17.2031 12.9043C17.3438 13.0645 17.5781 13.1445 17.9062 13.1445C17.9961 13.1445 18.0723 13.1426 18.1348 13.1387C18.2012 13.1348 18.2812 13.1289 18.375 13.1211V13.9883C18.2773 14.0039 18.1797 14.0176 18.082 14.0293C17.9844 14.041 17.8848 14.0469 17.7832 14.0469ZM19.8984 14V7.68359H20.918V8.62109H21.0117C21.1328 8.28906 21.3379 8.03125 21.627 7.84766C21.916 7.66406 22.2734 7.57227 22.6992 7.57227C22.7969 7.57227 22.8926 7.57812 22.9863 7.58984C23.084 7.59766 23.1582 7.60547 23.209 7.61328V8.60352C23.1035 8.58398 23 8.57031 22.8984 8.5625C22.8008 8.55078 22.6953 8.54492 22.582 8.54492C22.2578 8.54492 21.9707 8.60938 21.7207 8.73828C21.4707 8.86719 21.2734 9.04688 21.1289 9.27734C20.9883 9.50781 20.918 9.77734 20.918 10.0859V14H19.8984ZM24.5273 14V5.17578H25.5469V14H24.5273Z",fill:"currentColor"}))}function Wn(e){var t=e.size,n=t===void 0?20:t,r=e.color,u=r===void 0?"currentColor":r;return c.createElement("svg",{width:n,height:n,className:"DocSearch-Search-Icon",viewBox:"0 0 24 24","aria-hidden":"true"},c.createElement("circle",{cx:"11",cy:"11",r:"8",stroke:u,fill:"none",strokeWidth:"1.4"}),c.createElement("path",{d:"m21 21-4.3-4.3",stroke:u,fill:"none",strokeLinecap:"round",strokeLinejoin:"round"}))}var Zu=function(e){var t=e.theme;it((function(){if(t){var n=document.documentElement.dataset.theme;if(t!==n)return document.documentElement.dataset.theme=t,function(){n===void 0?delete document.documentElement.dataset.theme:document.documentElement.dataset.theme=n}}}),[t])},$s=["translations"],Lr="Ctrl",Ks=c.forwardRef((function(e,t){var n=e.translations,r=n===void 0?{}:n,u=Dt(e,$s),o=r.buttonText,a=o===void 0?"Search":o,i=r.buttonAriaLabel,l=i===void 0?"Search":i,s=qe(Ot(null),2),f=s[0],D=s[1];Zu({theme:u.theme}),it((function(){typeof navigator<"u"&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?D("⌘"):D(Lr))}),[]);var h=qe(f===Lr?[Lr,"Control",c.createElement(Vs,null)]:["Meta","Meta",c.createElement(Us,null)],3),p=h[0],d=h[1],F=h[2],A="".concat(d,"+k");return c.createElement("button",Pe({type:"button",className:"DocSearch DocSearch-Button","aria-label":"".concat(l," (").concat(A,")"),"aria-keyshortcuts":A},u,{ref:t}),c.createElement("span",{className:"DocSearch-Button-Container"},c.createElement(Wn,null),c.createElement("span",{className:"DocSearch-Button-Placeholder"},a)),c.createElement("span",{className:"DocSearch-Button-Keys"},f!==null&&c.createElement(c.Fragment,null,c.createElement(Po,{reactsToKey:p},F),c.createElement(Po,{reactsToKey:"k"},c.createElement(zs,null)))))}));function Po(e){var t=e.reactsToKey,n=e.children,r=qe(Ot(!1),2),u=r[0],o=r[1];return it((function(){if(t)return window.addEventListener("keydown",a),window.addEventListener("keyup",i),function(){window.removeEventListener("keydown",a),window.removeEventListener("keyup",i)};function a(l){l.key===t&&o(!0)}function i(l){l.key!==t&&l.key!=="Meta"||o(!1)}}),[t]),c.createElement("kbd",{className:u?"DocSearch-Button-Key DocSearch-Button-Key--pressed":"DocSearch-Button-Key"+(t==="Ctrl"?" DocSearch-Button-Key--ctrl":"")},n)}var Ai,bi="vercel.ai.error",Ws=Symbol.for(bi),Zs=(function(){function e(t){var n,r=t.name,u=t.message,o=t.cause;return Sr(this,e),(n=wr(this,e,[u]))[Ai]=!0,n.name=r,n.cause=o,n}return Or(e,lu(Error)),xr(e,0,[{key:"isInstance",value:function(t){return e.hasMarker(t,bi)}},{key:"hasMarker",value:function(t,n){var r=Symbol.for(n);return t!=null&&q(t)=="object"&&r in t&&typeof t[r]=="boolean"&&t[r]===!0}}])})();Ai=Ws;var sn=Zs;function _i(e){return e==null?"unknown error":typeof e=="string"?e:e instanceof Error?e.message:JSON.stringify(e)}var ki,wi="AI_InvalidArgumentError",Si="vercel.ai.error.".concat(wi),Js=Symbol.for(Si),Qs=(function(){function e(t){var n,r=t.message,u=t.cause,o=t.argument;return Sr(this,e),(n=wr(this,e,[{name:wi,message:r,cause:u}]))[ki]=!0,n.argument=o,n}return Or(e,sn),xr(e,0,[{key:"isInstance",value:function(t){return sn.hasMarker(t,Si)}}])})();ki=Js;var xi,Bi="AI_JSONParseError",Oi="vercel.ai.error.".concat(Bi),Gs=Symbol.for(Oi),jo=(function(){function e(t){var n,r=t.text,u=t.cause;return Sr(this,e),(n=wr(this,e,[{name:Bi,message:"JSON parsing failed: Text: ".concat(r,`. +Error message: `).concat(_i(u)),cause:u}]))[xi]=!0,n.text=r,n}return Or(e,sn),xr(e,0,[{key:"isInstance",value:function(t){return sn.hasMarker(t,Oi)}}])})();xi=Gs;var Ii,Ti="AI_TypeValidationError",Pi="vercel.ai.error.".concat(Ti),Ys=Symbol.for(Pi);Ii=Ys;var Ro=(function(){function e(t){var n,r=t.value,u=t.cause;return Sr(this,e),(n=wr(this,e,[{name:Ti,message:"Type validation failed: Value: ".concat(JSON.stringify(r),`. +Error message: `).concat(_i(u)),cause:u}]))[Ii]=!0,n.value=r,n}return Or(e,sn),xr(e,0,[{key:"isInstance",value:function(t){return sn.hasMarker(t,Pi)}},{key:"wrap",value:function(t){var n=t.value,r=t.cause;return e.isInstance(r)&&r.value===n?r:new e({value:n,cause:r})}}])})();function ji(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var No,Mt={exports:{}},Xs=ji((function(){if(No)return Mt.exports;No=1;var e=typeof Buffer<"u",t=/"(?:_|\\u005[Ff])(?:_|\\u005[Ff])(?:p|\\u0070)(?:r|\\u0072)(?:o|\\u006[Ff])(?:t|\\u0074)(?:o|\\u006[Ff])(?:_|\\u005[Ff])(?:_|\\u005[Ff])"\s*:/,n=/"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/;function r(a,i,l){l==null&&i!==null&&Zt(i)==="object"&&(l=i,i=void 0),e&&Buffer.isBuffer(a)&&(a=a.toString()),a&&a.charCodeAt(0)===65279&&(a=a.slice(1));var s=JSON.parse(a,i);if(s===null||Zt(s)!=="object")return s;var f=l&&l.protoAction||"error",D=l&&l.constructorAction||"error";if(f==="ignore"&&D==="ignore")return s;if(f!=="ignore"&&D!=="ignore"){if(t.test(a)===!1&&n.test(a)===!1)return s}else if(f!=="ignore"&&D==="ignore"){if(t.test(a)===!1)return s}else if(n.test(a)===!1)return s;return u(s,{protoAction:f,constructorAction:D,safe:l&&l.safe})}function u(a){for(var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},l=i.protoAction,s=l===void 0?"error":l,f=i.constructorAction,D=f===void 0?"error":f,h=i.safe,p=[a];p.length;){var d=p;p=[];var F,A=kt(d);try{for(A.s();!(F=A.n()).done;){var C=F.value;if(s!=="ignore"&&Object.prototype.hasOwnProperty.call(C,"__proto__")){if(h===!0)return null;if(s==="error")throw new SyntaxError("Object contains forbidden prototype property");delete C.__proto__}if(D!=="ignore"&&Object.prototype.hasOwnProperty.call(C,"constructor")&&Object.prototype.hasOwnProperty.call(C.constructor,"prototype")){if(h===!0)return null;if(D==="error")throw new SyntaxError("Object contains forbidden prototype property");delete C.constructor}for(var g in C){var E=C[g];E&&Zt(E)==="object"&&p.push(E)}}}catch(b){A.e(b)}finally{A.f()}}return a}function o(a,i,l){var s=Error.stackTraceLimit;Error.stackTraceLimit=0;try{return r(a,i,l)}finally{Error.stackTraceLimit=s}}return Mt.exports=o,Mt.exports.default=o,Mt.exports.parse=o,Mt.exports.safeParse=function(a,i){var l=Error.stackTraceLimit;Error.stackTraceLimit=0;try{return r(a,i,{safe:!0})}catch{return null}finally{Error.stackTraceLimit=l}},Mt.exports.scan=u,Mt.exports})()),Ju=(function(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},t=e.prefix,n=e.size,r=n===void 0?16:n,u=e.alphabet,o=u===void 0?"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz":u,a=e.separator,i=a===void 0?"-":a,l=(function(s){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:21;return function(){for(var D="",h=0|(arguments.length>0&&arguments[0]!==void 0?arguments[0]:f);h--;)D+=s[Math.random()*s.length|0];return D}})(o,r);if(t==null)return l;if(o.includes(i))throw new Qs({argument:"separator",message:'The separator "'.concat(i,'" must not be part of the alphabet "').concat(o,'".')});return function(s){return"".concat(t).concat(i).concat(l(s))}})(),Mr=Symbol.for("vercel.ai.validator");function Lo(e){var t=e.text,n=e.schema;try{var r=Xs.parse(t);if(n==null)return{success:!0,value:r,rawValue:r};var u=(function(o){var a,i=o.value,l=(function(f){return(function(p){return q(p)=="object"&&p!==null&&Mr in p&&p[Mr]===!0&&"validate"in p})(f)?f:(D=f,h=function(p){var d=D.safeParse(p);return d.success?{success:!0,value:d.data}:{success:!1,error:d.error}},iu(iu({},Mr,!0),"validate",h));var D,h})(o.schema);try{if(l.validate==null)return{success:!0,value:i};var s=l.validate(i);return s.success?s:{success:!1,error:Ro.wrap({value:i,cause:s.error})}}catch(f){return{success:!1,error:Ro.wrap({value:i,cause:f})}}})({value:r,schema:n});return u.success?fe(fe({},u),{},{rawValue:r}):u}catch(o){return{success:!1,error:jo.isInstance(o)?o:new jo({text:t,cause:o})}}}new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");var el={code:"0",name:"text",parse:function(e){if(typeof e!="string")throw new Error('"text" parts expect a string value.');return{type:"text",value:e}}},tl={code:"3",name:"error",parse:function(e){if(typeof e!="string")throw new Error('"error" parts expect a string value.');return{type:"error",value:e}}},nl={code:"4",name:"assistant_message",parse:function(e){if(!(e!=null&&q(e)=="object"&&"id"in e&&"role"in e&&"content"in e&&typeof e.id=="string"&&typeof e.role=="string"&&e.role==="assistant"&&Array.isArray(e.content)&&e.content.every((function(t){return t!=null&&q(t)=="object"&&"type"in t&&t.type==="text"&&"text"in t&&t.text!=null&&q(t.text)=="object"&&"value"in t.text&&typeof t.text.value=="string"}))))throw new Error('"assistant_message" parts expect an object with an "id", "role", and "content" property.');return{type:"assistant_message",value:e}}},rl={code:"5",name:"assistant_control_data",parse:function(e){if(e==null||q(e)!="object"||!("threadId"in e)||!("messageId"in e)||typeof e.threadId!="string"||typeof e.messageId!="string")throw new Error('"assistant_control_data" parts expect an object with a "threadId" and "messageId" property.');return{type:"assistant_control_data",value:{threadId:e.threadId,messageId:e.messageId}}}},ul={code:"6",name:"data_message",parse:function(e){if(e==null||q(e)!="object"||!("role"in e)||!("data"in e)||typeof e.role!="string"||e.role!=="data")throw new Error('"data_message" parts expect an object with a "role" and "data" property.');return{type:"data_message",value:e}}};function ol(e){var t=["ROOT"],n=-1,r=null;function u(p,d,F){switch(p){case'"':n=d,t.pop(),t.push(F),t.push("INSIDE_STRING");break;case"f":case"t":case"n":n=d,r=d,t.pop(),t.push(F),t.push("INSIDE_LITERAL");break;case"-":t.pop(),t.push(F),t.push("INSIDE_NUMBER");break;case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":n=d,t.pop(),t.push(F),t.push("INSIDE_NUMBER");break;case"{":n=d,t.pop(),t.push(F),t.push("INSIDE_OBJECT_START");break;case"[":n=d,t.pop(),t.push(F),t.push("INSIDE_ARRAY_START")}}function o(p,d){switch(p){case",":t.pop(),t.push("INSIDE_OBJECT_AFTER_COMMA");break;case"}":n=d,t.pop()}}function a(p,d){switch(p){case",":t.pop(),t.push("INSIDE_ARRAY_AFTER_COMMA");break;case"]":n=d,t.pop()}}for(var i=0;i=0;D--)switch(t[D]){case"INSIDE_STRING":f+='"';break;case"INSIDE_OBJECT_KEY":case"INSIDE_OBJECT_AFTER_KEY":case"INSIDE_OBJECT_AFTER_COMMA":case"INSIDE_OBJECT_START":case"INSIDE_OBJECT_BEFORE_VALUE":case"INSIDE_OBJECT_AFTER_VALUE":f+="}";break;case"INSIDE_ARRAY_START":case"INSIDE_ARRAY_AFTER_COMMA":case"INSIDE_ARRAY_AFTER_VALUE":f+="]";break;case"INSIDE_LITERAL":var h=e.substring(r,e.length);"true".startsWith(h)?f+="true".slice(h.length):"false".startsWith(h)?f+="false".slice(h.length):"null".startsWith(h)&&(f+="null".slice(h.length))}return f}[el,tl,nl,rl,ul].map((function(e){return e.code}));var Qu=[{code:"0",name:"text",parse:function(e){if(typeof e!="string")throw new Error('"text" parts expect a string value.');return{type:"text",value:e}}},{code:"2",name:"data",parse:function(e){if(!Array.isArray(e))throw new Error('"data" parts expect an array value.');return{type:"data",value:e}}},{code:"3",name:"error",parse:function(e){if(typeof e!="string")throw new Error('"error" parts expect a string value.');return{type:"error",value:e}}},{code:"8",name:"message_annotations",parse:function(e){if(!Array.isArray(e))throw new Error('"message_annotations" parts expect an array value.');return{type:"message_annotations",value:e}}},{code:"9",name:"tool_call",parse:function(e){if(e==null||q(e)!="object"||!("toolCallId"in e)||typeof e.toolCallId!="string"||!("toolName"in e)||typeof e.toolName!="string"||!("args"in e)||q(e.args)!="object")throw new Error('"tool_call" parts expect an object with a "toolCallId", "toolName", and "args" property.');return{type:"tool_call",value:e}}},{code:"a",name:"tool_result",parse:function(e){if(e==null||q(e)!="object"||!("toolCallId"in e)||typeof e.toolCallId!="string"||!("result"in e))throw new Error('"tool_result" parts expect an object with a "toolCallId" and a "result" property.');return{type:"tool_result",value:e}}},{code:"b",name:"tool_call_streaming_start",parse:function(e){if(e==null||q(e)!="object"||!("toolCallId"in e)||typeof e.toolCallId!="string"||!("toolName"in e)||typeof e.toolName!="string")throw new Error('"tool_call_streaming_start" parts expect an object with a "toolCallId" and "toolName" property.');return{type:"tool_call_streaming_start",value:e}}},{code:"c",name:"tool_call_delta",parse:function(e){if(e==null||q(e)!="object"||!("toolCallId"in e)||typeof e.toolCallId!="string"||!("argsTextDelta"in e)||typeof e.argsTextDelta!="string")throw new Error('"tool_call_delta" parts expect an object with a "toolCallId" and "argsTextDelta" property.');return{type:"tool_call_delta",value:e}}},{code:"d",name:"finish_message",parse:function(e){if(e==null||q(e)!="object"||!("finishReason"in e)||typeof e.finishReason!="string")throw new Error('"finish_message" parts expect an object with a "finishReason" property.');var t={finishReason:e.finishReason};return"usage"in e&&e.usage!=null&&q(e.usage)=="object"&&"promptTokens"in e.usage&&"completionTokens"in e.usage&&(t.usage={promptTokens:typeof e.usage.promptTokens=="number"?e.usage.promptTokens:Number.NaN,completionTokens:typeof e.usage.completionTokens=="number"?e.usage.completionTokens:Number.NaN}),{type:"finish_message",value:t}}},{code:"e",name:"finish_step",parse:function(e){if(e==null||q(e)!="object"||!("finishReason"in e)||typeof e.finishReason!="string")throw new Error('"finish_step" parts expect an object with a "finishReason" property.');var t={finishReason:e.finishReason,isContinued:!1};return"usage"in e&&e.usage!=null&&q(e.usage)=="object"&&"promptTokens"in e.usage&&"completionTokens"in e.usage&&(t.usage={promptTokens:typeof e.usage.promptTokens=="number"?e.usage.promptTokens:Number.NaN,completionTokens:typeof e.usage.completionTokens=="number"?e.usage.completionTokens:Number.NaN}),"isContinued"in e&&typeof e.isContinued=="boolean"&&(t.isContinued=e.isContinued),{type:"finish_step",value:t}}},{code:"f",name:"start_step",parse:function(e){if(e==null||q(e)!="object"||!("messageId"in e)||typeof e.messageId!="string")throw new Error('"start_step" parts expect an object with an "id" property.');return{type:"start_step",value:{messageId:e.messageId}}}},{code:"g",name:"reasoning",parse:function(e){if(typeof e!="string")throw new Error('"reasoning" parts expect a string value.');return{type:"reasoning",value:e}}},{code:"h",name:"source",parse:function(e){if(e==null||q(e)!="object")throw new Error('"source" parts expect a Source object.');return{type:"source",value:e}}},{code:"i",name:"redacted_reasoning",parse:function(e){if(e==null||q(e)!="object"||!("data"in e)||typeof e.data!="string")throw new Error('"redacted_reasoning" parts expect an object with a "data" property.');return{type:"redacted_reasoning",value:{data:e.data}}}},{code:"j",name:"reasoning_signature",parse:function(e){if(e==null||q(e)!="object"||!("signature"in e)||typeof e.signature!="string")throw new Error('"reasoning_signature" parts expect an object with a "signature" property.');return{type:"reasoning_signature",value:{signature:e.signature}}}},{code:"k",name:"file",parse:function(e){if(e==null||q(e)!="object"||!("data"in e)||typeof e.data!="string"||!("mimeType"in e)||typeof e.mimeType!="string")throw new Error('"file" parts expect an object with a "data" and "mimeType" property.');return{type:"file",value:e}}}],al=Object.fromEntries(Qu.map((function(e){return[e.code,e]})));Object.fromEntries(Qu.map((function(e){return[e.name,e.code]})));var il=Qu.map((function(e){return e.code})),sl=function(e){var t=e.indexOf(":");if(t===-1)throw new Error("Failed to parse stream string. No separator found.");var n=e.slice(0,t);if(!il.includes(n))throw new Error("Failed to parse stream string. Invalid code ".concat(n,"."));var r=n,u=e.slice(t+1),o=JSON.parse(u);return al[r].parse(o)},ll=10;function cl(e,t){var n,r=new Uint8Array(t),u=0,o=Br(e);try{for(o.s();!(n=o.n()).done;){var a=n.value;r.set(a,u),u+=a.length}}catch(i){o.e(i)}finally{o.f()}return e.length=0,r}function Dl(e){return gu.apply(this,arguments)}function gu(){return gu=Qe(pe().mark((function e(t){var n,r,u,o,a,i,l,s,f,D,h,p,d,F,A,C,g,E,b,w,S,O,P,x;return pe().wrap((function(R){for(;;)switch(R.prev=R.next){case 0:return x=function(){var _=[].concat(b);w?.length&&(F.annotations=w);var T=fe(fe({},structuredClone(F)),{},{revisionId:i()});r({message:T,data:_,replaceLastMessage:p})},E=function(_,T){var j=F.parts.find((function(M){return M.type==="tool-invocation"&&M.toolInvocation.toolCallId===_}));j!=null?j.toolInvocation=T:F.parts.push({type:"tool-invocation",toolInvocation:T})},n=t.stream,r=t.update,u=t.onToolCall,o=t.onFinish,a=t.generateId,i=a===void 0?Ju:a,l=t.getCurrentDate,s=l===void 0?function(){return new Date}:l,f=t.lastMessage,p=f?.role==="assistant",d=p?1+((h=(D=f.toolInvocations)==null?void 0:D.reduce((function(_,T){var j;return Math.max(_,(j=T.step)!=null?j:0)}),0))!=null?h:0):0,F=p?structuredClone(f):{id:i(),createdAt:s(),role:"assistant",content:"",parts:[]},b=[],w=p?f?.annotations:void 0,S={},O={completionTokens:NaN,promptTokens:NaN,totalTokens:NaN},P="unknown",R.next=12,(function(){var _=Qe(pe().mark((function T(j){var M,U,v,m,y,B,k,N,H,V,z,Z,X,ae,Le,He,Fe,Be,re,Ee,we,Ge,Ke,Ze,ie,Q,se,Y,he,G;return pe().wrap((function(I){for(;;)switch(I.prev=I.next){case 0:M=j.stream,U=j.onTextPart,v=j.onReasoningPart,m=j.onReasoningSignaturePart,y=j.onRedactedReasoningPart,B=j.onSourcePart,k=j.onFilePart,N=j.onDataPart,H=j.onErrorPart,V=j.onToolCallStreamingStartPart,z=j.onToolCallDeltaPart,Z=j.onToolCallPart,X=j.onToolResultPart,ae=j.onMessageAnnotationsPart,Le=j.onFinishMessagePart,He=j.onFinishStepPart,Fe=j.onStartStepPart,Be=M.getReader(),re=new TextDecoder,Ee=[],we=0;case 3:return I.next=5,Be.read();case 5:if(Ge=I.sent,!(Ke=Ge.value)||(Ee.push(Ke),we+=Ke.length,Ke[Ke.length-1]===ll)){I.next=9;break}return I.abrupt("continue",81);case 9:if(Ee.length!==0){I.next=11;break}return I.abrupt("break",83);case 11:Ze=cl(Ee,we),we=0,ie=re.decode(Ze,{stream:!0}).split(` +`).filter((function(K){return K!==""})).map(sl),Q=Br(ie),I.prev=15,Q.s();case 17:if((se=Q.n()).done){I.next=73;break}Y=se.value,he=Y.type,G=Y.value,I.t0=he,I.next=I.t0==="text"?22:I.t0==="reasoning"?25:I.t0==="reasoning_signature"?28:I.t0==="redacted_reasoning"?31:I.t0==="file"?34:I.t0==="source"?37:I.t0==="data"?40:I.t0==="error"?43:I.t0==="message_annotations"?46:I.t0==="tool_call_streaming_start"?49:I.t0==="tool_call_delta"?52:I.t0==="tool_call"?55:I.t0==="tool_result"?58:I.t0==="finish_message"?61:I.t0==="finish_step"?64:I.t0==="start_step"?67:70;break;case 22:return I.next=24,U?.(G);case 24:return I.abrupt("break",71);case 25:return I.next=27,v?.(G);case 27:return I.abrupt("break",71);case 28:return I.next=30,m?.(G);case 30:return I.abrupt("break",71);case 31:return I.next=33,y?.(G);case 33:return I.abrupt("break",71);case 34:return I.next=36,k?.(G);case 36:return I.abrupt("break",71);case 37:return I.next=39,B?.(G);case 39:return I.abrupt("break",71);case 40:return I.next=42,N?.(G);case 42:return I.abrupt("break",71);case 43:return I.next=45,H?.(G);case 45:return I.abrupt("break",71);case 46:return I.next=48,ae?.(G);case 48:return I.abrupt("break",71);case 49:return I.next=51,V?.(G);case 51:return I.abrupt("break",71);case 52:return I.next=54,z?.(G);case 54:return I.abrupt("break",71);case 55:return I.next=57,Z?.(G);case 57:return I.abrupt("break",71);case 58:return I.next=60,X?.(G);case 60:return I.abrupt("break",71);case 61:return I.next=63,Le?.(G);case 63:return I.abrupt("break",71);case 64:return I.next=66,He?.(G);case 66:return I.abrupt("break",71);case 67:return I.next=69,Fe?.(G);case 69:return I.abrupt("break",71);case 70:throw new Error("Unknown stream part type: ".concat(he));case 71:I.next=17;break;case 73:I.next=78;break;case 75:I.prev=75,I.t1=I.catch(15),Q.e(I.t1);case 78:return I.prev=78,Q.f(),I.finish(78);case 81:I.next=3;break;case 83:case"end":return I.stop()}}),T,null,[[15,75,78,81]])})));return function(T){return _.apply(this,arguments)}})()({stream:n,onTextPart:function(_){A==null?(A={type:"text",text:_},F.parts.push(A)):A.text+=_,F.content+=_,x()},onReasoningPart:function(_){var T;g==null?(g={type:"text",text:_},C?.details.push(g)):g.text+=_,C==null?(C={type:"reasoning",reasoning:_,details:[g]},F.parts.push(C)):C.reasoning+=_,F.reasoning=((T=F.reasoning)!=null?T:"")+_,x()},onReasoningSignaturePart:function(_){g!=null&&(g.signature=_.signature)},onRedactedReasoningPart:function(_){C==null&&(C={type:"reasoning",reasoning:"",details:[]},F.parts.push(C)),C.details.push({type:"redacted",data:_.data}),g=void 0,x()},onFilePart:function(_){F.parts.push({type:"file",mimeType:_.mimeType,data:_.data}),x()},onSourcePart:function(_){F.parts.push({type:"source",source:_}),x()},onToolCallStreamingStartPart:function(_){F.toolInvocations==null&&(F.toolInvocations=[]),S[_.toolCallId]={text:"",step:d,toolName:_.toolName,index:F.toolInvocations.length};var T={state:"partial-call",step:d,toolCallId:_.toolCallId,toolName:_.toolName,args:void 0};F.toolInvocations.push(T),E(_.toolCallId,T),x()},onToolCallDeltaPart:function(_){var T=S[_.toolCallId];T.text+=_.argsTextDelta;var j=(function(v){if(v===void 0)return{value:void 0,state:"undefined-input"};var m=Lo({text:v});return m.success?{value:m.value,state:"successful-parse"}:(m=Lo({text:ol(v)})).success?{value:m.value,state:"repaired-parse"}:{value:void 0,state:"failed-parse"}})(T.text),M=j.value,U={state:"partial-call",step:T.step,toolCallId:_.toolCallId,toolName:T.toolName,args:M};F.toolInvocations[T.index]=U,E(_.toolCallId,U),x()},onToolCallPart:function(_){return Qe(pe().mark((function T(){var j,M,U;return pe().wrap((function(v){for(;;)switch(v.prev=v.next){case 0:if(j=fe({state:"call",step:d},_),S[_.toolCallId]!=null?F.toolInvocations[S[_.toolCallId].index]=j:(F.toolInvocations==null&&(F.toolInvocations=[]),F.toolInvocations.push(j)),E(_.toolCallId,j),x(),!u){v.next=6;break}return v.next=4,u({toolCall:_});case 4:(M=v.sent)!=null&&(U=fe(fe({state:"result",step:d},_),{},{result:M}),F.toolInvocations[F.toolInvocations.length-1]=U,E(_.toolCallId,U),x());case 6:case"end":return v.stop()}}),T)})))()},onToolResultPart:function(_){var T=F.toolInvocations;if(T==null)throw new Error("tool_result must be preceded by a tool_call");var j=T.findIndex((function(U){return U.toolCallId===_.toolCallId}));if(j===-1)throw new Error("tool_result must be preceded by a tool_call with the same toolCallId");var M=fe(fe({},T[j]),{},{state:"result"},_);T[j]=M,E(_.toolCallId,M),x()},onDataPart:function(_){b.push.apply(b,Ft(_)),x()},onMessageAnnotationsPart:function(_){var T;w==null?w=Ft(_):(T=w).push.apply(T,Ft(_)),x()},onFinishStepPart:function(_){d+=1,A=_.isContinued?A:void 0,C=void 0,g=void 0},onStartStepPart:function(_){p||(F.id=_.messageId),F.parts.push({type:"step-start"}),x()},onFinishMessagePart:function(_){P=_.finishReason,_.usage!=null&&(O=(function(T){var j=T.promptTokens,M=T.completionTokens;return{promptTokens:j,completionTokens:M,totalTokens:j+M}})(_.usage))},onErrorPart:function(_){throw new Error(_)}});case 12:o?.({message:F,finishReason:P,usage:O});case 13:case"end":return R.stop()}}),e)}))),gu.apply(this,arguments)}function fl(e){return Eu.apply(this,arguments)}function Eu(){return Eu=Qe(pe().mark((function e(t){var n,r,u,o,a,i,l,s;return pe().wrap((function(f){for(;;)switch(f.prev=f.next){case 0:return n=t.stream,r=t.update,u=t.onFinish,o=t.getCurrentDate,a=o===void 0?function(){return new Date}:o,i=t.generateId,l={type:"text",text:""},s={id:(i===void 0?Ju:i)(),createdAt:a(),role:"assistant",content:"",parts:[l]},f.next=4,(function(){var D=Qe(pe().mark((function h(p){var d,F,A,C,g,E;return pe().wrap((function(b){for(;;)switch(b.prev=b.next){case 0:d=p.stream,F=p.onTextPart,A=d.pipeThrough(new TextDecoderStream).getReader();case 2:return b.next=4,A.read();case 4:if(C=b.sent,g=C.done,E=C.value,!g){b.next=9;break}return b.abrupt("break",13);case 9:return b.next=11,F(E);case 11:b.next=2;break;case 13:case"end":return b.stop()}}),h)})));return function(h){return D.apply(this,arguments)}})()({stream:n,onTextPart:function(D){s.content+=D,l.text+=D,r({message:fe({},s),data:[],replaceLastMessage:!1})}});case 4:u?.(s,{usage:{completionTokens:NaN,promptTokens:NaN,totalTokens:NaN},finishReason:"unknown"});case 5:case"end":return f.stop()}}),e)}))),Eu.apply(this,arguments)}function qr(e){return e?.reduce((function(t,n){var r;return Math.max(t,(r=n.step)!=null?r:0)}),0)}function Ri(e){var t;return(t=e.parts)!=null?t:[].concat(Ft(e.toolInvocations?e.toolInvocations.map((function(n){return{type:"tool-invocation",toolInvocation:n}})):[]),Ft(e.reasoning?[{type:"reasoning",reasoning:e.reasoning,details:[{type:"text",text:e.reasoning}]}]:[]),Ft(e.content?[{type:"text",text:e.content}]:[]))}function Hr(e){return e.map((function(t){return fe(fe({},t),{},{parts:Ri(t)})}))}function yu(e,t){if(e===t)return!0;if(e==null||t==null)return!1;if(q(e)!="object"&&q(t)!="object")return e===t;if(e.constructor!==t.constructor)return!1;if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(Array.isArray(e)){if(e.length!==t.length)return!1;for(var n=0;n0&&n.every((function(r){return"result"in r.toolInvocation}))}var Ho,Uo,zo={exports:{}},Ur={},pl=(Uo||(Uo=1,zo.exports=(function(){if(Ho)return Ur;Ho=1;var e=c,t=typeof Object.is=="function"?Object.is:function(l,s){return l===s&&(l!==0||1/l==1/s)||l!=l&&s!=s},n=e.useState,r=e.useEffect,u=e.useLayoutEffect,o=e.useDebugValue;function a(l){var s=l.getSnapshot;l=l.value;try{var f=s();return!t(l,f)}catch{return!0}}var i=typeof window>"u"||window.document===void 0||window.document.createElement===void 0?function(l,s){return s()}:function(l,s){var f=s(),D=n({inst:{value:f,getSnapshot:s}}),h=D[0].inst,p=D[1];return u((function(){h.value=f,h.getSnapshot=s,a(h)&&p({inst:h})}),[l,f,s]),r((function(){return a(h)&&p({inst:h}),l((function(){a(h)&&p({inst:h})}))}),[l]),o(f),f};return Ur.useSyncExternalStore=e.useSyncExternalStore!==void 0?e.useSyncExternalStore:i,Ur})()),zo.exports),Vo=Object.prototype.hasOwnProperty,bt=new WeakMap,Wt=function(){},Ye=void 0,Au=Object,De=function(e){return e===Ye},vt=function(e){return typeof e=="function"},Pt=function(e,t){return fe(fe({},e),t)},Ni=function(e){return vt(e.then)},zr={},er={},Gu="undefined",Zn=(typeof window>"u"?"undefined":q(window))!=Gu,bu=(typeof document>"u"?"undefined":q(document))!=Gu,hl=Zn&&"Deno"in window,Li=function(e,t){var n=bt.get(e);return[function(){return!De(t)&&e.get(t)||zr},function(r){if(!De(t)){var u=e.get(t);t in er||(er[t]=u),n[5](t,Pt(u,r),u||zr)}},n[6],function(){return!De(t)&&t in er?er[t]:!De(t)&&e.get(t)||zr}]},_u=!0,Mi=Xe(Zn&&window.addEventListener?[window.addEventListener.bind(window),window.removeEventListener.bind(window)]:[Wt,Wt],2),Vr=Mi[0],$r=Mi[1],dl={isOnline:function(){return _u},isVisible:function(){var e=bu&&document.visibilityState;return De(e)||e!=="hidden"}},ml={initFocus:function(e){return bu&&document.addEventListener("visibilitychange",e),Vr("focus",e),function(){bu&&document.removeEventListener("visibilitychange",e),$r("focus",e)}},initReconnect:function(e){var t=function(){_u=!0,e()},n=function(){_u=!1};return Vr("online",t),Vr("offline",n),function(){$r("online",t),$r("offline",n)}}},$o=!c.useId,Vn=!Zn||hl,Kr=Vn?it:cn,Wr=typeof navigator<"u"&&navigator.connection,Ko=!Vn&&Wr&&(["slow-2g","2g"].includes(Wr.effectiveType)||Wr.saveData),tr=new WeakMap,Zr=function(e,t){return Au.prototype.toString.call(e)==="[object ".concat(t,"]")},vl=0,ku=function(e){var t,n,r=q(e),u=Zr(e,"Date"),o=Zr(e,"RegExp"),a=Zr(e,"Object");if(Au(e)!==e||u||o)t=u?e.toJSON():r=="symbol"?e.toString():r=="string"?JSON.stringify(e):""+e;else{if(t=tr.get(e))return t;if(t=++vl+"~",tr.set(e,t),Array.isArray(e)){for(t="@",n=0;no||setTimeout(r,i,u)},onDiscarded:Wt,revalidateOnFocus:!0,revalidateOnReconnect:!0,revalidateIfStale:!0,shouldRetryOnError:!0,errorRetryInterval:Ko?1e4:5e3,focusThrottleInterval:5e3,dedupingInterval:2e3,loadingTimeout:Ko?5e3:3e3,compare:function e(t,n){var r,u;if(t===n)return!0;if(t&&n&&(r=t.constructor)===n.constructor){if(r===Date)return t.getTime()===n.getTime();if(r===RegExp)return t.toString()===n.toString();if(r===Array){if((u=t.length)===n.length)for(;u--&&e(t[u],n[u]););return u===-1}if(!r||q(t)=="object"){for(r in u=0,t)if(Vo.call(t,r)&&++u&&!Vo.call(n,r)||!(r in n)||!e(t[r],n[r]))return!1;return Object.keys(n).length===u}}return t!=t&&n!=n},isPaused:function(){return!1},cache:Ui,mutate:El,fallback:{}},dl),Cl=ri({}),zi=Zn&&window.__SWR_DEVTOOLS_USE__,Al=(zi?window.__SWR_DEVTOOLS_USE__:[]).concat((function(e){return function(t,n,r){return e(t,n&&function(){var u=Xe(Yu(t),1)[0],o=Xe(bt.get(Ui),4)[3];if(u.startsWith("$inf$"))return n.apply(void 0,arguments);var a=o[u];return De(a)?n.apply(void 0,arguments):(delete o[u],a)},r)}}));zi&&(window.__SWR_DEVTOOLS_REACT__=c);var Zo,Jo,Qo,Jr=c.use||function(e){switch(e.status){case"pending":throw e;case"fulfilled":return e.value;case"rejected":throw e.reason;default:throw e.status="pending",e.then((function(t){e.status="fulfilled",e.value=t}),(function(t){e.status="rejected",e.reason=t})),e}},Qr={dedupe:!0},nr=(Zo=function(e,t,n){var r=n.cache,u=n.compare,o=n.suspense,a=n.fallbackData,i=n.revalidateOnMount,l=n.revalidateIfStale,s=n.refreshInterval,f=n.refreshWhenHidden,D=n.refreshWhenOffline,h=n.keepPreviousData,p=Xe(bt.get(r),4),d=p[0],F=p[1],A=p[2],C=p[3],g=Xe(Yu(e),2),E=g[0],b=g[1],w=ot(!1),S=ot(!1),O=ot(E),P=ot(t),x=ot(n),R=function(){return x.current},_=function(){return R().isVisible()&&R().isOnline()},T=Xe(Li(r,E),4),j=T[0],M=T[1],U=T[2],v=T[3],m=ot({}).current,y=De(a)?De(n.fallback)?Ye:n.fallback[E]:a,B=function(ie,Q){for(var se in m){var Y=se;if(Y==="data"){if(!u(ie[Y],Q[Y])&&(!De(ie[Y])||!u(Le,Q[Y])))return!1}else if(Q[Y]!==ie[Y])return!1}return!0},k=Rt((function(){var ie=!!E&&!!t&&(De(i)?!R().isPaused()&&!o&&l!==!1:i),Q=function(K){var J=Pt(K);return delete J._k,ie?fe({isValidating:!0,isLoading:!0},J):J},se=j(),Y=v(),he=Q(se),G=se===Y?he:Q(Y),I=he;return[function(){var K=Q(j());return B(K,I)?(I.data=K.data,I.isLoading=K.isLoading,I.isValidating=K.isValidating,I.error=K.error,I):(I=K,K)},function(){return G}]}),[r,E]),N=pl.useSyncExternalStore(ut((function(ie){return U(E,(function(Q,se){B(se,Q)||ie()}))}),[r,E]),k[0],k[1]),H=!w.current,V=d[E]&&d[E].length>0,z=N.data,Z=De(z)?y&&Ni(y)?Jr(y):y:z,X=N.error,ae=ot(Z),Le=h?De(z)?De(ae.current)?Z:ae.current:z:Z,He=!(V&&!De(X))&&(H&&!De(i)?i:!R().isPaused()&&(o?!De(Z)&&l:De(Z)||l)),Fe=!!(E&&t&&H&&He),Be=De(N.isValidating)?Fe:N.isValidating,re=De(N.isLoading)?Fe:N.isLoading,Ee=ut((function(){var ie=Qe(pe().mark((function Q(se){var Y,he,G,I,K,J,ue,ye,_e,le,Oe,ke,Se,Me,je,ze;return pe().wrap((function(ce){for(;;)switch(ce.prev=ce.next){case 0:if(Y=P.current,E&&Y&&!S.current&&!R().isPaused()){ce.next=3;break}return ce.abrupt("return",!1);case 3:return I=!0,K=se||{},J=!A[E]||!K.dedupe,ue=function(){return $o?!S.current&&E===O.current&&w.current:E===O.current},ye={isValidating:!1,isLoading:!1},_e=function(){M(ye)},le=function(){var Ue=A[E];Ue&&Ue[1]===G&&delete A[E]},Oe={isValidating:!0},De(j().data)&&(Oe.isLoading=!0),ce.prev=6,J&&(M(Oe),n.loadingTimeout&&De(j().data)&&setTimeout((function(){I&&ue()&&R().onLoadingSlow(E,n)}),n.loadingTimeout),A[E]=[Y(b),wu()]),ke=Xe(A[E],2),he=ke[0],G=ke[1],ce.next=11,he;case 11:if(he=ce.sent,J&&setTimeout(le,n.dedupingInterval),A[E]&&A[E][1]===G){ce.next=15;break}return ce.abrupt("return",(J&&ue()&&R().onDiscarded(E),!1));case 15:if(ye.error=Ye,Se=F[E],De(Se)||!(G<=Se[0]||G<=Se[1]||Se[1]===0)){ce.next=19;break}return ce.abrupt("return",(_e(),J&&ue()&&R().onDiscarded(E),!1));case 19:Me=j().data,ye.data=u(Me,he)?Me:he,J&&ue()&&R().onSuccess(he,E,n),ce.next=28;break;case 23:ce.prev=23,ce.t0=ce.catch(6),le(),je=R(),ze=je.shouldRetryOnError,je.isPaused()||(ye.error=ce.t0,J&&ue()&&(je.onError(ce.t0,E,je),(ze===!0||vt(ze)&&ze(ce.t0))&&(R().revalidateOnFocus&&R().revalidateOnReconnect&&!_()||je.onErrorRetry(ce.t0,E,je,(function(Ue){var At=d[E];At&&At[0]&&At[0](3,Ue)}),{retryCount:(K.retryCount||0)+1,dedupe:!0}))));case 28:return ce.abrupt("return",(I=!1,_e(),!0));case 29:case"end":return ce.stop()}}),Q,null,[[6,23]])})));return function(Q){return ie.apply(this,arguments)}})(),[E,r]),we=ut((function(){for(var ie=arguments.length,Q=new Array(ie),se=0;se=0&&(K[J]=K[K.length-1],K.pop())}})(E,d,(function(he){var G=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(he==0){var I=Date.now();R().revalidateOnFocus&&I>Q&&_()&&(Q=I+R().focusThrottleInterval,ie())}else if(he==1)R().revalidateOnReconnect&&_()&&ie();else{if(he==2)return Ee();if(he==3)return Ee(G)}}));return S.current=!1,O.current=E,w.current=!0,M({_k:b}),He&&(De(Z)||Vn?ie():(function(he){Zn&&q(window.requestAnimationFrame)!=Gu?window.requestAnimationFrame(he):setTimeout(he,1)})(ie)),function(){S.current=!0,Y()}}}),[E]),Kr((function(){var ie;function Q(){var Y=vt(s)?s(j().data):s;Y&&ie!==-1&&(ie=setTimeout(se,Y))}function se(){j().error||!f&&!R().isVisible()||!D&&!R().isOnline()?Q():Ee(Qr).then(Q)}return Q(),function(){ie&&(clearTimeout(ie),ie=-1)}}),[s,f,D,E]),zu(Le),o&&De(Z)&&E){if(!$o&&Vn)throw new Error("Fallback data is required when using Suspense in SSR.");P.current=t,x.current=n,S.current=!1;var Ge=C[E];if(!De(Ge)){var Ke=we(Ge);Jr(Ke)}if(!De(X))throw X;var Ze=Ee(Qr);De(Le)||(Ze.status="fulfilled",Ze.value=!0),Jr(Ze)}return{mutate:we,get data(){return m.data=!0,Le},get error(){return m.error=!0,X},get isValidating(){return m.isValidating=!0,Be},get isLoading(){return m.isLoading=!0,re}}},function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&arguments[0]!==void 0?arguments[0]:{},t=e.api,n=t===void 0?"/api/chat":t,r=e.id,u=e.initialMessages,o=e.initialInput,a=o===void 0?"":o,i=e.sendExtraMessageFields,l=e.onToolCall,s=e.experimental_prepareRequestBody,f=e.maxSteps,D=f===void 0?1:f,h=e.streamProtocol,p=h===void 0?"data":h,d=e.onResponse,F=e.onFinish,A=e.onError,C=e.credentials,g=e.headers,E=e.body,b=e.generateId,w=b===void 0?Ju:b,S=e.fetch,O=e.keepLastMessageOnError,P=O===void 0||O,x=e.experimental_throttle,R=Xe(Ot(w),1)[0],_=r??R,T=typeof n=="string"?[n,_]:_,j=_l(u??[]),M=Rt((function(){return Hr(j)}),[j]),U=nr([T,"messages"],null,{fallbackData:M}),v=U.data,m=U.mutate,y=ot(v||[]);it((function(){y.current=v||[]}),[v]);var B=nr([T,"streamData"],null),k=B.data,N=B.mutate,H=ot(k);it((function(){H.current=k}),[k]);var V=nr([T,"status"],null),z=V.data,Z=z===void 0?"ready":z,X=V.mutate,ae=nr([T,"error"],null),Le=ae.data,He=ae.mutate,Fe=ot(null),Be=ot({credentials:C,headers:g,body:E});it((function(){Be.current={credentials:C,headers:g,body:E}}),[C,g,E]);var re=ut((function(){var I=Qe(pe().mark((function K(J){var ue,ye,_e,le,Oe,ke,Se,Me,je,ze,ce,Ue,At,Qt=arguments;return pe().wrap((function(Re){for(;;)switch(Re.prev=Re.next){case 0:return ue=Qt.length>1&&Qt[1]!==void 0?Qt[1]:"generate",X("submitted"),He(void 0),le=Hr(J.messages),Oe=le.length,ke=qr((ye=le[le.length-1])==null?void 0:ye.toolInvocations),Re.prev=3,Se=new AbortController,Fe.current=Se,Me=Go(m,x),je=Go(N,x),ze=y.current,Me(le,!1),ce=i?le:le.map((function(Ne){var ft=Ne.role,be=Ne.content,tt=Ne.experimental_attachments,pt=Ne.data,at=Ne.annotations,$e=Ne.toolInvocations,nt=Ne.parts;return fe(fe(fe(fe(fe({role:ft,content:be},tt!==void 0&&{experimental_attachments:tt}),pt!==void 0&&{data:pt}),at!==void 0&&{annotations:at}),$e!==void 0&&{toolInvocations:$e}),nt!==void 0&&{parts:nt})})),Ue=H.current,Re.next=11,(function(){var Ne=Qe(pe().mark((function ft(be){var tt,pt,at,$e,nt,pn,Nt,Gt,Yt,Xt,L,W,ee,ge,de,me,Ie,Lt,Qn,Gn,rt,Je;return pe().wrap((function(te){for(;;)switch(te.prev=te.next){case 0:return tt=be.api,pt=be.body,at=be.streamProtocol,$e=at===void 0?"data":at,nt=be.credentials,pn=be.headers,Nt=be.abortController,Gt=be.restoreMessagesOnFailure,Yt=be.onResponse,Xt=be.onUpdate,L=be.onFinish,W=be.onToolCall,ee=be.generateId,ge=be.fetch,de=ge===void 0?fetch:ge,me=be.lastMessage,Ie=be.requestType,rt=(Ie===void 0?"generate":Ie)==="resume"?de("".concat(tt,"?chatId=").concat(pt.id),{method:"GET",headers:fe({"Content-Type":"application/json"},pn),signal:(Lt=Nt?.())==null?void 0:Lt.signal,credentials:nt}):de(tt,{method:"POST",body:JSON.stringify(pt),headers:fe({"Content-Type":"application/json"},pn),signal:(Qn=Nt?.())==null?void 0:Qn.signal,credentials:nt}),te.next=4,rt.catch((function(It){throw Gt(),It}));case 4:if(Je=te.sent,!Yt){te.next=14;break}return te.prev=6,te.next=9,Yt(Je);case 9:te.next=14;break;case 11:throw te.prev=11,te.t0=te.catch(6),te.t0;case 14:if(Je.ok){te.next=27;break}return Gt(),te.t1=Error,te.next=19,Je.text();case 19:if(te.t2=Gn=te.sent,te.t2==null){te.next=24;break}te.t3=Gn,te.next=25;break;case 24:te.t3="Failed to fetch the chat response.";case 25:throw te.t4=te.t3,new te.t1(te.t4);case 27:if(Je.body){te.next=29;break}throw new Error("The response body is empty.");case 29:te.t5=$e,te.next=te.t5==="text"?32:te.t5==="data"?35:38;break;case 32:return te.next=34,fl({stream:Je.body,update:Xt,onFinish:L,generateId:ee});case 34:return te.abrupt("return",void te.sent);case 35:return te.next=37,Dl({stream:Je.body,update:Xt,lastMessage:me,onToolCall:W,onFinish:function(It){var hn=It.message,ht=It.finishReason,dn=It.usage;L&&hn!=null&&L(hn,{usage:dn,finishReason:ht})},generateId:ee});case 37:return te.abrupt("return",void te.sent);case 38:throw new Error("Unknown stream protocol: ".concat($e));case 39:case"end":return te.stop()}}),ft,null,[[6,11]])})));return function(ft){return Ne.apply(this,arguments)}})()({api:n,body:(_e=s?.({id:_,messages:le,requestData:J.data,requestBody:J.body}))!=null?_e:fe(fe({id:_,messages:ce,data:J.data},Be.current.body),J.body),streamProtocol:p,credentials:Be.current.credentials,headers:fe(fe({},Be.current.headers),J.headers),abortController:function(){return Fe.current},restoreMessagesOnFailure:function(){P||Me(ze,!1)},onResponse:d,onUpdate:function(Ne){var ft=Ne.message,be=Ne.data,tt=Ne.replaceLastMessage;X("streaming"),Me([].concat(Ft(tt?le.slice(0,le.length-1):le),[ft]),!1),be?.length&&je([].concat(Ft(Ue??[]),Ft(be)),!1)},onToolCall:l,onFinish:F,generateId:w,fetch:S,lastMessage:le[le.length-1],requestType:ue});case 11:Fe.current=null,X("ready"),Re.next=20;break;case 15:if(Re.prev=15,Re.t0=Re.catch(3),Re.t0.name!=="AbortError"){Re.next=19;break}return Re.abrupt("return",(Fe.current=null,X("ready"),null));case 19:A&&Re.t0 instanceof Error&&A(Re.t0),He(Re.t0),X("error");case 20:if(At=y.current,Re.t1=(function(Ne){var ft,be=Ne.originalMaxToolInvocationStep,tt=Ne.originalMessageCount,pt=Ne.maxSteps,at=Ne.messages,$e=at[at.length-1];return pt>1&&$e!=null&&(at.length>tt||qr($e.toolInvocations)!==be)&&qo($e)&&((ft=qr($e.toolInvocations))!=null?ft:0)1&&ce[1]!==void 0?ce[1]:{}).data,_e=ue.headers,le=ue.body,Oe=ue.experimental_attachments,ke=Oe===void 0?J.experimental_attachments:Oe,Ue.next=3,Mo(ke);case 3:return je=Ue.sent,ze=y.current.concat(fe(fe({},J),{},{id:(Se=J.id)!=null?Se:w(),createdAt:(Me=J.createdAt)!=null?Me:new Date,experimental_attachments:je.length>0?je:void 0,parts:Ri(J)})),Ue.abrupt("return",re({messages:ze,headers:_e,body:le,data:ye}));case 6:case"end":return Ue.stop()}}),K)})));return function(K){return I.apply(this,arguments)}})(),[re,w]),we=ut(Qe(pe().mark((function I(){var K,J,ue,ye,_e,le,Oe=arguments;return pe().wrap((function(ke){for(;;)switch(ke.prev=ke.next){case 0:if(J=(K=Oe.length>0&&Oe[0]!==void 0?Oe[0]:{}).data,ue=K.headers,ye=K.body,(_e=y.current).length!==0){ke.next=4;break}return ke.abrupt("return",null);case 4:return le=_e[_e.length-1],ke.abrupt("return",re({messages:le.role==="assistant"?_e.slice(0,-1):_e,headers:ue,body:ye,data:J}));case 6:case"end":return ke.stop()}}),I)}))),[re]),Ge=ut((function(){Fe.current&&(Fe.current.abort(),Fe.current=null)}),[]),Ke=ut(Qe(pe().mark((function I(){var K;return pe().wrap((function(J){for(;;)switch(J.prev=J.next){case 0:K=y.current,re({messages:K},"resume");case 2:case"end":return J.stop()}}),I)}))),[re]),Ze=ut((function(I){typeof I=="function"&&(I=I(y.current));var K=Hr(I);m(K,!1),y.current=K}),[m]),ie=ut((function(I){typeof I=="function"&&(I=I(H.current)),N(I,!1),H.current=I}),[N]),Q=Xe(Ot(a),2),se=Q[0],Y=Q[1],he=ut((function(){var I=Qe(pe().mark((function K(J){var ue,ye,_e,le,Oe,ke=arguments;return pe().wrap((function(Se){for(;;)switch(Se.prev=Se.next){case 0:if(ue=ke.length>1&&ke[1]!==void 0?ke[1]:{},ye=ke.length>2?ke[2]:void 0,(_e=J?.preventDefault)==null||_e.call(J),se||ue.allowEmptySubmit){Se.next=4;break}return Se.abrupt("return");case 4:return ye&&(Be.current=fe(fe({},Be.current),ye)),Se.next=7,Mo(ue.experimental_attachments);case 7:le=Se.sent,Oe={messages:y.current.concat({id:w(),createdAt:new Date,role:"user",content:se,experimental_attachments:le.length>0?le:void 0,parts:[{type:"text",text:se}]}),headers:ue.headers,body:ue.body,data:ue.data},re(Oe),Y("");case 10:case"end":return Se.stop()}}),K)})));return function(K){return I.apply(this,arguments)}})(),[se,w,re]),G=ut((function(I){var K=I.toolCallId,J=I.result,ue=y.current;(function(ye){var _e,le=ye.messages,Oe=ye.toolCallId,ke=ye.toolResult,Se=le[le.length-1],Me=Se.parts.find((function(ze){return ze.type==="tool-invocation"&&ze.toolInvocation.toolCallId===Oe}));if(Me!=null){var je=fe(fe({},Me.toolInvocation),{},{state:"result",result:ke});Me.toolInvocation=je,Se.toolInvocations=(_e=Se.toolInvocations)==null?void 0:_e.map((function(ze){return ze.toolCallId===Oe?je:ze}))}})({messages:ue,toolCallId:K,toolResult:J}),m([].concat(Ft(ue.slice(0,ue.length-1)),[fe({},ue[ue.length-1])]),!1),Z!=="submitted"&&Z!=="streaming"&&qo(ue[ue.length-1])&&re({messages:ue})}),[m,Z,re]);return{messages:v??[],id:_,setMessages:Ze,data:k,setData:ie,error:Le,append:Ee,reload:we,stop:Ge,experimental_resume:Ke,input:se,setInput:Y,handleInputChange:function(I){Y(I.target.value)},handleSubmit:he,isLoading:Z==="submitted"||Z==="streaming",status:Z,addToolResult:G}}function Vi(e,t){var n=void 0;return function(){for(var r=arguments.length,u=new Array(r),o=0;oe.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(f[l]=a[l]);return f})(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(u[n]=e[n])}return u}function ta(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(u){return Object.getOwnPropertyDescriptor(e,u).enumerable}))),n.push.apply(n,r)}return n}function rn(e){for(var t=1;t=3||n===2&&r>=4||n===1&&r>=10);function o(a,i,l){if(u&&l!==void 0){var s=l[0].__autocomplete_algoliaCredentials,f={"X-Algolia-Application-Id":s.appId,"X-Algolia-API-Key":s.apiKey};e.apply(void 0,[a].concat(rr(i),[{headers:f}]))}else e.apply(void 0,[a].concat(rr(i)))}return{init:function(a,i){e("init",{appId:a,apiKey:i})},setAuthenticatedUserToken:function(a){e("setAuthenticatedUserToken",a)},setUserToken:function(a){e("setUserToken",a)},clickedObjectIDsAfterSearch:function(){for(var a=arguments.length,i=new Array(a),l=0;l0&&o("clickedObjectIDsAfterSearch",ur(i),i[0].items)},clickedObjectIDs:function(){for(var a=arguments.length,i=new Array(a),l=0;l0&&o("clickedObjectIDs",ur(i),i[0].items)},clickedFilters:function(){for(var a=arguments.length,i=new Array(a),l=0;l0&&e.apply(void 0,["clickedFilters"].concat(i))},convertedObjectIDsAfterSearch:function(){for(var a=arguments.length,i=new Array(a),l=0;l0&&o("convertedObjectIDsAfterSearch",ur(i),i[0].items)},convertedObjectIDs:function(){for(var a=arguments.length,i=new Array(a),l=0;l0&&o("convertedObjectIDs",ur(i),i[0].items)},convertedFilters:function(){for(var a=arguments.length,i=new Array(a),l=0;l0&&e.apply(void 0,["convertedFilters"].concat(i))},viewedObjectIDs:function(){for(var a=arguments.length,i=new Array(a),l=0;l0&&i.reduce((function(s,f){var D=f.items,h=Ki(f,Bl);return[].concat(rr(s),rr((function(p){for(var d=arguments.length>1&&arguments[1]!==void 0?arguments[1]:20,F=[],A=0;A0&&e.apply(void 0,["viewedFilters"].concat(i))}}}function Tl(e){var t=e.items.reduce((function(n,r){var u;return n[r.__autocomplete_indexName]=((u=n[r.__autocomplete_indexName])!==null&&u!==void 0?u:[]).concat(r),n}),{});return Object.keys(t).map((function(n){return{index:n,items:t[n],algoliaSource:["autocomplete"]}}))}function mn(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function bn(e){return bn=typeof Symbol=="function"&&q(Symbol.iterator)=="symbol"?function(t){return q(t)}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":q(t)},bn(e)}function un(e){return(function(t){if(Array.isArray(t))return Yr(t)})(e)||(function(t){if(typeof Symbol<"u"&&t[Symbol.iterator]!=null||t["@@iterator"]!=null)return Array.from(t)})(e)||(function(t,n){if(t){if(typeof t=="string")return Yr(t,n);var r=Object.prototype.toString.call(t).slice(8,-1);return r==="Object"&&t.constructor&&(r=t.constructor.name),r==="Map"||r==="Set"?Array.from(t):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Yr(t,n):void 0}})(e)||(function(){throw new TypeError(`Invalid attempt to spread non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)})()}function Yr(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&Rl({onItemsChange:u,items:d,insights:s,state:p}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(h){var p=h.setContext,d=h.onSelect,F=h.onActive;function A(C){p({algoliaInsightsPlugin:{__algoliaSearchParameters:dt(dt({},i?{clickAnalytics:!0}:{}),C?{userToken:Nl(C)}:{}),insights:s}})}l("addAlgoliaAgent","insights-plugin"),A(),l("onUserTokenChange",(function(C){A(C)})),l("getUserToken",null,(function(C,g){A(g)})),d((function(C){var g=C.item,E=C.state,b=C.event,w=C.source;mn(g)&&o({state:E,event:b,insights:s,item:g,insightsEvents:[dt({eventName:"Item Selected"},Xo({item:g,items:w.getItems().filter(mn)}))]})})),F((function(C){var g=C.item,E=C.source,b=C.state,w=C.event;mn(g)&&a({state:b,event:w,insights:s,item:g,insightsEvents:[dt({eventName:"Item Active"},Xo({item:g,items:E.getItems().filter(mn)}))]})}))},onStateChange:function(h){var p=h.state;D({state:p})},__autocomplete_pluginOptions:e}}function ua(){var e,t=arguments.length>1?arguments[1]:void 0;return[].concat(un(arguments.length>0&&arguments[0]!==void 0?arguments[0]:[]),["autocomplete-internal"],un((e=t.algoliaInsightsPlugin)!==null&&e!==void 0&&e.__automaticInsights?["autocomplete-automatic"]:[]))}function Nl(e){return typeof e=="number"?e.toString():e}function dr(e,t){var n=t;return{then:function(r,u){return dr(e.then(or(r,n,e),or(u,n,e)),n)},catch:function(r){return dr(e.catch(or(r,n,e)),n)},finally:function(r){return r&&n.onCancelList.push(r),dr(e.finally(or(r&&function(){return n.onCancelList=[],r()},n,e)),n)},cancel:function(){n.isCanceled=!0;var r=n.onCancelList;n.onCancelList=[],r.forEach((function(u){u()}))},isCanceled:function(){return n.isCanceled===!0}}}function oa(e){return dr(e,{isCanceled:!1,onCancelList:[]})}function or(e,t,n){return e?function(r){return t.isCanceled?r:e(r)}:n}var aa,Xr=!0;function Ll(){var e=[];return{add:function(t){return e.push(t),t.finally((function(){e=e.filter((function(n){return n!==t}))}))},cancelAll:function(){e.forEach((function(t){return t.cancel()}))},isEmpty:function(){return e.length===0},wait:function(t){return Xr?(Xr=!1,(aa=t?Promise.race([Promise.all(e),new Promise((function(n){return setTimeout(n,t)}))]):Promise.all(e)).then((function(){Xr=!0}))):aa}}}function ia(e,t,n,r){if(!n)return null;if(e<0&&(t===null||r!==null&&t===0))return n+e;var u=(t===null?-1:t)+e;return u<=-1||u>=n?r===null?null:0:u}function sa(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(u){return Object.getOwnPropertyDescriptor(e,u).enumerable}))),n.push.apply(n,r)}return n}function la(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=f.length?{done:!0}:{done:!1,value:f[p++]}},e:function(g){throw g},f:d}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var F,A=!0,C=!1;return{s:function(){h=h.call(f)},n:function(){var g=h.next();return A=g.done,g},e:function(g){C=!0,F=g},f:function(){try{A||h.return==null||h.return()}finally{if(C)throw F}}}})(e);try{for(o.s();!(n=o.n()).done;){var a,i,l,s=(a=n.value.__autocomplete_pluginOptions)===null||a===void 0||(i=(l=a).awaitSubmit)===null||i===void 0?void 0:i.call(l);if(typeof s=="number")u.push(s);else if(s===!0){r=!0;break}}}catch(f){o.e(f)}finally{o.f()}return r?t.wait():u.length>0?t.wait(Math.max.apply(Math,u)):void 0};function Kt(e){var t=(function(u){var o=u.collections.map((function(a){return a.items.length})).reduce((function(a,i,l){var s=(a[l-1]||0)+i;return a.push(s),a}),[]).reduce((function(a,i){return i<=u.activeItemId?a+1:a}),0);return u.collections[o]})(e);if(!t)return null;var n=t.items[(function(u){for(var o=u.state,a=u.collection,i=!1,l=0,s=0;i===!1;){var f=o.collections[l];if(f===a){i=!0;break}s+=f.items.length,l++}return o.activeItemId-s})({state:e,collection:t})],r=t.source;return{item:n,itemInputValue:r.getItemInputValue({item:n,state:e}),itemUrl:r.getItemUrl({item:n,state:e}),source:r}}function ct(e,t,n){return[e,n?.sourceId,t].filter(Boolean).join("-").replace(/\s/g,"")}var ql=/((gt|sm)-|galaxy nexus)|samsung[- ]|samsungbrowser/i;function fa(e){return e.nativeEvent||e}function kn(e){return kn=typeof Symbol=="function"&&q(Symbol.iterator)=="symbol"?function(t){return q(t)}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":q(t)},kn(e)}function pa(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(u){return Object.getOwnPropertyDescriptor(e,u).enumerable}))),n.push.apply(n,r)}return n}function Hl(e,t,n){return(t=(function(r){var u=(function(o){if(kn(o)!=="object"||o===null)return o;var a=o[Symbol.toPrimitive];if(a!==void 0){var i=a.call(o,"string");if(kn(i)!=="object")return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(o)})(r);return kn(u)==="symbol"?u:String(u)})(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function wn(e){return wn=typeof Symbol=="function"&&q(Symbol.iterator)=="symbol"?function(t){return q(t)}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":q(t)},wn(e)}function ha(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(u){return Object.getOwnPropertyDescriptor(e,u).enumerable}))),n.push.apply(n,r)}return n}function ar(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n0},reshape:function(o){return o.sources}},e),{},{id:(n=e.id)!==null&&n!==void 0?n:"autocomplete-".concat(wl++),plugins:u,initialState:en({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(o){var a;(a=e.onStateChange)===null||a===void 0||a.call(e,o),u.forEach((function(i){var l;return(l=i.onStateChange)===null||l===void 0?void 0:l.call(i,o)}))},onSubmit:function(o){var a;(a=e.onSubmit)===null||a===void 0||a.call(e,o),u.forEach((function(i){var l;return(l=i.onSubmit)===null||l===void 0?void 0:l.call(i,o)}))},onReset:function(o){var a;(a=e.onReset)===null||a===void 0||a.call(e,o),u.forEach((function(i){var l;return(l=i.onReset)===null||l===void 0?void 0:l.call(i,o)}))},getSources:function(o){return Promise.all([].concat((function(a){return(function(i){if(Array.isArray(i))return eu(i)})(a)||(function(i){if(typeof Symbol<"u"&&i[Symbol.iterator]!=null||i["@@iterator"]!=null)return Array.from(i)})(a)||(function(i,l){if(i){if(typeof i=="string")return eu(i,l);var s=Object.prototype.toString.call(i).slice(8,-1);return s==="Object"&&i.constructor&&(s=i.constructor.name),s==="Map"||s==="Set"?Array.from(i):s==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?eu(i,l):void 0}})(a)||(function(){throw new TypeError(`Invalid attempt to spread non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)})()})(u.map((function(a){return a.getSources}))),[e.getSources]).filter(Boolean).map((function(a){return(function(i,l){var s=[];return Promise.resolve(i(l)).then((function(f){return Promise.all(f.filter((function(D){return!!D})).map((function(D){if(D.sourceId,s.includes(D.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(D.sourceId)," is not unique."));s.push(D.sourceId);var h={getItemInputValue:function(d){return d.state.query},getItemUrl:function(){},onSelect:function(d){(0,d.setIsOpen)(!1)},onActive:Cr,onResolve:Cr};Object.keys(h).forEach((function(d){h[d].__default=!0}));var p=la(la({},h),D);return Promise.resolve(p)})))}))})(a,o)}))).then((function(a){return $n(a)})).then((function(a){return a.map((function(i){return en(en({},i),{},{onSelect:function(l){i.onSelect(l),t.forEach((function(s){var f;return(f=s.onSelect)===null||f===void 0?void 0:f.call(s,l)}))},onActive:function(l){i.onActive(l),t.forEach((function(s){var f;return(f=s.onActive)===null||f===void 0?void 0:f.call(s,l)}))},onResolve:function(l){i.onResolve(l),t.forEach((function(s){var f;return(f=s.onResolve)===null||f===void 0?void 0:f.call(s,l)}))}})}))}))},navigator:en({navigate:function(o){var a=o.itemUrl;r.location.assign(a)},navigateNewTab:function(o){var a=o.itemUrl,i=r.open(a,"_blank","noopener");i?.focus()},navigateNewWindow:function(o){var a=o.itemUrl;r.open(a,"_blank","noopener")}},e.navigator)})}function xn(e){return xn=typeof Symbol=="function"&&q(Symbol.iterator)=="symbol"?function(t){return q(t)}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":q(t)},xn(e)}function ma(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(u){return Object.getOwnPropertyDescriptor(e,u).enumerable}))),n.push.apply(n,r)}return n}function ir(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(j[_]=x[_]);return j})(E,b);if(Object.getOwnPropertySymbols){var P=Object.getOwnPropertySymbols(E);for(S=0;S=0||Object.prototype.propertyIsEnumerable.call(E,w)&&(O[w]=E[w])}return O})(e,Wl);vn&&u.environment.clearTimeout(vn);var s=l.setCollections,f=l.setIsOpen,D=l.setQuery,h=l.setActiveItemId,p=l.setStatus,d=l.setContext;if(D(o),h(u.defaultActiveItemId),!o&&u.openOnFocus===!1){var F,A=i.getState().collections.map((function(E){return qt(qt({},E),{},{items:[]})}));p("idle"),s(A),f((F=r.isOpen)!==null&&F!==void 0?F:u.shouldPanelOpen({state:i.getState()}));var C=oa(Ea(A).then((function(){return Promise.resolve()})));return i.pendingRequests.add(C)}p("loading"),vn=u.environment.setTimeout((function(){p("stalled")}),u.stallThreshold);var g=oa(Ea(u.getSources(qt({query:o,refresh:a,state:i.getState()},l)).then((function(E){return Promise.all(E.map((function(b){return Promise.resolve(b.getItems(qt({query:o,refresh:a,state:i.getState()},l))).then((function(w){return(function(S,O,P){if(R=S,!!R?.execute){var x=S.requesterId==="algolia"?Object.assign.apply(Object,[{}].concat(Ji(Object.keys(P.context).map((function(_){var T;return(T=P.context[_])===null||T===void 0?void 0:T.__algoliaSearchParameters}))))):{};return tn(tn({},S),{},{requests:S.queries.map((function(_){return{query:S.requesterId==="algolia"?tn(tn({},_),{},{params:tn(tn({},x),_.params)}):_,sourceId:O,transformResponse:S.transformResponse}}))})}var R;return{items:S,sourceId:O}})(w,b.sourceId,i.getState())}))}))).then(Kl).then((function(b){var w,S=b.some((function(O){return(function(P){return!Array.isArray(P)&&!!P?._automaticInsights})(O.items)}));return S&&d({algoliaInsightsPlugin:qt(qt({},((w=i.getState().context)===null||w===void 0?void 0:w.algoliaInsightsPlugin)||{}),{},{__automaticInsights:S})}),(function(O,P,x){return P.map((function(R){var _,T=O.filter((function(v){return v.sourceId===R.sourceId})),j=T.map((function(v){return v.items})),M=T[0].transformResponse,U=M?M({results:_=j,hits:_.map((function(v){return v.hits})).filter(Boolean),facetHits:_.map((function(v){var m;return(m=v.facetHits)===null||m===void 0?void 0:m.map((function(y){return{label:y.value,count:y.count,_highlightResult:{label:{value:y.highlighted}}}}))})).filter(Boolean)}):j;return R.onResolve({source:R,results:j,items:U,state:x.getState()}),U.every(Boolean),'The `getItems` function from source "'.concat(R.sourceId,'" must return an array of items but returned ').concat(JSON.stringify(void 0),`. + +Did you forget to return items? + +See: https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/sources/#param-getitems`),{source:R,items:U}}))})(b,E,i)})).then((function(b){return(function(w){var S=w.props,O=w.state,P=w.collections.reduce((function(R,_){return ir(ir({},R),{},Zi({},_.source.sourceId,ir(ir({},_.source),{},{getItems:function(){return $n(_.items)}})))}),{}),x=S.plugins.reduce((function(R,_){return _.reshape?_.reshape(R):R}),{sourcesBySourceId:P,state:O}).sourcesBySourceId;return $n(S.reshape({sourcesBySourceId:x,sources:Object.values(x),state:O})).filter(Boolean).map((function(R){return{source:R,items:R.getItems()}}))})({collections:b,props:u,state:i.getState()})}))})))).then((function(E){var b;p("idle"),s(E);var w=u.shouldPanelOpen({state:i.getState()});f((b=r.isOpen)!==null&&b!==void 0?b:u.openOnFocus&&!o&&w||w);var S=Kt(i.getState());if(i.getState().activeItemId!==null&&S){var O=S.item,P=S.itemInputValue,x=S.itemUrl,R=S.source;R.onActive(qt({event:t,item:O,itemInputValue:P,itemUrl:x,refresh:a,source:R,state:i.getState()},l))}})).finally((function(){p("idle"),vn&&u.environment.clearTimeout(vn)}));return i.pendingRequests.add(g)}function In(e){return In=typeof Symbol=="function"&&q(Symbol.iterator)=="symbol"?function(t){return q(t)}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":q(t)},In(e)}var Jl=["event","props","refresh","store"];function ya(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(u){return Object.getOwnPropertyDescriptor(e,u).enumerable}))),n.push.apply(n,r)}return n}function Ht(e){for(var t=1;t=0||(f[l]=a[l]);return f})(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(u[n]=e[n])}return u}function uc(e){var t=e.props,n=e.refresh,r=e.store,u=nn(e,Gl);return{getEnvironmentProps:function(o){var a=o.inputElement,i=o.formElement,l=o.panelElement;function s(f){!r.getState().isOpen&&r.pendingRequests.isEmpty()||f.target===a||[i,l].some((function(D){return(h=D)===(p=f.target)||h.contains(p);var h,p}))===!1&&(r.dispatch("blur",null),t.debug||r.pendingRequests.cancelAll())}return We({onTouchStart:s,onMouseDown:s,onTouchMove:function(f){r.getState().isOpen!==!1&&a===t.environment.document.activeElement&&f.target!==a&&a.blur()}},nn(o,Yl))},getRootProps:function(o){return We({role:"combobox","aria-expanded":r.getState().isOpen,"aria-haspopup":"listbox","aria-controls":r.getState().isOpen?r.getState().collections.map((function(a){var i=a.source;return ct(t.id,"list",i)})).join(" "):void 0,"aria-labelledby":ct(t.id,"label")},o)},getFormProps:function(o){o.inputElement;var a=nn(o,Xl),i=function(l){var s;t.onSubmit(We({event:l,refresh:n,state:r.getState()},u)),r.dispatch("submit",null),(s=o.inputElement)===null||s===void 0||s.blur()};return We({action:"",noValidate:!0,role:"search",onSubmit:function(l){l.preventDefault();var s=Da(t.plugins,r.pendingRequests);s!==void 0?s.then((function(){return i(l)})):i(l)},onReset:function(l){var s;l.preventDefault(),t.onReset(We({event:l,refresh:n,state:r.getState()},u)),r.dispatch("reset",null),(s=o.inputElement)===null||s===void 0||s.focus()}},a)},getLabelProps:function(o){return We({htmlFor:ct(t.id,"input"),id:ct(t.id,"label")},o)},getInputProps:function(o){var a;function i(F){(t.openOnFocus||r.getState().query)&&Vt(We({event:F,props:t,query:r.getState().completion||r.getState().query,refresh:n,store:r},u)),r.dispatch("focus",null)}var l=o||{};l.inputElement;var s=l.maxLength,f=s===void 0?512:s,D=nn(l,ec),h=Kt(r.getState()),p=(function(F){return!!(F&&F.match(ql))})(((a=t.environment.navigator)===null||a===void 0?void 0:a.userAgent)||""),d=t.enterKeyHint||(h!=null&&h.itemUrl&&!p?"go":"search");return We({"aria-autocomplete":"both","aria-activedescendant":r.getState().isOpen&&r.getState().activeItemId!==null?ct(t.id,"item-".concat(r.getState().activeItemId),h?.source):void 0,"aria-controls":r.getState().isOpen?r.getState().collections.filter((function(F){return F.items.length>0})).map((function(F){var A=F.source;return ct(t.id,"list",A)})).join(" "):void 0,"aria-labelledby":ct(t.id,"label"),value:r.getState().completion||r.getState().query,id:ct(t.id,"input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:d,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:f,type:"search",onChange:function(F){var A=F.currentTarget.value;t.ignoreCompositionEvents&&fa(F).isComposing?u.setQuery(A):Vt(We({event:F,props:t,query:A.slice(0,f),refresh:n,store:r},u))},onCompositionEnd:function(F){Vt(We({event:F,props:t,query:F.currentTarget.value.slice(0,f),refresh:n,store:r},u))},onKeyDown:function(F){fa(F).isComposing||(function(A){var C=A.event,g=A.props,E=A.refresh,b=A.store,w=(function(M,U){if(M==null)return{};var v,m,y=(function(k,N){if(k==null)return{};var H,V,z={},Z=Object.keys(k);for(V=0;V=0||(z[H]=k[H]);return z})(M,U);if(Object.getOwnPropertySymbols){var B=Object.getOwnPropertySymbols(M);for(m=0;m=0||Object.prototype.propertyIsEnumerable.call(M,v)&&(y[v]=M[v])}return y})(A,Jl);if(C.key==="ArrowUp"||C.key==="ArrowDown"){var S=function(){var M=Kt(b.getState()),U=g.environment.document.getElementById(ct(g.id,"item-".concat(b.getState().activeItemId),M?.source));U&&(U.scrollIntoViewIfNeeded?U.scrollIntoViewIfNeeded(!1):U.scrollIntoView(!1))},O=function(){var M=Kt(b.getState());if(b.getState().activeItemId!==null&&M){var U=M.item,v=M.itemInputValue,m=M.itemUrl,y=M.source;y.onActive(Ht({event:C,item:U,itemInputValue:v,itemUrl:m,refresh:E,source:y,state:b.getState()},w))}};C.preventDefault(),b.getState().isOpen===!1&&(g.openOnFocus||b.getState().query)?Vt(Ht({event:C,props:g,query:b.getState().query,refresh:E,store:b},w)).then((function(){b.dispatch(C.key,{nextActiveItemId:g.defaultActiveItemId}),O(),setTimeout(S,0)})):(b.dispatch(C.key,{}),O(),S())}else if(C.key==="Escape")C.preventDefault(),b.dispatch(C.key,null),b.pendingRequests.cancelAll();else if(C.key==="Tab")b.dispatch("blur",null),b.pendingRequests.cancelAll();else if(C.key==="Enter"){if(b.getState().activeItemId===null||b.getState().collections.every((function(M){return M.items.length===0}))){var P=Da(g.plugins,b.pendingRequests);return void(P!==void 0?P.then(b.pendingRequests.cancelAll):g.debug||b.pendingRequests.cancelAll())}C.preventDefault();var x=Kt(b.getState()),R=x.item,_=x.itemInputValue,T=x.itemUrl,j=x.source;if(C.metaKey||C.ctrlKey)T!==void 0&&(j.onSelect(Ht({event:C,item:R,itemInputValue:_,itemUrl:T,refresh:E,source:j,state:b.getState()},w)),g.navigator.navigateNewTab({itemUrl:T,item:R,state:b.getState()}));else if(C.shiftKey)T!==void 0&&(j.onSelect(Ht({event:C,item:R,itemInputValue:_,itemUrl:T,refresh:E,source:j,state:b.getState()},w)),g.navigator.navigateNewWindow({itemUrl:T,item:R,state:b.getState()}));else if(!C.altKey){if(T!==void 0)return j.onSelect(Ht({event:C,item:R,itemInputValue:_,itemUrl:T,refresh:E,source:j,state:b.getState()},w)),void g.navigator.navigate({itemUrl:T,item:R,state:b.getState()});Vt(Ht({event:C,nextState:{isOpen:!1},props:g,query:_,refresh:E,store:b},w)).then((function(){j.onSelect(Ht({event:C,item:R,itemInputValue:_,itemUrl:T,refresh:E,source:j,state:b.getState()},w))}))}}})(We({event:F,props:t,refresh:n,store:r},u))},onFocus:i,onBlur:Cr,onClick:function(F){o.inputElement!==t.environment.document.activeElement||r.getState().isOpen||i(F)}},D)},getPanelProps:function(o){return We({onMouseDown:function(a){a.preventDefault()},onMouseLeave:function(){r.dispatch("mouseleave",null)}},o)},getListProps:function(o){var a=o||{},i=a.source,l=nn(a,tc);return We({role:"listbox","aria-labelledby":ct(t.id,"label"),id:ct(t.id,"list",i)},l)},getItemProps:function(o){var a=o.item,i=o.source,l=nn(o,nc);return We({id:ct(t.id,"item-".concat(a.__autocomplete_id),i),role:"option","aria-selected":r.getState().activeItemId===a.__autocomplete_id,onMouseMove:function(s){if(a.__autocomplete_id!==r.getState().activeItemId){r.dispatch("mousemove",a.__autocomplete_id);var f=Kt(r.getState());if(r.getState().activeItemId!==null&&f){var D=f.item,h=f.itemInputValue,p=f.itemUrl,d=f.source;d.onActive(We({event:s,item:D,itemInputValue:h,itemUrl:p,refresh:n,source:d,state:r.getState()},u))}}},onMouseDown:function(s){s.preventDefault()},onClick:function(s){var f=i.getItemInputValue({item:a,state:r.getState()}),D=i.getItemUrl({item:a,state:r.getState()});(D?Promise.resolve():Vt(We({event:s,nextState:{isOpen:!1},props:t,query:f,refresh:n,store:r},u))).then((function(){i.onSelect(We({event:s,item:a,itemInputValue:f,itemUrl:D,refresh:n,source:i,state:r.getState()},u))}))}},l)}}}function Pn(e){return Pn=typeof Symbol=="function"&&q(Symbol.iterator)=="symbol"?function(t){return q(t)}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":q(t)},Pn(e)}function Aa(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(u){return Object.getOwnPropertyDescriptor(e,u).enumerable}))),n.push.apply(n,r)}return n}function oc(e){for(var t=1;tn-30}catch{return!0}},cr=null,Gi=(function(){var e=Bt(Ve().mark((function t(n){var r,u;return Ve().wrap((function(o){for(;;)switch(o.prev=o.next){case 0:if(r=n.assistantId,u=sessionStorage.getItem(wa),Dc(u)){o.next=4;break}return o.abrupt("return",u);case 4:return cr||(cr=fetch("".concat(Xu,"/token"),{method:"POST",headers:{"x-algolia-assistant-id":r,"content-type":"application/json"}}).then((function(a){return a.json()})).then((function(a){var i=a.token;return sessionStorage.setItem(wa,i),i})).finally((function(){return cr=null}))),o.abrupt("return",cr);case 6:case"end":return o.stop()}}),t)})));return function(t){return e.apply(this,arguments)}})(),fc=(function(){var e=Bt(Ve().mark((function t(n){var r,u,o,a,i,l;return Ve().wrap((function(s){for(;;)switch(s.prev=s.next){case 0:return r=n.assistantId,u=n.thumbs,o=n.messageId,a=n.appId,(i=new Headers).set("x-algolia-assistant-id",r),i.set("content-type","application/json"),s.next=7,Gi({assistantId:r});case 7:l=s.sent,i.set("authorization","TOKEN ".concat(l));case 9:return s.abrupt("return",fetch("".concat(Xu,"/feedback"),{method:"POST",body:JSON.stringify({appId:a,messageId:o,thumbs:u}),headers:i}));case 10:case"end":return s.stop()}}),t)})));return function(t){return e.apply(this,arguments)}})();function pc(e){var t=e.translations,n=(t===void 0?{}:t).poweredByText,r=n===void 0?"Powered by":n;return c.createElement("a",{href:"https://www.algolia.com/ref/docsearch/?utm_source=".concat(window.location.hostname,"&utm_medium=referral&utm_content=powered_by&utm_campaign=docsearch"),target:"_blank",rel:"noopener noreferrer"},c.createElement("span",{className:"DocSearch-Label"},r),c.createElement("svg",{width:"80",height:"24","aria-label":"Algolia",role:"img",id:"Layer_1",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 2196.2 500"},c.createElement("defs",null,c.createElement("style",null,".cls-1,.cls-2{fill:#003dff;}.cls-2{fill-rule:evenodd;}")),c.createElement("path",{className:"cls-2",d:"M1070.38,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),c.createElement("rect",{className:"cls-1",x:"1845.88",y:"104.73",width:"62.58",height:"277.9",rx:"5.9",ry:"5.9"}),c.createElement("path",{className:"cls-2",d:"M1851.78,71.38h50.77c3.26,0,5.9-2.64,5.9-5.9V5.9c0-3.62-3.24-6.39-6.82-5.83l-50.77,7.95c-2.87,.45-4.99,2.92-4.99,5.83v51.62c0,3.26,2.64,5.9,5.9,5.9Z"}),c.createElement("path",{className:"cls-2",d:"M1764.03,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),c.createElement("path",{className:"cls-2",d:"M1631.95,142.72c-11.14-12.25-24.83-21.65-40.78-28.31-15.92-6.53-33.26-9.85-52.07-9.85-18.78,0-36.15,3.17-51.92,9.85-15.59,6.66-29.29,16.05-40.76,28.31-11.47,12.23-20.38,26.87-26.76,44.03-6.38,17.17-9.24,37.37-9.24,58.36,0,20.99,3.19,36.87,9.55,54.21,6.38,17.32,15.14,32.11,26.45,44.36,11.29,12.23,24.83,21.62,40.6,28.46,15.77,6.83,40.12,10.33,52.4,10.48,12.25,0,36.78-3.82,52.7-10.48,15.92-6.68,29.46-16.23,40.78-28.46,11.29-12.25,20.05-27.04,26.25-44.36,6.22-17.34,9.24-33.22,9.24-54.21,0-20.99-3.34-41.19-10.03-58.36-6.38-17.17-15.14-31.8-26.43-44.03Zm-44.43,163.75c-11.47,15.75-27.56,23.7-48.09,23.7-20.55,0-36.63-7.8-48.1-23.7-11.47-15.75-17.21-34.01-17.21-61.2,0-26.89,5.59-49.14,17.06-64.87,11.45-15.75,27.54-23.52,48.07-23.52,20.55,0,36.63,7.78,48.09,23.52,11.47,15.57,17.36,37.98,17.36,64.87,0,27.19-5.72,45.3-17.19,61.2Z"}),c.createElement("path",{className:"cls-2",d:"M894.42,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),c.createElement("path",{className:"cls-2",d:"M2133.97,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),c.createElement("path",{className:"cls-2",d:"M1314.05,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-11.79,18.34-19.6,39.64-22.11,62.59-.58,5.3-.88,10.68-.88,16.14s.31,11.15,.93,16.59c4.28,38.09,23.14,71.61,50.66,94.52,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47h0c17.99,0,34.61-5.93,48.16-15.97,16.29-11.58,28.88-28.54,34.48-47.75v50.26h-.11v11.08c0,21.84-5.71,38.27-17.34,49.36-11.61,11.08-31.04,16.63-58.25,16.63-11.12,0-28.79-.59-46.6-2.41-2.83-.29-5.46,1.5-6.27,4.22l-12.78,43.11c-1.02,3.46,1.27,7.02,4.83,7.53,21.52,3.08,42.52,4.68,54.65,4.68,48.91,0,85.16-10.75,108.89-32.21,21.48-19.41,33.15-48.89,35.2-88.52V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,64.1s.65,139.13,0,143.36c-12.08,9.77-27.11,13.59-43.49,14.7-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-1.32,0-2.63-.03-3.94-.1-40.41-2.11-74.52-37.26-74.52-79.38,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33Z"}),c.createElement("path",{className:"cls-1",d:"M249.83,0C113.3,0,2,110.09,.03,246.16c-2,138.19,110.12,252.7,248.33,253.5,42.68,.25,83.79-10.19,120.3-30.03,3.56-1.93,4.11-6.83,1.08-9.51l-23.38-20.72c-4.75-4.21-11.51-5.4-17.36-2.92-25.48,10.84-53.17,16.38-81.71,16.03-111.68-1.37-201.91-94.29-200.13-205.96,1.76-110.26,92-199.41,202.67-199.41h202.69V407.41l-115-102.18c-3.72-3.31-9.42-2.66-12.42,1.31-18.46,24.44-48.53,39.64-81.93,37.34-46.33-3.2-83.87-40.5-87.34-86.81-4.15-55.24,39.63-101.52,94-101.52,49.18,0,89.68,37.85,93.91,85.95,.38,4.28,2.31,8.27,5.52,11.12l29.95,26.55c3.4,3.01,8.79,1.17,9.63-3.3,2.16-11.55,2.92-23.58,2.07-35.92-4.82-70.34-61.8-126.93-132.17-131.26-80.68-4.97-148.13,58.14-150.27,137.25-2.09,77.1,61.08,143.56,138.19,145.26,32.19,.71,62.03-9.41,86.14-26.95l150.26,133.2c6.44,5.71,16.61,1.14,16.61-7.47V9.48C499.66,4.25,495.42,0,490.18,0H249.83Z"})))}function ru(e){return c.createElement("svg",{width:"20",height:"20","aria-label":e.ariaLabel,viewBox:"0 0 24 24",role:"img"},c.createElement("g",{fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"1.4"},e.children))}function hc(e){var t=e.translations,n=t===void 0?{}:t,r=e.isAskAiActive,u=r!==void 0&&r,o=n.selectText,a=o===void 0?"Select":o,i=n.selectKeyAriaLabel,l=i===void 0?"Enter key":i,s=n.submitQuestionText,f=s===void 0?"Submit question":s,D=n.navigateText,h=D===void 0?"Navigate":D,p=n.navigateUpKeyAriaLabel,d=p===void 0?"Arrow up":p,F=n.navigateDownKeyAriaLabel,A=F===void 0?"Arrow down":F,C=n.closeText,g=C===void 0?"Close":C,E=n.backToSearchText,b=E===void 0?"Back to search":E,w=n.closeKeyAriaLabel,S=w===void 0?"Escape key":w,O=n.poweredByText,P=O===void 0?"Powered by":O;return c.createElement(c.Fragment,null,c.createElement("div",{className:"DocSearch-Logo"},c.createElement(pc,{translations:{poweredByText:P}})),c.createElement("ul",{className:"DocSearch-Commands"},c.createElement("li",null,c.createElement("kbd",{className:"DocSearch-Commands-Key"},c.createElement(ru,{ariaLabel:A},c.createElement("path",{d:"M12 5v14"}),c.createElement("path",{d:"m19 12-7 7-7-7"}))),c.createElement("kbd",{className:"DocSearch-Commands-Key"},c.createElement(ru,{ariaLabel:d},c.createElement("path",{d:"m5 12 7-7 7 7"}),c.createElement("path",{d:"M12 19V5"}))),c.createElement("span",{className:"DocSearch-Label"},h)),c.createElement("li",null,c.createElement("kbd",{className:"DocSearch-Commands-Key"},c.createElement(ru,{ariaLabel:l},c.createElement("polyline",{points:"9 10 4 15 9 20"}),c.createElement("path",{d:"M20 4v7a4 4 0 0 1-4 4H4"}))),c.createElement("span",{className:"DocSearch-Label"},u?f:a)),c.createElement("li",null,c.createElement("kbd",{className:"DocSearch-Commands-Key"},c.createElement("span",{className:"DocSearch-Escape-Key"},"ESC")),c.createElement("span",{className:"DocSearch-Label","aria-label":S},u?b:g))))}function dc(e){var t=e.hit,n=e.children;return c.createElement("a",{href:t.url},n)}function Ar(e){var t=e.className;return c.createElement("svg",{viewBox:"0 0 38 38",className:t,stroke:"currentColor",strokeOpacity:".5"},c.createElement("g",{fill:"none",fillRule:"evenodd"},c.createElement("g",{transform:"translate(1 1)",strokeWidth:"2"},c.createElement("circle",{strokeOpacity:".3",cx:"18",cy:"18",r:"18"}),c.createElement("path",{d:"M36 18c0-9.94-8.06-18-18-18"},c.createElement("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"1s",repeatCount:"indefinite"})))))}function eo(){return c.createElement("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.3",strokeLinecap:"round",strokeLinejoin:"round",className:"DocSearch-Hit-icon-sparkles"},c.createElement("path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z"}),c.createElement("path",{d:"M20 3v4"}),c.createElement("path",{d:"M22 5h-4"}),c.createElement("path",{d:"M4 17v2"}),c.createElement("path",{d:"M5 18H3"}))}function mc(){return c.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},c.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},c.createElement("path",{d:"M3.18 6.6a8.23 8.23 0 1112.93 9.94h0a8.23 8.23 0 01-11.63 0"}),c.createElement("path",{d:"M6.44 7.25H2.55V3.36M10.45 6v5.6M10.45 11.6L13 13"})))}function mr(){return c.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},c.createElement("path",{d:"M10 10l5.09-5.09L10 10l5.09 5.09L10 10zm0 0L4.91 4.91 10 10l-5.09 5.09L10 10z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function vc(){return c.createElement("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"2",className:"lucide lucide-triangle-alert-icon lucide-triangle-alert"},c.createElement("path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"}),c.createElement("path",{d:"M12 9v4"}),c.createElement("path",{d:"M12 17h.01"}))}function Fc(){return c.createElement("svg",{className:"DocSearch-Hit-Select-Icon",width:"20",height:"20",viewBox:"0 0 20 20"},c.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},c.createElement("path",{d:"M18 3v4c0 2-2 4-4 4H2"}),c.createElement("path",{d:"M8 17l-6-6 6-6"})))}var gc=function(){return c.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"},c.createElement("path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"}),c.createElement("path",{d:"M14 2v4a2 2 0 0 0 2 2h4"}),c.createElement("path",{d:"M10 9H8"}),c.createElement("path",{d:"M16 13H8"}),c.createElement("path",{d:"M16 17H8"}))};function Ec(e){switch(e.type){case"lvl1":return c.createElement(gc,null);case"content":return c.createElement(Cc,null);default:return c.createElement(yc,null)}}function yc(){return c.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},c.createElement("line",{x1:"4",x2:"20",y1:"9",y2:"9"}),c.createElement("line",{x1:"4",x2:"20",y1:"15",y2:"15"}),c.createElement("line",{x1:"10",x2:"8",y1:"3",y2:"21"}),c.createElement("line",{x1:"16",x2:"14",y1:"3",y2:"21"}))}function Cc(){return c.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},c.createElement("path",{d:"M17 5H3h14zm0 5H3h14zm0 5H3h14z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function Sa(){return c.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},c.createElement("path",{d:"M10 14.2L5 17l1-5.6-4-4 5.5-.7 2.5-5 2.5 5 5.6.8-4 4 .9 5.5z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function Ac(){return c.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},c.createElement("path",{d:"M19 4.8a16 16 0 00-2-1.2m-3.3-1.2A16 16 0 001.1 4.7M16.7 8a12 12 0 00-2.8-1.4M10 6a12 12 0 00-6.7 2M12.3 14.7a4 4 0 00-4.5 0M14.5 11.4A8 8 0 0010 10M3 16L18 2M10 18h0"}))}function bc(){return c.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"64",height:"64",viewBox:"0 0 24 24",fill:"none",stroke:"#5a5e9a",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"},c.createElement("path",{d:"m13.5 8.5-5 5"}),c.createElement("path",{d:"m8.5 8.5 5 5"}),c.createElement("circle",{cx:"11",cy:"11",r:"8"}),c.createElement("path",{d:"m21 21-4.3-4.3"}))}var uu,_c={before:"Searched for ",separator:", ",lastSeparator:" and ",after:""};function kc(e){var t=e.queries,n=e.translations,r=e.onSearchQueryClick;if(t.length===0)return null;if(typeof n.aggregatedToolCallNode=="function")return c.createElement(c.Fragment,null,n.aggregatedToolCallNode(t,r));var u=(n.aggregatedToolCallText?n.aggregatedToolCallText(t):_c)||{},o=u.before,a=o===void 0?"":o,i=u.separator,l=i===void 0?", ":i,s=u.lastSeparator,f=s===void 0?" and ":s,D=u.after,h=D===void 0?"":D;return c.createElement("div",{className:"DocSearch-AskAiScreen-MessageContent-Tool Tool--AggregatedResult"},c.createElement(Wn,{size:18}),c.createElement("span",null,a&&c.createElement("span",null,a),t.map((function(p,d){return c.createElement(Et,{key:p+d},c.createElement("span",{role:"button",tabIndex:0,className:"DocSearch-AskAiScreen-MessageContent-Tool-Query",onKeyDown:function(F){F.key!=="enter"&&F.key!==" "||(F.preventDefault(),r(p))},onClick:function(){return r(p)}},'"',p,'"'),d1&&arguments[1]!==void 0?arguments[1]:"",n=typeof e=="string"?e:e.source,r={replace:function(u,o){var a=typeof o=="string"?o:o.source;return a=a.replace(et.caret,"$1"),n=n.replace(u,a),r},getRegex:function(){return new RegExp(n,t)}};return r}var et={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] /,listReplaceTask:/^\[[ xX]\] +/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C8A\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CD\uA7D0\uA7D1\uA7D3\uA7D5-\uA7DC\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDDC0-\uDDF3\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDD40-\uDD65\uDD6F-\uDD85\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDEC2-\uDEC4\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDF70-\uDF81\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61\uDF80-\uDF89\uDF8B\uDF8E\uDF90-\uDFB5\uDFB7\uDFD1\uDFD3]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDED0-\uDEE3\uDF00-\uDF1A\uDF30-\uDF3B\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8\uDFC0-\uDFE0\uDFF0-\uDFF9]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDF50-\uDF59\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD80E\uD80F\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD887][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46\uDC60-\uDFFF]|\uD810[\uDC00-\uDFFA]|\uD811[\uDC00-\uDE46]|\uD818[\uDD00-\uDD1D\uDD30-\uDD39]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDD40-\uDD6C\uDD70-\uDD79\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDCFF-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD833[\uDCF0-\uDCF9]|\uD834[\uDEC0-\uDED3\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD839[\uDCD0-\uDCEB\uDCF0-\uDCF9\uDDD0-\uDDED\uDDF0-\uDDFA\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF39\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0\uDFF0-\uDFFF]|\uD87B[\uDC00-\uDE5D]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD888[\uDC00-\uDFAF])/,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:function(e){return new RegExp("^( {0,3}".concat(e,")((?:[ ][^\\n]*)?(?:\\n|$))"))},nextBulletRegex:function(e){return new RegExp("^ {0,".concat(Math.min(3,e-1),"}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))"))},hrRegex:function(e){return new RegExp("^ {0,".concat(Math.min(3,e-1),"}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)"))},fencesBeginRegex:function(e){return new RegExp("^ {0,".concat(Math.min(3,e-1),"}(?:```|~~~)"))},headingBeginRegex:function(e){return new RegExp("^ {0,".concat(Math.min(3,e-1),"}#"))},htmlBeginRegex:function(e){return new RegExp("^ {0,".concat(Math.min(3,e-1),"}<(?:[a-z].*>|!--)"),"i")}},Jn=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,to=/(?:[*+-]|\d{1,9}[.)])/,Yi=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,Xi=Ae(Yi).replace(/bull/g,to).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),wc=Ae(Yi).replace(/bull/g,to).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),no=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,ro=/(?!\s*\])(?:\\.|[^\[\]\\])+/,Sc=Ae(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",ro).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),xc=Ae(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,to).getRegex(),Tr="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",uo=/|$))/,Bc=Ae("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",uo).replace("tag",Tr).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Ba=Ae(no).replace("hr",Jn).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Tr).getRegex(),oo={blockquote:Ae(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",Ba).getRegex(),code:/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,def:Sc,fences:/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,hr:Jn,html:Bc,lheading:Xi,list:xc,newline:/^(?:[ \t]*(?:\n|$))+/,paragraph:Ba,table:Nn,text:/^[^\n]+/},Oa=Ae("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",Jn).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Tr).getRegex(),Oc=$($({},oo),{},{lheading:wc,table:Oa,paragraph:Ae(no).replace("hr",Jn).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",Oa).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Tr).getRegex()}),Ic=$($({},oo),{},{html:Ae(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",uo).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Nn,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:Ae(no).replace("hr",Jn).replace("heading",` *#{1,6} *[^ +]`).replace("lheading",Xi).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()}),es=/^( {2,}|\\)\n(?!\s*$)/,Pr=/(?:[!-\/:-@\[-`\{-~\xA1-\xA9\xAB\xAC\xAE-\xB1\xB4\xB6-\xB8\xBB\xBF\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u037E\u0384\u0385\u0387\u03F6\u0482\u055A-\u055F\u0589\u058A\u058D-\u058F\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0606-\u060F\u061B\u061D-\u061F\u066A-\u066D\u06D4\u06DE\u06E9\u06FD\u06FE\u0700-\u070D\u07F6-\u07F9\u07FE\u07FF\u0830-\u083E\u085E\u0888\u0964\u0965\u0970\u09F2\u09F3\u09FA\u09FB\u09FD\u0A76\u0AF0\u0AF1\u0B70\u0BF3-\u0BFA\u0C77\u0C7F\u0C84\u0D4F\u0D79\u0DF4\u0E3F\u0E4F\u0E5A\u0E5B\u0F01-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0F3A-\u0F3D\u0F85\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE-\u0FDA\u104A-\u104F\u109E\u109F\u10FB\u1360-\u1368\u1390-\u1399\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DB\u1800-\u180A\u1940\u1944\u1945\u19DE-\u19FF\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B4E\u1B4F\u1B5A-\u1B6A\u1B74-\u1B7F\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2010-\u2027\u2030-\u205E\u207A-\u207E\u208A-\u208E\u20A0-\u20C0\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2429\u2440-\u244A\u249C-\u24E9\u2500-\u2775\u2794-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E5D\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFF\u3001-\u3004\u3008-\u3020\u3030\u3036\u3037\u303D-\u303F\u309B\u309C\u30A0\u30FB\u3190\u3191\u3196-\u319F\u31C0-\u31E5\u31EF\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAA77-\uAA79\uAADE\uAADF\uAAF0\uAAF1\uAB5B\uAB6A\uAB6B\uABEB\uFB29\uFBB2-\uFBC2\uFD3E-\uFD4F\uFDCF\uFDFC-\uFDFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF0F\uFF1A-\uFF20\uFF3B-\uFF40\uFF5B-\uFF65\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD]|\uD800[\uDD00-\uDD02\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDC77\uDC78\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEC8\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDD6E\uDD8E\uDD8F\uDEAD\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9\uDFD4\uDFD5\uDFD7\uDFD8]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3F]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2\uDF00-\uDF09\uDFE1]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDF43-\uDF4F\uDFD5-\uDFF1\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3F\uDF44\uDF45]|\uD81B[\uDD6D-\uDD6F\uDE97-\uDE9A\uDFE2]|\uD82F[\uDC9C\uDC9F]|\uD833[\uDC00-\uDCEF\uDD00-\uDEB3\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85-\uDE8B]|\uD838[\uDD4F\uDEFF]|\uD839\uDDFF|\uD83A[\uDD5E\uDD5F]|\uD83B[\uDCAC\uDCB0\uDD2E\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED7\uDEDC-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF76\uDF7B-\uDFD9\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0-\uDCBB\uDCC0\uDCC1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE7C\uDE80-\uDE89\uDE8F-\uDEC6\uDECE-\uDEDC\uDEDF-\uDEE9\uDEF0-\uDEF8\uDF00-\uDF92\uDF94-\uDFEF])/,ao=/(?:[\t-\r -\/:-@\[-`\{-~\xA0-\xA9\xAB\xAC\xAE-\xB1\xB4\xB6-\xB8\xBB\xBF\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u037E\u0384\u0385\u0387\u03F6\u0482\u055A-\u055F\u0589\u058A\u058D-\u058F\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0606-\u060F\u061B\u061D-\u061F\u066A-\u066D\u06D4\u06DE\u06E9\u06FD\u06FE\u0700-\u070D\u07F6-\u07F9\u07FE\u07FF\u0830-\u083E\u085E\u0888\u0964\u0965\u0970\u09F2\u09F3\u09FA\u09FB\u09FD\u0A76\u0AF0\u0AF1\u0B70\u0BF3-\u0BFA\u0C77\u0C7F\u0C84\u0D4F\u0D79\u0DF4\u0E3F\u0E4F\u0E5A\u0E5B\u0F01-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0F3A-\u0F3D\u0F85\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE-\u0FDA\u104A-\u104F\u109E\u109F\u10FB\u1360-\u1368\u1390-\u1399\u1400\u166D\u166E\u1680\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DB\u1800-\u180A\u1940\u1944\u1945\u19DE-\u19FF\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B4E\u1B4F\u1B5A-\u1B6A\u1B74-\u1B7F\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2000-\u200A\u2010-\u2029\u202F-\u205F\u207A-\u207E\u208A-\u208E\u20A0-\u20C0\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2429\u2440-\u244A\u249C-\u24E9\u2500-\u2775\u2794-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E5D\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u3004\u3008-\u3020\u3030\u3036\u3037\u303D-\u303F\u309B\u309C\u30A0\u30FB\u3190\u3191\u3196-\u319F\u31C0-\u31E5\u31EF\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAA77-\uAA79\uAADE\uAADF\uAAF0\uAAF1\uAB5B\uAB6A\uAB6B\uABEB\uFB29\uFBB2-\uFBC2\uFD3E-\uFD4F\uFDCF\uFDFC-\uFDFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFEFF\uFF01-\uFF0F\uFF1A-\uFF20\uFF3B-\uFF40\uFF5B-\uFF65\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD]|\uD800[\uDD00-\uDD02\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDC77\uDC78\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEC8\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDD6E\uDD8E\uDD8F\uDEAD\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9\uDFD4\uDFD5\uDFD7\uDFD8]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3F]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2\uDF00-\uDF09\uDFE1]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDF43-\uDF4F\uDFD5-\uDFF1\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3F\uDF44\uDF45]|\uD81B[\uDD6D-\uDD6F\uDE97-\uDE9A\uDFE2]|\uD82F[\uDC9C\uDC9F]|\uD833[\uDC00-\uDCEF\uDD00-\uDEB3\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85-\uDE8B]|\uD838[\uDD4F\uDEFF]|\uD839\uDDFF|\uD83A[\uDD5E\uDD5F]|\uD83B[\uDCAC\uDCB0\uDD2E\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED7\uDEDC-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF76\uDF7B-\uDFD9\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0-\uDCBB\uDCC0\uDCC1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE7C\uDE80-\uDE89\uDE8F-\uDEC6\uDECE-\uDEDC\uDEDF-\uDEE9\uDEF0-\uDEF8\uDF00-\uDF92\uDF94-\uDFEF])/,ts=/(?:[\0-\x08\x0E-\x1F0-9A-Za-z\x7F-\x9F\xAA\xAD\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376-\u037D\u037F-\u0383\u0386\u0388-\u03F5\u03F7-\u0481\u0483-\u0559\u0560-\u0588\u058B\u058C\u0590-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7-\u05F2\u05F5-\u0605\u0610-\u061A\u061C\u0620-\u0669\u066E-\u06D3\u06D5-\u06DD\u06DF-\u06E8\u06EA-\u06FC\u06FF\u070E-\u07F5\u07FA-\u07FD\u0800-\u082F\u083F-\u085D\u085F-\u0887\u0889-\u0963\u0966-\u096F\u0971-\u09F1\u09F4-\u09F9\u09FC\u09FE-\u0A75\u0A77-\u0AEF\u0AF2-\u0B6F\u0B71-\u0BF2\u0BFB-\u0C76\u0C78-\u0C7E\u0C80-\u0C83\u0C85-\u0D4E\u0D50-\u0D78\u0D7A-\u0DF3\u0DF5-\u0E3E\u0E40-\u0E4E\u0E50-\u0E59\u0E5C-\u0F00\u0F18\u0F19\u0F20-\u0F33\u0F35\u0F37\u0F39\u0F3E-\u0F84\u0F86-\u0FBD\u0FC6\u0FCD\u0FDB-\u1049\u1050-\u109D\u10A0-\u10FA\u10FC-\u135F\u1369-\u138F\u139A-\u13FF\u1401-\u166C\u166F-\u167F\u1681-\u169A\u169D-\u16EA\u16EE-\u1734\u1737-\u17D3\u17D7\u17DC-\u17FF\u180B-\u193F\u1941-\u1943\u1946-\u19DD\u1A00-\u1A1D\u1A20-\u1A9F\u1AA7\u1AAE-\u1B4D\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BFB\u1C00-\u1C3A\u1C40-\u1C7D\u1C80-\u1CBF\u1CC8-\u1CD2\u1CD4-\u1FBC\u1FBE\u1FC2-\u1FCC\u1FD0-\u1FDC\u1FE0-\u1FEC\u1FF0-\u1FFC\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u2079\u207F-\u2089\u208F-\u209F\u20C1-\u20FF\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u218C-\u218F\u242A-\u243F\u244B-\u249B\u24EA-\u24FF\u2776-\u2793\u2B74\u2B75\u2B96\u2C00-\u2CE4\u2CEB-\u2CF8\u2CFD\u2D00-\u2D6F\u2D71-\u2DFF\u2E2F\u2E5E-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3040-\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u318F\u3192-\u3195\u31A0-\u31BF\u31E6-\u31EE\u31F0-\u31FF\u321F-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\uA48F\uA4C7-\uA4FD\uA500-\uA60C\uA610-\uA672\uA674-\uA67D\uA67F-\uA6F1\uA6F8-\uA6FF\uA717-\uA71F\uA722-\uA788\uA78B-\uA827\uA82C-\uA835\uA83A-\uA873\uA878-\uA8CD\uA8D0-\uA8F7\uA8FB\uA8FD-\uA92D\uA930-\uA95E\uA960-\uA9C0\uA9CE-\uA9DD\uA9E0-\uAA5B\uAA60-\uAA76\uAA7A-\uAADD\uAAE0-\uAAEF\uAAF2-\uAB5A\uAB5C-\uAB69\uAB6C-\uABEA\uABEC-\uD7FF\uE000-\uFB28\uFB2A-\uFBB1\uFBC3-\uFD3D\uFD50-\uFDCE\uFDD0-\uFDFB\uFE00-\uFE0F\uFE1A-\uFE2F\uFE53\uFE67\uFE6C-\uFEFE\uFF00\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF]|\uD800[\uDC00-\uDCFF\uDD03-\uDD36\uDD40-\uDD78\uDD8A\uDD8B\uDD8F\uDD9D-\uDD9F\uDDA1-\uDDCF\uDDFD-\uDF9E\uDFA0-\uDFCF\uDFD1-\uDFFF]|\uD801[\uDC00-\uDD6E\uDD70-\uDFFF]|\uD802[\uDC00-\uDC56\uDC58-\uDC76\uDC79-\uDD1E\uDD20-\uDD3E\uDD40-\uDE4F\uDE59-\uDE7E\uDE80-\uDEC7\uDEC9-\uDEEF\uDEF7-\uDF38\uDF40-\uDF98\uDF9D-\uDFFF]|\uD803[\uDC00-\uDD6D\uDD6F-\uDD8D\uDD90-\uDEAC\uDEAE-\uDF54\uDF5A-\uDF85\uDF8A-\uDFFF]|\uD804[\uDC00-\uDC46\uDC4E-\uDCBA\uDCBD\uDCC2-\uDD3F\uDD44-\uDD73\uDD76-\uDDC4\uDDC9-\uDDCC\uDDCE-\uDDDA\uDDDC\uDDE0-\uDE37\uDE3E-\uDEA8\uDEAA-\uDFD3\uDFD6\uDFD9-\uDFFF]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC5C\uDC5E-\uDCC5\uDCC7-\uDDC0\uDDD8-\uDE40\uDE44-\uDE5F\uDE6D-\uDEB8\uDEBA-\uDF3B\uDF40-\uDFFF]|\uD806[\uDC00-\uDC3A\uDC3C-\uDD43\uDD47-\uDDE1\uDDE3-\uDE3E\uDE47-\uDE99\uDE9D\uDEA3-\uDEFF\uDF0A-\uDFE0\uDFE2-\uDFFF]|\uD807[\uDC00-\uDC40\uDC46-\uDC6F\uDC72-\uDEF6\uDEF9-\uDF42\uDF50-\uDFD4\uDFF2-\uDFFE]|[\uD808\uD80A\uD80C-\uD819\uD81C-\uD82E\uD830-\uD832\uD837\uD83F-\uDBFF][\uDC00-\uDFFF]|\uD809[\uDC00-\uDC6F\uDC75-\uDFFF]|\uD80B[\uDC00-\uDFF0\uDFF3-\uDFFF]|\uD81A[\uDC00-\uDE6D\uDE70-\uDEF4\uDEF6-\uDF36\uDF40-\uDF43\uDF46-\uDFFF]|\uD81B[\uDC00-\uDD6C\uDD70-\uDE96\uDE9B-\uDFE1\uDFE3-\uDFFF]|\uD82F[\uDC00-\uDC9B\uDC9D\uDC9E\uDCA0-\uDFFF]|\uD833[\uDCF0-\uDCFF\uDEB4-\uDF4F\uDFC4-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDD65-\uDD69\uDD6D-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDDEB-\uDDFF\uDE42-\uDE44\uDE46-\uDEFF\uDF57-\uDFFF]|\uD835[\uDC00-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE8C-\uDFFF]|\uD838[\uDC00-\uDD4E\uDD50-\uDEFE\uDF00-\uDFFF]|\uD839[\uDC00-\uDDFE\uDE00-\uDFFF]|\uD83A[\uDC00-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDD2D\uDD2F-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDD0C\uDDAE-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDE5F\uDE66-\uDEFF]|\uD83D[\uDED8-\uDEDB\uDEED-\uDEEF\uDEFD-\uDEFF\uDF77-\uDF7A\uDFDA-\uDFDF\uDFEC-\uDFEF\uDFF1-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE\uDCAF\uDCBC-\uDCBF\uDCC2-\uDCFF\uDE54-\uDE5F\uDE6E\uDE6F\uDE7D-\uDE7F\uDE8A-\uDE8E\uDEC7-\uDECD\uDEDD\uDEDE\uDEEA-\uDEEF\uDEF9-\uDEFF\uDF93\uDFF0-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/,Tc=Ae(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,ao).getRegex(),ns=/(?!~)(?:[!-\/:-@\[-`\{-~\xA1-\xA9\xAB\xAC\xAE-\xB1\xB4\xB6-\xB8\xBB\xBF\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u037E\u0384\u0385\u0387\u03F6\u0482\u055A-\u055F\u0589\u058A\u058D-\u058F\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0606-\u060F\u061B\u061D-\u061F\u066A-\u066D\u06D4\u06DE\u06E9\u06FD\u06FE\u0700-\u070D\u07F6-\u07F9\u07FE\u07FF\u0830-\u083E\u085E\u0888\u0964\u0965\u0970\u09F2\u09F3\u09FA\u09FB\u09FD\u0A76\u0AF0\u0AF1\u0B70\u0BF3-\u0BFA\u0C77\u0C7F\u0C84\u0D4F\u0D79\u0DF4\u0E3F\u0E4F\u0E5A\u0E5B\u0F01-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0F3A-\u0F3D\u0F85\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE-\u0FDA\u104A-\u104F\u109E\u109F\u10FB\u1360-\u1368\u1390-\u1399\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DB\u1800-\u180A\u1940\u1944\u1945\u19DE-\u19FF\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B4E\u1B4F\u1B5A-\u1B6A\u1B74-\u1B7F\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2010-\u2027\u2030-\u205E\u207A-\u207E\u208A-\u208E\u20A0-\u20C0\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2429\u2440-\u244A\u249C-\u24E9\u2500-\u2775\u2794-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E5D\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFF\u3001-\u3004\u3008-\u3020\u3030\u3036\u3037\u303D-\u303F\u309B\u309C\u30A0\u30FB\u3190\u3191\u3196-\u319F\u31C0-\u31E5\u31EF\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAA77-\uAA79\uAADE\uAADF\uAAF0\uAAF1\uAB5B\uAB6A\uAB6B\uABEB\uFB29\uFBB2-\uFBC2\uFD3E-\uFD4F\uFDCF\uFDFC-\uFDFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF0F\uFF1A-\uFF20\uFF3B-\uFF40\uFF5B-\uFF65\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD]|\uD800[\uDD00-\uDD02\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDC77\uDC78\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEC8\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDD6E\uDD8E\uDD8F\uDEAD\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9\uDFD4\uDFD5\uDFD7\uDFD8]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3F]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2\uDF00-\uDF09\uDFE1]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDF43-\uDF4F\uDFD5-\uDFF1\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3F\uDF44\uDF45]|\uD81B[\uDD6D-\uDD6F\uDE97-\uDE9A\uDFE2]|\uD82F[\uDC9C\uDC9F]|\uD833[\uDC00-\uDCEF\uDD00-\uDEB3\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85-\uDE8B]|\uD838[\uDD4F\uDEFF]|\uD839\uDDFF|\uD83A[\uDD5E\uDD5F]|\uD83B[\uDCAC\uDCB0\uDD2E\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED7\uDEDC-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF76\uDF7B-\uDFD9\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0-\uDCBB\uDCC0\uDCC1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE7C\uDE80-\uDE89\uDE8F-\uDEC6\uDECE-\uDEDC\uDEDF-\uDEE9\uDEF0-\uDEF8\uDF00-\uDF92\uDF94-\uDFEF])/,rs=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,Pc=Ae(rs,"u").replace(/punct/g,Pr).getRegex(),jc=Ae(rs,"u").replace(/punct/g,ns).getRegex(),us="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",Rc=Ae(us,"gu").replace(/notPunctSpace/g,ts).replace(/punctSpace/g,ao).replace(/punct/g,Pr).getRegex(),Nc=Ae(us,"gu").replace(/notPunctSpace/g,/(?:(?:[\0-\x08\x0E-\x1F0-9A-Za-z\x7F-\x9F\xAA\xAD\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376-\u037D\u037F-\u0383\u0386\u0388-\u03F5\u03F7-\u0481\u0483-\u0559\u0560-\u0588\u058B\u058C\u0590-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7-\u05F2\u05F5-\u0605\u0610-\u061A\u061C\u0620-\u0669\u066E-\u06D3\u06D5-\u06DD\u06DF-\u06E8\u06EA-\u06FC\u06FF\u070E-\u07F5\u07FA-\u07FD\u0800-\u082F\u083F-\u085D\u085F-\u0887\u0889-\u0963\u0966-\u096F\u0971-\u09F1\u09F4-\u09F9\u09FC\u09FE-\u0A75\u0A77-\u0AEF\u0AF2-\u0B6F\u0B71-\u0BF2\u0BFB-\u0C76\u0C78-\u0C7E\u0C80-\u0C83\u0C85-\u0D4E\u0D50-\u0D78\u0D7A-\u0DF3\u0DF5-\u0E3E\u0E40-\u0E4E\u0E50-\u0E59\u0E5C-\u0F00\u0F18\u0F19\u0F20-\u0F33\u0F35\u0F37\u0F39\u0F3E-\u0F84\u0F86-\u0FBD\u0FC6\u0FCD\u0FDB-\u1049\u1050-\u109D\u10A0-\u10FA\u10FC-\u135F\u1369-\u138F\u139A-\u13FF\u1401-\u166C\u166F-\u167F\u1681-\u169A\u169D-\u16EA\u16EE-\u1734\u1737-\u17D3\u17D7\u17DC-\u17FF\u180B-\u193F\u1941-\u1943\u1946-\u19DD\u1A00-\u1A1D\u1A20-\u1A9F\u1AA7\u1AAE-\u1B4D\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BFB\u1C00-\u1C3A\u1C40-\u1C7D\u1C80-\u1CBF\u1CC8-\u1CD2\u1CD4-\u1FBC\u1FBE\u1FC2-\u1FCC\u1FD0-\u1FDC\u1FE0-\u1FEC\u1FF0-\u1FFC\u1FFF\u200B-\u200F\u202A-\u202E\u2060-\u2079\u207F-\u2089\u208F-\u209F\u20C1-\u20FF\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u218C-\u218F\u242A-\u243F\u244B-\u249B\u24EA-\u24FF\u2776-\u2793\u2B74\u2B75\u2B96\u2C00-\u2CE4\u2CEB-\u2CF8\u2CFD\u2D00-\u2D6F\u2D71-\u2DFF\u2E2F\u2E5E-\u2E7F\u2E9A\u2EF4-\u2EFF\u2FD6-\u2FEF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3040-\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u318F\u3192-\u3195\u31A0-\u31BF\u31E6-\u31EE\u31F0-\u31FF\u321F-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\uA48F\uA4C7-\uA4FD\uA500-\uA60C\uA610-\uA672\uA674-\uA67D\uA67F-\uA6F1\uA6F8-\uA6FF\uA717-\uA71F\uA722-\uA788\uA78B-\uA827\uA82C-\uA835\uA83A-\uA873\uA878-\uA8CD\uA8D0-\uA8F7\uA8FB\uA8FD-\uA92D\uA930-\uA95E\uA960-\uA9C0\uA9CE-\uA9DD\uA9E0-\uAA5B\uAA60-\uAA76\uAA7A-\uAADD\uAAE0-\uAAEF\uAAF2-\uAB5A\uAB5C-\uAB69\uAB6C-\uABEA\uABEC-\uD7FF\uE000-\uFB28\uFB2A-\uFBB1\uFBC3-\uFD3D\uFD50-\uFDCE\uFDD0-\uFDFB\uFE00-\uFE0F\uFE1A-\uFE2F\uFE53\uFE67\uFE6C-\uFEFE\uFF00\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFDF\uFFE7\uFFEF-\uFFFB\uFFFE\uFFFF]|\uD800[\uDC00-\uDCFF\uDD03-\uDD36\uDD40-\uDD78\uDD8A\uDD8B\uDD8F\uDD9D-\uDD9F\uDDA1-\uDDCF\uDDFD-\uDF9E\uDFA0-\uDFCF\uDFD1-\uDFFF]|\uD801[\uDC00-\uDD6E\uDD70-\uDFFF]|\uD802[\uDC00-\uDC56\uDC58-\uDC76\uDC79-\uDD1E\uDD20-\uDD3E\uDD40-\uDE4F\uDE59-\uDE7E\uDE80-\uDEC7\uDEC9-\uDEEF\uDEF7-\uDF38\uDF40-\uDF98\uDF9D-\uDFFF]|\uD803[\uDC00-\uDD6D\uDD6F-\uDD8D\uDD90-\uDEAC\uDEAE-\uDF54\uDF5A-\uDF85\uDF8A-\uDFFF]|\uD804[\uDC00-\uDC46\uDC4E-\uDCBA\uDCBD\uDCC2-\uDD3F\uDD44-\uDD73\uDD76-\uDDC4\uDDC9-\uDDCC\uDDCE-\uDDDA\uDDDC\uDDE0-\uDE37\uDE3E-\uDEA8\uDEAA-\uDFD3\uDFD6\uDFD9-\uDFFF]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC5C\uDC5E-\uDCC5\uDCC7-\uDDC0\uDDD8-\uDE40\uDE44-\uDE5F\uDE6D-\uDEB8\uDEBA-\uDF3B\uDF40-\uDFFF]|\uD806[\uDC00-\uDC3A\uDC3C-\uDD43\uDD47-\uDDE1\uDDE3-\uDE3E\uDE47-\uDE99\uDE9D\uDEA3-\uDEFF\uDF0A-\uDFE0\uDFE2-\uDFFF]|\uD807[\uDC00-\uDC40\uDC46-\uDC6F\uDC72-\uDEF6\uDEF9-\uDF42\uDF50-\uDFD4\uDFF2-\uDFFE]|[\uD808\uD80A\uD80C-\uD819\uD81C-\uD82E\uD830-\uD832\uD837\uD83F-\uDBFF][\uDC00-\uDFFF]|\uD809[\uDC00-\uDC6F\uDC75-\uDFFF]|\uD80B[\uDC00-\uDFF0\uDFF3-\uDFFF]|\uD81A[\uDC00-\uDE6D\uDE70-\uDEF4\uDEF6-\uDF36\uDF40-\uDF43\uDF46-\uDFFF]|\uD81B[\uDC00-\uDD6C\uDD70-\uDE96\uDE9B-\uDFE1\uDFE3-\uDFFF]|\uD82F[\uDC00-\uDC9B\uDC9D\uDC9E\uDCA0-\uDFFF]|\uD833[\uDCF0-\uDCFF\uDEB4-\uDF4F\uDFC4-\uDFFF]|\uD834[\uDCF6-\uDCFF\uDD27\uDD28\uDD65-\uDD69\uDD6D-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDDEB-\uDDFF\uDE42-\uDE44\uDE46-\uDEFF\uDF57-\uDFFF]|\uD835[\uDC00-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE8C-\uDFFF]|\uD838[\uDC00-\uDD4E\uDD50-\uDEFE\uDF00-\uDFFF]|\uD839[\uDC00-\uDDFE\uDE00-\uDFFF]|\uD83A[\uDC00-\uDD5D\uDD60-\uDFFF]|\uD83B[\uDC00-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDD2D\uDD2F-\uDEEF\uDEF2-\uDFFF]|\uD83C[\uDC2C-\uDC2F\uDC94-\uDC9F\uDCAF\uDCB0\uDCC0\uDCD0\uDCF6-\uDD0C\uDDAE-\uDDE5\uDE03-\uDE0F\uDE3C-\uDE3F\uDE49-\uDE4F\uDE52-\uDE5F\uDE66-\uDEFF]|\uD83D[\uDED8-\uDEDB\uDEED-\uDEEF\uDEFD-\uDEFF\uDF77-\uDF7A\uDFDA-\uDFDF\uDFEC-\uDFEF\uDFF1-\uDFFF]|\uD83E[\uDC0C-\uDC0F\uDC48-\uDC4F\uDC5A-\uDC5F\uDC88-\uDC8F\uDCAE\uDCAF\uDCBC-\uDCBF\uDCC2-\uDCFF\uDE54-\uDE5F\uDE6E\uDE6F\uDE7D-\uDE7F\uDE8A-\uDE8E\uDEC7-\uDECD\uDEDD\uDEDE\uDEEA-\uDEEF\uDEF9-\uDEFF\uDF93\uDFF0-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])|~)/).replace(/punctSpace/g,/(?!~)(?:[\t-\r -\/:-@\[-`\{-~\xA0-\xA9\xAB\xAC\xAE-\xB1\xB4\xB6-\xB8\xBB\xBF\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u037E\u0384\u0385\u0387\u03F6\u0482\u055A-\u055F\u0589\u058A\u058D-\u058F\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0606-\u060F\u061B\u061D-\u061F\u066A-\u066D\u06D4\u06DE\u06E9\u06FD\u06FE\u0700-\u070D\u07F6-\u07F9\u07FE\u07FF\u0830-\u083E\u085E\u0888\u0964\u0965\u0970\u09F2\u09F3\u09FA\u09FB\u09FD\u0A76\u0AF0\u0AF1\u0B70\u0BF3-\u0BFA\u0C77\u0C7F\u0C84\u0D4F\u0D79\u0DF4\u0E3F\u0E4F\u0E5A\u0E5B\u0F01-\u0F17\u0F1A-\u0F1F\u0F34\u0F36\u0F38\u0F3A-\u0F3D\u0F85\u0FBE-\u0FC5\u0FC7-\u0FCC\u0FCE-\u0FDA\u104A-\u104F\u109E\u109F\u10FB\u1360-\u1368\u1390-\u1399\u1400\u166D\u166E\u1680\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DB\u1800-\u180A\u1940\u1944\u1945\u19DE-\u19FF\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B4E\u1B4F\u1B5A-\u1B6A\u1B74-\u1B7F\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u1FBD\u1FBF-\u1FC1\u1FCD-\u1FCF\u1FDD-\u1FDF\u1FED-\u1FEF\u1FFD\u1FFE\u2000-\u200A\u2010-\u2029\u202F-\u205F\u207A-\u207E\u208A-\u208E\u20A0-\u20C0\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F\u218A\u218B\u2190-\u2429\u2440-\u244A\u249C-\u24E9\u2500-\u2775\u2794-\u2B73\u2B76-\u2B95\u2B97-\u2BFF\u2CE5-\u2CEA\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E5D\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u3004\u3008-\u3020\u3030\u3036\u3037\u303D-\u303F\u309B\u309C\u30A0\u30FB\u3190\u3191\u3196-\u319F\u31C0-\u31E5\u31EF\u3200-\u321E\u322A-\u3247\u3250\u3260-\u327F\u328A-\u32B0\u32C0-\u33FF\u4DC0-\u4DFF\uA490-\uA4C6\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA700-\uA716\uA720\uA721\uA789\uA78A\uA828-\uA82B\uA836-\uA839\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAA77-\uAA79\uAADE\uAADF\uAAF0\uAAF1\uAB5B\uAB6A\uAB6B\uABEB\uFB29\uFBB2-\uFBC2\uFD3E-\uFD4F\uFDCF\uFDFC-\uFDFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFEFF\uFF01-\uFF0F\uFF1A-\uFF20\uFF3B-\uFF40\uFF5B-\uFF65\uFFE0-\uFFE6\uFFE8-\uFFEE\uFFFC\uFFFD]|\uD800[\uDD00-\uDD02\uDD37-\uDD3F\uDD79-\uDD89\uDD8C-\uDD8E\uDD90-\uDD9C\uDDA0\uDDD0-\uDDFC\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDC77\uDC78\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEC8\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDD6E\uDD8E\uDD8F\uDEAD\uDF55-\uDF59\uDF86-\uDF89]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9\uDFD4\uDFD5\uDFD7\uDFD8]|\uD805[\uDC4B-\uDC4F\uDC5A\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDEB9\uDF3C-\uDF3F]|\uD806[\uDC3B\uDD44-\uDD46\uDDE2\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2\uDF00-\uDF09\uDFE1]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8\uDF43-\uDF4F\uDFD5-\uDFF1\uDFFF]|\uD809[\uDC70-\uDC74]|\uD80B[\uDFF1\uDFF2]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3F\uDF44\uDF45]|\uD81B[\uDD6D-\uDD6F\uDE97-\uDE9A\uDFE2]|\uD82F[\uDC9C\uDC9F]|\uD833[\uDC00-\uDCEF\uDD00-\uDEB3\uDF50-\uDFC3]|\uD834[\uDC00-\uDCF5\uDD00-\uDD26\uDD29-\uDD64\uDD6A-\uDD6C\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDDEA\uDE00-\uDE41\uDE45\uDF00-\uDF56]|\uD835[\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85-\uDE8B]|\uD838[\uDD4F\uDEFF]|\uD839\uDDFF|\uD83A[\uDD5E\uDD5F]|\uD83B[\uDCAC\uDCB0\uDD2E\uDEF0\uDEF1]|\uD83C[\uDC00-\uDC2B\uDC30-\uDC93\uDCA0-\uDCAE\uDCB1-\uDCBF\uDCC1-\uDCCF\uDCD1-\uDCF5\uDD0D-\uDDAD\uDDE6-\uDE02\uDE10-\uDE3B\uDE40-\uDE48\uDE50\uDE51\uDE60-\uDE65\uDF00-\uDFFF]|\uD83D[\uDC00-\uDED7\uDEDC-\uDEEC\uDEF0-\uDEFC\uDF00-\uDF76\uDF7B-\uDFD9\uDFE0-\uDFEB\uDFF0]|\uD83E[\uDC00-\uDC0B\uDC10-\uDC47\uDC50-\uDC59\uDC60-\uDC87\uDC90-\uDCAD\uDCB0-\uDCBB\uDCC0\uDCC1\uDD00-\uDE53\uDE60-\uDE6D\uDE70-\uDE7C\uDE80-\uDE89\uDE8F-\uDEC6\uDECE-\uDEDC\uDEDF-\uDEE9\uDEF0-\uDEF8\uDF00-\uDF92\uDF94-\uDFEF])/).replace(/punct/g,ns).getRegex(),Lc=Ae("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,ts).replace(/punctSpace/g,ao).replace(/punct/g,Pr).getRegex(),Mc=Ae(/\\(punct)/,"gu").replace(/punct/g,Pr).getRegex(),qc=Ae(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Hc=Ae(uo).replace("(?:-->|$)","-->").getRegex(),Uc=Ae("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",Hc).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),br=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,zc=Ae(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",br).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),Ia=Ae(/^!?\[(label)\]\[(ref)\]/).replace("label",br).replace("ref",ro).getRegex(),Ta=Ae(/^!?\[(ref)\](?:\[\])?/).replace("ref",ro).getRegex(),io={_backpedal:Nn,anyPunctuation:Mc,autolink:qc,blockSkip:/\[[^[\]]*?\]\((?:\\.|[^\\\(\)]|\((?:\\.|[^\\\(\)])*\))*\)|`[^`]*?`|<[^<>]*?>/g,br:es,code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,del:Nn,emStrongLDelim:Pc,emStrongRDelimAst:Rc,emStrongRDelimUnd:Lc,escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,link:zc,nolink:Ta,punctuation:Tc,reflink:Ia,reflinkSearch:Ae("reflink|nolink(?!\\()","g").replace("reflink",Ia).replace("nolink",Ta).getRegex(),tag:Uc,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},Pa=function(e){return Kc[e]};function mt(e,t){if(t){if(et.escapeTest.test(e))return e.replace(et.escapeReplace,Pa)}else if(et.escapeTestNoEncode.test(e))return e.replace(et.escapeReplaceNoEncode,Pa);return e}function ja(e){try{e=encodeURI(e).replace(et.percentDecode,"%")}catch{return null}return e}function Ra(e,t){var n,r=e.replace(et.findPipe,(function(o,a,i){for(var l=!1,s=a;--s>=0&&i[s]==="\\";)l=!l;return l?"|":" |"})).split(et.splitPipe),u=0;if(r[0].trim()||r.shift(),r.length>0&&((n=r.at(-1))===null||n===void 0||!n.trim())&&r.pop(),t)if(r.length>t)r.splice(t);else for(;r.length0)return{type:"space",raw:t[0]}}},{key:"code",value:function(e){var t=this.rules.block.code.exec(e);if(t){var n=t[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?n:gn(n,` +`)}}}},{key:"fences",value:function(e){var t=this.rules.block.fences.exec(e);if(t){var n=t[0],r=(function(u,o,a){var i=u.match(a.other.indentCodeCompensation);if(i===null)return o;var l=i[1];return o.split(` +`).map((function(s){var f=s.match(a.other.beginningSpace);return f===null?s:qe(f,1)[0].length>=l.length?s.slice(l.length):s})).join(` +`)})(n,t[3]||"",this.rules);return{type:"code",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:r}}}},{key:"heading",value:function(e){var t=this.rules.block.heading.exec(e);if(t){var n=t[2].trim();if(this.rules.other.endingHash.test(n)){var r=gn(n,"#");this.options.pedantic?n=r.trim():r&&!this.rules.other.endingSpaceChar.test(r)||(n=r.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}},{key:"hr",value:function(e){var t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:gn(t[0],` +`)}}},{key:"blockquote",value:function(e){var t=this.rules.block.blockquote.exec(e);if(t){for(var n=gn(t[0],` +`).split(` +`),r="",u="",o=[];n.length>0;){var a=!1,i=[],l=void 0;for(l=0;l1,o={type:"list",raw:"",ordered:u,start:u?+r.slice(0,-1):"",loose:!1,items:[]};r=u?"\\d{1,9}\\".concat(r.slice(-1)):"\\".concat(r),this.options.pedantic&&(r=u?r:"[*+-]");for(var a=this.rules.other.listItemRegex(r),i=!1;e;){var l=!1,s="",f="";if(!(n=a.exec(e))||this.rules.block.hr.test(e))break;s=n[0],e=e.substring(s.length);var D=n[2].split(` +`,1)[0].replace(this.rules.other.listReplaceTabs,(function(j){return" ".repeat(3*j.length)})),h=e.split(` +`,1)[0],p=!D.trim(),d=0;if(this.options.pedantic?(d=2,f=D.trimStart()):p?d=n[1].length+1:(d=(d=n[2].search(this.rules.other.nonSpaceChar))>4?1:d,f=D.slice(d),d+=n[1].length),p&&this.rules.other.blankLine.test(h)&&(s+=h+` +`,e=e.substring(h.length+1),l=!0),!l)for(var F=this.rules.other.nextBulletRegex(d),A=this.rules.other.hrRegex(d),C=this.rules.other.fencesBeginRegex(d),g=this.rules.other.headingBeginRegex(d),E=this.rules.other.htmlBeginRegex(d);e;){var b=e.split(` +`,1)[0],w=void 0;if(h=b,w=this.options.pedantic?h=h.replace(this.rules.other.listReplaceNesting," "):h.replace(this.rules.other.tabCharGlobal," "),C.test(h)||g.test(h)||E.test(h)||F.test(h)||A.test(h))break;if(w.search(this.rules.other.nonSpaceChar)>=d||!h.trim())f+=` +`+w.slice(d);else{if(p||D.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||C.test(D)||g.test(D)||A.test(D))break;f+=` +`+h}p||h.trim()||(p=!0),s+=b+` +`,e=e.substring(b.length+1),D=w.slice(d)}o.loose||(i?o.loose=!0:this.rules.other.doubleBlankLine.test(s)&&(i=!0));var S=null,O=void 0;this.options.gfm&&(S=this.rules.other.listIsTask.exec(f))&&(O=S[0]!=="[ ] ",f=f.replace(this.rules.other.listReplaceTask,"")),o.items.push({type:"list_item",raw:s,task:!!S,checked:O,loose:!1,text:f,tokens:[]}),o.raw+=s}var P=o.items.at(-1);if(!P)return;P.raw=P.raw.trimEnd(),P.text=P.text.trimEnd(),o.raw=o.raw.trimEnd();for(var x=0;x0&&R.some((function(j){return t.rules.other.anyLine.test(j.raw)}));o.loose=_}if(o.loose)for(var T=0;T0?-2:-1})(t[2],"()");if(u===-2)return;if(u>-1){var o=(t[0].indexOf("!")===0?5:4)+t[1].length+u;t[2]=t[2].substring(0,u),t[0]=t[0].substring(0,o).trim(),t[3]=""}}var a=t[2],i="";if(this.options.pedantic){var l=this.rules.other.pedanticHrefTitle.exec(a);l&&(a=l[1],i=l[3])}else i=t[3]?t[3].slice(1,-1):"";return a=a.trim(),this.rules.other.startAngleBracket.test(a)&&(a=this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?a.slice(1):a.slice(1,-1)),Na(t,{href:a&&a.replace(this.rules.inline.anyPunctuation,"$1"),title:i&&i.replace(this.rules.inline.anyPunctuation,"$1")},t[0],this.lexer,this.rules)}}},{key:"reflink",value:function(e,t){var n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){var r=t[(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," ").toLowerCase()];if(!r){var u=n[0].charAt(0);return{type:"text",raw:u,text:u}}return Na(n,r,n[0],this.lexer,this.rules)}}},{key:"emStrong",value:function(e,t){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"",r=this.rules.inline.emStrongLDelim.exec(e);if(r&&(!r[3]||!n.match(this.rules.other.unicodeAlphaNumeric))&&(!r[1]&&!r[2]||!n||this.rules.inline.punctuation.exec(n))){var u,o,a=Ct(r[0]).length-1,i=a,l=0,s=r[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(s.lastIndex=0,t=t.slice(-1*e.length+a);(r=s.exec(t))!=null;)if(u=r[1]||r[2]||r[3]||r[4]||r[5]||r[6])if(o=Ct(u).length,r[3]||r[4])i+=o;else if(!((r[5]||r[6])&&a%3)||(a+o)%3){if(!((i-=o)>0)){o=Math.min(o,o+i+l);var f=Ct(r[0])[0].length,D=e.slice(0,a+r.index+f+o);if(Math.min(a,o)%2){var h=D.slice(1,-1);return{type:"em",raw:D,text:h,tokens:this.lexer.inlineTokens(h)}}var p=D.slice(2,-2);return{type:"strong",raw:D,text:p,tokens:this.lexer.inlineTokens(p)}}}else l+=o}}},{key:"codespan",value:function(e){var t=this.rules.inline.code.exec(e);if(t){var n=t[2].replace(this.rules.other.newLineCharGlobal," "),r=this.rules.other.nonSpaceChar.test(n),u=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return r&&u&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:t[0],text:n}}}},{key:"br",value:function(e){var t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}},{key:"del",value:function(e){var t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}},{key:"autolink",value:function(e){var t,n,r=this.rules.inline.autolink.exec(e);if(r)return n=r[2]==="@"?"mailto:"+(t=r[1]):t=r[1],{type:"link",raw:r[0],text:t,href:n,tokens:[{type:"text",raw:t,text:t}]}}},{key:"url",value:function(e){var t;if(t=this.rules.inline.url.exec(e)){var n,r;if(t[2]==="@")r="mailto:"+(n=t[0]);else{var u;do{var o,a;u=t[0],t[0]=(o=(a=this.rules.inline._backpedal.exec(t[0]))===null||a===void 0?void 0:a[0])!==null&&o!==void 0?o:""}while(u!==t[0]);n=t[0],r=t[1]==="www."?"http://"+t[0]:t[0]}return{type:"link",raw:t[0],text:n,href:r,tokens:[{type:"text",raw:n,text:n}]}}}},{key:"inlineText",value:function(e){var t=this.rules.inline.text.exec(e);if(t){var n=this.lexer.state.inRawBlock;return{type:"text",raw:t[0],text:t[0],escaped:n}}}}]),wt=(function(){function e(t){st(this,e),ve(this,"tokens",void 0),ve(this,"options",void 0),ve(this,"state",void 0),ve(this,"tokenizer",void 0),ve(this,"inlineQueue",void 0),this.tokens=[],this.tokens.links=Object.create(null),this.options=t||Jt,this.options.tokenizer=this.options.tokenizer||new _r,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};var n={other:et,block:Dr.normal,inline:Fn.normal};this.options.pedantic?(n.block=Dr.pedantic,n.inline=Fn.pedantic):this.options.gfm&&(n.block=Dr.gfm,this.options.breaks?n.inline=Fn.breaks:n.inline=Fn.gfm),this.tokenizer.rules=n}return lt(e,[{key:"lex",value:function(t){t=t.replace(et.carriageReturn,` +`),this.blockTokens(t,this.tokens);for(var n=0;n1&&arguments[1]!==void 0?arguments[1]:[],u=arguments.length>2&&arguments[2]!==void 0&&arguments[2];this.options.pedantic&&(t=t.replace(et.tabCharGlobal," ").replace(et.spaceLine,""));for(var o,a=function(){var i,l,s;if((i=n.options.extensions)!==null&&i!==void 0&&(i=i.block)!==null&&i!==void 0&&i.some((function(b){return!!(s=b.call({lexer:n},t,r))&&(t=t.substring(s.raw.length),r.push(s),!0)})))return 0;if(s=n.tokenizer.space(t)){t=t.substring(s.raw.length);var f=r.at(-1);return s.raw.length===1&&f!==void 0?f.raw+=` +`:r.push(s),0}if(s=n.tokenizer.code(t)){t=t.substring(s.raw.length);var D=r.at(-1);return D?.type==="paragraph"||D?.type==="text"?(D.raw+=` +`+s.raw,D.text+=` +`+s.text,n.inlineQueue.at(-1).src=D.text):r.push(s),0}if((s=n.tokenizer.fences(t))||(s=n.tokenizer.heading(t))||(s=n.tokenizer.hr(t))||(s=n.tokenizer.blockquote(t))||(s=n.tokenizer.list(t))||(s=n.tokenizer.html(t)))return t=t.substring(s.raw.length),r.push(s),0;if(s=n.tokenizer.def(t)){t=t.substring(s.raw.length);var h=r.at(-1);return h?.type==="paragraph"||h?.type==="text"?(h.raw+=` +`+s.raw,h.text+=` +`+s.raw,n.inlineQueue.at(-1).src=h.text):n.tokens.links[s.tag]||(n.tokens.links[s.tag]={href:s.href,title:s.title}),0}if((s=n.tokenizer.table(t))||(s=n.tokenizer.lheading(t)))return t=t.substring(s.raw.length),r.push(s),0;var p=t;if((l=n.options.extensions)!==null&&l!==void 0&&l.startBlock){var d,F=1/0,A=t.slice(1);n.options.extensions.startBlock.forEach((function(b){typeof(d=b.call({lexer:n},A))=="number"&&d>=0&&(F=Math.min(F,d))})),F<1/0&&F>=0&&(p=t.substring(0,F+1))}if(n.state.top&&(s=n.tokenizer.paragraph(p))){var C=r.at(-1);return u&&C?.type==="paragraph"?(C.raw+=` +`+s.raw,C.text+=` +`+s.text,n.inlineQueue.pop(),n.inlineQueue.at(-1).src=C.text):r.push(s),u=p.length!==t.length,t=t.substring(s.raw.length),0}if(s=n.tokenizer.text(t)){t=t.substring(s.raw.length);var g=r.at(-1);return g?.type==="text"?(g.raw+=` +`+s.raw,g.text+=` +`+s.text,n.inlineQueue.pop(),n.inlineQueue.at(-1).src=g.text):r.push(s),0}if(t){var E="Infinite loop on byte: "+t.charCodeAt(0);if(n.options.silent)return console.error(E),1;throw new Error(E)}};t&&((o=a())===0||o!==1););return this.state.top=!0,r}},{key:"inline",value:function(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[];return this.inlineQueue.push({src:t,tokens:n}),n}},{key:"inlineTokens",value:function(t){var n=this,r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],u=t,o=null;if(this.tokens.links){var a=Object.keys(this.tokens.links);if(a.length>0)for(;(o=this.tokenizer.rules.inline.reflinkSearch.exec(u))!=null;)a.includes(o[0].slice(o[0].lastIndexOf("[")+1,-1))&&(u=u.slice(0,o.index)+"["+"a".repeat(o[0].length-2)+"]"+u.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(o=this.tokenizer.rules.inline.anyPunctuation.exec(u))!=null;)u=u.slice(0,o.index)+"++"+u.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;(o=this.tokenizer.rules.inline.blockSkip.exec(u))!=null;)u=u.slice(0,o.index)+"["+"a".repeat(o[0].length-2)+"]"+u.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(var i,l=!1,s="",f=function(){var D,h,p;if(l||(s=""),l=!1,(D=n.options.extensions)!==null&&D!==void 0&&(D=D.inline)!==null&&D!==void 0&&D.some((function(w){return!!(p=w.call({lexer:n},t,r))&&(t=t.substring(p.raw.length),r.push(p),!0)})))return 0;if((p=n.tokenizer.escape(t))||(p=n.tokenizer.tag(t))||(p=n.tokenizer.link(t)))return t=t.substring(p.raw.length),r.push(p),0;if(p=n.tokenizer.reflink(t,n.tokens.links)){t=t.substring(p.raw.length);var d=r.at(-1);return p.type==="text"&&d?.type==="text"?(d.raw+=p.raw,d.text+=p.text):r.push(p),0}if((p=n.tokenizer.emStrong(t,u,s))||(p=n.tokenizer.codespan(t))||(p=n.tokenizer.br(t))||(p=n.tokenizer.del(t))||(p=n.tokenizer.autolink(t))||!n.state.inLink&&(p=n.tokenizer.url(t)))return t=t.substring(p.raw.length),r.push(p),0;var F=t;if((h=n.options.extensions)!==null&&h!==void 0&&h.startInline){var A,C=1/0,g=t.slice(1);n.options.extensions.startInline.forEach((function(w){typeof(A=w.call({lexer:n},g))=="number"&&A>=0&&(C=Math.min(C,A))})),C<1/0&&C>=0&&(F=t.substring(0,C+1))}if(p=n.tokenizer.inlineText(F)){t=t.substring(p.raw.length),p.raw.slice(-1)!=="_"&&(s=p.raw.slice(-1)),l=!0;var E=r.at(-1);return E?.type==="text"?(E.raw+=p.raw,E.text+=p.text):r.push(p),0}if(t){var b="Infinite loop on byte: "+t.charCodeAt(0);if(n.options.silent)return console.error(b),1;throw new Error(b)}};t&&((i=f())===0||i!==1););return r}}],[{key:"rules",get:function(){return{block:Dr,inline:Fn}}},{key:"lex",value:function(t,n){return new e(n).lex(t)}},{key:"lexInline",value:function(t,n){return new e(n).inlineTokens(t)}}])})(),kr=lt((function e(t){st(this,e),ve(this,"options",void 0),ve(this,"parser",void 0),this.options=t||Jt}),[{key:"space",value:function(e){return""}},{key:"code",value:function(e){var t,n=e.text,r=e.lang,u=e.escaped,o=(t=(r||"").match(et.notSpaceStart))===null||t===void 0?void 0:t[0],a=n.replace(et.endingNewline,"")+` +`;return o?'
'+(u?a:mt(a,!0))+`
+`:"
"+(u?a:mt(a,!0))+`
+`}},{key:"blockquote",value:function(e){var t=e.tokens,n=this.parser.parse(t);return`
+`.concat(n,`
+`)}},{key:"html",value:function(e){return e.text}},{key:"heading",value:function(e){var t=e.tokens,n=e.depth;return"").concat(this.parser.parseInline(t)," +`)}},{key:"hr",value:function(e){return`
+`}},{key:"list",value:function(e){for(var t=e.ordered,n=e.start,r="",u=0;u +`+r+" +`}},{key:"listitem",value:function(e){var t="";if(e.task){var n,r=this.checkbox({checked:!!e.checked});e.loose?((n=e.tokens[0])===null||n===void 0?void 0:n.type)==="paragraph"?(e.tokens[0].text=r+" "+e.tokens[0].text,e.tokens[0].tokens&&e.tokens[0].tokens.length>0&&e.tokens[0].tokens[0].type==="text"&&(e.tokens[0].tokens[0].text=r+" "+mt(e.tokens[0].tokens[0].text),e.tokens[0].tokens[0].escaped=!0)):e.tokens.unshift({type:"text",raw:r+" ",text:r+" ",escaped:!0}):t+=r+" "}return t+=this.parser.parse(e.tokens,!!e.loose),"
  • ".concat(t,`
  • +`)}},{key:"checkbox",value:function(e){return"'}},{key:"paragraph",value:function(e){var t=e.tokens;return"

    ".concat(this.parser.parseInline(t),`

    +`)}},{key:"table",value:function(e){for(var t="",n="",r=0;r")),` + +`+t+` +`+u+`
    +`}},{key:"tablerow",value:function(e){var t=e.text;return` +`.concat(t,` +`)}},{key:"tablecell",value:function(e){var t=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?"<".concat(n,' align="').concat(e.align,'">'):"<".concat(n,">"))+t+" +`)}},{key:"strong",value:function(e){var t=e.tokens;return"".concat(this.parser.parseInline(t),"")}},{key:"em",value:function(e){var t=e.tokens;return"".concat(this.parser.parseInline(t),"")}},{key:"codespan",value:function(e){var t=e.text;return"".concat(mt(t,!0),"")}},{key:"br",value:function(e){return"
    "}},{key:"del",value:function(e){var t=e.tokens;return"".concat(this.parser.parseInline(t),"")}},{key:"link",value:function(e){var t=e.href,n=e.title,r=e.tokens,u=this.parser.parseInline(r),o=ja(t);if(o===null)return u;var a='
    "+u+""}},{key:"image",value:function(e){var t=e.href,n=e.title,r=e.text,u=e.tokens;u&&(r=this.parser.parseInline(u,this.parser.textRenderer));var o=ja(t);if(o===null)return mt(r);var a='').concat(r,'"}},{key:"text",value:function(e){return"tokens"in e&&e.tokens?this.parser.parseInline(e.tokens):"escaped"in e&&e.escaped?e.text:mt(e.text)}}]),so=lt((function e(){st(this,e)}),[{key:"strong",value:function(e){return e.text}},{key:"em",value:function(e){return e.text}},{key:"codespan",value:function(e){return e.text}},{key:"del",value:function(e){return e.text}},{key:"html",value:function(e){return e.text}},{key:"text",value:function(e){return e.text}},{key:"link",value:function(e){return""+e.text}},{key:"image",value:function(e){return""+e.text}},{key:"br",value:function(){return""}}]),St=(function(){function e(t){st(this,e),ve(this,"options",void 0),ve(this,"renderer",void 0),ve(this,"textRenderer",void 0),this.options=t||Jt,this.options.renderer=this.options.renderer||new kr,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new so}return lt(e,[{key:"parse",value:function(t){for(var n=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],r="",u=0;u1&&arguments[1]!==void 0?arguments[1]:this.renderer,r="",u=0;u";return t?Promise.resolve(r):r}if(t)return Promise.reject(n);throw n}}}]),Tt=new Wc;function Ce(e,t){return Tt.parse(e,t)}function fr(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}Ce.options=Ce.setOptions=function(e){return Tt.setOptions(e),Ce.defaults=Tt.defaults,xa(Ce.defaults),Ce},Ce.getDefaults=function(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}},Ce.defaults=Jt,Ce.use=function(){return Tt.use.apply(Tt,arguments),Ce.defaults=Tt.defaults,xa(Ce.defaults),Ce},Ce.walkTokens=function(e,t){return Tt.walkTokens(e,t)},Ce.parseInline=Tt.parseInline,Ce.Parser=St,Ce.parser=St.parse,Ce.Renderer=kr,Ce.TextRenderer=so,Ce.Lexer=wt,Ce.lexer=wt.lex,Ce.Tokenizer=_r,Ce.Hooks=vr,Ce.parse=Ce,Ce.options,Ce.setOptions,Ce.use,Ce.walkTokens,Ce.parseInline,St.parse,wt.lex;var Ou=new Ce.Renderer;Ou.code=function(e){var t=e.text,n=e.lang,r=n===void 0?"":n,u=e.escaped,o=r?"language-".concat(r):"",a=u?t:fr(t),i=encodeURIComponent(t);return` +
    + +
    ').concat(a,`
    +
    + `)},Ou.link=function(e){var t=e.href,n=e.title,r=e.text,u=n?' title="'.concat(fr(n),'"'):"",o=t?fr(t):"",a=fr(r);return'').concat(a,"")};var Fr=hi((function(e){var t=e.content,n=e.copyButtonText,r=e.copyButtonCopiedText,u=e.isStreaming,o=Rt((function(){return Ce.parse(t,{gfm:!0,breaks:!0,renderer:Ou})}),[t]),a=ot(null);return it((function(){var i=a.current;if(i)return Array.from(i.querySelectorAll(".DocSearch-CodeSnippet-CopyButton")).forEach((function(s){var f=s.querySelector(".DocSearch-CodeSnippet-CopyButton-Label");f&&(f.textContent=n),s.classList.remove("DocSearch-CodeSnippet-CopyButton--copied")})),i.addEventListener("click",l),function(){i.removeEventListener("click",l)};function l(s){var f,D=s.target.closest(".DocSearch-CodeSnippet-CopyButton");if(D){var h=(f=D.getAttribute("data-code"))!==null&&f!==void 0?f:"";navigator.clipboard.writeText(decodeURIComponent(h)).catch((function(){}));var p=D.querySelector(".DocSearch-CodeSnippet-CopyButton-Label");if(p){D.classList.add("DocSearch-CodeSnippet-CopyButton--copied");var d=n;p.textContent=r,setTimeout((function(){D.classList.remove("DocSearch-CodeSnippet-CopyButton--copied"),p.textContent=d}),1500)}}}}),[o,n,r]),c.createElement("div",{ref:a,className:"DocSearch-Markdown-Content ".concat(u?"DocSearch-Markdown-Content--streaming":""),dangerouslySetInnerHTML:{__html:o}})}));Fr.displayName="MemoizedMarkdown";var Zc=["translations"];function Jc(e){var t=e.disclaimerText;return c.createElement("p",{className:"DocSearch-AskAiScreen-Disclaimer"},t)}function Qc(e){var t=e.exchange,n=e.askAiStreamError,r=e.isLastExchange,u=e.loadingStatus,o=e.onSearchQueryClick,a=e.translations,i=e.conversations,l=e.onFeedback,s=t.userMessage,f=t.assistantMessage,D=!r||r&&u==="ready"&&!!f,h=c.useMemo((function(){return(function(d){var F,A=[],C=new Set,g=d.replace(/```[\s\S]*?```/g,"").replace(/`[^`]*`/g,""),E=kt(g.matchAll(/\[([^\]]*)\]\(([^)]+)\)/g));try{for(E.s();!(F=E.n()).done;){var b=F.value,w=b[1].trim(),S=b[2];C.has(S)||(C.add(S),A.push({url:S,title:w||void 0}))}}catch(R){E.e(R)}finally{E.f()}var O,P=kt(g.matchAll(new RegExp('(?"{}|\\\\^`[\\]]+',"g")));try{for(P.s();!(O=P.n()).done;){var x=O.value[0].replace(/[.,;:!?]+$/,"");C.has(x)||(C.add(x),A.push({url:x}))}}catch(R){P.e(R)}finally{P.f()}return A})(f?.content||"")}),[f]),p=c.useMemo((function(){return Array.isArray(f?.parts)?(function(d){for(var F=[],A=0;A1?F.push({type:"aggregated-tool-call",queries:b}):b.length===1&&F.push(E),A=w-1}else F.push(E)}return F})(f?.parts||[]):f!=null&&f.content?[f?.content]:[]}),[f]);return c.createElement("div",{className:"DocSearch-AskAiScreen-Response-Container"},c.createElement("div",{className:"DocSearch-AskAiScreen-Response"},c.createElement("div",{className:"DocSearch-AskAiScreen-Message DocSearch-AskAiScreen-Message--user"},c.createElement("p",{className:"DocSearch-AskAiScreen-Query"},s.content)),c.createElement("div",{className:"DocSearch-AskAiScreen-Message DocSearch-AskAiScreen-Message--assistant"},c.createElement("div",{className:"DocSearch-AskAiScreen-MessageContent"},u==="error"&&n&&r&&c.createElement("div",{className:"DocSearch-AskAiScreen-MessageContent DocSearch-AskAiScreen-Error"},c.createElement(vc,null),c.createElement(Fr,{content:n.message,copyButtonText:"",copyButtonCopiedText:"",isStreaming:!1})),u==="submitted"&&r&&c.createElement("div",{className:"DocSearch-AskAiScreen-MessageContent-Reasoning"},c.createElement("span",{className:"shimmer"},a.thinkingText||"Thinking...")),Array.isArray(p)?p.map((function(d,F){var A,C,g,E=F;if(typeof d=="string")return c.createElement(Fr,{key:E,content:d,copyButtonText:a.copyButtonText||"Copy",copyButtonCopiedText:a.copyButtonCopiedText||"Copied!",isStreaming:u==="streaming"});if(d&&d.type==="aggregated-tool-call")return c.createElement(kc,{key:E,queries:d.queries,translations:a,onSearchQueryClick:o});if(d.type==="reasoning"&&(f==null||(A=f.parts)===null||A===void 0?void 0:A.length)===1)return c.createElement("div",{key:E,className:"DocSearch-AskAiScreen-MessageContent-Reasoning shimmer"},c.createElement("span",{className:"shimmer"},"Reasoning..."));if(d.type==="text")return c.createElement(Fr,{key:E,content:d.text,copyButtonText:a.copyButtonText||"Copy",copyButtonCopiedText:a.copyButtonCopiedText||"Copied!",isStreaming:u==="streaming"});if(d.type==="tool-invocation"){var b=d.toolInvocation;if(b.toolName==="searchIndex")switch(b.state){case"partial-call":return c.createElement("div",{key:E,className:"DocSearch-AskAiScreen-MessageContent-Tool Tool--PartialCall shimmer"},c.createElement(Ar,{className:"DocSearch-AskAiScreen-SmallerLoadingIcon"}),c.createElement("span",null,a.preToolCallText||"Searching..."));case"call":return c.createElement("div",{key:E,className:"DocSearch-AskAiScreen-MessageContent-Tool Tool--Call shimmer"},c.createElement(Ar,{className:"DocSearch-AskAiScreen-SmallerLoadingIcon"}),c.createElement("span",null,"".concat(a.duringToolCallText||"Searching for ",' "').concat(((C=b.args)===null||C===void 0?void 0:C.query)||"",'" ...')));case"result":return c.createElement("div",{key:E,className:"DocSearch-AskAiScreen-MessageContent-Tool Tool--Result"},c.createElement(Wn,{size:18}),c.createElement("span",null,"".concat(a.afterToolCallText||"Searched for")," ",c.createElement("span",{role:"button",tabIndex:0,className:"DocSearch-AskAiScreen-MessageContent-Tool-Query",onKeyDown:function(w){var S;w.key!=="Enter"&&w.key!==" "||(w.preventDefault(),o(((S=b.args)===null||S===void 0?void 0:S.query)||""))},onClick:function(){var w;return o(((w=b.args)===null||w===void 0?void 0:w.query)||"")}}," ",'"',((g=b.args)===null||g===void 0?void 0:g.query)||"",'"')));default:return null}return c.createElement("span",{key:E,className:"text-sm italic shimmer"},a.thinkingText||"Thinking...")}return null})):f?.content)),c.createElement("div",{className:"DocSearch-AskAiScreen-Answer-Footer"},c.createElement(Gc,{id:s?.id||t.id,showActions:D,latestAssistantMessageContent:f?.content||null,translations:a,conversations:i,onFeedback:l}))),h.length>0?c.createElement(Yc,{urlsToDisplay:h,relatedSourcesText:a.relatedSourcesText}):null)}function Gc(e){var t=e.id,n=e.showActions,r=e.latestAssistantMessageContent,u=e.translations,o=e.conversations,a=e.onFeedback,i=c.useMemo((function(){var P,x,R=(P=o.getOne)===null||P===void 0?void 0:P.call(o,t);return(x=R?.feedback)!==null&&x!==void 0?x:null}),[o,t]),l=qe(c.useState(i),2),s=l[0],f=l[1],D=qe(c.useState(!1),2),h=D[0],p=D[1],d=qe(c.useState(null),2),F=d[0],A=d[1],C=(function(){var P=Bt(Ve().mark((function x(R){return Ve().wrap((function(_){for(;;)switch(_.prev=_.next){case 0:if(!h){_.next=2;break}return _.abrupt("return");case 2:return A(null),p(!0),_.prev=4,_.next=7,a?.(t,R==="like"?1:0);case 7:f(R),_.next=13;break;case 10:_.prev=10,_.t0=_.catch(4),A(_.t0);case 13:return _.prev=13,p(!1),_.finish(13);case 16:case"end":return _.stop()}}),x,null,[[4,10,13,16]])})));return function(x){return P.apply(this,arguments)}})(),g=u.likeButtonTitle,E=g===void 0?"Like":g,b=u.dislikeButtonTitle,w=b===void 0?"Dislike":b,S=u.thanksForFeedbackText,O=S===void 0?"Thanks for your feedback!":S;return n&&r?c.createElement("div",{className:"DocSearch-AskAiScreen-Actions"},s===null?c.createElement(c.Fragment,null,h?c.createElement(Ar,{className:"DocSearch-AskAiScreen-SmallerLoadingIcon"}):c.createElement(c.Fragment,null,c.createElement(n0,{title:E,onClick:function(){return C("like")}}),c.createElement(r0,{title:w,onClick:function(){return C("dislike")}})),F&&c.createElement("p",{className:"DocSearch-AskAiScreen-FeedbackText"},F.message||"An error occured")):c.createElement("p",{className:"DocSearch-AskAiScreen-FeedbackText DocSearch-AskAiScreen-FeedbackText--visible"},O),c.createElement(t0,{translations:u,onClick:function(){return navigator.clipboard.writeText(r)}})):null}function Yc(e){var t=e.urlsToDisplay,n=e.relatedSourcesText;return c.createElement("div",{className:"DocSearch-AskAiScreen-RelatedSources"},c.createElement("p",{className:"DocSearch-AskAiScreen-RelatedSources-Title"},n||"Related sources"),c.createElement("div",{className:"DocSearch-AskAiScreen-RelatedSources-List"},t.length>0&&t.map((function(r){return c.createElement("a",{key:r.url,href:r.url,className:"DocSearch-AskAiScreen-RelatedSources-Item-Link",target:"_blank",rel:"noopener noreferrer"},c.createElement(e0,null),c.createElement("span",null,r.title||r.url))}))))}function Xc(e){var t=e.translations,n=t===void 0?{}:t,r=Dt(e,Zc),u=n.disclaimerText,o=u===void 0?"Answers are generated with AI which can make mistakes. Verify responses.":u,a=r.messages,i=Rt((function(){for(var s=[],f=0;f0&&c.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},c.createElement("p",{className:"DocSearch-Help"},i,":"),c.createElement("div",{className:"DocSearch-NoResults-Prefill-List-Items"},h.slice(0,3).reduce((function(p,d){return[].concat(Ct(p),[c.createElement("p",{key:d},c.createElement(Wn,{size:16}),c.createElement("button",{className:"DocSearch-Prefill",key:d,type:"button",onClick:function(){r.setQuery(d.toLowerCase()+" "),r.refresh(),r.inputRef.current.focus()}},d))])}),[]))),r.getMissingResultsUrl&&c.createElement("p",{className:"DocSearch-Help"},"".concat(s," "),c.createElement("a",{href:r.getMissingResultsUrl({query:r.state.query}),target:"_blank",rel:"noopener noreferrer"},D)))}var a0=["hit","attribute","tagName"];function Ma(e,t){return t.split(".").reduce((function(n,r){return n!=null&&n[r]?n[r]:null}),e)}function zt(e){var t=e.hit,n=e.attribute,r=e.tagName;return gt(r===void 0?"span":r,$($({},Dt(e,a0)),{},{dangerouslySetInnerHTML:{__html:Ma(t,"_snippetResult.".concat(n,".value"))||Ma(t,n)}}))}function gr(e){return e.collection&&e.collection.items.length!==0?e.collection.source.sourceId==="askAI"?c.createElement("section",{className:"DocSearch-AskAi-Section"},c.createElement("ul",e.getListProps({source:e.collection.source}),c.createElement(s0,Pe({item:e.collection.items[0],translations:e.translations},e)))):(e.collection.source.sourceId,c.createElement("section",{className:"DocSearch-Hits"},c.createElement("div",{className:"DocSearch-Hit-source"},e.title),c.createElement("ul",e.getListProps({source:e.collection.source}),e.collection.items.map((function(t,n){return c.createElement(i0,Pe({key:[e.title,t.objectID].join(":"),item:t,index:n},e))}))))):null}function i0(e){var t=e.item,n=e.index,r=e.renderIcon,u=e.renderAction,o=e.getItemProps,a=e.onItemClick,i=e.collection,l=e.hitComponent,s=qe(c.useState("idle"),2),f=s[0],D=s[1],h=c.useRef(null),p=l;return c.createElement("li",Pe({className:["DocSearch-Hit",t.__docsearch_parent&&"DocSearch-Hit--Child",f==="favoriting"&&"DocSearch-Hit--favoriting",f==="deleting"&&"DocSearch-Hit--deleting"].filter(Boolean).join(" "),onAnimationEnd:function(){var d;(d=h.current)===null||d===void 0||d.call(h),h.current=null}},o({item:t,source:i.source,onClick:function(d){a(t,d)}})),c.createElement(p,{hit:t},c.createElement("div",{className:"DocSearch-Hit-Container"},r({item:t,index:n}),t.hierarchy[t.type]&&t.type==="lvl1"&&c.createElement("div",{className:"DocSearch-Hit-content-wrapper"},c.createElement(zt,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.lvl1"}),t.content&&c.createElement(zt,{className:"DocSearch-Hit-path",hit:t,attribute:"content"})),t.type==="askAI"&&c.createElement("div",{className:"DocSearch-Hit-content-wrapper"},c.createElement(zt,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.lvl1"})),t.hierarchy[t.type]&&(t.type==="lvl2"||t.type==="lvl3"||t.type==="lvl4"||t.type==="lvl5"||t.type==="lvl6")&&c.createElement("div",{className:"DocSearch-Hit-content-wrapper"},c.createElement(zt,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.".concat(t.type)}),c.createElement(zt,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),t.type==="content"&&c.createElement("div",{className:"DocSearch-Hit-content-wrapper"},c.createElement(zt,{className:"DocSearch-Hit-title",hit:t,attribute:"content"}),c.createElement(zt,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),u({item:t,runDeleteTransition:function(d){D("deleting"),h.current=d},runFavoriteTransition:function(d){D("favoriting"),h.current=d}}))))}function s0(e){var t=e.item,n=e.getItemProps,r=e.onItemClick,u=e.translations,o=e.collection,a=(u||{}).askAiPlaceholder,i=a===void 0?"Ask AI: ":a;return c.createElement("li",Pe({className:"DocSearch-Hit"},n({item:t,source:o.source,onClick:function(l){r(t,l)}})),c.createElement("div",{className:"DocSearch-Hit--AskAI"},c.createElement("div",{className:"DocSearch-Hit-AskAIButton DocSearch-Hit-Container"},c.createElement("div",{className:" DocSearch-Hit-AskAIButton-icon DocSearch-Hit-icon"},c.createElement(eo,null)),c.createElement("div",{className:"DocSearch-Hit-AskAIButton-title"},c.createElement("span",{className:"DocSearch-Hit-AskAIButton-title-highlight"},i),c.createElement("mark",{className:"DocSearch-Hit-AskAIButton-title-query"},t.query||"")))))}function qa(e,t,n){return e.reduce((function(r,u){var o=t(u);return r.hasOwnProperty(o)||(r[o]=[]),r[o].length<(n||5)&&r[o].push(u),r}),{})}function Iu(e){return e}function Er(e){return e.button===1||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}function l0(){}var os=/(|<\/mark>)/g,c0=RegExp(os.source);function as(e){var t,n,r=e;if(!r.__docsearch_parent&&!e._highlightResult)return e.hierarchy.lvl0;var u=r.__docsearch_parent?(t=r.__docsearch_parent)===null||t===void 0||(t=t._highlightResult)===null||t===void 0||(t=t.hierarchy)===null||t===void 0?void 0:t.lvl0:(n=e._highlightResult)===null||n===void 0||(n=n.hierarchy)===null||n===void 0?void 0:n.lvl0;return u?u.value&&c0.test(u.value)?u.value.replace(os,""):u.value:e.hierarchy.lvl0}var D0=["translations"];function f0(e){var t=e.translations,n=t===void 0?{}:t,r=Dt(e,D0);return c.createElement("div",{className:"DocSearch-Dropdown-Container"},r.state.collections.map((function(u){if(u.items.length===0)return null;var o=as(u.items[0]);return c.createElement(gr,Pe({},r,{key:u.source.sourceId,translations:n,title:o,collection:u,renderIcon:function(a){var i,l=a.item,s=a.index;return c.createElement(c.Fragment,null,l.__docsearch_parent&&c.createElement("svg",{className:"DocSearch-Hit-Tree",viewBox:"0 0 24 54"},c.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},l.__docsearch_parent!==((i=u.items[s+1])===null||i===void 0?void 0:i.__docsearch_parent)?c.createElement("path",{d:"M8 6v21M20 27H8.3"}):c.createElement("path",{d:"M8 6v42M20 27H8.3"}))),c.createElement("div",{className:"DocSearch-Hit-icon"},c.createElement(Ec,{type:l.type})))},renderAction:function(){return c.createElement("div",{className:"DocSearch-Hit-action"},c.createElement(Fc,null))}}))})),r.resultsFooterComponent&&c.createElement("section",{className:"DocSearch-HitsFooter"},c.createElement(r.resultsFooterComponent,{state:r.state})))}var p0=["translations"];function h0(e){var t=e.translations,n=t===void 0?{}:t,r=Dt(e,p0),u=n.recentSearchesTitle,o=u===void 0?"Recent":u,a=n.saveRecentSearchButtonTitle,i=a===void 0?"Save this search":a,l=n.removeRecentSearchButtonTitle,s=l===void 0?"Remove this search from history":l,f=n.favoriteSearchesTitle,D=f===void 0?"Favorite":f,h=n.removeFavoriteSearchButtonTitle,p=h===void 0?"Remove this search from favorites":h,d=n.recentConversationsTitle,F=d===void 0?"Recent conversations":d,A=n.removeRecentConversationButtonTitle,C=A===void 0?"Remove this conversation from history":A;return c.createElement("div",{className:"DocSearch-Dropdown-Container"},c.createElement(gr,Pe({},r,{title:o,collection:r.state.collections[0],renderIcon:function(){return c.createElement("div",{className:"DocSearch-Hit-icon"},c.createElement(mc,null))},renderAction:function(g){var E=g.item,b=g.runFavoriteTransition,w=g.runDeleteTransition;return c.createElement(c.Fragment,null,c.createElement("div",{className:"DocSearch-Hit-action"},c.createElement("button",{className:"DocSearch-Hit-action-button",title:i,type:"submit",onClick:function(S){S.preventDefault(),S.stopPropagation(),b((function(){r.favoriteSearches.add(E),r.recentSearches.remove(E),r.refresh()}))}},c.createElement(Sa,null))),c.createElement("div",{className:"DocSearch-Hit-action"},c.createElement("button",{className:"DocSearch-Hit-action-button",title:s,type:"submit",onClick:function(S){S.preventDefault(),S.stopPropagation(),w((function(){r.recentSearches.remove(E),r.refresh()}))}},c.createElement(mr,null))))}})),c.createElement(gr,Pe({},r,{title:D,collection:r.state.collections[1],renderIcon:function(){return c.createElement("div",{className:"DocSearch-Hit-icon"},c.createElement(Sa,null))},renderAction:function(g){var E=g.item,b=g.runDeleteTransition;return c.createElement("div",{className:"DocSearch-Hit-action"},c.createElement("button",{className:"DocSearch-Hit-action-button",title:p,type:"submit",onClick:function(w){w.preventDefault(),w.stopPropagation(),b((function(){r.favoriteSearches.remove(E),r.refresh()}))}},c.createElement(mr,null)))}})),c.createElement(gr,Pe({},r,{title:F,collection:r.state.collections[2],renderIcon:function(){return c.createElement("div",{className:"DocSearch-Hit-icon"},c.createElement(eo,null))},renderAction:function(g){var E=g.item,b=g.runDeleteTransition;return c.createElement("div",{className:"DocSearch-Hit-action"},c.createElement("button",{className:"DocSearch-Hit-action-button",title:C,type:"submit",onClick:function(w){w.preventDefault(),w.stopPropagation(),b((function(){r.conversations.remove(E),r.refresh()}))}},c.createElement(mr,null)))}})))}var d0=["translations"],m0=c.memo((function(e){var t,n=e.translations,r=n===void 0?{}:n,u=Dt(e,d0);return u.isAskAiActive&&u.canHandleAskAi?c.createElement(Xc,Pe({},u,{messages:u.messages,status:u.status,askAiStreamError:u.askAiStreamError,askAiFetchError:u.askAiFetchError,translations:r?.askAiScreen})):((t=u.state)===null||t===void 0?void 0:t.status)==="error"?c.createElement(u0,{translations:r?.errorScreen}):u.state.query?u.hasCollections||u.canHandleAskAi?c.createElement(c.Fragment,null,c.createElement(f0,Pe({},u,{translations:r?.resultsScreen})),u.canHandleAskAi&&u.state.collections.length===1&&c.createElement(La,Pe({},u,{translations:r?.noResultsScreen}))):c.createElement(La,Pe({},u,{translations:r?.noResultsScreen})):c.createElement(h0,Pe({},u,{hasCollections:u.hasCollections,translations:r?.startScreen}))}),(function(e,t){return t.state.status==="loading"||t.state.status==="stalled"}));function v0(e){var t=e.size,n=t===void 0?20:t,r=e.color,u=r===void 0?"currentColor":r;return c.createElement("svg",{width:n,height:n,className:"DocSearch-Back-Icon",viewBox:"0 0 24 24",fill:"none",stroke:u,strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true"},c.createElement("path",{d:"m12 19-7-7 7-7"}),c.createElement("path",{d:"M19 12H5"}))}var F0=["translations"];function g0(e){var t=e.translations,n=t===void 0?{}:t,r=Dt(e,F0),u=n.clearButtonTitle,o=u===void 0?"Clear":u,a=n.clearButtonAriaLabel,i=a===void 0?"Clear the query":a,l=n.closeButtonText,s=l===void 0?"Close":l,f=n.closeButtonAriaLabel,D=f===void 0?"Close":f,h=n.searchInputLabel,p=h===void 0?"Search":h,d=n.backToKeywordSearchButtonText,F=d===void 0?"Back to keyword search":d,A=n.backToKeywordSearchButtonAriaLabel,C=A===void 0?"Back to keyword search":A,g=n.placeholderTextAskAiStreaming,E=g===void 0?"Answering...":g,b=r.getFormProps({inputElement:r.inputRef.current}).onReset;c.useEffect((function(){r.autoFocus&&r.inputRef.current&&r.inputRef.current.focus()}),[r.autoFocus,r.inputRef]),c.useEffect((function(){r.isFromSelection&&r.inputRef.current&&r.inputRef.current.select()}),[r.isFromSelection,r.inputRef]);var w=r.getInputProps({inputElement:r.inputRef.current,autoFocus:r.autoFocus,maxLength:512}),S=new Set(["ArrowUp","ArrowDown","Enter"]),O=w.onKeyDown,P=w.onChange,x=r.askAiStatus==="streaming"||r.askAiStatus==="submitted",R=r.state.status==="stalled";c.useEffect((function(){r.askAiStatus!=="streaming"&&r.askAiStatus!=="submitted"&&r.inputRef.current&&r.inputRef.current.focus()}),[r.askAiStatus,r.inputRef]);var _=$($({},w),{},{enterKeyHint:r.isAskAiActive?"enter":"search",onKeyDown:function(T){if(r.isAskAiActive&&S.has(T.key))return T.key==="Enter"&&!x&&r.state.query&&r.onAskAgain(r.state.query),T.preventDefault(),void T.stopPropagation();O?.(T)},onChange:function(T){if(r.isAskAiActive)return r.setQuery(T.currentTarget.value),T.preventDefault(),void T.stopPropagation();P?.(T)},disabled:x});return c.createElement(c.Fragment,null,c.createElement("form",{className:"DocSearch-Form",onSubmit:function(T){T.preventDefault()},onReset:b},r.isAskAiActive?c.createElement(c.Fragment,null,c.createElement("button",{type:"button",tabIndex:0,className:"DocSearch-AskAi-Return",title:F,"aria-label":C,onClick:function(){return r.onAskAiToggle(!1)}},c.createElement(v0,null))):c.createElement(c.Fragment,null,R&&c.createElement("div",{className:"DocSearch-LoadingIndicator"},c.createElement(Ar,null)),!R&&c.createElement("label",Pe({className:"DocSearch-MagnifierLabel"},r.getLabelProps()),c.createElement(Wn,null),c.createElement("span",{className:"DocSearch-VisuallyHiddenForAccessibility"},p))),c.createElement("input",Pe({className:"DocSearch-Input",ref:r.inputRef},_,{placeholder:x?E:r.placeholder})),c.createElement("div",{className:"DocSearch-Actions"},x&&c.createElement("button",{type:"button",className:"DocSearch-StreamingIndicator",onClick:function(){return r.onAskAiToggle(!0)}},c.createElement(eo,null)),c.createElement("button",{className:"DocSearch-Clear",type:"reset","aria-label":i,hidden:!r.state.query,tabIndex:r.state.query?0:-1,"aria-hidden":r.state.query?"false":"true"},o),(x||r.state.query)&&c.createElement("div",{className:"DocSearch-Divider"}),c.createElement("button",{type:"button",title:s,className:"DocSearch-Close","aria-label":D,onClick:r.onClose},c.createElement(mr,null)))))}function is(){if(typeof window<"u"&&window.localStorage){var e=[];for(var t in window.localStorage)if(t.includes("__DOCSEARCH_")){var n=window.localStorage[t];e.push({key:t,size:n.length+t.length})}e.sort((function(o,a){return a.size-o.size}));for(var r=Math.ceil(e.length/2),u=0;u"u"||!("localStorage"in window))return!1;var t="__TEST_KEY__";try{return window.localStorage.setItem(t,""),window.localStorage.removeItem(t),!0}catch{return!1}})()===!1?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){(function(n,r){try{window.localStorage.setItem(n,JSON.stringify(r))}catch(u){if(u instanceof DOMException&&u.name==="QuotaExceededError")try{is(),window.localStorage.setItem(n,JSON.stringify(r))}catch{}}})(e,t)},getItem:function(){var t=window.localStorage.getItem(e);if(t===null)return[];try{var n=JSON.parse(t);return Array.isArray(n)?n:[]}catch{return window.localStorage.removeItem(e),[]}}}}var E0=["_highlightResult","_snippetResult"];function Ha(e){var t=e.key,n=e.limit,r=n===void 0?5:n,u=ss(t),o=u.getItem().slice(0,r);return{add:function(a){var i=a;i._highlightResult,i._snippetResult;var l=Dt(i,E0),s=o.findIndex((function(f){return f.objectID===l.objectID}));s>-1&&o.splice(s,1),o.unshift(l),o=o.slice(0,r),u.setItem(o)},remove:function(a){o=o.filter((function(i){return i.objectID!==a.objectID})),u.setItem(o)},getAll:function(){return o}}}function y0(e){var t,n="algolia-client-js-".concat(e.key);function r(){return t===void 0&&(t=e.localStorage||window.localStorage),t}function u(){return JSON.parse(r().getItem(n)||"{}")}function o(a){r().setItem(n,JSON.stringify(a))}return{get:function(a,i){var l=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){var s,f,D;return s=e.timeToLive?1e3*e.timeToLive:null,f=u(),o(D=Object.fromEntries(Object.entries(f).filter((function(h){return qe(h,2)[1].timestamp!==void 0})))),s&&o(Object.fromEntries(Object.entries(D).filter((function(h){var p=qe(h,2)[1],d=new Date().getTime();return!(p.timestamp+s2&&arguments[2]!==void 0?arguments[2]:{miss:function(){return Promise.resolve()}};return u().then((function(a){return Promise.all([a,o.miss(a)])})).then((function(a){return qe(a,1)[0]}))},set:function(r,u){return Promise.resolve(u)},delete:function(r){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(r,u){var o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{miss:function(){return Promise.resolve()}};return n.get(r,u,o).catch((function(){return yn({caches:t}).get(r,u,o)}))},set:function(r,u){return n.set(r,u).catch((function(){return yn({caches:t}).set(r,u)}))},delete:function(r){return n.delete(r).catch((function(){return yn({caches:t}).delete(r)}))},clear:function(){return n.clear().catch((function(){return yn({caches:t}).clear()}))}}}function ou(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{serializable:!0},t={};return{get:function(n,r){var u=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{miss:function(){return Promise.resolve()}},o=JSON.stringify(n);if(o in t)return Promise.resolve(e.serializable?JSON.parse(t[o]):t[o]);var a=r();return a.then((function(i){return u.miss(i)})).then((function(){return a}))},set:function(n,r){return t[JSON.stringify(n)]=e.serializable?JSON.stringify(r):r,Promise.resolve(r)},delete:function(n){return delete t[JSON.stringify(n)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function C0(e){var t=e.algoliaAgents,n=e.client,r=e.version,u=(function(o){var a={value:"Algolia for JavaScript (".concat(o,")"),add:function(i){var l="; ".concat(i.segment).concat(i.version!==void 0?" (".concat(i.version,")"):"");return a.value.indexOf(l)===-1&&(a.value="".concat(a.value).concat(l)),a}};return a})(r).add({segment:n,version:r});return t.forEach((function(o){return u.add(o)})),u}var Ua=12e4;function za(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"up",n=Date.now();return $($({},e),{},{status:t,lastUpdate:n,isUp:function(){return t==="up"||Date.now()-n>Ua},isTimedOut:function(){return t==="timed out"&&Date.now()-n<=Ua}})}var ls=(function(){function e(t,n){var r;return st(this,e),ve(r=Dn(this,e,[t]),"name","AlgoliaError"),n&&(r.name=n),r}return fn(e,Fu(Error)),lt(e)})(),cs=(function(){function e(t,n,r){var u;return st(this,e),ve(u=Dn(this,e,[t,r]),"stackTrace",void 0),u.stackTrace=n,u}return fn(e,ls),lt(e)})(),A0=(function(){function e(t){return st(this,e),Dn(this,e,["Unreachable hosts - your application id may be incorrect. If the error persists, please reach out to the Algolia Support team: https://alg.li/support.",t,"RetryError"])}return fn(e,cs),lt(e)})(),Tu=(function(){function e(t,n,r){var u,o=arguments.length>3&&arguments[3]!==void 0?arguments[3]:"ApiError";return st(this,e),ve(u=Dn(this,e,[t,r,o]),"status",void 0),u.status=n,u}return fn(e,cs),lt(e)})(),b0=(function(){function e(t,n){var r;return st(this,e),ve(r=Dn(this,e,[t,"DeserializationError"]),"response",void 0),r.response=n,r}return fn(e,ls),lt(e)})(),_0=(function(){function e(t,n,r,u){var o;return st(this,e),ve(o=Dn(this,e,[t,n,u,"DetailedApiError"]),"error",void 0),o.error=r,o}return fn(e,Tu),lt(e)})();function k0(e,t,n){var r,u=(r=n,Object.keys(r).filter((function(a){return r[a]!==void 0})).sort().map((function(a){return"".concat(a,"=").concat(encodeURIComponent(Object.prototype.toString.call(r[a])==="[object Array]"?r[a].join(","):r[a]).replace(/\+/g,"%20"))})).join("&")),o="".concat(e.protocol,"://").concat(e.url).concat(e.port?":".concat(e.port):"","/").concat(t.charAt(0)==="/"?t.substring(1):t);return u.length&&(o+="?".concat(u)),o}function w0(e,t){if(e.method!=="GET"&&(e.data!==void 0||t.data!==void 0)){var n=Array.isArray(e.data)?e.data:$($({},e.data),t.data);return JSON.stringify(n)}}function S0(e,t,n){var r=$($($({Accept:"application/json"},e),t),n),u={};return Object.keys(r).forEach((function(o){var a=r[o];u[o.toLowerCase()]=a})),u}function x0(e){try{return JSON.parse(e.content)}catch(t){throw new b0(t.message,e)}}function B0(e,t){var n=e.content,r=e.status;try{var u=JSON.parse(n);return"error"in u?new _0(u.message,r,u.error,t):new Tu(u.message,r,t)}catch{}return new Tu(n,r,t)}function O0(e){return e.map((function(t){return Ds(t)}))}function Ds(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return $($({},e),{},{request:$($({},e.request),{},{headers:$($({},e.request.headers),t)})})}var I0=["appId","apiKey","authMode","algoliaAgents"],T0=["params"],Va="5.28.0";function P0(e){return[{url:"".concat(e,"-dsn.algolia.net"),accept:"read",protocol:"https"},{url:"".concat(e,".algolia.net"),accept:"write",protocol:"https"}].concat((function(t){for(var n=t,r=t.length-1;r>0;r--){var u=Math.floor(Math.random()*(r+1)),o=t[r];n[r]=t[u],n[u]=o}return n})([{url:"".concat(e,"-1.algolianet.com"),accept:"readWrite",protocol:"https"},{url:"".concat(e,"-2.algolianet.com"),accept:"readWrite",protocol:"https"},{url:"".concat(e,"-3.algolianet.com"),accept:"readWrite",protocol:"https"}]))}var Pu="4.0.0-beta.8";function j0(e,t,n){return c.useMemo((function(){var r=(function(u,o){if(!u||typeof u!="string")throw new Error("`appId` is missing.");if(!o||typeof o!="string")throw new Error("`apiKey` is missing.");return(function(a){var i=a.appId,l=a.apiKey,s=a.authMode,f=a.algoliaAgents,D=Dt(a,I0),h=(function(d,F){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"WithinHeaders",C={"x-algolia-api-key":F,"x-algolia-application-id":d};return{headers:function(){return A==="WithinHeaders"?C:{}},queryParameters:function(){return A==="WithinQueryParameters"?C:{}}}})(i,l,s),p=(function(d){var F=d.hosts,A=d.hostsCache,C=d.baseHeaders,g=d.logger,E=d.baseQueryParameters,b=d.algoliaAgent,w=d.timeouts,S=d.requester,O=d.requestsCache,P=d.responsesCache;function x(j){return R.apply(this,arguments)}function R(){return(R=Bt(Ve().mark((function j(M){var U,v,m,y,B;return Ve().wrap((function(k){for(;;)switch(k.prev=k.next){case 0:return k.next=2,Promise.all(M.map((function(N){return A.get(N,(function(){return Promise.resolve(za(N))}))})));case 2:return U=k.sent,v=U.filter((function(N){return N.isUp()})),m=U.filter((function(N){return N.isTimedOut()})),y=[].concat(Ct(v),Ct(m)),B=y.length>0?y:M,k.abrupt("return",{hosts:B,getTimeout:function(N,H){return(m.length===0&&N===0?1:m.length+3+N)*H}});case 8:case"end":return k.stop()}}),j)})))).apply(this,arguments)}function _(j,M){return T.apply(this,arguments)}function T(){return T=Bt(Ve().mark((function j(M,U){var v,m,y,B,k,N,H,V,z,Z,X,ae,Le,He=arguments;return Ve().wrap((function(Fe){for(;;)switch(Fe.prev=Fe.next){case 0:if(v=!(He.length>2&&He[2]!==void 0)||He[2],m=[],y=w0(M,U),B=S0(C,M.headers,U.headers),k=M.method==="GET"?$($({},M.data),U.data):{},N=$($($({},E),M.queryParameters),k),b.value&&(N["x-algolia-agent"]=b.value),U&&U.queryParameters)for(H=0,V=Object.keys(U.queryParameters);H1&&arguments[1]!==void 0?arguments[1]:{},U=j.useReadTransporter||j.method==="GET";if(!U)return _(j,M,U);var v=function(){return _(j,M)};if((M.cacheable||j.cacheable)!==!0)return v();var m={request:j,requestOptions:M,transporter:{queryParameters:E,headers:C}};return P.get(m,(function(){return O.get(m,(function(){return O.set(m,v()).then((function(y){return Promise.all([O.delete(m),y])}),(function(y){return Promise.all([O.delete(m),Promise.reject(y)])})).then((function(y){var B=qe(y,2);return B[0],B[1]}))}))}),{miss:function(y){return P.set(m,y)}})},requestsCache:O,responsesCache:P}})($($({hosts:P0(i)},D),{},{algoliaAgent:C0({algoliaAgents:f,client:"Lite",version:Va}),baseHeaders:$($({"content-type":"text/plain"},h.headers()),D.baseHeaders),baseQueryParameters:$($({},h.queryParameters()),D.baseQueryParameters)}));return{transporter:p,appId:i,apiKey:l,clearCache:function(){return Promise.all([p.requestsCache.clear(),p.responsesCache.clear()]).then((function(){}))},get _ua(){return p.algoliaAgent.value},addAlgoliaAgent:function(d,F){p.algoliaAgent.add({segment:d,version:F})},setClientApiKey:function(d){var F=d.apiKey;s&&s!=="WithinHeaders"?p.baseQueryParameters["x-algolia-api-key"]=F:p.baseHeaders["x-algolia-api-key"]=F},searchForHits:function(d,F){return this.search(d,F)},searchForFacets:function(d,F){return this.search(d,F)},customPost:function(d,F){var A=d.path,C=d.parameters,g=d.body;if(!A)throw new Error("Parameter `path` is required when calling `customPost`.");var E={method:"POST",path:"/{path}".replace("{path}",A),queryParameters:C||{},headers:{},data:g||{}};return p.request(E,F)},getRecommendations:function(d,F){if(d&&Array.isArray(d)&&(d={requests:d}),!d)throw new Error("Parameter `getRecommendationsParams` is required when calling `getRecommendations`.");if(!d.requests)throw new Error("Parameter `getRecommendationsParams.requests` is required when calling `getRecommendations`.");var A={method:"POST",path:"/1/indexes/*/recommendations",queryParameters:{},headers:{},data:d,useReadTransporter:!0,cacheable:!0};return p.request(A,F)},search:function(d,F){if(d&&Array.isArray(d)){var A={requests:d.map((function(g){var E=g.params,b=Dt(g,T0);return b.type==="facet"?$($($({},b),E),{},{type:"facet"}):$($($({},b),E),{},{facet:void 0,maxFacetHits:void 0,facetQuery:void 0})}))};d=A}if(!d)throw new Error("Parameter `searchMethodParams` is required when calling `search`.");if(!d.requests)throw new Error("Parameter `searchMethodParams.requests` is required when calling `search`.");var C={method:"POST",path:"/1/indexes/*/queries",queryParameters:{},headers:{},data:d,useReadTransporter:!0,cacheable:!0};return p.request(C,F)}}})($({appId:u,apiKey:o,timeouts:{connect:1e3,read:2e3,write:3e4},logger:{debug:function(a,i){return Promise.resolve()},info:function(a,i){return Promise.resolve()},error:function(a,i){return Promise.resolve()}},requester:{send:function(a){return new Promise((function(i){var l=new XMLHttpRequest;l.open(a.method,a.url,!0),Object.keys(a.headers).forEach((function(h){return l.setRequestHeader(h,a.headers[h])}));var s,f=function(h,p){return setTimeout((function(){l.abort(),i({status:0,content:p,isTimedOut:!0})}),h)},D=f(a.connectTimeout,"Connection timeout");l.onreadystatechange=function(){l.readyState>l.OPENED&&s===void 0&&(clearTimeout(D),s=f(a.responseTimeout,"Socket timeout"))},l.onerror=function(){l.status===0&&(clearTimeout(D),clearTimeout(s),i({content:l.responseText||"Network request failed",status:l.status,isTimedOut:!1}))},l.onload=function(){clearTimeout(D),clearTimeout(s),i({content:l.responseText,status:l.status,isTimedOut:!1})},l.send(a.data)}))}},algoliaAgents:[{segment:"Browser"}],authMode:"WithinQueryParameters",responsesCache:ou(),requestsCache:ou({serializable:!1}),hostsCache:yn({caches:[y0({key:"".concat(Va,"-").concat(u)}),ou()]})},void 0))})(e,t);return r.addAlgoliaAgent("docsearch",Pu),/docsearch.js \(.*\)/.test(r.transporter.algoliaAgent.value)===!1&&r.addAlgoliaAgent("docsearch-react",Pu),n(r)}),[e,t,n])}var R0=["footer","searchBox"],N0=(function(){var e=Bt(Ve().mark((function t(n){var r,u,o,a,i,l,s,f,D,h,p,d,F,A,C,g,E,b,w,S,O,P,x,R,_,T,j,M,U,v,m,y;return Ve().wrap((function(B){for(;;)switch(B.prev=B.next){case 0:return r=n.query,u=n.state,o=n.setContext,a=n.setStatus,i=n.searchClient,l=n.indexName,s=n.searchParameters,f=n.snippetLength,D=n.insights,h=n.appId,p=n.apiKey,d=n.maxResultsPerGroup,F=n.transformItems,A=F===void 0?Iu:F,C=n.saveRecentSearch,g=n.onClose,E=D,B.prev=2,B.next=5,i.search({requests:[$({query:r,indexName:l,attributesToRetrieve:(b=s?.attributesToRetrieve)!==null&&b!==void 0?b:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:(w=s?.attributesToSnippet)!==null&&w!==void 0?w:["hierarchy.lvl1:".concat(f.current),"hierarchy.lvl2:".concat(f.current),"hierarchy.lvl3:".concat(f.current),"hierarchy.lvl4:".concat(f.current),"hierarchy.lvl5:".concat(f.current),"hierarchy.lvl6:".concat(f.current),"content:".concat(f.current)],snippetEllipsisText:(S=s?.snippetEllipsisText)!==null&&S!==void 0?S:"…",highlightPreTag:(O=s?.highlightPreTag)!==null&&O!==void 0?O:"",highlightPostTag:(P=s?.highlightPostTag)!==null&&P!==void 0?P:"",hitsPerPage:(x=s?.hitsPerPage)!==null&&x!==void 0?x:20,clickAnalytics:(R=s?.clickAnalytics)!==null&&R!==void 0?R:E},s)]});case 5:return _=B.sent,T=_.results,j=T[0],M=j.hits,U=j.nbHits,v=A(M),m=qa(v,(function(k){return as(k)}),d),u.context.searchSuggestions.length-1?a[ge]=L:(a.unshift(L),a=a.slice(0,u)),o.setItem(a)},addFeedback:function(L,W){var ee=a.find((function(de){var me;return(me=de.messages)===null||me===void 0?void 0:me.some((function(Ie){return Ie.id===L}))}));if(ee&&ee.messages){var ge=ee.messages.find((function(de){return de.id===L}));ge&&(ge.feedback=W,o.setItem(a))}},getOne:function(L){var W,ee=a.find((function(ge){var de;return(de=ge.messages)===null||de===void 0?void 0:de.some((function(me){return me.id===L}))}));return ee==null||(W=ee.messages)===null||W===void 0?void 0:W.find((function(ge){return ge.id===L}))},getAll:function(){return a},remove:function(L){a=a.filter((function(W){return W.objectID!==L.objectID})),o.setItem(a)}})).current,_e=c.useRef(Ha({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(s),limit:10})).current,le=c.useRef(Ha({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(s),limit:_e.getAll().length===0?ae:He})).current,Oe=qe(c.useState(null),2),ke=Oe[0],Se=Oe[1],Me=kl({api:Xu,sendExtraMessageFields:!0,fetch:(function(L){function W(ee,ge){return L.apply(this,arguments)}return W.toString=function(){return L.toString()},W})((function(){var L=Bt(Ve().mark((function W(ee,ge){var de,me;return Ve().wrap((function(Ie){for(;;)switch(Ie.prev=Ie.next){case 0:Ie.next=2;break;case 2:if(J){Ie.next=4;break}throw new Error("Ask AI assistant ID is required");case 4:return Ie.next=6,Gi({assistantId:J});case 6:return de=Ie.sent,(me=new Headers(ge.headers)).set("authorization","TOKEN ".concat(de)),Ie.abrupt("return",fetch(ee,$($({},ge),{},{headers:me})));case 10:case"end":return Ie.stop()}}),W)})));return function(W,ee){return L.apply(this,arguments)}})()),headers:{"Content-Type":"application/json","X-Algolia-API-Key":K?.apiKey||l,"X-Algolia-Application-Id":K?.appId||i,"X-Algolia-Index-Name":K?.indexName||s,"X-Algolia-Assistant-Id":J||""},body:ue?{searchParameters:ue}:{},onError:function(L){Se(L)}}),je=Me.messages,ze=Me.append,ce=Me.status,Ue=Me.setMessages,At=Me.error,Qt=c.useRef(ce);c.useEffect((function(){j||(Qt.current==="streaming"&&ce==="ready"&&ye.add((function(L,W){return{query:L,objectID:W[0].content,messages:W,type:"askAI",anchor:"stored",content:null,hierarchy:{lvl0:"askAI",lvl1:W[0].content,lvl2:null,lvl3:null,lvl4:null,lvl5:null,lvl6:null},url:"",url_without_anchor:""}})(je[0].content,je)),Qt.current=ce)}),[ce,je,ye,j]);var Re=c.useCallback((function(L){var W=L.hierarchy,ee=["lvl6","lvl5","lvl4","lvl3","lvl2","lvl1","lvl0"].find((function(ge){return W[ge]}));return $($({},L),{},{type:ee||"lvl0",content:null})}),[]),Ne=c.useCallback((function(L){if(!j){var W=L.type==="content"?L.__docsearch_parent||Re(L):L;W&&_e.getAll().findIndex((function(ee){return ee.objectID===W.objectID}))===-1&&le.add(W)}}),[_e,le,j,Re]),ft=c.useCallback((function(L){if(we.context.algoliaInsightsPlugin&&L.__autocomplete_id){var W=L,ee={eventName:"Item Selected",index:W.__autocomplete_indexName,items:[W],positions:[L.__autocomplete_id],queryID:W.__autocomplete_queryID};we.context.algoliaInsightsPlugin.insights.clickedObjectIDsAfterSearch(ee)}}),[we.context.algoliaInsightsPlugin]),be=c.useRef(void 0),tt=c.useCallback((function(L,W){if(N(L),ze({role:"user",content:W}),Q.current){var ee=Q.current;typeof ee.scrollTo=="function"?ee.scrollTo({top:0,behavior:"smooth"}):ee.scrollTop=0}be.current&&be.current.setQuery("")}),[N,ze]),pt=c.useCallback((function(){var L=Bt(Ve().mark((function W(ee,ge){var de;return Ve().wrap((function(me){for(;;)switch(me.prev=me.next){case 0:if(J&&i){me.next=2;break}return me.abrupt("return");case 2:return me.next=4,fc({assistantId:J,thumbs:ge,messageId:ee,appId:i});case 4:if(!(me.sent.status>=300)){me.next=7;break}throw new Error("Failed, try again later");case 7:(de=ye.addFeedback)===null||de===void 0||de.call(ye,ee,ge===1?"like":"dislike");case 8:case"end":return me.stop()}}),W)})));return function(W,ee){return L.apply(this,arguments)}})(),[J,i,ye]);be.current||(be.current=cc({id:"docsearch",defaultActiveItemId:0,openOnFocus:!0,initialState:{query:G,context:{searchSuggestions:[]}},insights:!!k,navigator:O,onStateChange:function(L){Ge(L.state)},getSources:function(L){var W=L.query,ee=L.state,ge=L.setContext,de=L.setStatus;if(!W){var me=(function(rt){var Je=rt.recentSearches,te=rt.favoriteSearches,It=rt.saveRecentSearch,hn=rt.onClose;return rt.disableUserPersonalization?[]:[{sourceId:"recentSearches",onSelect:function(ht){var dn=ht.item,jr=ht.event;It(dn),Er(jr)||hn()},getItemUrl:function(ht){return ht.item.url},getItems:function(){return Je.getAll()}},{sourceId:"favoriteSearches",onSelect:function(ht){var dn=ht.item,jr=ht.event;It(dn),Er(jr)||hn()},getItemUrl:function(ht){return ht.item.url},getItems:function(){return te.getAll()}}]})({recentSearches:le,favoriteSearches:_e,saveRecentSearch:Ne,onClose:A,disableUserPersonalization:j}),Ie=Z?[{sourceId:"recentConversations",getItems:function(){return j?[]:ye.getAll()},onSelect:function(rt){var Je=rt.item;Je.messages&&(Ue(Je.messages),N(!0))}}]:[];return[].concat(Ct(me),Ie)}var Lt={context:ee.context},Qn=N0({query:W,state:Lt,setContext:ge,setStatus:de,searchClient:I,indexName:s,searchParameters:h,snippetLength:Y,insights:!!k,appId:i,apiKey:l,maxResultsPerGroup:p,transformItems:g,saveRecentSearch:Ne,onClose:A}),Gn=Z?[{sourceId:"askAI",getItems:function(){return[{type:"askAI",query:W,url_without_anchor:"",objectID:"ask-ai-button",content:null,url:"",anchor:null,hierarchy:{lvl0:"Ask AI",lvl1:W,lvl2:null,lvl3:null,lvl4:null,lvl5:null,lvl6:null},_highlightResult:{},_snippetResult:{},__docsearch_parent:null}]},onSelect:function(rt){var Je=rt.item;Je.type==="askAI"&&Je.query&&tt(!0,Je.query)}}]:[];return Qn.then((function(rt){return[].concat(Gn,Ct(rt))}))}}));var at,$e,nt=be.current,pn=nt.getEnvironmentProps,Nt=nt.getRootProps,Gt=nt.refresh;(function(L){var W=L.getEnvironmentProps,ee=L.panelElement,ge=L.formElement,de=L.inputElement;c.useEffect((function(){if(ee&&ge&&de){var me=W({panelElement:ee,formElement:ge,inputElement:de}),Ie=me.onTouchStart,Lt=me.onTouchMove;return window.addEventListener("touchstart",Ie),window.addEventListener("touchmove",Lt),function(){window.removeEventListener("touchstart",Ie),window.removeEventListener("touchmove",Lt)}}}),[W,ee,ge,de])})({getEnvironmentProps:pn,panelElement:Q.current,formElement:ie.current,inputElement:se.current}),at={container:Ke.current},$e=at.container,c.useEffect((function(){if($e){var L=$e.querySelectorAll("a[href]:not([disabled]), button:not([disabled]), input:not([disabled])"),W=L[0],ee=L[L.length-1];return $e.addEventListener("keydown",ge),function(){$e.removeEventListener("keydown",ge)}}function ge(de){de.key==="Tab"&&(de.shiftKey?document.activeElement===W&&(de.preventDefault(),ee.focus()):document.activeElement===ee&&(de.preventDefault(),W.focus()))}}),[$e]),Zu({theme:d}),c.useEffect((function(){return document.body.classList.add("DocSearch--active"),function(){var L,W;document.body.classList.remove("DocSearch--active"),(L=(W=window).scrollTo)===null||L===void 0||L.call(W,0,x)}}),[]),c.useEffect((function(){typeof window<"u"&&window.localStorage&&(function(){if(typeof window>"u"||!window.localStorage)return 0;var L=0;for(var W in window.localStorage)window.localStorage.hasOwnProperty(W)&&(L+=window.localStorage[W].length+W.length);return L})()>4194304&&is()}),[]),c.useLayoutEffect((function(){var L=window.innerWidth-document.body.clientWidth;return document.body.style.marginRight="".concat(L,"px"),function(){document.body.style.marginRight="0px"}}),[]),c.useEffect((function(){window.matchMedia("(max-width: 768px)").matches&&(Y.current=5)}),[]),c.useEffect((function(){var L;Q.current&&!V&&(typeof(L=Q.current).scrollTo=="function"?L.scrollTo({top:0,behavior:"smooth"}):L.scrollTop=0)}),[we.query,V]),c.useEffect((function(){G.length>0&&(Gt(),se.current&&se.current.focus())}),[G,Gt]),c.useEffect((function(){function L(){if(Ze.current){var W=.01*window.innerHeight;Ze.current.style.setProperty("--docsearch-vh","".concat(W,"px"))}}return L(),window.addEventListener("resize",L),function(){window.removeEventListener("resize",L)}}),[]),c.useEffect((function(){V||(nt.refresh(),Ue([]))}),[V,nt,Ue]);var Yt=!0,Xt=we.collections.some((function(L){return L.items.length>0}));return we.status!=="idle"||Xt!==!1||we.query.length!==0||V||(Yt=!1),c.createElement("div",Pe({ref:Ke},Nt({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container",we.status==="stalled"&&"DocSearch-Container--Stalled",we.status==="error"&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(L){L.target===L.currentTarget&&A()}}),c.createElement("div",{className:"DocSearch-Modal",ref:Ze},c.createElement("header",{className:"DocSearch-SearchBar",ref:ie},c.createElement(g0,Pe({},nt,{state:we,placeholder:f||"Search docs",autoFocus:G.length===0,inputRef:se,isFromSelection:!!G&&G===he,translations:Be,isAskAiActive:V,askAiStatus:ce,onClose:A,onAskAiToggle:N,onAskAgain:function(L){tt(!0,L)}}))),Yt&&c.createElement("div",{className:"DocSearch-Dropdown",ref:Q},c.createElement(m0,Pe({},nt,{indexName:s,state:we,hitComponent:b,resultsFooterComponent:S,disableUserPersonalization:j,recentSearches:le,favoriteSearches:_e,conversations:ye,inputRef:se,translations:re,getMissingResultsUrl:y,isAskAiActive:V,canHandleAskAi:Z,messages:je,askAiStreamError:ke,askAiFetchError:At,status:ce,hasCollections:Xt,onAskAiToggle:N,onItemClick:function(L,W){if(L.type==="askAI"&&L.query)return L.anchor==="stored"&&"messages"in L?(Ue(L.messages),N(!0)):tt(!0,L.query),void W.preventDefault();ft(L),Ne(L),Er(W)||A()},onFeedback:pt}))),c.createElement("footer",{className:"DocSearch-Footer"},c.createElement(hc,{translations:Fe,isAskAiActive:V}))))}function M0(e){var t,n,r,u,o,a,i=Pe({},((function(O){if(O==null)throw new TypeError("Cannot destructure "+O)})(e),e)),l=c.useRef(null),s=qe(c.useState(!1),2),f=s[0],D=s[1],h=qe(c.useState(i?.initialQuery||void 0),2),p=h[0],d=h[1],F=qe(c.useState(!1),2),A=F[0],C=F[1],g=(i==null||(t=i.translations)===null||t===void 0||(t=t.modal)===null||t===void 0||(t=t.searchBox)===null||t===void 0?void 0:t.placeholderText)||i?.placeholder||"Search docs",E=!!i?.askAi;E&&(g=(i==null||(o=i.translations)===null||o===void 0||(o=o.modal)===null||o===void 0||(o=o.searchBox)===null||o===void 0?void 0:o.placeholderText)||"Search docs or ask AI a question"),A&&(g=(i==null||(a=i.translations)===null||a===void 0||(a=a.modal)===null||a===void 0||(a=a.searchBox)===null||a===void 0?void 0:a.placeholderTextAskAi)||"Ask another question...");var b=c.useCallback((function(O){C(O)}),[C]),w=c.useCallback((function(){D(!0)}),[D]),S=c.useCallback((function(){D(!1),d(i?.initialQuery),A&&C(!1)}),[D,i.initialQuery,A,C]);return(function(O){var P=O.isOpen,x=O.onOpen,R=O.onClose,_=O.onInput,T=O.isAskAiActive,j=O.onAskAiToggle,M=O.searchButtonRef;c.useEffect((function(){function U(v){var m;if(!P||v.code!=="Escape"||!T)return v.code==="Escape"&&P||((m=v.key)===null||m===void 0?void 0:m.toLowerCase())==="k"&&(v.metaKey||v.ctrlKey)||!(function(y){var B=y.composedPath()[0],k=B.tagName;return B.isContentEditable||k==="INPUT"||k==="SELECT"||k==="TEXTAREA"})(v)&&v.key==="/"&&!P?(v.preventDefault(),void(P?R():document.body.classList.contains("DocSearch--active")||x())):void(M&&M.current===document.activeElement&&_&&/[a-zA-Z0-9]/.test(String.fromCharCode(v.keyCode))&&_(v));j(!1)}return window.addEventListener("keydown",U),function(){window.removeEventListener("keydown",U)}}),[P,x,R,_,M,T,j])})({isOpen:f,onOpen:w,onClose:S,onInput:c.useCallback((function(O){D(!0),d(O.key)}),[D,d]),isAskAiActive:A,onAskAiToggle:b,searchButtonRef:l}),Zu({theme:i.theme}),c.createElement(c.Fragment,null,c.createElement(Ks,{ref:l,translations:i==null||(n=i.translations)===null||n===void 0?void 0:n.button,onClick:w}),f&&Fi(c.createElement(L0,Pe({},i,{placeholder:g,initialScrollY:window.scrollY,initialQuery:p,translations:i==null||(r=i.translations)===null||r===void 0?void 0:r.modal,isAskAiActive:A,canHandleAskAi:E,onAskAiToggle:b,onClose:S})),(u=i.portalContainer)!==null&&u!==void 0?u:document.body))}function q0(e){var t=(function(n){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:window;return typeof n=="string"?r.document.querySelector(n):n})(e.container,e.environment);return Ei(c.createElement(M0,su({},e,{transformSearchClient:function(n){return n.addAlgoliaAgent("docsearch.js",Pu),e.transformSearchClient?e.transformSearchClient(n):n}})),t),function(){yi(t)}}const H0={id:"docsearch"},V0=fs({__name:"VPAlgoliaSearchBox",props:{algolia:{}},setup(e){const t=e,n=ps(),{site:r,localeIndex:u,lang:o}=gs();hs(a),ds(u,a);async function a(){await ms();const s={...t.algolia,...t.algolia.locales?.[u.value]},f=s.searchParameters?.facetFilters??[],D=[...(Array.isArray(f)?f:[f]).filter(F=>!F.startsWith("lang:")),`lang:${o.value}`],h=s.askAi,p=typeof h=="string",d=h?{indexName:p?s.indexName:h.indexName,apiKey:p?s.apiKey:h.apiKey,appId:p?s.appId:h.appId,assistantId:p?h:h.assistantId,searchParameters:D.length?{facetFilters:D}:void 0}:void 0;i({...s,searchParameters:{...s.searchParameters,facetFilters:D},askAi:d})}function i(s){const f=Object.assign({},s,{container:"#docsearch",navigator:{navigate(D){n.go(D.itemUrl)}},transformItems(D){return D.map(h=>Object.assign({},h,{url:l(h.url)}))}});q0(f)}function l(s){const{pathname:f,hash:D}=new URL(s,location.origin);return f.replace(/\.html$/,r.value.cleanUrls?"":".html")+D}return(s,f)=>(Fs(),vs("div",H0))}});export{V0 as default}; diff --git a/assets/chunks/framework.Bhsyh9kO.js b/assets/chunks/framework.Bhsyh9kO.js new file mode 100644 index 00000000..a024a92d --- /dev/null +++ b/assets/chunks/framework.Bhsyh9kO.js @@ -0,0 +1,19 @@ +/** +* @vue/shared v3.5.20 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**//*! #__NO_SIDE_EFFECTS__ */function Vs(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const se={},Nt=[],Ke=()=>{},ci=()=>!1,cn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),ks=e=>e.startsWith("onUpdate:"),fe=Object.assign,Us=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Go=Object.prototype.hasOwnProperty,Z=(e,t)=>Go.call(e,t),k=Array.isArray,Dt=e=>an(e)==="[object Map]",Ut=e=>an(e)==="[object Set]",hr=e=>an(e)==="[object Date]",G=e=>typeof e=="function",ce=e=>typeof e=="string",$e=e=>typeof e=="symbol",ne=e=>e!==null&&typeof e=="object",ai=e=>(ne(e)||G(e))&&G(e.then)&&G(e.catch),ui=Object.prototype.toString,an=e=>ui.call(e),Xo=e=>an(e).slice(8,-1),fi=e=>an(e)==="[object Object]",Ws=e=>ce(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Ft=Vs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Wn=e=>{const t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},Yo=/-(\w)/g,De=Wn(e=>e.replace(Yo,(t,n)=>n?n.toUpperCase():"")),zo=/\B([A-Z])/g,ht=Wn(e=>e.replace(zo,"-$1").toLowerCase()),Bn=Wn(e=>e.charAt(0).toUpperCase()+e.slice(1)),An=Wn(e=>e?`on${Bn(e)}`:""),at=(e,t)=>!Object.is(e,t),Rn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},Nn=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Jo=e=>{const t=ce(e)?Number(e):NaN;return isNaN(t)?e:t};let pr;const Kn=()=>pr||(pr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Bs(e){if(k(e)){const t={};for(let n=0;n{if(n){const s=n.split(Zo);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Ks(e){let t="";if(ce(e))t=e;else if(k(e))for(let n=0;nCt(n,t))}const pi=e=>!!(e&&e.__v_isRef===!0),il=e=>ce(e)?e:e==null?"":k(e)||ne(e)&&(e.toString===ui||!G(e.toString))?pi(e)?il(e.value):JSON.stringify(e,gi,2):String(e),gi=(e,t)=>pi(t)?gi(e,t.value):Dt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[os(s,i)+" =>"]=r,n),{})}:Ut(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>os(n))}:$e(t)?os(t):ne(t)&&!k(t)&&!fi(t)?String(t):t,os=(e,t="")=>{var n;return $e(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.20 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let ve;class ol{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=ve,!t&&ve&&(this.index=(ve.scopes||(ve.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&&--this._on===0&&(ve=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(zt){let t=zt;for(zt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Yt;){let t=Yt;for(Yt=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function bi(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function wi(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),Ys(s),cl(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function Ts(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Si(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Si(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===en)||(e.globalVersion=en,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Ts(e))))return;e.flags|=2;const t=e.dep,n=ie,s=He;ie=e,He=!0;try{bi(e);const r=e.fn(e._value);(t.version===0||at(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{ie=n,He=s,wi(e),e.flags&=-3}}function Ys(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)Ys(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function cl(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let He=!0;const xi=[];function tt(){xi.push(He),He=!1}function nt(){const e=xi.pop();He=e===void 0?!0:e}function gr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=ie;ie=void 0;try{t()}finally{ie=n}}}let en=0;class al{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 qn{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,this.__v_skip=!0}track(t){if(!ie||!He||ie===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==ie)n=this.activeLink=new al(ie,this),ie.deps?(n.prevDep=ie.depsTail,ie.depsTail.nextDep=n,ie.depsTail=n):ie.deps=ie.depsTail=n,Ei(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=ie.depsTail,n.nextDep=void 0,ie.depsTail.nextDep=n,ie.depsTail=n,ie.deps===n&&(ie.deps=s)}return n}trigger(t){this.version++,en++,this.notify(t)}notify(t){Gs();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Xs()}}}function Ei(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Ei(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Dn=new WeakMap,bt=Symbol(""),Cs=Symbol(""),tn=Symbol("");function _e(e,t,n){if(He&&ie){let s=Dn.get(e);s||Dn.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new qn),r.map=s,r.key=n),r.track()}}function Qe(e,t,n,s,r,i){const o=Dn.get(e);if(!o){en++;return}const l=c=>{c&&c.trigger()};if(Gs(),t==="clear")o.forEach(l);else{const c=k(e),u=c&&Ws(n);if(c&&n==="length"){const a=Number(s);o.forEach((d,m)=>{(m==="length"||m===tn||!$e(m)&&m>=a)&&l(d)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),u&&l(o.get(tn)),t){case"add":c?u&&l(o.get("length")):(l(o.get(bt)),Dt(e)&&l(o.get(Cs)));break;case"delete":c||(l(o.get(bt)),Dt(e)&&l(o.get(Cs)));break;case"set":Dt(e)&&l(o.get(bt));break}}Xs()}function ul(e,t){const n=Dn.get(e);return n&&n.get(t)}function Ot(e){const t=Q(e);return t===e?t:(_e(t,"iterate",tn),Ie(e)?t:t.map(de))}function Gn(e){return _e(e=Q(e),"iterate",tn),e}const fl={__proto__:null,[Symbol.iterator](){return cs(this,Symbol.iterator,de)},concat(...e){return Ot(this).concat(...e.map(t=>k(t)?Ot(t):t))},entries(){return cs(this,"entries",e=>(e[1]=de(e[1]),e))},every(e,t){return Xe(this,"every",e,t,void 0,arguments)},filter(e,t){return Xe(this,"filter",e,t,n=>n.map(de),arguments)},find(e,t){return Xe(this,"find",e,t,de,arguments)},findIndex(e,t){return Xe(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Xe(this,"findLast",e,t,de,arguments)},findLastIndex(e,t){return Xe(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Xe(this,"forEach",e,t,void 0,arguments)},includes(...e){return as(this,"includes",e)},indexOf(...e){return as(this,"indexOf",e)},join(e){return Ot(this).join(e)},lastIndexOf(...e){return as(this,"lastIndexOf",e)},map(e,t){return Xe(this,"map",e,t,void 0,arguments)},pop(){return qt(this,"pop")},push(...e){return qt(this,"push",e)},reduce(e,...t){return mr(this,"reduce",e,t)},reduceRight(e,...t){return mr(this,"reduceRight",e,t)},shift(){return qt(this,"shift")},some(e,t){return Xe(this,"some",e,t,void 0,arguments)},splice(...e){return qt(this,"splice",e)},toReversed(){return Ot(this).toReversed()},toSorted(e){return Ot(this).toSorted(e)},toSpliced(...e){return Ot(this).toSpliced(...e)},unshift(...e){return qt(this,"unshift",e)},values(){return cs(this,"values",de)}};function cs(e,t,n){const s=Gn(e),r=s[t]();return s!==e&&!Ie(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.value&&(i.value=n(i.value)),i}),r}const dl=Array.prototype;function Xe(e,t,n,s,r,i){const o=Gn(e),l=o!==e&&!Ie(e),c=o[t];if(c!==dl[t]){const d=c.apply(e,i);return l?de(d):d}let u=n;o!==e&&(l?u=function(d,m){return n.call(this,de(d),m,e)}:n.length>2&&(u=function(d,m){return n.call(this,d,m,e)}));const a=c.call(o,u,s);return l&&r?r(a):a}function mr(e,t,n,s){const r=Gn(e);let i=n;return r!==e&&(Ie(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,de(l),c,e)}),r[t](i,...s)}function as(e,t,n){const s=Q(e);_e(s,"iterate",tn);const r=s[t](...n);return(r===-1||r===!1)&&zs(n[0])?(n[0]=Q(n[0]),s[t](...n)):r}function qt(e,t,n=[]){tt(),Gs();const s=Q(e)[t].apply(e,n);return Xs(),nt(),s}const hl=Vs("__proto__,__v_isRef,__isVue"),Ti=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter($e));function pl(e){$e(e)||(e=String(e));const t=Q(this);return _e(t,"has",e),t.hasOwnProperty(e)}class Ci{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?Ii:Pi:i?Oi:Mi).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=k(t);if(!r){let c;if(o&&(c=fl[n]))return c;if(n==="hasOwnProperty")return pl}const l=Reflect.get(t,n,ue(t)?t:s);return($e(n)?Ti.has(n):hl(n))||(r||_e(t,"get",n),i)?l:ue(l)?o&&Ws(n)?l:l.value:ne(l)?r?un(l):jt(l):l}}class Ai extends Ci{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];if(!this._isShallow){const c=ut(i);if(!Ie(s)&&!ut(s)&&(i=Q(i),s=Q(s)),!k(t)&&ue(i)&&!ue(s))return c||(i.value=s),!0}const o=k(t)&&Ws(n)?Number(n)e,vn=e=>Reflect.getPrototypeOf(e);function _l(e,t,n){return function(...s){const r=this.__v_raw,i=Q(r),o=Dt(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,u=r[e](...s),a=n?As:t?Fn:de;return!t&&_e(i,"iterate",c?Cs:bt),{next(){const{value:d,done:m}=u.next();return m?{value:d,done:m}:{value:l?[a(d[0]),a(d[1])]:a(d),done:m}},[Symbol.iterator](){return this}}}}function yn(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function bl(e,t){const n={get(r){const i=this.__v_raw,o=Q(i),l=Q(r);e||(at(r,l)&&_e(o,"get",r),_e(o,"get",l));const{has:c}=vn(o),u=t?As:e?Fn:de;if(c.call(o,r))return u(i.get(r));if(c.call(o,l))return u(i.get(l));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&_e(Q(r),"iterate",bt),r.size},has(r){const i=this.__v_raw,o=Q(i),l=Q(r);return e||(at(r,l)&&_e(o,"has",r),_e(o,"has",l)),r===l?i.has(r):i.has(r)||i.has(l)},forEach(r,i){const o=this,l=o.__v_raw,c=Q(l),u=t?As:e?Fn:de;return!e&&_e(c,"iterate",bt),l.forEach((a,d)=>r.call(i,u(a),u(d),o))}};return fe(n,e?{add:yn("add"),set:yn("set"),delete:yn("delete"),clear:yn("clear")}:{add(r){!t&&!Ie(r)&&!ut(r)&&(r=Q(r));const i=Q(this);return vn(i).has.call(i,r)||(i.add(r),Qe(i,"add",r,r)),this},set(r,i){!t&&!Ie(i)&&!ut(i)&&(i=Q(i));const o=Q(this),{has:l,get:c}=vn(o);let u=l.call(o,r);u||(r=Q(r),u=l.call(o,r));const a=c.call(o,r);return o.set(r,i),u?at(i,a)&&Qe(o,"set",r,i):Qe(o,"add",r,i),this},delete(r){const i=Q(this),{has:o,get:l}=vn(i);let c=o.call(i,r);c||(r=Q(r),c=o.call(i,r)),l&&l.call(i,r);const u=i.delete(r);return c&&Qe(i,"delete",r,void 0),u},clear(){const r=Q(this),i=r.size!==0,o=r.clear();return i&&Qe(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=_l(r,e,t)}),n}function Xn(e,t){const n=bl(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(Z(n,r)&&r in s?n:s,r,i)}const wl={get:Xn(!1,!1)},Sl={get:Xn(!1,!0)},xl={get:Xn(!0,!1)},El={get:Xn(!0,!0)},Mi=new WeakMap,Oi=new WeakMap,Pi=new WeakMap,Ii=new WeakMap;function Tl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Cl(e){return e.__v_skip||!Object.isExtensible(e)?0:Tl(Xo(e))}function jt(e){return ut(e)?e:Yn(e,!1,gl,wl,Mi)}function Al(e){return Yn(e,!1,vl,Sl,Oi)}function un(e){return Yn(e,!0,ml,xl,Pi)}function $u(e){return Yn(e,!0,yl,El,Ii)}function Yn(e,t,n,s,r){if(!ne(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=Cl(e);if(i===0)return e;const o=r.get(e);if(o)return o;const l=new Proxy(e,i===2?s:n);return r.set(e,l),l}function wt(e){return ut(e)?wt(e.__v_raw):!!(e&&e.__v_isReactive)}function ut(e){return!!(e&&e.__v_isReadonly)}function Ie(e){return!!(e&&e.__v_isShallow)}function zs(e){return e?!!e.__v_raw:!1}function Q(e){const t=e&&e.__v_raw;return t?Q(t):e}function Mn(e){return!Z(e,"__v_skip")&&Object.isExtensible(e)&&di(e,"__v_skip",!0),e}const de=e=>ne(e)?jt(e):e,Fn=e=>ne(e)?un(e):e;function ue(e){return e?e.__v_isRef===!0:!1}function qe(e){return Li(e,!1)}function Le(e){return Li(e,!0)}function Li(e,t){return ue(e)?e:new Rl(e,t)}class Rl{constructor(t,n){this.dep=new qn,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:Q(t),this._value=n?t:de(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Ie(t)||ut(t);t=s?t:Q(t),at(t,n)&&(this._rawValue=t,this._value=s?t:de(t),this.dep.trigger())}}function Js(e){return ue(e)?e.value:e}function le(e){return G(e)?e():Js(e)}const Ml={get:(e,t,n)=>t==="__v_raw"?e:Js(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return ue(r)&&!ue(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Ni(e){return wt(e)?e:new Proxy(e,Ml)}class Ol{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new qn,{get:s,set:r}=t(n.track.bind(n),n.trigger.bind(n));this._get=s,this._set=r}get value(){return this._value=this._get()}set value(t){this._set(t)}}function Pl(e){return new Ol(e)}class Il{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,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 ul(Q(this._object),this._key)}}class Ll{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 Nl(e,t,n){return ue(e)?e:G(e)?new Ll(e):ne(e)&&arguments.length>1?Dl(e,t,n):qe(e)}function Dl(e,t,n){const s=e[t];return ue(s)?s:new Il(e,t,n)}class Fl{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new qn(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=en-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&ie!==this)return _i(this,!0),!0}get value(){const t=this.dep.track();return Si(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Hl(e,t,n=!1){let s,r;return G(e)?s=e:(s=e.get,r=e.set),new Fl(s,r,n)}const _n={},Hn=new WeakMap;let yt;function $l(e,t=!1,n=yt){if(n){let s=Hn.get(n);s||Hn.set(n,s=[]),s.push(e)}}function jl(e,t,n=se){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:c}=n,u=g=>r?g:Ie(g)||r===!1||r===0?Ze(g,1):Ze(g);let a,d,m,y,S=!1,E=!1;if(ue(e)?(d=()=>e.value,S=Ie(e)):wt(e)?(d=()=>u(e),S=!0):k(e)?(E=!0,S=e.some(g=>wt(g)||Ie(g)),d=()=>e.map(g=>{if(ue(g))return g.value;if(wt(g))return u(g);if(G(g))return c?c(g,2):g()})):G(e)?t?d=c?()=>c(e,2):e:d=()=>{if(m){tt();try{m()}finally{nt()}}const g=yt;yt=a;try{return c?c(e,3,[y]):e(y)}finally{yt=g}}:d=Ke,t&&r){const g=d,M=r===!0?1/0:r;d=()=>Ze(g(),M)}const K=mi(),D=()=>{a.stop(),K&&K.active&&Us(K.effects,a)};if(i&&t){const g=t;t=(...M)=>{g(...M),D()}}let U=E?new Array(e.length).fill(_n):_n;const p=g=>{if(!(!(a.flags&1)||!a.dirty&&!g))if(t){const M=a.run();if(r||S||(E?M.some((W,V)=>at(W,U[V])):at(M,U))){m&&m();const W=yt;yt=a;try{const V=[M,U===_n?void 0:E&&U[0]===_n?[]:U,y];U=M,c?c(t,3,V):t(...V)}finally{yt=W}}}else a.run()};return l&&l(p),a=new vi(d),a.scheduler=o?()=>o(p,!1):p,y=g=>$l(g,!1,a),m=a.onStop=()=>{const g=Hn.get(a);if(g){if(c)c(g,4);else for(const M of g)M();Hn.delete(a)}},t?s?p(!0):U=a.run():o?o(p.bind(null,!0),!0):a.run(),D.pause=a.pause.bind(a),D.resume=a.resume.bind(a),D.stop=D,D}function Ze(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--,ue(e))Ze(e.value,t,n);else if(k(e))for(let s=0;s{Ze(s,t,n)});else if(fi(e)){for(const s in e)Ze(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&Ze(e[s],t,n)}return e}/** +* @vue/runtime-core v3.5.20 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function fn(e,t,n,s){try{return s?e(...s):e()}catch(r){dn(r,t,n)}}function je(e,t,n,s){if(G(e)){const r=fn(e,t,n,s);return r&&ai(r)&&r.catch(i=>{dn(i,t,n)}),r}if(k(e)){const r=[];for(let i=0;i>>1,r=we[s],i=nn(r);i=nn(n)?we.push(e):we.splice(kl(t),0,e),e.flags|=1,Fi()}}function Fi(){$n||($n=Di.then(Hi))}function Ul(e){k(e)?Ht.push(...e):ot&&e.id===-1?ot.splice(It+1,0,e):e.flags&1||(Ht.push(e),e.flags|=1),Fi()}function vr(e,t,n=We+1){for(;nnn(n)-nn(s));if(Ht.length=0,ot){ot.push(...t);return}for(ot=t,It=0;Ite.id==null?e.flags&2?-1:1/0:e.id;function Hi(e){try{for(We=0;We{s._d&&Mr(-1);const i=Vn(t);let o;try{o=e(...r)}finally{Vn(i),s._d&&Mr(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function ju(e,t){if(ge===null)return e;const n=es(ge),s=e.dirs||(e.dirs=[]);for(let r=0;re.__isTeleport,Je=Symbol("_leaveCb"),bn=Symbol("_enterCb");function Kl(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Wt(()=>{e.isMounted=!0}),qi(()=>{e.isUnmounting=!0}),e}const Me=[Function,Array],Vi={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Me,onEnter:Me,onAfterEnter:Me,onEnterCancelled:Me,onBeforeLeave:Me,onLeave:Me,onAfterLeave:Me,onLeaveCancelled:Me,onBeforeAppear:Me,onAppear:Me,onAfterAppear:Me,onAppearCancelled:Me},ki=e=>{const t=e.subTree;return t.component?ki(t.component):t},ql={name:"BaseTransition",props:Vi,setup(e,{slots:t}){const n=Rt(),s=Kl();return()=>{const r=t.default&&Bi(t.default(),!0);if(!r||!r.length)return;const i=Ui(r),o=Q(e),{mode:l}=o;if(s.isLeaving)return us(i);const c=yr(i);if(!c)return us(i);let u=Rs(c,o,s,n,d=>u=d);c.type!==he&&sn(c,u);let a=n.subTree&&yr(n.subTree);if(a&&a.type!==he&&!_t(c,a)&&ki(n).type!==he){let d=Rs(a,o,s,n);if(sn(a,d),l==="out-in"&&c.type!==he)return s.isLeaving=!0,d.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete d.afterLeave,a=void 0},us(i);l==="in-out"&&c.type!==he?d.delayLeave=(m,y,S)=>{const E=Wi(s,a);E[String(a.key)]=a,m[Je]=()=>{y(),m[Je]=void 0,delete u.delayedLeave,a=void 0},u.delayedLeave=()=>{S(),delete u.delayedLeave,a=void 0}}:a=void 0}else a&&(a=void 0);return i}}};function Ui(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==he){t=n;break}}return t}const Gl=ql;function Wi(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Rs(e,t,n,s,r){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:c,onEnter:u,onAfterEnter:a,onEnterCancelled:d,onBeforeLeave:m,onLeave:y,onAfterLeave:S,onLeaveCancelled:E,onBeforeAppear:K,onAppear:D,onAfterAppear:U,onAppearCancelled:p}=t,g=String(e.key),M=Wi(n,e),W=(_,R)=>{_&&je(_,s,9,R)},V=(_,R)=>{const F=R[1];W(_,R),k(_)?_.every(x=>x.length<=1)&&F():_.length<=1&&F()},Y={mode:o,persisted:l,beforeEnter(_){let R=c;if(!n.isMounted)if(i)R=K||c;else return;_[Je]&&_[Je](!0);const F=M[g];F&&_t(e,F)&&F.el[Je]&&F.el[Je](),W(R,[_])},enter(_){let R=u,F=a,x=d;if(!n.isMounted)if(i)R=D||u,F=U||a,x=p||d;else return;let $=!1;const N=_[bn]=B=>{$||($=!0,B?W(x,[_]):W(F,[_]),Y.delayedLeave&&Y.delayedLeave(),_[bn]=void 0)};R?V(R,[_,N]):N()},leave(_,R){const F=String(e.key);if(_[bn]&&_[bn](!0),n.isUnmounting)return R();W(m,[_]);let x=!1;const $=_[Je]=N=>{x||(x=!0,R(),N?W(E,[_]):W(S,[_]),_[Je]=void 0,M[F]===e&&delete M[F])};M[F]=e,y?V(y,[_,$]):$()},clone(_){const R=Rs(_,t,n,s,r);return r&&r(R),R}};return Y}function us(e){if(pn(e))return e=ft(e),e.children=null,e}function yr(e){if(!pn(e))return ji(e.type)&&e.children?Ui(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&G(n.default))return n.default()}}function sn(e,t){e.shapeFlag&6&&e.component?(e.transition=t,sn(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 Bi(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;i$t(S,t&&(k(t)?t[E]:t),n,s,r));return}if(St(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&$t(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?es(s.component):s.el,o=r?null:i,{i:l,r:c}=e,u=t&&t.r,a=l.refs===se?l.refs={}:l.refs,d=l.setupState,m=Q(d),y=d===se?ci:S=>Z(m,S);if(u!=null&&u!==c){if(ce(u))a[u]=null,y(u)&&(d[u]=null);else if(ue(u)){u.value=null;const S=t;S.k&&(a[S.k]=null)}}if(G(c))fn(c,l,12,[o,a]);else{const S=ce(c),E=ue(c);if(S||E){const K=()=>{if(e.f){const D=S?y(c)?d[c]:a[c]:c.value;if(r)k(D)&&Us(D,i);else if(k(D))D.includes(i)||D.push(i);else if(S)a[c]=[i],y(c)&&(d[c]=a[c]);else{const U=[i];c.value=U,e.k&&(a[e.k]=U)}}else S?(a[c]=o,y(c)&&(d[c]=o)):E&&(c.value=o,e.k&&(a[e.k]=o))};o?(K.id=-1,Ce(K,n)):K()}}}let _r=!1;const Pt=()=>{_r||(console.error("Hydration completed but contains mismatches."),_r=!0)},Xl=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",Yl=e=>e.namespaceURI.includes("MathML"),wn=e=>{if(e.nodeType===1){if(Xl(e))return"svg";if(Yl(e))return"mathml"}},Lt=e=>e.nodeType===8;function zl(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:u}}=e,a=(p,g)=>{if(!g.hasChildNodes()){n(null,p,g),jn(),g._vnode=p;return}d(g.firstChild,p,null,null,null),jn(),g._vnode=p},d=(p,g,M,W,V,Y=!1)=>{Y=Y||!!g.dynamicChildren;const _=Lt(p)&&p.data==="[",R=()=>E(p,g,M,W,V,_),{type:F,ref:x,shapeFlag:$,patchFlag:N}=g;let B=p.nodeType;g.el=p,N===-2&&(Y=!1,g.dynamicChildren=null);let P=null;switch(F){case Tt:B!==3?g.children===""?(c(g.el=r(""),o(p),p),P=p):P=R():(p.data!==g.children&&(Pt(),p.data=g.children),P=i(p));break;case he:U(p)?(P=i(p),D(g.el=p.content.firstChild,p,M)):B!==8||_?P=R():P=i(p);break;case Qt:if(_&&(p=i(p),B=p.nodeType),B===1||B===3){P=p;const z=!g.children.length;for(let H=0;H{Y=Y||!!g.dynamicChildren;const{type:_,props:R,patchFlag:F,shapeFlag:x,dirs:$,transition:N}=g,B=_==="input"||_==="option";if(B||F!==-1){$&&Be(g,null,M,"created");let P=!1;if(U(p)){P=ao(null,N)&&M&&M.vnode.props&&M.vnode.props.appear;const H=p.content.firstChild;if(P){const te=H.getAttribute("class");te&&(H.$cls=te),N.beforeEnter(H)}D(H,p,M),g.el=p=H}if(x&16&&!(R&&(R.innerHTML||R.textContent))){let H=y(p.firstChild,g,p,M,W,V,Y);for(;H;){Sn(p,1)||Pt();const te=H;H=H.nextSibling,l(te)}}else if(x&8){let H=g.children;H[0]===` +`&&(p.tagName==="PRE"||p.tagName==="TEXTAREA")&&(H=H.slice(1)),p.textContent!==H&&(Sn(p,0)||Pt(),p.textContent=g.children)}if(R){if(B||!Y||F&48){const H=p.tagName.includes("-");for(const te in R)(B&&(te.endsWith("value")||te==="indeterminate")||cn(te)&&!Ft(te)||te[0]==="."||H)&&s(p,te,null,R[te],void 0,M)}else if(R.onClick)s(p,"onClick",null,R.onClick,void 0,M);else if(F&4&&wt(R.style))for(const H in R.style)R.style[H]}let z;(z=R&&R.onVnodeBeforeMount)&&Oe(z,M,g),$&&Be(g,null,M,"beforeMount"),((z=R&&R.onVnodeMounted)||$||P)&&yo(()=>{z&&Oe(z,M,g),P&&N.enter(p),$&&Be(g,null,M,"mounted")},W)}return p.nextSibling},y=(p,g,M,W,V,Y,_)=>{_=_||!!g.dynamicChildren;const R=g.children,F=R.length;for(let x=0;x{const{slotScopeIds:_}=g;_&&(V=V?V.concat(_):_);const R=o(p),F=y(i(p),g,R,M,W,V,Y);return F&&Lt(F)&&F.data==="]"?i(g.anchor=F):(Pt(),c(g.anchor=u("]"),R,F),F)},E=(p,g,M,W,V,Y)=>{if(Sn(p.parentElement,1)||Pt(),g.el=null,Y){const F=K(p);for(;;){const x=i(p);if(x&&x!==F)l(x);else break}}const _=i(p),R=o(p);return l(p),n(null,g,R,_,M,W,wn(R),V),M&&(M.vnode.el=g.el,mo(M,g.el)),_},K=(p,g="[",M="]")=>{let W=0;for(;p;)if(p=i(p),p&&Lt(p)&&(p.data===g&&W++,p.data===M)){if(W===0)return i(p);W--}return p},D=(p,g,M)=>{const W=g.parentNode;W&&W.replaceChild(p,g);let V=M;for(;V;)V.vnode.el===g&&(V.vnode.el=V.subTree.el=p),V=V.parent},U=p=>p.nodeType===1&&p.tagName==="TEMPLATE";return[a,d]}const br="data-allow-mismatch",Jl={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function Sn(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(br);)e=e.parentElement;const n=e&&e.getAttribute(br);if(n==null)return!1;if(n==="")return!0;{const s=n.split(",");return t===0&&s.includes("children")?!0:s.includes(Jl[t])}}Kn().requestIdleCallback;Kn().cancelIdleCallback;function Ql(e,t){if(Lt(e)&&e.data==="["){let n=1,s=e.nextSibling;for(;s;){if(s.nodeType===1){if(t(s)===!1)break}else if(Lt(s))if(s.data==="]"){if(--n===0)break}else s.data==="["&&n++;s=s.nextSibling}}else t(e)}const St=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function Vu(e){G(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:r=200,hydrate:i,timeout:o,suspensible:l=!0,onError:c}=e;let u=null,a,d=0;const m=()=>(d++,u=null,y()),y=()=>{let S;return u||(S=u=t().catch(E=>{if(E=E instanceof Error?E:new Error(String(E)),c)return new Promise((K,D)=>{c(E,()=>K(m()),()=>D(E),d+1)});throw E}).then(E=>S!==u&&u?u:(E&&(E.__esModule||E[Symbol.toStringTag]==="Module")&&(E=E.default),a=E,E)))};return Zs({name:"AsyncComponentWrapper",__asyncLoader:y,__asyncHydrate(S,E,K){let D=!1;(E.bu||(E.bu=[])).push(()=>D=!0);const U=()=>{D||K()},p=i?()=>{const g=i(U,M=>Ql(S,M));g&&(E.bum||(E.bum=[])).push(g)}:U;a?p():y().then(()=>!E.isUnmounted&&p())},get __asyncResolved(){return a},setup(){const S=pe;if(er(S),a)return()=>fs(a,S);const E=p=>{u=null,dn(p,S,13,!s)};if(l&&S.suspense||Vt)return y().then(p=>()=>fs(p,S)).catch(p=>(E(p),()=>s?ae(s,{error:p}):null));const K=qe(!1),D=qe(),U=qe(!!r);return r&&setTimeout(()=>{U.value=!1},r),o!=null&&setTimeout(()=>{if(!K.value&&!D.value){const p=new Error(`Async component timed out after ${o}ms.`);E(p),D.value=p}},o),y().then(()=>{K.value=!0,S.parent&&pn(S.parent.vnode)&&S.parent.update()}).catch(p=>{E(p),D.value=p}),()=>{if(K.value&&a)return fs(a,S);if(D.value&&s)return ae(s,{error:D.value});if(n&&!U.value)return ae(n)}}})}function fs(e,t){const{ref:n,props:s,children:r,ce:i}=t.vnode,o=ae(e,s,r);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const pn=e=>e.type.__isKeepAlive;function Zl(e,t){Ki(e,"a",t)}function ec(e,t){Ki(e,"da",t)}function Ki(e,t,n=pe){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(zn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)pn(r.parent.vnode)&&tc(s,t,n,r),r=r.parent}}function tc(e,t,n,s){const r=zn(t,e,s,!0);Jn(()=>{Us(s[t],r)},n)}function zn(e,t,n=pe,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{tt();const l=gn(n),c=je(t,n,e,o);return l(),nt(),c});return s?r.unshift(i):r.push(i),i}}const rt=e=>(t,n=pe)=>{(!Vt||e==="sp")&&zn(e,(...s)=>t(...s),n)},nc=rt("bm"),Wt=rt("m"),sc=rt("bu"),rc=rt("u"),qi=rt("bum"),Jn=rt("um"),ic=rt("sp"),oc=rt("rtg"),lc=rt("rtc");function cc(e,t=pe){zn("ec",e,t)}const Gi="components";function ku(e,t){return Yi(Gi,e,!0,t)||e}const Xi=Symbol.for("v-ndc");function Uu(e){return ce(e)?Yi(Gi,e,!1)||e:e||Xi}function Yi(e,t,n=!0,s=!1){const r=ge||pe;if(r){const i=r.type;{const l=qc(i,!1);if(l&&(l===t||l===De(t)||l===Bn(De(t))))return i}const o=wr(r[e]||i[e],t)||wr(r.appContext[e],t);return!o&&s?i:o}}function wr(e,t){return e&&(e[t]||e[De(t)]||e[Bn(De(t))])}function Wu(e,t,n,s){let r;const i=n,o=k(e);if(o||ce(e)){const l=o&&wt(e);let c=!1,u=!1;l&&(c=!Ie(e),u=ut(e),e=Gn(e)),r=new Array(e.length);for(let a=0,d=e.length;at(l,c,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let c=0,u=l.length;con(t)?!(t.type===he||t.type===Se&&!zi(t.children)):!0)?e:null}function Ku(e,t){const n={};for(const s in e)n[/[A-Z]/.test(s)?`on:${s}`:An(s)]=e[s];return n}const Ms=e=>e?xo(e)?es(e):Ms(e.parent):null,Jt=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=>Ms(e.parent),$root:e=>Ms(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Qi(e),$forceUpdate:e=>e.f||(e.f=()=>{Qs(e.update)}),$nextTick:e=>e.n||(e.n=hn.bind(e.proxy)),$watch:e=>Oc.bind(e)}),ds=(e,t)=>e!==se&&!e.__isScriptSetup&&Z(e,t),ac={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let u;if(t[0]!=="$"){const y=o[t];if(y!==void 0)switch(y){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(ds(s,t))return o[t]=1,s[t];if(r!==se&&Z(r,t))return o[t]=2,r[t];if((u=e.propsOptions[0])&&Z(u,t))return o[t]=3,i[t];if(n!==se&&Z(n,t))return o[t]=4,n[t];Os&&(o[t]=0)}}const a=Jt[t];let d,m;if(a)return t==="$attrs"&&_e(e.attrs,"get",""),a(e);if((d=l.__cssModules)&&(d=d[t]))return d;if(n!==se&&Z(n,t))return o[t]=4,n[t];if(m=c.config.globalProperties,Z(m,t))return m[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return ds(r,t)?(r[t]=n,!0):s!==se&&Z(s,t)?(s[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:s,appContext:r,propsOptions:i,type:o}},l){let c,u;return!!(n[l]||e!==se&&l[0]!=="$"&&Z(e,l)||ds(t,l)||(c=i[0])&&Z(c,l)||Z(s,l)||Z(Jt,l)||Z(r.config.globalProperties,l)||(u=o.__cssModules)&&u[l])},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 qu(){return uc().slots}function uc(e){const t=Rt();return t.setupContext||(t.setupContext=To(t))}function Sr(e){return k(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Os=!0;function fc(e){const t=Qi(e),n=e.proxy,s=e.ctx;Os=!1,t.beforeCreate&&xr(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:u,created:a,beforeMount:d,mounted:m,beforeUpdate:y,updated:S,activated:E,deactivated:K,beforeDestroy:D,beforeUnmount:U,destroyed:p,unmounted:g,render:M,renderTracked:W,renderTriggered:V,errorCaptured:Y,serverPrefetch:_,expose:R,inheritAttrs:F,components:x,directives:$,filters:N}=t;if(u&&dc(u,s,null),o)for(const z in o){const H=o[z];G(H)&&(s[z]=H.bind(n))}if(r){const z=r.call(n,n);ne(z)&&(e.data=jt(z))}if(Os=!0,i)for(const z in i){const H=i[z],te=G(H)?H.bind(n,n):G(H.get)?H.get.bind(n,n):Ke,pt=!G(H)&&G(H.set)?H.set.bind(n):Ke,Ve=oe({get:te,set:pt});Object.defineProperty(s,z,{enumerable:!0,configurable:!0,get:()=>Ve.value,set:ke=>Ve.value=ke})}if(l)for(const z in l)Ji(l[z],s,n,z);if(c){const z=G(c)?c.call(n):c;Reflect.ownKeys(z).forEach(H=>{yc(H,z[H])})}a&&xr(a,e,"c");function P(z,H){k(H)?H.forEach(te=>z(te.bind(n))):H&&z(H.bind(n))}if(P(nc,d),P(Wt,m),P(sc,y),P(rc,S),P(Zl,E),P(ec,K),P(cc,Y),P(lc,W),P(oc,V),P(qi,U),P(Jn,g),P(ic,_),k(R))if(R.length){const z=e.exposed||(e.exposed={});R.forEach(H=>{Object.defineProperty(z,H,{get:()=>n[H],set:te=>n[H]=te,enumerable:!0})})}else e.exposed||(e.exposed={});M&&e.render===Ke&&(e.render=M),F!=null&&(e.inheritAttrs=F),x&&(e.components=x),$&&(e.directives=$),_&&er(e)}function dc(e,t,n=Ke){k(e)&&(e=Ps(e));for(const s in e){const r=e[s];let i;ne(r)?"default"in r?i=Et(r.from||s,r.default,!0):i=Et(r.from||s):i=Et(r),ue(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function xr(e,t,n){je(k(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Ji(e,t,n,s){let r=s.includes(".")?po(n,s):()=>n[s];if(ce(e)){const i=t[e];G(i)&&Re(r,i)}else if(G(e))Re(r,e.bind(n));else if(ne(e))if(k(e))e.forEach(i=>Ji(i,t,n,s));else{const i=G(e.handler)?e.handler.bind(n):t[e.handler];G(i)&&Re(r,i,e)}}function Qi(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(u=>kn(c,u,o,!0)),kn(c,t,o)),ne(t)&&i.set(t,c),c}function kn(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&kn(e,i,n,!0),r&&r.forEach(o=>kn(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=hc[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const hc={data:Er,props:Tr,emits:Tr,methods:Xt,computed:Xt,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:Xt,directives:Xt,watch:gc,provide:Er,inject:pc};function Er(e,t){return t?e?function(){return fe(G(e)?e.call(this,this):e,G(t)?t.call(this,this):t)}:t:e}function pc(e,t){return Xt(Ps(e),Ps(t))}function Ps(e){if(k(e)){const t={};for(let n=0;n1)return n&&G(t)?t.call(s&&s.proxy):t}}function eo(){return!!(Rt()||xt)}const to={},no=()=>Object.create(to),so=e=>Object.getPrototypeOf(e)===to;function _c(e,t,n,s=!1){const r={},i=no();e.propsDefaults=Object.create(null),ro(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:Al(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function bc(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=Q(r),[c]=e.propsOptions;let u=!1;if((s||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let d=0;d{c=!0;const[m,y]=io(d,t,!0);fe(o,m),y&&l.push(...y)};!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)&&s.set(e,Nt),Nt;if(k(i))for(let a=0;ae==="_"||e==="_ctx"||e==="$stable",nr=e=>k(e)?e.map(Pe):[Pe(e)],Sc=(e,t,n)=>{if(t._n)return t;const s=Wl((...r)=>nr(t(...r)),n);return s._c=!1,s},oo=(e,t,n)=>{const s=e._ctx;for(const r in e){if(tr(r))continue;const i=e[r];if(G(i))t[r]=Sc(r,i,s);else if(i!=null){const o=nr(i);t[r]=()=>o}}},lo=(e,t)=>{const n=nr(t);e.slots.default=()=>n},co=(e,t,n)=>{for(const s in t)(n||!tr(s))&&(e[s]=t[s])},xc=(e,t,n)=>{const s=e.slots=no();if(e.vnode.shapeFlag&32){const r=t._;r?(co(s,t,n),n&&di(s,"_",r,!0)):oo(t,s)}else t&&lo(e,t)},Ec=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=se;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:co(r,t,n):(i=!t.$stable,oo(t,r)),o=t}else t&&(lo(e,t),o={default:1});if(i)for(const l in r)!tr(l)&&o[l]==null&&delete r[l]},Ce=yo;function Tc(e){return Cc(e,zl)}function Cc(e,t){const n=Kn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:u,setElementText:a,parentNode:d,nextSibling:m,setScopeId:y=Ke,insertStaticContent:S}=e,E=(f,h,v,T=null,b=null,w=null,I=void 0,O=null,A=!!h.dynamicChildren)=>{if(f===h)return;f&&!_t(f,h)&&(T=mn(f),ke(f,b,w,!0),f=null),h.patchFlag===-2&&(A=!1,h.dynamicChildren=null);const{type:C,ref:q,shapeFlag:L}=h;switch(C){case Tt:K(f,h,v,T);break;case he:D(f,h,v,T);break;case Qt:f==null&&U(h,v,T,I);break;case Se:x(f,h,v,T,b,w,I,O,A);break;default:L&1?M(f,h,v,T,b,w,I,O,A):L&6?$(f,h,v,T,b,w,I,O,A):(L&64||L&128)&&C.process(f,h,v,T,b,w,I,O,A,Mt)}q!=null&&b?$t(q,f&&f.ref,w,h||f,!h):q==null&&f&&f.ref!=null&&$t(f.ref,null,w,f,!0)},K=(f,h,v,T)=>{if(f==null)s(h.el=l(h.children),v,T);else{const b=h.el=f.el;h.children!==f.children&&u(b,h.children)}},D=(f,h,v,T)=>{f==null?s(h.el=c(h.children||""),v,T):h.el=f.el},U=(f,h,v,T)=>{[f.el,f.anchor]=S(f.children,h,v,T,f.el,f.anchor)},p=({el:f,anchor:h},v,T)=>{let b;for(;f&&f!==h;)b=m(f),s(f,v,T),f=b;s(h,v,T)},g=({el:f,anchor:h})=>{let v;for(;f&&f!==h;)v=m(f),r(f),f=v;r(h)},M=(f,h,v,T,b,w,I,O,A)=>{h.type==="svg"?I="svg":h.type==="math"&&(I="mathml"),f==null?W(h,v,T,b,w,I,O,A):_(f,h,b,w,I,O,A)},W=(f,h,v,T,b,w,I,O)=>{let A,C;const{props:q,shapeFlag:L,transition:j,dirs:X}=f;if(A=f.el=o(f.type,w,q&&q.is,q),L&8?a(A,f.children):L&16&&Y(f.children,A,null,T,b,hs(f,w),I,O),X&&Be(f,null,T,"created"),V(A,f,f.scopeId,I,T),q){for(const re in q)re!=="value"&&!Ft(re)&&i(A,re,null,q[re],w,T);"value"in q&&i(A,"value",null,q.value,w),(C=q.onVnodeBeforeMount)&&Oe(C,T,f)}X&&Be(f,null,T,"beforeMount");const J=ao(b,j);J&&j.beforeEnter(A),s(A,h,v),((C=q&&q.onVnodeMounted)||J||X)&&Ce(()=>{C&&Oe(C,T,f),J&&j.enter(A),X&&Be(f,null,T,"mounted")},b)},V=(f,h,v,T,b)=>{if(v&&y(f,v),T)for(let w=0;w{for(let C=A;C{const O=h.el=f.el;let{patchFlag:A,dynamicChildren:C,dirs:q}=h;A|=f.patchFlag&16;const L=f.props||se,j=h.props||se;let X;if(v&>(v,!1),(X=j.onVnodeBeforeUpdate)&&Oe(X,v,h,f),q&&Be(h,f,v,"beforeUpdate"),v&>(v,!0),(L.innerHTML&&j.innerHTML==null||L.textContent&&j.textContent==null)&&a(O,""),C?R(f.dynamicChildren,C,O,v,T,hs(h,b),w):I||H(f,h,O,null,v,T,hs(h,b),w,!1),A>0){if(A&16)F(O,L,j,v,b);else if(A&2&&L.class!==j.class&&i(O,"class",null,j.class,b),A&4&&i(O,"style",L.style,j.style,b),A&8){const J=h.dynamicProps;for(let re=0;re{X&&Oe(X,v,h,f),q&&Be(h,f,v,"updated")},T)},R=(f,h,v,T,b,w,I)=>{for(let O=0;O{if(h!==v){if(h!==se)for(const w in h)!Ft(w)&&!(w in v)&&i(f,w,h[w],null,b,T);for(const w in v){if(Ft(w))continue;const I=v[w],O=h[w];I!==O&&w!=="value"&&i(f,w,O,I,b,T)}"value"in v&&i(f,"value",h.value,v.value,b)}},x=(f,h,v,T,b,w,I,O,A)=>{const C=h.el=f?f.el:l(""),q=h.anchor=f?f.anchor:l("");let{patchFlag:L,dynamicChildren:j,slotScopeIds:X}=h;X&&(O=O?O.concat(X):X),f==null?(s(C,v,T),s(q,v,T),Y(h.children||[],v,q,b,w,I,O,A)):L>0&&L&64&&j&&f.dynamicChildren?(R(f.dynamicChildren,j,v,b,w,I,O),(h.key!=null||b&&h===b.subTree)&&uo(f,h,!0)):H(f,h,v,q,b,w,I,O,A)},$=(f,h,v,T,b,w,I,O,A)=>{h.slotScopeIds=O,f==null?h.shapeFlag&512?b.ctx.activate(h,v,T,I,A):N(h,v,T,b,w,I,A):B(f,h,A)},N=(f,h,v,T,b,w,I)=>{const O=f.component=Uc(f,T,b);if(pn(f)&&(O.ctx.renderer=Mt),Wc(O,!1,I),O.asyncDep){if(b&&b.registerDep(O,P,I),!f.el){const A=O.subTree=ae(he);D(null,A,h,v),f.placeholder=A.el}}else P(O,f,h,v,b,w,I)},B=(f,h,v)=>{const T=h.component=f.component;if(Dc(f,h,v))if(T.asyncDep&&!T.asyncResolved){z(T,h,v);return}else T.next=h,T.update();else h.el=f.el,T.vnode=h},P=(f,h,v,T,b,w,I)=>{const O=()=>{if(f.isMounted){let{next:L,bu:j,u:X,parent:J,vnode:re}=f;{const Ee=fo(f);if(Ee){L&&(L.el=re.el,z(f,L,I)),Ee.asyncDep.then(()=>{f.isUnmounted||O()});return}}let ee=L,xe;gt(f,!1),L?(L.el=re.el,z(f,L,I)):L=re,j&&Rn(j),(xe=L.props&&L.props.onVnodeBeforeUpdate)&&Oe(xe,J,L,re),gt(f,!0);const me=ps(f),Fe=f.subTree;f.subTree=me,E(Fe,me,d(Fe.el),mn(Fe),f,b,w),L.el=me.el,ee===null&&mo(f,me.el),X&&Ce(X,b),(xe=L.props&&L.props.onVnodeUpdated)&&Ce(()=>Oe(xe,J,L,re),b)}else{let L;const{el:j,props:X}=h,{bm:J,m:re,parent:ee,root:xe,type:me}=f,Fe=St(h);if(gt(f,!1),J&&Rn(J),!Fe&&(L=X&&X.onVnodeBeforeMount)&&Oe(L,ee,h),gt(f,!0),j&&is){const Ee=()=>{f.subTree=ps(f),is(j,f.subTree,f,b,null)};Fe&&me.__asyncHydrate?me.__asyncHydrate(j,f,Ee):Ee()}else{xe.ce&&xe.ce._def.shadowRoot!==!1&&xe.ce._injectChildStyle(me);const Ee=f.subTree=ps(f);E(null,Ee,v,T,f,b,w),h.el=Ee.el}if(re&&Ce(re,b),!Fe&&(L=X&&X.onVnodeMounted)){const Ee=h;Ce(()=>Oe(L,ee,Ee),b)}(h.shapeFlag&256||ee&&St(ee.vnode)&&ee.vnode.shapeFlag&256)&&f.a&&Ce(f.a,b),f.isMounted=!0,h=v=T=null}};f.scope.on();const A=f.effect=new vi(O);f.scope.off();const C=f.update=A.run.bind(A),q=f.job=A.runIfDirty.bind(A);q.i=f,q.id=f.uid,A.scheduler=()=>Qs(q),gt(f,!0),C()},z=(f,h,v)=>{h.component=f;const T=f.vnode.props;f.vnode=h,f.next=null,bc(f,h.props,T,v),Ec(f,h.children,v),tt(),vr(f),nt()},H=(f,h,v,T,b,w,I,O,A=!1)=>{const C=f&&f.children,q=f?f.shapeFlag:0,L=h.children,{patchFlag:j,shapeFlag:X}=h;if(j>0){if(j&128){pt(C,L,v,T,b,w,I,O,A);return}else if(j&256){te(C,L,v,T,b,w,I,O,A);return}}X&8?(q&16&&Bt(C,b,w),L!==C&&a(v,L)):q&16?X&16?pt(C,L,v,T,b,w,I,O,A):Bt(C,b,w,!0):(q&8&&a(v,""),X&16&&Y(L,v,T,b,w,I,O,A))},te=(f,h,v,T,b,w,I,O,A)=>{f=f||Nt,h=h||Nt;const C=f.length,q=h.length,L=Math.min(C,q);let j;for(j=0;jq?Bt(f,b,w,!0,!1,L):Y(h,v,T,b,w,I,O,A,L)},pt=(f,h,v,T,b,w,I,O,A)=>{let C=0;const q=h.length;let L=f.length-1,j=q-1;for(;C<=L&&C<=j;){const X=f[C],J=h[C]=A?lt(h[C]):Pe(h[C]);if(_t(X,J))E(X,J,v,null,b,w,I,O,A);else break;C++}for(;C<=L&&C<=j;){const X=f[L],J=h[j]=A?lt(h[j]):Pe(h[j]);if(_t(X,J))E(X,J,v,null,b,w,I,O,A);else break;L--,j--}if(C>L){if(C<=j){const X=j+1,J=Xj)for(;C<=L;)ke(f[C],b,w,!0),C++;else{const X=C,J=C,re=new Map;for(C=J;C<=j;C++){const Te=h[C]=A?lt(h[C]):Pe(h[C]);Te.key!=null&&re.set(Te.key,C)}let ee,xe=0;const me=j-J+1;let Fe=!1,Ee=0;const Kt=new Array(me);for(C=0;C=me){ke(Te,b,w,!0);continue}let Ue;if(Te.key!=null)Ue=re.get(Te.key);else for(ee=J;ee<=j;ee++)if(Kt[ee-J]===0&&_t(Te,h[ee])){Ue=ee;break}Ue===void 0?ke(Te,b,w,!0):(Kt[Ue-J]=C+1,Ue>=Ee?Ee=Ue:Fe=!0,E(Te,h[Ue],v,null,b,w,I,O,A),xe++)}const ur=Fe?Ac(Kt):Nt;for(ee=ur.length-1,C=me-1;C>=0;C--){const Te=J+C,Ue=h[Te],fr=h[Te+1],dr=Te+1{const{el:w,type:I,transition:O,children:A,shapeFlag:C}=f;if(C&6){Ve(f.component.subTree,h,v,T);return}if(C&128){f.suspense.move(h,v,T);return}if(C&64){I.move(f,h,v,Mt);return}if(I===Se){s(w,h,v);for(let L=0;LO.enter(w),b);else{const{leave:L,delayLeave:j,afterLeave:X}=O,J=()=>{f.ctx.isUnmounted?r(w):s(w,h,v)},re=()=>{w._isLeaving&&w[Je](!0),L(w,()=>{J(),X&&X()})};j?j(w,J,re):re()}else s(w,h,v)},ke=(f,h,v,T=!1,b=!1)=>{const{type:w,props:I,ref:O,children:A,dynamicChildren:C,shapeFlag:q,patchFlag:L,dirs:j,cacheIndex:X}=f;if(L===-2&&(b=!1),O!=null&&(tt(),$t(O,null,v,f,!0),nt()),X!=null&&(h.renderCache[X]=void 0),q&256){h.ctx.deactivate(f);return}const J=q&1&&j,re=!St(f);let ee;if(re&&(ee=I&&I.onVnodeBeforeUnmount)&&Oe(ee,h,f),q&6)qo(f.component,v,T);else{if(q&128){f.suspense.unmount(v,T);return}J&&Be(f,null,h,"beforeUnmount"),q&64?f.type.remove(f,h,v,Mt,T):C&&!C.hasOnce&&(w!==Se||L>0&&L&64)?Bt(C,h,v,!1,!0):(w===Se&&L&384||!b&&q&16)&&Bt(A,h,v),T&&cr(f)}(re&&(ee=I&&I.onVnodeUnmounted)||J)&&Ce(()=>{ee&&Oe(ee,h,f),J&&Be(f,null,h,"unmounted")},v)},cr=f=>{const{type:h,el:v,anchor:T,transition:b}=f;if(h===Se){Ko(v,T);return}if(h===Qt){g(f);return}const w=()=>{r(v),b&&!b.persisted&&b.afterLeave&&b.afterLeave()};if(f.shapeFlag&1&&b&&!b.persisted){const{leave:I,delayLeave:O}=b,A=()=>I(v,w);O?O(f.el,w,A):A()}else w()},Ko=(f,h)=>{let v;for(;f!==h;)v=m(f),r(f),f=v;r(h)},qo=(f,h,v)=>{const{bum:T,scope:b,job:w,subTree:I,um:O,m:A,a:C}=f;Ar(A),Ar(C),T&&Rn(T),b.stop(),w&&(w.flags|=8,ke(I,f,h,v)),O&&Ce(O,h),Ce(()=>{f.isUnmounted=!0},h)},Bt=(f,h,v,T=!1,b=!1,w=0)=>{for(let I=w;I{if(f.shapeFlag&6)return mn(f.component.subTree);if(f.shapeFlag&128)return f.suspense.next();const h=m(f.anchor||f.el),v=h&&h[Bl];return v?m(v):h};let ss=!1;const ar=(f,h,v)=>{f==null?h._vnode&&ke(h._vnode,null,null,!0):E(h._vnode||null,f,h,null,null,null,v),h._vnode=f,ss||(ss=!0,vr(),jn(),ss=!1)},Mt={p:E,um:ke,m:Ve,r:cr,mt:N,mc:Y,pc:H,pbc:R,n:mn,o:e};let rs,is;return t&&([rs,is]=t(Mt)),{render:ar,hydrate:rs,createApp:vc(ar,rs)}}function hs({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 gt({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function ao(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function uo(e,t,n=!1){const s=e.children,r=t.children;if(k(s)&&k(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function fo(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:fo(t)}function Ar(e){if(e)for(let t=0;tEt(Rc);function ho(e,t){return Qn(e,null,t)}function Gu(e,t){return Qn(e,null,{flush:"post"})}function Re(e,t,n){return Qn(e,t,n)}function Qn(e,t,n=se){const{immediate:s,deep:r,flush:i,once:o}=n,l=fe({},n),c=t&&s||!t&&i!=="post";let u;if(Vt){if(i==="sync"){const y=Mc();u=y.__watcherHandles||(y.__watcherHandles=[])}else if(!c){const y=()=>{};return y.stop=Ke,y.resume=Ke,y.pause=Ke,y}}const a=pe;l.call=(y,S,E)=>je(y,a,S,E);let d=!1;i==="post"?l.scheduler=y=>{Ce(y,a&&a.suspense)}:i!=="sync"&&(d=!0,l.scheduler=(y,S)=>{S?y():Qs(y)}),l.augmentJob=y=>{t&&(y.flags|=4),d&&(y.flags|=2,a&&(y.id=a.uid,y.i=a))};const m=jl(e,t,l);return Vt&&(u?u.push(m):c&&m()),m}function Oc(e,t,n){const s=this.proxy,r=ce(e)?e.includes(".")?po(s,e):()=>s[e]:e.bind(s,s);let i;G(t)?i=t:(i=t.handler,n=t);const o=gn(this),l=Qn(r,i.bind(s),n);return o(),l}function po(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;rt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${De(t)}Modifiers`]||e[`${ht(t)}Modifiers`];function Ic(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||se;let r=n;const i=t.startsWith("update:"),o=i&&Pc(s,t.slice(7));o&&(o.trim&&(r=n.map(a=>ce(a)?a.trim():a)),o.number&&(r=n.map(Nn)));let l,c=s[l=An(t)]||s[l=An(De(t))];!c&&i&&(c=s[l=An(ht(t))]),c&&je(c,e,6,r);const u=s[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,je(u,e,6,r)}}function go(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!G(e)){const c=u=>{const a=go(u,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)&&s.set(e,null),null):(k(i)?i.forEach(c=>o[c]=null):fe(o,i),ne(e)&&s.set(e,o),o)}function Zn(e,t){return!e||!cn(t)?!1:(t=t.slice(2).replace(/Once$/,""),Z(e,t[0].toLowerCase()+t.slice(1))||Z(e,ht(t))||Z(e,t))}function ps(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:c,render:u,renderCache:a,props:d,data:m,setupState:y,ctx:S,inheritAttrs:E}=e,K=Vn(e);let D,U;try{if(n.shapeFlag&4){const g=r||s,M=g;D=Pe(u.call(M,g,a,d,y,m,S)),U=l}else{const g=t;D=Pe(g.length>1?g(d,{attrs:l,slots:o,emit:c}):g(d,null)),U=t.props?l:Lc(l)}}catch(g){Zt.length=0,dn(g,e,1),D=ae(he)}let p=D;if(U&&E!==!1){const g=Object.keys(U),{shapeFlag:M}=p;g.length&&M&7&&(i&&g.some(ks)&&(U=Nc(U,i)),p=ft(p,U,!1,!0))}return n.dirs&&(p=ft(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&sn(p,n.transition),D=p,Vn(K),D}const Lc=e=>{let t;for(const n in e)(n==="class"||n==="style"||cn(n))&&((t||(t={}))[n]=e[n]);return t},Nc=(e,t)=>{const n={};for(const s in e)(!ks(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Dc(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Rr(s,o,u):!!o;if(c&8){const a=t.dynamicProps;for(let d=0;de.__isSuspense;function yo(e,t){t&&t.pendingBranch?k(e)?t.effects.push(...e):t.effects.push(e):Ul(e)}const Se=Symbol.for("v-fgt"),Tt=Symbol.for("v-txt"),he=Symbol.for("v-cmt"),Qt=Symbol.for("v-stc"),Zt=[];let Ae=null;function Ls(e=!1){Zt.push(Ae=e?null:[])}function Fc(){Zt.pop(),Ae=Zt[Zt.length-1]||null}let rn=1;function Mr(e,t=!1){rn+=e,e<0&&Ae&&t&&(Ae.hasOnce=!0)}function _o(e){return e.dynamicChildren=rn>0?Ae||Nt:null,Fc(),rn>0&&Ae&&Ae.push(e),e}function Xu(e,t,n,s,r,i){return _o(wo(e,t,n,s,r,i,!0))}function Ns(e,t,n,s,r){return _o(ae(e,t,n,s,r,!0))}function on(e){return e?e.__v_isVNode===!0:!1}function _t(e,t){return e.type===t.type&&e.key===t.key}const bo=({key:e})=>e??null,On=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ce(e)||ue(e)||G(e)?{i:ge,r:e,k:t,f:!!n}:e:null);function wo(e,t=null,n=null,s=0,r=null,i=e===Se?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&bo(t),ref:t&&On(t),scopeId:$i,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:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:ge};return l?(sr(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=ce(n)?8:16),rn>0&&!o&&Ae&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ae.push(c),c}const ae=Hc;function Hc(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===Xi)&&(e=he),on(e)){const l=ft(e,t,!0);return n&&sr(l,n),rn>0&&!i&&Ae&&(l.shapeFlag&6?Ae[Ae.indexOf(e)]=l:Ae.push(l)),l.patchFlag=-2,l}if(Gc(e)&&(e=e.__vccOpts),t){t=$c(t);let{class:l,style:c}=t;l&&!ce(l)&&(t.class=Ks(l)),ne(c)&&(zs(c)&&!k(c)&&(c=fe({},c)),t.style=Bs(c))}const o=ce(e)?1:vo(e)?128:ji(e)?64:ne(e)?4:G(e)?2:0;return wo(e,t,n,s,r,o,i,!0)}function $c(e){return e?zs(e)||so(e)?fe({},e):e:null}function ft(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:c}=e,u=t?jc(r||{},t):r,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&bo(u),ref:t&&t.ref?n&&i?k(i)?i.concat(On(t)):[i,On(t)]:On(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&&ft(e.ssContent),ssFallback:e.ssFallback&&ft(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&s&&sn(a,c.clone(a)),a}function So(e=" ",t=0){return ae(Tt,null,e,t)}function Yu(e,t){const n=ae(Qt,null,e);return n.staticCount=t,n}function zu(e="",t=!1){return t?(Ls(),Ns(he,null,e)):ae(he,null,e)}function Pe(e){return e==null||typeof e=="boolean"?ae(he):k(e)?ae(Se,null,e.slice()):on(e)?lt(e):ae(Tt,null,String(e))}function lt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:ft(e)}function sr(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(k(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),sr(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!so(t)?t._ctx=ge:r===3&&ge&&(ge.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else G(t)?(t={default:t,_ctx:ge},n=32):(t=String(t),s&64?(n=16,t=[So(t)]):n=8);e.children=t,e.shapeFlag|=n}function jc(...e){const t={};for(let n=0;npe||ge;let Un,Ds;{const e=Kn(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};Un=t("__VUE_INSTANCE_SETTERS__",n=>pe=n),Ds=t("__VUE_SSR_SETTERS__",n=>Vt=n)}const gn=e=>{const t=pe;return Un(e),e.scope.on(),()=>{e.scope.off(),Un(t)}},Or=()=>{pe&&pe.scope.off(),Un(null)};function xo(e){return e.vnode.shapeFlag&4}let Vt=!1;function Wc(e,t=!1,n=!1){t&&Ds(t);const{props:s,children:r}=e.vnode,i=xo(e);_c(e,s,i,t),xc(e,r,n||t);const o=i?Bc(e,t):void 0;return t&&Ds(!1),o}function Bc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,ac);const{setup:s}=n;if(s){tt();const r=e.setupContext=s.length>1?To(e):null,i=gn(e),o=fn(s,e,0,[e.props,r]),l=ai(o);if(nt(),i(),(l||e.sp)&&!St(e)&&er(e),l){if(o.then(Or,Or),t)return o.then(c=>{Pr(e,c)}).catch(c=>{dn(c,e,0)});e.asyncDep=o}else Pr(e,o)}else Eo(e)}function Pr(e,t,n){G(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ne(t)&&(e.setupState=Ni(t)),Eo(e)}function Eo(e,t,n){const s=e.type;e.render||(e.render=s.render||Ke);{const r=gn(e);tt();try{fc(e)}finally{nt(),r()}}}const Kc={get(e,t){return _e(e,"get",""),e[t]}};function To(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Kc),slots:e.slots,emit:e.emit,expose:t}}function es(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Ni(Mn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Jt)return Jt[n](e)},has(t,n){return n in t||n in Jt}})):e.proxy}function qc(e,t=!0){return G(e)?e.displayName||e.name:e.name||t&&e.__name}function Gc(e){return G(e)&&"__vccOpts"in e}const oe=(e,t)=>Hl(e,t,Vt);function Fs(e,t,n){const s=arguments.length;return s===2?ne(t)&&!k(t)?on(t)?ae(e,null,[t]):ae(e,t):ae(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&on(n)&&(n=[n]),ae(e,t,n))}const Xc="3.5.20";/** +* @vue/runtime-dom v3.5.20 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Hs;const Ir=typeof window<"u"&&window.trustedTypes;if(Ir)try{Hs=Ir.createPolicy("vue",{createHTML:e=>e})}catch{}const Co=Hs?e=>Hs.createHTML(e):e=>e,Yc="http://www.w3.org/2000/svg",zc="http://www.w3.org/1998/Math/MathML",ze=typeof document<"u"?document:null,Lr=ze&&ze.createElement("template"),Jc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?ze.createElementNS(Yc,e):t==="mathml"?ze.createElementNS(zc,e):n?ze.createElement(e,{is:n}):ze.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>ze.createTextNode(e),createComment:e=>ze.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ze.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{Lr.innerHTML=Co(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=Lr.content;if(s==="svg"||s==="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]}},it="transition",Gt="animation",ln=Symbol("_vtc"),Ao={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},Qc=fe({},Vi,Ao),Zc=e=>(e.displayName="Transition",e.props=Qc,e),Ju=Zc((e,{slots:t})=>Fs(Gl,ea(e),t)),mt=(e,t=[])=>{k(e)?e.forEach(n=>n(...t)):e&&e(...t)},Nr=e=>e?k(e)?e.some(t=>t.length>1):e.length>1:!1;function ea(e){const t={};for(const x in e)x in Ao||(t[x]=e[x]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:u=o,appearToClass:a=l,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:m=`${n}-leave-active`,leaveToClass:y=`${n}-leave-to`}=e,S=ta(r),E=S&&S[0],K=S&&S[1],{onBeforeEnter:D,onEnter:U,onEnterCancelled:p,onLeave:g,onLeaveCancelled:M,onBeforeAppear:W=D,onAppear:V=U,onAppearCancelled:Y=p}=t,_=(x,$,N,B)=>{x._enterCancelled=B,vt(x,$?a:l),vt(x,$?u:o),N&&N()},R=(x,$)=>{x._isLeaving=!1,vt(x,d),vt(x,y),vt(x,m),$&&$()},F=x=>($,N)=>{const B=x?V:U,P=()=>_($,x,N);mt(B,[$,P]),Dr(()=>{vt($,x?c:i),Ye($,x?a:l),Nr(B)||Fr($,s,E,P)})};return fe(t,{onBeforeEnter(x){mt(D,[x]),Ye(x,i),Ye(x,o)},onBeforeAppear(x){mt(W,[x]),Ye(x,c),Ye(x,u)},onEnter:F(!1),onAppear:F(!0),onLeave(x,$){x._isLeaving=!0;const N=()=>R(x,$);Ye(x,d),x._enterCancelled?(Ye(x,m),jr()):(jr(),Ye(x,m)),Dr(()=>{x._isLeaving&&(vt(x,d),Ye(x,y),Nr(g)||Fr(x,s,K,N))}),mt(g,[x,N])},onEnterCancelled(x){_(x,!1,void 0,!0),mt(p,[x])},onAppearCancelled(x){_(x,!0,void 0,!0),mt(Y,[x])},onLeaveCancelled(x){R(x),mt(M,[x])}})}function ta(e){if(e==null)return null;if(ne(e))return[gs(e.enter),gs(e.leave)];{const t=gs(e);return[t,t]}}function gs(e){return Jo(e)}function Ye(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[ln]||(e[ln]=new Set)).add(t)}function vt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[ln];n&&(n.delete(t),n.size||(e[ln]=void 0))}function Dr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let na=0;function Fr(e,t,n,s){const r=e._endId=++na,i=()=>{r===e._endId&&s()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=sa(e,t);if(!o)return s();const u=o+"end";let a=0;const d=()=>{e.removeEventListener(u,m),i()},m=y=>{y.target===e&&++a>=c&&d()};setTimeout(()=>{a(n[S]||"").split(", "),r=s(`${it}Delay`),i=s(`${it}Duration`),o=Hr(r,i),l=s(`${Gt}Delay`),c=s(`${Gt}Duration`),u=Hr(l,c);let a=null,d=0,m=0;t===it?o>0&&(a=it,d=o,m=i.length):t===Gt?u>0&&(a=Gt,d=u,m=c.length):(d=Math.max(o,u),a=d>0?o>u?it:Gt:null,m=a?a===it?i.length:c.length:0);const y=a===it&&/\b(transform|all)(,|$)/.test(s(`${it}Property`).toString());return{type:a,timeout:d,propCount:m,hasTransform:y}}function Hr(e,t){for(;e.length$r(n)+$r(e[s])))}function $r(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function jr(){return document.body.offsetHeight}function ra(e,t,n){const s=e[ln];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Vr=Symbol("_vod"),ia=Symbol("_vsh"),oa=Symbol(""),la=/(^|;)\s*display\s*:/;function ca(e,t,n){const s=e.style,r=ce(n);let i=!1;if(n&&!r){if(t)if(ce(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&Pn(s,l,"")}else for(const o in t)n[o]==null&&Pn(s,o,"");for(const o in n)o==="display"&&(i=!0),Pn(s,o,n[o])}else if(r){if(t!==n){const o=s[oa];o&&(n+=";"+o),s.cssText=n,i=la.test(n)}}else t&&e.removeAttribute("style");Vr in e&&(e[Vr]=i?s.display:"",e[ia]&&(s.display="none"))}const kr=/\s*!important$/;function Pn(e,t,n){if(k(n))n.forEach(s=>Pn(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=aa(e,t);kr.test(n)?e.setProperty(ht(s),n.replace(kr,""),"important"):e[s]=n}}const Ur=["Webkit","Moz","ms"],ms={};function aa(e,t){const n=ms[t];if(n)return n;let s=De(t);if(s!=="filter"&&s in e)return ms[t]=s;s=Bn(s);for(let r=0;rvs||(ha.then(()=>vs=0),vs=Date.now());function ga(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;je(ma(s,n.value),t,5,[s])};return n.value=e,n.attached=pa(),n}function ma(e,t){if(k(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const Xr=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,va=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?ra(e,s,o):t==="style"?ca(e,n,s):cn(t)?ks(t)||fa(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):ya(e,t,s,o))?(Kr(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Br(e,t,s,o,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!ce(s))?Kr(e,De(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Br(e,t,s,o))};function ya(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&Xr(t)&&G(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return Xr(t)&&ce(n)?!1:t in e}const dt=e=>{const t=e.props["onUpdate:modelValue"]||!1;return k(t)?n=>Rn(t,n):t};function _a(e){e.target.composing=!0}function Yr(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Ne=Symbol("_assign"),Qu={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e[Ne]=dt(r);const i=s||r.props&&r.props.type==="number";et(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=Nn(l)),e[Ne](l)}),n&&et(e,"change",()=>{e.value=e.value.trim()}),t||(et(e,"compositionstart",_a),et(e,"compositionend",Yr),et(e,"change",Yr))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:r,number:i}},o){if(e[Ne]=dt(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?Nn(e.value):e.value,c=t??"";l!==c&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||r&&e.value.trim()===c)||(e.value=c))}},Zu={deep:!0,created(e,t,n){e[Ne]=dt(n),et(e,"change",()=>{const s=e._modelValue,r=kt(e),i=e.checked,o=e[Ne];if(k(s)){const l=qs(s,r),c=l!==-1;if(i&&!c)o(s.concat(r));else if(!i&&c){const u=[...s];u.splice(l,1),o(u)}}else if(Ut(s)){const l=new Set(s);i?l.add(r):l.delete(r),o(l)}else o(Ro(e,i))})},mounted:zr,beforeUpdate(e,t,n){e[Ne]=dt(n),zr(e,t,n)}};function zr(e,{value:t,oldValue:n},s){e._modelValue=t;let r;if(k(t))r=qs(t,s.props.value)>-1;else if(Ut(t))r=t.has(s.props.value);else{if(t===n)return;r=Ct(t,Ro(e,!0))}e.checked!==r&&(e.checked=r)}const ef={created(e,{value:t},n){e.checked=Ct(t,n.props.value),e[Ne]=dt(n),et(e,"change",()=>{e[Ne](kt(e))})},beforeUpdate(e,{value:t,oldValue:n},s){e[Ne]=dt(s),t!==n&&(e.checked=Ct(t,s.props.value))}},tf={deep:!0,created(e,{value:t,modifiers:{number:n}},s){const r=Ut(t);et(e,"change",()=>{const i=Array.prototype.filter.call(e.options,o=>o.selected).map(o=>n?Nn(kt(o)):kt(o));e[Ne](e.multiple?r?new Set(i):i:i[0]),e._assigning=!0,hn(()=>{e._assigning=!1})}),e[Ne]=dt(s)},mounted(e,{value:t}){Jr(e,t)},beforeUpdate(e,t,n){e[Ne]=dt(n)},updated(e,{value:t}){e._assigning||Jr(e,t)}};function Jr(e,t){const n=e.multiple,s=k(t);if(!(n&&!s&&!Ut(t))){for(let r=0,i=e.options.length;rString(u)===String(l)):o.selected=qs(t,l)>-1}else o.selected=t.has(l);else if(Ct(kt(o),t)){e.selectedIndex!==r&&(e.selectedIndex=r);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function kt(e){return"_value"in e?e._value:e.value}function Ro(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const ba=["ctrl","shift","alt","meta"],wa={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)=>ba.some(n=>e[`${n}Key`]&&!t.includes(n))},nf=(e,t)=>{const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=((r,...i)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=(r=>{if(!("key"in r))return;const i=ht(r.key);if(t.some(o=>o===i||Sa[o]===i))return e(r)}))},xa=fe({patchProp:va},Jc);let ys,Qr=!1;function Ea(){return ys=Qr?ys:Tc(xa),Qr=!0,ys}const rf=((...e)=>{const t=Ea().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Ca(s);if(r)return n(r,!0,Ta(r))},t});function Ta(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Ca(e){return ce(e)?document.querySelector(e):e}const of=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Aa=window.__VP_SITE_DATA__;function rr(e){return mi()?(ll(e),!0):!1}const _s=new WeakMap,Ra=(...e)=>{var t;const n=e[0],s=(t=Rt())==null?void 0:t.proxy;if(s==null&&!eo())throw new Error("injectLocal must be called in setup");return s&&_s.has(s)&&n in _s.get(s)?_s.get(s)[n]:Et(...e)},Mo=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Ma=e=>e!=null,Oa=Object.prototype.toString,Pa=e=>Oa.call(e)==="[object Object]",At=()=>{},Zr=Ia();function Ia(){var e,t;return Mo&&((e=window?.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window?.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window?.navigator.userAgent))}function ir(...e){if(e.length!==1)return Nl(...e);const t=e[0];return typeof t=="function"?un(Pl(()=>({get:t,set:At}))):qe(t)}function or(e,t){function n(...s){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,s),{fn:t,thisArg:this,args:s})).then(r).catch(i)})}return n}const Oo=e=>e();function La(e,t={}){let n,s,r=At;const i=c=>{clearTimeout(c),r(),r=At};let o;return c=>{const u=le(e),a=le(t.maxWait);return n&&i(n),u<=0||a!==void 0&&a<=0?(s&&(i(s),s=void 0),Promise.resolve(c())):new Promise((d,m)=>{r=t.rejectOnCancel?m:d,o=c,a&&!s&&(s=setTimeout(()=>{n&&i(n),s=void 0,d(o())},a)),n=setTimeout(()=>{s&&i(s),s=void 0,d(c())},u)})}}function Na(...e){let t=0,n,s=!0,r=At,i,o,l,c,u;!ue(e[0])&&typeof e[0]=="object"?{delay:o,trailing:l=!0,leading:c=!0,rejectOnCancel:u=!1}=e[0]:[o,l=!0,c=!0,u=!1]=e;const a=()=>{n&&(clearTimeout(n),n=void 0,r(),r=At)};return m=>{const y=le(o),S=Date.now()-t,E=()=>i=m();return a(),y<=0?(t=Date.now(),E()):(S>y&&(c||!s)?(t=Date.now(),E()):l&&(i=new Promise((K,D)=>{r=u?D:K,n=setTimeout(()=>{t=Date.now(),s=!0,K(E()),a()},Math.max(0,y-S))})),!c&&!n&&(n=setTimeout(()=>s=!0,y)),s=!1,i)}}function Da(e=Oo,t={}){const{initialState:n="active"}=t,s=ir(n==="active");function r(){s.value=!1}function i(){s.value=!0}const o=(...l)=>{s.value&&e(...l)};return{isActive:un(s),pause:r,resume:i,eventFilter:o}}function ei(e){return e.endsWith("rem")?Number.parseFloat(e)*16:Number.parseFloat(e)}function In(e){return Array.isArray(e)?e:[e]}function Po(e){return Rt()}function Fa(e,t=200,n={}){return or(La(t,n),e)}function Ha(e,t=200,n=!1,s=!0,r=!1){return or(Na(t,n,s,r),e)}function $a(e,t,n={}){const{eventFilter:s=Oo,...r}=n;return Re(e,or(s,t),r)}function ja(e,t,n={}){const{eventFilter:s,initialState:r="active",...i}=n,{eventFilter:o,pause:l,resume:c,isActive:u}=Da(s,{initialState:r});return{stop:$a(e,t,{...i,eventFilter:o}),pause:l,resume:c,isActive:u}}function ts(e,t=!0,n){Po()?Wt(e,n):t?e():hn(e)}function Va(e,t){Po()&&Jn(e,t)}function ka(e,t,n){return Re(e,t,{...n,immediate:!0})}const Ge=Mo?window:void 0;function ns(e){var t;const n=le(e);return(t=n?.$el)!=null?t:n}function st(...e){const t=[],n=()=>{t.forEach(l=>l()),t.length=0},s=(l,c,u,a)=>(l.addEventListener(c,u,a),()=>l.removeEventListener(c,u,a)),r=oe(()=>{const l=In(le(e[0])).filter(c=>c!=null);return l.every(c=>typeof c!="string")?l:void 0}),i=ka(()=>{var l,c;return[(c=(l=r.value)==null?void 0:l.map(u=>ns(u)))!=null?c:[Ge].filter(u=>u!=null),In(le(r.value?e[1]:e[0])),In(Js(r.value?e[2]:e[1])),le(r.value?e[3]:e[2])]},([l,c,u,a])=>{if(n(),!l?.length||!c?.length||!u?.length)return;const d=Pa(a)?{...a}:a;t.push(...l.flatMap(m=>c.flatMap(y=>u.map(S=>s(m,y,S,d)))))},{flush:"post"}),o=()=>{i(),n()};return rr(n),o}function Ua(){const e=Le(!1),t=Rt();return t&&Wt(()=>{e.value=!0},t),e}function Io(e){const t=Ua();return oe(()=>(t.value,!!e()))}function Wa(e,t,n={}){const{window:s=Ge,...r}=n;let i;const o=Io(()=>s&&"MutationObserver"in s),l=()=>{i&&(i.disconnect(),i=void 0)},c=oe(()=>{const m=le(e),y=In(m).map(ns).filter(Ma);return new Set(y)}),u=Re(c,m=>{l(),o.value&&m.size&&(i=new MutationObserver(t),m.forEach(y=>i.observe(y,r)))},{immediate:!0,flush:"post"}),a=()=>i?.takeRecords(),d=()=>{u(),l()};return rr(d),{isSupported:o,stop:d,takeRecords:a}}function Ba(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function lf(...e){let t,n,s={};e.length===3?(t=e[0],n=e[1],s=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],s=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:r=Ge,eventName:i="keydown",passive:o=!1,dedupe:l=!1}=s,c=Ba(t);return st(r,i,a=>{a.repeat&&le(l)||c(a)&&n(a)},o)}const Ka=Symbol("vueuse-ssr-width");function qa(){const e=eo()?Ra(Ka,null):null;return typeof e=="number"?e:void 0}function Lo(e,t={}){const{window:n=Ge,ssrWidth:s=qa()}=t,r=Io(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function"),i=Le(typeof s=="number"),o=Le(),l=Le(!1),c=u=>{l.value=u.matches};return ho(()=>{if(i.value){i.value=!r.value;const u=le(e).split(",");l.value=u.some(a=>{const d=a.includes("not all"),m=a.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),y=a.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/);let S=!!(m||y);return m&&S&&(S=s>=ei(m[1])),y&&S&&(S=s<=ei(y[1])),d?!S:S});return}r.value&&(o.value=n.matchMedia(le(e)),l.value=o.value.matches)}),st(o,"change",c,{passive:!0}),oe(()=>l.value)}const xn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},En="__vueuse_ssr_handlers__",Ga=Xa();function Xa(){return En in xn||(xn[En]=xn[En]||{}),xn[En]}function No(e,t){return Ga[e]||t}function Do(e){return Lo("(prefers-color-scheme: dark)",e)}function Ya(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 za={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()}},ti="vueuse-storage";function Ja(e,t,n,s={}){var r;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:u=!1,shallow:a,window:d=Ge,eventFilter:m,onError:y=N=>{console.error(N)},initOnMounted:S}=s,E=(a?Le:qe)(typeof t=="function"?t():t),K=oe(()=>le(e));if(!n)try{n=No("getDefaultStorage",()=>{var N;return(N=Ge)==null?void 0:N.localStorage})()}catch(N){y(N)}if(!n)return E;const D=le(t),U=Ya(D),p=(r=s.serializer)!=null?r:za[U],{pause:g,resume:M}=ja(E,N=>R(N),{flush:i,deep:o,eventFilter:m});Re(K,()=>x(),{flush:i});let W=!1;const V=N=>{S&&!W||x(N)},Y=N=>{S&&!W||$(N)};d&&l&&(n instanceof Storage?st(d,"storage",V,{passive:!0}):st(d,ti,Y)),S?ts(()=>{W=!0,x()}):x();function _(N,B){if(d){const P={key:K.value,oldValue:N,newValue:B,storageArea:n};d.dispatchEvent(n instanceof Storage?new StorageEvent("storage",P):new CustomEvent(ti,{detail:P}))}}function R(N){try{const B=n.getItem(K.value);if(N==null)_(B,null),n.removeItem(K.value);else{const P=p.write(N);B!==P&&(n.setItem(K.value,P),_(B,P))}}catch(B){y(B)}}function F(N){const B=N?N.newValue:n.getItem(K.value);if(B==null)return c&&D!=null&&n.setItem(K.value,p.write(D)),D;if(!N&&u){const P=p.read(B);return typeof u=="function"?u(P,D):U==="object"&&!Array.isArray(P)?{...D,...P}:P}else return typeof B!="string"?B:p.read(B)}function x(N){if(!(N&&N.storageArea!==n)){if(N&&N.key==null){E.value=D;return}if(!(N&&N.key!==K.value)){g();try{const B=p.write(E.value);(N===void 0||N?.newValue!==B)&&(E.value=F(N))}catch(B){y(B)}finally{N?hn(M):M()}}}}function $(N){x(N.detail)}return E}const Qa="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function Za(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=Ge,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:u,disableTransition:a=!0}=e,d={auto:"",light:"light",dark:"dark",...e.modes||{}},m=Do({window:r}),y=oe(()=>m.value?"dark":"light"),S=c||(o==null?ir(s):Ja(o,s,i,{window:r,listenToStorageChanges:l})),E=oe(()=>S.value==="auto"?y.value:S.value),K=No("updateHTMLAttrs",(g,M,W)=>{const V=typeof g=="string"?r?.document.querySelector(g):ns(g);if(!V)return;const Y=new Set,_=new Set;let R=null;if(M==="class"){const x=W.split(/\s/g);Object.values(d).flatMap($=>($||"").split(/\s/g)).filter(Boolean).forEach($=>{x.includes($)?Y.add($):_.add($)})}else R={key:M,value:W};if(Y.size===0&&_.size===0&&R===null)return;let F;a&&(F=r.document.createElement("style"),F.appendChild(document.createTextNode(Qa)),r.document.head.appendChild(F));for(const x of Y)V.classList.add(x);for(const x of _)V.classList.remove(x);R&&V.setAttribute(R.key,R.value),a&&(r.getComputedStyle(F).opacity,document.head.removeChild(F))});function D(g){var M;K(t,n,(M=d[g])!=null?M:g)}function U(g){e.onChanged?e.onChanged(g,D):D(g)}Re(E,U,{flush:"post",immediate:!0}),ts(()=>U(E.value));const p=oe({get(){return u?S.value:E.value},set(g){S.value=g}});return Object.assign(p,{store:S,system:y,state:E})}function eu(e={}){const{valueDark:t="dark",valueLight:n=""}=e,s=Za({...e,onChanged:(o,l)=>{var c;e.onChanged?(c=e.onChanged)==null||c.call(e,o==="dark",l,o):l(o)},modes:{dark:t,light:n}}),r=oe(()=>s.system.value);return oe({get(){return s.value==="dark"},set(o){const l=o?"dark":"light";r.value===l?s.value="auto":s.value=l}})}function bs(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}const ni=1;function tu(e,t={}){const{throttle:n=0,idle:s=200,onStop:r=At,onScroll:i=At,offset:o={left:0,right:0,top:0,bottom:0},observe:l={mutation:!1},eventListenerOptions:c={capture:!1,passive:!0},behavior:u="auto",window:a=Ge,onError:d=_=>{console.error(_)}}=t,m=typeof l=="boolean"?{mutation:l}:l,y=Le(0),S=Le(0),E=oe({get(){return y.value},set(_){D(_,void 0)}}),K=oe({get(){return S.value},set(_){D(void 0,_)}});function D(_,R){var F,x,$,N;if(!a)return;const B=le(e);if(!B)return;($=B instanceof Document?a.document.body:B)==null||$.scrollTo({top:(F=le(R))!=null?F:K.value,left:(x=le(_))!=null?x:E.value,behavior:le(u)});const P=((N=B?.document)==null?void 0:N.documentElement)||B?.documentElement||B;E!=null&&(y.value=P.scrollLeft),K!=null&&(S.value=P.scrollTop)}const U=Le(!1),p=jt({left:!0,right:!1,top:!0,bottom:!1}),g=jt({left:!1,right:!1,top:!1,bottom:!1}),M=_=>{U.value&&(U.value=!1,g.left=!1,g.right=!1,g.top=!1,g.bottom=!1,r(_))},W=Fa(M,n+s),V=_=>{var R;if(!a)return;const F=((R=_?.document)==null?void 0:R.documentElement)||_?.documentElement||ns(_),{display:x,flexDirection:$,direction:N}=getComputedStyle(F),B=N==="rtl"?-1:1,P=F.scrollLeft;g.left=Py.value;const z=Math.abs(P*B)<=(o.left||0),H=Math.abs(P*B)+F.clientWidth>=F.scrollWidth-(o.right||0)-ni;x==="flex"&&$==="row-reverse"?(p.left=H,p.right=z):(p.left=z,p.right=H),y.value=P;let te=F.scrollTop;_===a.document&&!te&&(te=a.document.body.scrollTop),g.top=teS.value;const pt=Math.abs(te)<=(o.top||0),Ve=Math.abs(te)+F.clientHeight>=F.scrollHeight-(o.bottom||0)-ni;x==="flex"&&$==="column-reverse"?(p.top=Ve,p.bottom=pt):(p.top=pt,p.bottom=Ve),S.value=te},Y=_=>{var R;if(!a)return;const F=(R=_.target.documentElement)!=null?R:_.target;V(F),U.value=!0,W(_),i(_)};return st(e,"scroll",n?Ha(Y,n,!0,!1):Y,c),ts(()=>{try{const _=le(e);if(!_)return;V(_)}catch(_){d(_)}}),m?.mutation&&e!=null&&e!==a&&e!==document&&Wa(e,()=>{const _=le(e);_&&V(_)},{attributes:!0,childList:!0,subtree:!0}),st(e,"scrollend",M,c),{x:E,y:K,isScrolling:U,arrivedState:p,directions:g,measure(){const _=le(e);a&&_&&V(_)}}}function Fo(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 ws=new WeakMap;function cf(e,t=!1){const n=Le(t);let s=null,r="";Re(ir(e),l=>{const c=bs(le(l));if(c){const u=c;if(ws.get(u)||ws.set(u,u.style.overflow),u.style.overflow!=="hidden"&&(r=u.style.overflow),u.style.overflow==="hidden")return n.value=!0;if(n.value)return u.style.overflow="hidden"}},{immediate:!0});const i=()=>{const l=bs(le(e));!l||n.value||(Zr&&(s=st(l,"touchmove",c=>{nu(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{const l=bs(le(e));!l||!n.value||(Zr&&s?.(),l.style.overflow=r,ws.delete(l),n.value=!1)};return rr(o),oe({get(){return n.value},set(l){l?i():o()}})}function af(e={}){const{window:t=Ge,...n}=e;return tu(t,n)}function uf(e={}){const{window:t=Ge,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:s=Number.POSITIVE_INFINITY,listenOrientation:r=!0,includeScrollbar:i=!0,type:o="inner"}=e,l=Le(n),c=Le(s),u=()=>{if(t)if(o==="outer")l.value=t.outerWidth,c.value=t.outerHeight;else if(o==="visual"&&t.visualViewport){const{width:d,height:m,scale:y}=t.visualViewport;l.value=Math.round(d*y),c.value=Math.round(m*y)}else i?(l.value=t.innerWidth,c.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,c.value=t.document.documentElement.clientHeight)};u(),ts(u);const a={passive:!0};if(st("resize",u,a),t&&o==="visual"&&t.visualViewport&&st(t.visualViewport,"resize",u,a),r){const d=Lo("(orientation: portrait)");Re(d,()=>u())}return{width:l,height:c}}const su={};var ru={};const Ho=/^(?:[a-z]+:|\/\/)/i,iu="vitepress-theme-appearance",$o=Symbol("stack-view:unpack"),ou=/#.*$/,lu=/[?#].*$/,cu=/(?:(^|\/)index)?\.(?:md|html)$/,ye=typeof document<"u",jo={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function au(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 s=t.match(ou);return s?(ye?location.hash:"")===s[0]:!0}function si(e){return decodeURI(e).replace(lu,"").replace(cu,"$1")}function uu(e){return Ho.test(e)}function fu(e,t){return Object.keys(e?.locales||{}).find(n=>n!=="root"&&!uu(n)&&au(t,`^/${n}/`,!0))||"root"}function du(e,t){const n=fu(e,t),{label:s,link:r,...i}=e.locales[n]??{};Object.assign(i,{localeIndex:n});const o=vu(e,t),l={head:ko(e.head??[],i.head??[],...o.map(c=>c.head??[]).reverse())};return lr(l,...o,i,e)}function Vo(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=hu(e.title,s);return n===r.slice(3)?n:`${n}${r}`}function hu(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function ko(...e){const t=[],n=new Map;for(const s of e)for(const r of s){const[i,o]=r,l=Object.entries(o)[0];if(i!=="meta"||!l){t.push(r);continue}const c=`${l[0]}=${l[1]}`,u=n.get(c);u!=null?t[u]=r:(n.set(c,t.length),t.push(r))}return t}const pu=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,gu=/^[a-z]:/i;function ri(e){const t=gu.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(pu,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const Ss=new Set;function mu(e){if(Ss.size===0){const n=typeof process=="object"&&ru?.VITE_EXTRA_EXTENSIONS||su?.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(s=>Ss.add(s))}const t=e.split(".").pop();return t==null||!Ss.has(t.toLowerCase())}function vu({additionalConfig:e},t){if(e===void 0)return[];if(typeof e=="function")return e(t)??[];const n=[],s=t.split("/").slice(0,-1);for(;s.length;){const r=`/${s.join("/")}/`;n.push(e[r]),s.pop()}return n.push(e["/"]),n.filter(r=>r!==void 0)}function lr(...e){const t=e.filter(r=>yu(r));if(t.length<=1)return e[0];const n=new Set(t.flatMap(r=>Reflect.ownKeys(r))),s=[...n];return new Proxy({},{get(r,i){return i===$o?t:lr(...t.map(o=>o[i]).filter(o=>o!==void 0))},set(){throw new Error("StackView is read-only and cannot be mutated.")},has(r,i){return n.has(i)},ownKeys(){return s},getOwnPropertyDescriptor(r,i){for(const o of t){const l=Object.getOwnPropertyDescriptor(o,i);if(l)return l}}})}lr.unpack=function(e){return e?.[$o]};function yu(e){return Object.prototype.toString.call(e)==="[object Object]"}const _u=Symbol(),ct=Le(un(Aa));function ff(e){const t=oe(()=>du(ct.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?qe(!0):n==="force-auto"?Do():n?eu({storageKey:iu,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):qe(!1),r=qe(ye?location.hash:"");return ye&&window.addEventListener("hashchange",()=>{r.value=location.hash}),Re(()=>e.data,()=>{r.value=ye?location.hash:""}),{site:t,theme:oe(()=>t.value.themeConfig),page:oe(()=>e.data),frontmatter:oe(()=>e.data.frontmatter),params:oe(()=>e.data.params),lang:oe(()=>t.value.lang),dir:oe(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:oe(()=>t.value.localeIndex||"root"),title:oe(()=>Vo(t.value,e.data)),description:oe(()=>e.data.description||t.value.description),isDark:s,hash:oe(()=>r.value)}}function bu(){const e=Et(_u);if(!e)throw new Error("vitepress data not properly injected in app");return e}function wu(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function ii(e){return Ho.test(e)||!e.startsWith("/")?e:wu(ct.value.base,e)}function Su(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),ye){t=ri(t.slice(1).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];if(s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),!s)return null;t=`/assets/${t}.${s}.js`}else t=`./${ri(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let Ln=[];function df(e){Ln.push(e),Va(()=>{Ln=Ln.filter(t=>t!==e)})}function xu(){let e=ct.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=oi(e,n);else if(Array.isArray(e))for(const s of e){const r=oi(s,n);if(r){t=r;break}}return t}function oi(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}const Eu=Symbol(),Uo="http://a.com",Tu=()=>({path:"/",hash:"",query:"",component:null,data:jo});function hf(e,t){const n=jt(Tu()),s={route:n,async go(l,c){l=js(l),await s.onBeforeRouteChange?.(l)!==!1&&((!ye||await Au(l,c))&&await i(l),o(),await s.onAfterRouteChange?.(l))}};let r=null;async function i(l,c=0,u=!1){if(await s.onBeforePageLoad?.(l)===!1)return;const a=new URL(l,Uo),d=r=a.pathname;try{let m=await e(d);if(!m)throw new Error(`Page not found: ${d}`);if(r===d){r=null;const{default:y,__pageData:S}=m;if(!y)throw new Error(`Invalid route component: ${y}`);await s.onAfterPageLoad?.(l),n.path=ye?d:ii(d),n.component=Mn(y),n.data=Mn(S),o(a),ye&&hn(()=>{let E=ct.value.base+S.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");return!ct.value.cleanUrls&&!E.endsWith("/")&&(E+=".html"),E!==a.pathname&&(a.pathname=E,l=E+a.search+a.hash,history.replaceState({},"",l)),$s(a.hash,!1,c)})}}catch(m){if(!/fetch|Page not found/.test(m.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(m),!u)try{const y=await fetch(ct.value.base+"hashmap.json");window.__VP_HASH_MAP__=await y.json(),await i(l,c,!0);return}catch{}if(r===d){r=null,n.path=ye?d:ii(d),n.component=t?Mn(t):null;const y=ye?n.path.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").slice(ct.value.base.length):"404.md";n.data={...jo,relativePath:y},o(a)}}}function o(l=ye?location:{search:"",hash:""}){n.query=l.search,n.hash=decodeURIComponent(l.hash)}return ye&&(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 u=c.getAttribute("href")??(c instanceof SVGAElement?c.getAttribute("xlink:href"):null);if(u==null)return;const{href:a,origin:d,pathname:m}=new URL(u,c.baseURI),y=new URL(location.href);d===y.origin&&mu(m)&&(l.preventDefault(),s.go(a,{smoothScroll:c.classList.contains("header-anchor")}))},{capture:!0}),window.addEventListener("popstate",async l=>{if(l.state===null)return;const c=js(location.href);await i(c,l.state&&l.state.scrollPosition||0),o(),await s.onAfterRouteChange?.(c)}),window.addEventListener("hashchange",l=>{l.preventDefault(),o()})),s}function Cu(){const e=Et(Eu);if(!e)throw new Error("useRouter() is called without provider.");return e}function Wo(){return Cu().route}function $s(e,t=!1,n=0){if(!e||n){window.scrollTo(0,n);return}let s=null;try{s=document.getElementById(decodeURIComponent(e).slice(1))}catch(r){console.warn(r)}if(s){let r=function(){!t||Math.abs(o-window.scrollY)>window.innerHeight?window.scrollTo(0,o):window.scrollTo({left:0,top:o,behavior:"smooth"})};const i=parseInt(window.getComputedStyle(s).paddingTop,10),o=window.scrollY+s.getBoundingClientRect().top-xu()+i;requestAnimationFrame(r)}}function js(e){const t=new URL(e,Uo);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),ct.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}async function Au(e,{smoothScroll:t=!1,initialLoad:n=!1,replace:s=!1}={}){const r=js(location.href),i=new URL(e,location.origin),o=new URL(r,location.origin);if(e===r){if(!n)return $s(i.hash,t),!1}else if(s?history.replaceState({},"",e):(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",e)),i.pathname===o.pathname)return i.hash!==o.hash&&(window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:o.href,newURL:i.href})),$s(i.hash,t)),!1;return!0}const Tn=()=>Ln.forEach(e=>e()),pf=Zs({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Wo(),{frontmatter:n,site:s}=bu();return Re(n,Tn,{deep:!0,flush:"post"}),()=>Fs(e.as,s.value.contentProps??{style:{position:"relative"}},[t.component?Fs(t.component,{onVnodeMounted:Tn,onVnodeUpdated:Tn,onVnodeUnmounted:Tn}):"404 Page Not Found"])}}),Ru="modulepreload",Mu=function(e){return"/"+e},li={},gf=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){let c=function(u){return Promise.all(u.map(a=>Promise.resolve(a).then(d=>({status:"fulfilled",value:d}),d=>({status:"rejected",reason:d}))))};document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),l=o?.nonce||o?.getAttribute("nonce");r=c(n.map(u=>{if(u=Mu(u),u in li)return;li[u]=!0;const a=u.endsWith(".css"),d=a?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${u}"]${d}`))return;const m=document.createElement("link");if(m.rel=a?"stylesheet":Ru,a||(m.as="script"),m.crossOrigin="",m.href=u,l&&m.setAttribute("nonce",l),document.head.appendChild(m),a)return new Promise((y,S)=>{m.addEventListener("load",y),m.addEventListener("error",()=>S(new Error(`Unable to preload CSS for ${u}`)))})}))}function i(o){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=o,window.dispatchEvent(l),!l.defaultPrevented)throw o}return r.then(o=>{for(const l of o||[])l.status==="rejected"&&i(l.reason);return t().catch(i)})},mf=Zs({setup(e,{slots:t}){const n=qe(!1);return Wt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function vf(){ye&&window.addEventListener("click",e=>{const t=e.target;if(t.matches(".vp-code-group input")){const n=t.parentElement?.parentElement;if(!n)return;const s=Array.from(n.querySelectorAll("input")).indexOf(t);if(s<0)return;const r=n.querySelector(".blocks");if(!r)return;const i=Array.from(r.children).find(c=>c.classList.contains("active"));if(!i)return;const o=r.children[s];if(!o||i===o)return;i.classList.remove("active"),o.classList.add("active"),n?.querySelector(`label[for="${t.id}"]`)?.scrollIntoView({block:"nearest"})}})}const Ou=/language-(shellscript|shell|bash|sh|zsh)/,Pu=[".vp-copy-ignore",".diff.remove"].join(", ");function yf(){if(ye){const e=new WeakMap;window.addEventListener("click",t=>{const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const s=n.parentElement,r=n.nextElementSibling?.nextElementSibling;if(!s||!r)return;const i=Ou.test(s.className),o=r.cloneNode(!0);o.querySelectorAll(Pu).forEach(c=>c.remove()),o.innerHTML=o.innerHTML.replace(/\n+/g,` +`);let l=o.textContent||"";i&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),Iu(l).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const c=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,c)})}})}}async function Iu(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 s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function _f(e,t){let n=!0,s=[];const r=i=>{if(n){n=!1,i.forEach(l=>{const c=xs(l);for(const u of document.head.children)if(u.isEqualNode(c)){s.push(u);return}});return}const o=i.map(xs);s.forEach((l,c)=>{const u=o.findIndex(a=>a?.isEqualNode(l??null));u!==-1?delete o[u]:(l?.remove(),delete s[c])}),o.forEach(l=>l&&document.head.appendChild(l)),s=[...s,...o].filter(Boolean)};ho(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[],u=Vo(o,i);u!==document.title&&(document.title=u);const a=l||o.description;let d=document.querySelector("meta[name=description]");d?d.getAttribute("content")!==a&&d.setAttribute("content",a):xs(["meta",{name:"description",content:a}]),r(ko(o.head,Nu(c)))})}function xs([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),e==="script"&&t.async==null&&(s.async=!1),s}function Lu(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Nu(e){return e.filter(t=>!Lu(t))}const Es=new Set,Bo=()=>document.createElement("link"),Du=e=>{const t=Bo();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Fu=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let Cn;const Hu=ye&&(Cn=Bo())&&Cn.relList&&Cn.relList.supports&&Cn.relList.supports("prefetch")?Du:Fu;function bf(){if(!ye||!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 s=()=>{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(!Es.has(c)){Es.add(c);const u=Su(c);u&&Hu(u)}}})}),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):Es.add(l))})})};Wt(s);const r=Wo();Re(()=>r.path,s),Jn(()=>{n&&n.disconnect()})}export{sf as $,Gu as A,Le as B,ye as C,Wo as D,$u as E,df as F,Se as G,Wu as H,ku as I,ae as J,Uu as K,Ho as L,jc as M,Et as N,Bs as O,uf as P,lf as Q,hn as R,af as S,Ju as T,un as U,Vu as V,gf as W,cf as X,yc as Y,Ku as Z,of as _,So as a,qi as a0,nf as a1,qu as a2,_f as a3,Eu as a4,ff as a5,_u as a6,pf as a7,mf as a8,ct as a9,hf as aa,Su as ab,rf as ac,bf as ad,yf as ae,vf as af,Fs as ag,Yu as ah,ju as ai,ef as aj,tf as ak,Qu as al,Zu as am,Cu as an,Ns as b,Xu as c,Zs as d,zu as e,mu as f,ii as g,oe as h,uu as i,wo as j,Js as k,au as l,Lo as m,Ks as n,Ls as o,Wt as p,rc as q,Bu as r,Jn as s,il as t,bu as u,xu as v,Wl as w,qe as x,ho as y,Re as z}; diff --git a/assets/chunks/framework.PeLcR_tw.js b/assets/chunks/framework.PeLcR_tw.js deleted file mode 100644 index b5654e5f..00000000 --- a/assets/chunks/framework.PeLcR_tw.js +++ /dev/null @@ -1,18 +0,0 @@ -/** -* @vue/shared v3.5.16 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**//*! #__NO_SIDE_EFFECTS__ */function Vs(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const ne={},It=[],Ke=()=>{},Ko=()=>!1,rn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),ks=e=>e.startsWith("onUpdate:"),de=Object.assign,Us=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Bo=Object.prototype.hasOwnProperty,Z=(e,t)=>Bo.call(e,t),k=Array.isArray,Pt=e=>on(e)==="[object Map]",Ht=e=>on(e)==="[object Set]",fr=e=>on(e)==="[object Date]",X=e=>typeof e=="function",le=e=>typeof e=="string",$e=e=>typeof e=="symbol",te=e=>e!==null&&typeof e=="object",ri=e=>(te(e)||X(e))&&X(e.then)&&X(e.catch),ii=Object.prototype.toString,on=e=>ii.call(e),qo=e=>on(e).slice(8,-1),oi=e=>on(e)==="[object Object]",Ws=e=>le(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Lt=Vs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),jn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Go=/-(\w)/g,De=jn(e=>e.replace(Go,(t,n)=>n?n.toUpperCase():"")),Xo=/\B([A-Z])/g,ft=jn(e=>e.replace(Xo,"-$1").toLowerCase()),Vn=jn(e=>e.charAt(0).toUpperCase()+e.slice(1)),Tn=jn(e=>e?`on${Vn(e)}`:""),ot=(e,t)=>!Object.is(e,t),En=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},Mn=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Yo=e=>{const t=le(e)?Number(e):NaN;return isNaN(t)?e:t};let ur;const kn=()=>ur||(ur=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ks(e){if(k(e)){const t={};for(let n=0;n{if(n){const s=n.split(zo);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Bs(e){let t="";if(le(e))t=e;else if(k(e))for(let n=0;nEt(n,t))}const ai=e=>!!(e&&e.__v_isRef===!0),sl=e=>le(e)?e:e==null?"":k(e)||te(e)&&(e.toString===ii||!X(e.toString))?ai(e)?sl(e.value):JSON.stringify(e,fi,2):String(e),fi=(e,t)=>ai(t)?fi(e,t.value):Pt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[rs(s,i)+" =>"]=r,n),{})}:Ht(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>rs(n))}:$e(t)?rs(t):te(t)&&!k(t)&&!oi(t)?String(t):t,rs=(e,t="")=>{var n;return $e(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** -* @vue/reactivity v3.5.16 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let ye;class rl{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=ye,!t&&ye&&(this.index=(ye.scopes||(ye.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&&--this._on===0&&(ye=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(Bt){let t=Bt;for(Bt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Kt;){let t=Kt;for(Kt=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function gi(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function mi(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),Ys(s),ol(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function Es(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(yi(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function yi(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Yt)||(e.globalVersion=Yt,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Es(e))))return;e.flags|=2;const t=e.dep,n=re,s=He;re=e,He=!0;try{gi(e);const r=e.fn(e._value);(t.version===0||ot(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{re=n,He=s,mi(e),e.flags&=-3}}function Ys(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)Ys(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function ol(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let He=!0;const vi=[];function ze(){vi.push(He),He=!1}function Qe(){const e=vi.pop();He=e===void 0?!0:e}function dr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=re;re=void 0;try{t()}finally{re=n}}}let Yt=0;class ll{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 Un{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(!re||!He||re===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==re)n=this.activeLink=new ll(re,this),re.deps?(n.prevDep=re.depsTail,re.depsTail.nextDep=n,re.depsTail=n):re.deps=re.depsTail=n,_i(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=re.depsTail,n.nextDep=void 0,re.depsTail.nextDep=n,re.depsTail=n,re.deps===n&&(re.deps=s)}return n}trigger(t){this.version++,Yt++,this.notify(t)}notify(t){Gs();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Xs()}}}function _i(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)_i(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const In=new WeakMap,yt=Symbol(""),Cs=Symbol(""),Jt=Symbol("");function _e(e,t,n){if(He&&re){let s=In.get(e);s||In.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new Un),r.map=s,r.key=n),r.track()}}function Xe(e,t,n,s,r,i){const o=In.get(e);if(!o){Yt++;return}const l=c=>{c&&c.trigger()};if(Gs(),t==="clear")o.forEach(l);else{const c=k(e),f=c&&Ws(n);if(c&&n==="length"){const a=Number(s);o.forEach((h,y)=>{(y==="length"||y===Jt||!$e(y)&&y>=a)&&l(h)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),f&&l(o.get(Jt)),t){case"add":c?f&&l(o.get("length")):(l(o.get(yt)),Pt(e)&&l(o.get(Cs)));break;case"delete":c||(l(o.get(yt)),Pt(e)&&l(o.get(Cs)));break;case"set":Pt(e)&&l(o.get(yt));break}}Xs()}function cl(e,t){const n=In.get(e);return n&&n.get(t)}function Rt(e){const t=Q(e);return t===e?t:(_e(t,"iterate",Jt),Ie(e)?t:t.map(he))}function Wn(e){return _e(e=Q(e),"iterate",Jt),e}const al={__proto__:null,[Symbol.iterator](){return os(this,Symbol.iterator,he)},concat(...e){return Rt(this).concat(...e.map(t=>k(t)?Rt(t):t))},entries(){return os(this,"entries",e=>(e[1]=he(e[1]),e))},every(e,t){return Be(this,"every",e,t,void 0,arguments)},filter(e,t){return Be(this,"filter",e,t,n=>n.map(he),arguments)},find(e,t){return Be(this,"find",e,t,he,arguments)},findIndex(e,t){return Be(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Be(this,"findLast",e,t,he,arguments)},findLastIndex(e,t){return Be(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Be(this,"forEach",e,t,void 0,arguments)},includes(...e){return ls(this,"includes",e)},indexOf(...e){return ls(this,"indexOf",e)},join(e){return Rt(this).join(e)},lastIndexOf(...e){return ls(this,"lastIndexOf",e)},map(e,t){return Be(this,"map",e,t,void 0,arguments)},pop(){return kt(this,"pop")},push(...e){return kt(this,"push",e)},reduce(e,...t){return hr(this,"reduce",e,t)},reduceRight(e,...t){return hr(this,"reduceRight",e,t)},shift(){return kt(this,"shift")},some(e,t){return Be(this,"some",e,t,void 0,arguments)},splice(...e){return kt(this,"splice",e)},toReversed(){return Rt(this).toReversed()},toSorted(e){return Rt(this).toSorted(e)},toSpliced(...e){return Rt(this).toSpliced(...e)},unshift(...e){return kt(this,"unshift",e)},values(){return os(this,"values",he)}};function os(e,t,n){const s=Wn(e),r=s[t]();return s!==e&&!Ie(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.value&&(i.value=n(i.value)),i}),r}const fl=Array.prototype;function Be(e,t,n,s,r,i){const o=Wn(e),l=o!==e&&!Ie(e),c=o[t];if(c!==fl[t]){const h=c.apply(e,i);return l?he(h):h}let f=n;o!==e&&(l?f=function(h,y){return n.call(this,he(h),y,e)}:n.length>2&&(f=function(h,y){return n.call(this,h,y,e)}));const a=c.call(o,f,s);return l&&r?r(a):a}function hr(e,t,n,s){const r=Wn(e);let i=n;return r!==e&&(Ie(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,he(l),c,e)}),r[t](i,...s)}function ls(e,t,n){const s=Q(e);_e(s,"iterate",Jt);const r=s[t](...n);return(r===-1||r===!1)&&Js(n[0])?(n[0]=Q(n[0]),s[t](...n)):r}function kt(e,t,n=[]){ze(),Gs();const s=Q(e)[t].apply(e,n);return Xs(),Qe(),s}const ul=Vs("__proto__,__v_isRef,__isVue"),bi=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter($e));function dl(e){$e(e)||(e=String(e));const t=Q(this);return _e(t,"has",e),t.hasOwnProperty(e)}class wi{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?Ai:Ci:i?Ei:Ti).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=k(t);if(!r){let c;if(o&&(c=al[n]))return c;if(n==="hasOwnProperty")return dl}const l=Reflect.get(t,n,fe(t)?t:s);return($e(n)?bi.has(n):ul(n))||(r||_e(t,"get",n),i)?l:fe(l)?o&&Ws(n)?l:l.value:te(l)?r?Bn(l):Dt(l):l}}class Si extends wi{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];if(!this._isShallow){const c=lt(i);if(!Ie(s)&&!lt(s)&&(i=Q(i),s=Q(s)),!k(t)&&fe(i)&&!fe(s))return c?!1:(i.value=s,!0)}const o=k(t)&&Ws(n)?Number(n)e,hn=e=>Reflect.getPrototypeOf(e);function yl(e,t,n){return function(...s){const r=this.__v_raw,i=Q(r),o=Pt(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,f=r[e](...s),a=n?As:t?Pn:he;return!t&&_e(i,"iterate",c?Cs:yt),{next(){const{value:h,done:y}=f.next();return y?{value:h,done:y}:{value:l?[a(h[0]),a(h[1])]:a(h),done:y}},[Symbol.iterator](){return this}}}}function pn(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function vl(e,t){const n={get(r){const i=this.__v_raw,o=Q(i),l=Q(r);e||(ot(r,l)&&_e(o,"get",r),_e(o,"get",l));const{has:c}=hn(o),f=t?As:e?Pn:he;if(c.call(o,r))return f(i.get(r));if(c.call(o,l))return f(i.get(l));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&_e(Q(r),"iterate",yt),Reflect.get(r,"size",r)},has(r){const i=this.__v_raw,o=Q(i),l=Q(r);return e||(ot(r,l)&&_e(o,"has",r),_e(o,"has",l)),r===l?i.has(r):i.has(r)||i.has(l)},forEach(r,i){const o=this,l=o.__v_raw,c=Q(l),f=t?As:e?Pn:he;return!e&&_e(c,"iterate",yt),l.forEach((a,h)=>r.call(i,f(a),f(h),o))}};return de(n,e?{add:pn("add"),set:pn("set"),delete:pn("delete"),clear:pn("clear")}:{add(r){!t&&!Ie(r)&&!lt(r)&&(r=Q(r));const i=Q(this);return hn(i).has.call(i,r)||(i.add(r),Xe(i,"add",r,r)),this},set(r,i){!t&&!Ie(i)&&!lt(i)&&(i=Q(i));const o=Q(this),{has:l,get:c}=hn(o);let f=l.call(o,r);f||(r=Q(r),f=l.call(o,r));const a=c.call(o,r);return o.set(r,i),f?ot(i,a)&&Xe(o,"set",r,i):Xe(o,"add",r,i),this},delete(r){const i=Q(this),{has:o,get:l}=hn(i);let c=o.call(i,r);c||(r=Q(r),c=o.call(i,r)),l&&l.call(i,r);const f=i.delete(r);return c&&Xe(i,"delete",r,void 0),f},clear(){const r=Q(this),i=r.size!==0,o=r.clear();return i&&Xe(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=yl(r,e,t)}),n}function Kn(e,t){const n=vl(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(Z(n,r)&&r in s?n:s,r,i)}const _l={get:Kn(!1,!1)},bl={get:Kn(!1,!0)},wl={get:Kn(!0,!1)},Sl={get:Kn(!0,!0)},Ti=new WeakMap,Ei=new WeakMap,Ci=new WeakMap,Ai=new WeakMap;function xl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Tl(e){return e.__v_skip||!Object.isExtensible(e)?0:xl(qo(e))}function Dt(e){return lt(e)?e:qn(e,!1,hl,_l,Ti)}function El(e){return qn(e,!1,gl,bl,Ei)}function Bn(e){return qn(e,!0,pl,wl,Ci)}function Of(e){return qn(e,!0,ml,Sl,Ai)}function qn(e,t,n,s,r){if(!te(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=Tl(e);if(i===0)return e;const o=r.get(e);if(o)return o;const l=new Proxy(e,i===2?s:n);return r.set(e,l),l}function vt(e){return lt(e)?vt(e.__v_raw):!!(e&&e.__v_isReactive)}function lt(e){return!!(e&&e.__v_isReadonly)}function Ie(e){return!!(e&&e.__v_isShallow)}function Js(e){return e?!!e.__v_raw:!1}function Q(e){const t=e&&e.__v_raw;return t?Q(t):e}function Cn(e){return!Z(e,"__v_skip")&&Object.isExtensible(e)&&li(e,"__v_skip",!0),e}const he=e=>te(e)?Dt(e):e,Pn=e=>te(e)?Bn(e):e;function fe(e){return e?e.__v_isRef===!0:!1}function _t(e){return Ri(e,!1)}function Pe(e){return Ri(e,!0)}function Ri(e,t){return fe(e)?e:new Cl(e,t)}class Cl{constructor(t,n){this.dep=new Un,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:Q(t),this._value=n?t:he(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Ie(t)||lt(t);t=s?t:Q(t),ot(t,n)&&(this._rawValue=t,this._value=s?t:he(t),this.dep.trigger())}}function zs(e){return fe(e)?e.value:e}function ce(e){return X(e)?e():zs(e)}const Al={get:(e,t,n)=>t==="__v_raw"?e:zs(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return fe(r)&&!fe(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Oi(e){return vt(e)?e:new Proxy(e,Al)}class Rl{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new Un,{get:s,set:r}=t(n.track.bind(n),n.trigger.bind(n));this._get=s,this._set=r}get value(){return this._value=this._get()}set value(t){this._set(t)}}function Ol(e){return new Rl(e)}class Ml{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,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 cl(Q(this._object),this._key)}}class Il{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 Pl(e,t,n){return fe(e)?e:X(e)?new Il(e):te(e)&&arguments.length>1?Ll(e,t,n):_t(e)}function Ll(e,t,n){const s=e[t];return fe(s)?s:new Ml(e,t,n)}class Nl{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Un(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Yt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&re!==this)return pi(this,!0),!0}get value(){const t=this.dep.track();return yi(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Dl(e,t,n=!1){let s,r;return X(e)?s=e:(s=e.get,r=e.set),new Nl(s,r,n)}const gn={},Ln=new WeakMap;let gt;function Fl(e,t=!1,n=gt){if(n){let s=Ln.get(n);s||Ln.set(n,s=[]),s.push(e)}}function Hl(e,t,n=ne){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:c}=n,f=g=>r?g:Ie(g)||r===!1||r===0?Ye(g,1):Ye(g);let a,h,y,v,R=!1,L=!1;if(fe(e)?(h=()=>e.value,R=Ie(e)):vt(e)?(h=()=>f(e),R=!0):k(e)?(L=!0,R=e.some(g=>vt(g)||Ie(g)),h=()=>e.map(g=>{if(fe(g))return g.value;if(vt(g))return f(g);if(X(g))return c?c(g,2):g()})):X(e)?t?h=c?()=>c(e,2):e:h=()=>{if(y){ze();try{y()}finally{Qe()}}const g=gt;gt=a;try{return c?c(e,3,[v]):e(v)}finally{gt=g}}:h=Ke,t&&r){const g=h,O=r===!0?1/0:r;h=()=>Ye(g(),O)}const q=ui(),F=()=>{a.stop(),q&&q.active&&Us(q.effects,a)};if(i&&t){const g=t;t=(...O)=>{g(...O),F()}}let B=L?new Array(e.length).fill(gn):gn;const p=g=>{if(!(!(a.flags&1)||!a.dirty&&!g))if(t){const O=a.run();if(r||R||(L?O.some((U,C)=>ot(U,B[C])):ot(O,B))){y&&y();const U=gt;gt=a;try{const C=[O,B===gn?void 0:L&&B[0]===gn?[]:B,v];B=O,c?c(t,3,C):t(...C)}finally{gt=U}}}else a.run()};return l&&l(p),a=new di(h),a.scheduler=o?()=>o(p,!1):p,v=g=>Fl(g,!1,a),y=a.onStop=()=>{const g=Ln.get(a);if(g){if(c)c(g,4);else for(const O of g)O();Ln.delete(a)}},t?s?p(!0):B=a.run():o?o(p.bind(null,!0),!0):a.run(),F.pause=a.pause.bind(a),F.resume=a.resume.bind(a),F.stop=F,F}function Ye(e,t=1/0,n){if(t<=0||!te(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,fe(e))Ye(e.value,t,n);else if(k(e))for(let s=0;s{Ye(s,t,n)});else if(oi(e)){for(const s in e)Ye(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&Ye(e[s],t,n)}return e}/** -* @vue/runtime-core v3.5.16 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function ln(e,t,n,s){try{return s?e(...s):e()}catch(r){Gn(r,t,n)}}function je(e,t,n,s){if(X(e)){const r=ln(e,t,n,s);return r&&ri(r)&&r.catch(i=>{Gn(i,t,n)}),r}if(k(e)){const r=[];for(let i=0;i>>1,r=we[s],i=zt(r);i=zt(n)?we.push(e):we.splice(jl(t),0,e),e.flags|=1,Ii()}}function Ii(){Nn||(Nn=Mi.then(Pi))}function Vl(e){k(e)?Nt.push(...e):st&&e.id===-1?st.splice(Mt+1,0,e):e.flags&1||(Nt.push(e),e.flags|=1),Ii()}function pr(e,t,n=Ue+1){for(;nzt(n)-zt(s));if(Nt.length=0,st){st.push(...t);return}for(st=t,Mt=0;Mte.id==null?e.flags&2?-1:1/0:e.id;function Pi(e){try{for(Ue=0;Ue{s._d&&Cr(-1);const i=Fn(t);let o;try{o=e(...r)}finally{Fn(i),s._d&&Cr(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function Mf(e,t){if(ae===null)return e;const n=Zn(ae),s=e.dirs||(e.dirs=[]);for(let r=0;re.__isTeleport,rt=Symbol("_leaveCb"),mn=Symbol("_enterCb");function Wl(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return $t(()=>{e.isMounted=!0}),Wi(()=>{e.isUnmounting=!0}),e}const Re=[Function,Array],Di={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},Fi=e=>{const t=e.subTree;return t.component?Fi(t.component):t},Kl={name:"BaseTransition",props:Di,setup(e,{slots:t}){const n=an(),s=Wl();return()=>{const r=t.default&&ji(t.default(),!0);if(!r||!r.length)return;const i=Hi(r),o=Q(e),{mode:l}=o;if(s.isLeaving)return cs(i);const c=gr(i);if(!c)return cs(i);let f=Rs(c,o,s,n,h=>f=h);c.type!==pe&&Qt(c,f);let a=n.subTree&&gr(n.subTree);if(a&&a.type!==pe&&!mt(c,a)&&Fi(n).type!==pe){let h=Rs(a,o,s,n);if(Qt(a,h),l==="out-in"&&c.type!==pe)return s.isLeaving=!0,h.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete h.afterLeave,a=void 0},cs(i);l==="in-out"&&c.type!==pe?h.delayLeave=(y,v,R)=>{const L=$i(s,a);L[String(a.key)]=a,y[rt]=()=>{v(),y[rt]=void 0,delete f.delayedLeave,a=void 0},f.delayedLeave=()=>{R(),delete f.delayedLeave,a=void 0}}:a=void 0}else a&&(a=void 0);return i}}};function Hi(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==pe){t=n;break}}return t}const Bl=Kl;function $i(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Rs(e,t,n,s,r){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:c,onEnter:f,onAfterEnter:a,onEnterCancelled:h,onBeforeLeave:y,onLeave:v,onAfterLeave:R,onLeaveCancelled:L,onBeforeAppear:q,onAppear:F,onAfterAppear:B,onAppearCancelled:p}=t,g=String(e.key),O=$i(n,e),U=(T,M)=>{T&&je(T,s,9,M)},C=(T,M)=>{const V=M[1];U(T,M),k(T)?T.every(w=>w.length<=1)&&V():T.length<=1&&V()},K={mode:o,persisted:l,beforeEnter(T){let M=c;if(!n.isMounted)if(i)M=q||c;else return;T[rt]&&T[rt](!0);const V=O[g];V&&mt(e,V)&&V.el[rt]&&V.el[rt](),U(M,[T])},enter(T){let M=f,V=a,w=h;if(!n.isMounted)if(i)M=F||f,V=B||a,w=p||h;else return;let H=!1;const N=T[mn]=J=>{H||(H=!0,J?U(w,[T]):U(V,[T]),K.delayedLeave&&K.delayedLeave(),T[mn]=void 0)};M?C(M,[T,N]):N()},leave(T,M){const V=String(e.key);if(T[mn]&&T[mn](!0),n.isUnmounting)return M();U(y,[T]);let w=!1;const H=T[rt]=N=>{w||(w=!0,M(),N?U(L,[T]):U(R,[T]),T[rt]=void 0,O[V]===e&&delete O[V])};O[V]=e,v?C(v,[T,H]):H()},clone(T){const M=Rs(T,t,n,s,r);return r&&r(M),M}};return K}function cs(e){if(Xn(e))return e=ct(e),e.children=null,e}function gr(e){if(!Xn(e))return Ni(e.type)&&e.children?Hi(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&X(n.default))return n.default()}}function Qt(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Qt(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 ji(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;iZt(R,t&&(k(t)?t[L]:t),n,s,r));return}if(bt(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&Zt(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?Zn(s.component):s.el,o=r?null:i,{i:l,r:c}=e,f=t&&t.r,a=l.refs===ne?l.refs={}:l.refs,h=l.setupState,y=Q(h),v=h===ne?()=>!1:R=>Z(y,R);if(f!=null&&f!==c&&(le(f)?(a[f]=null,v(f)&&(h[f]=null)):fe(f)&&(f.value=null)),X(c))ln(c,l,12,[o,a]);else{const R=le(c),L=fe(c);if(R||L){const q=()=>{if(e.f){const F=R?v(c)?h[c]:a[c]:c.value;r?k(F)&&Us(F,i):k(F)?F.includes(i)||F.push(i):R?(a[c]=[i],v(c)&&(h[c]=a[c])):(c.value=[i],e.k&&(a[e.k]=c.value))}else R?(a[c]=o,v(c)&&(h[c]=o)):L&&(c.value=o,e.k&&(a[e.k]=o))};o?(q.id=-1,Ce(q,n)):q()}}}let mr=!1;const Ot=()=>{mr||(console.error("Hydration completed but contains mismatches."),mr=!0)},ql=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",Gl=e=>e.namespaceURI.includes("MathML"),yn=e=>{if(e.nodeType===1){if(ql(e))return"svg";if(Gl(e))return"mathml"}},vn=e=>e.nodeType===8;function Xl(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:f}}=e,a=(p,g)=>{if(!g.hasChildNodes()){n(null,p,g),Dn(),g._vnode=p;return}h(g.firstChild,p,null,null,null),Dn(),g._vnode=p},h=(p,g,O,U,C,K=!1)=>{K=K||!!g.dynamicChildren;const T=vn(p)&&p.data==="[",M=()=>L(p,g,O,U,C,T),{type:V,ref:w,shapeFlag:H,patchFlag:N}=g;let J=p.nodeType;g.el=p,N===-2&&(K=!1,g.dynamicChildren=null);let D=null;switch(V){case xt:J!==3?g.children===""?(c(g.el=r(""),o(p),p),D=p):D=M():(p.data!==g.children&&(Ot(),p.data=g.children),D=i(p));break;case pe:B(p)?(D=i(p),F(g.el=p.content.firstChild,p,O)):J!==8||T?D=M():D=i(p);break;case Gt:if(T&&(p=i(p),J=p.nodeType),J===1||J===3){D=p;const Y=!g.children.length;for(let $=0;${K=K||!!g.dynamicChildren;const{type:T,props:M,patchFlag:V,shapeFlag:w,dirs:H,transition:N}=g,J=T==="input"||T==="option";if(J||V!==-1){H&&We(g,null,O,"created");let D=!1;if(B(p)){D=oo(null,N)&&O&&O.vnode.props&&O.vnode.props.appear;const $=p.content.firstChild;if(D){const oe=$.getAttribute("class");oe&&($.$cls=oe),N.beforeEnter($)}F($,p,O),g.el=p=$}if(w&16&&!(M&&(M.innerHTML||M.textContent))){let $=v(p.firstChild,g,p,O,U,C,K);for(;$;){_n(p,1)||Ot();const oe=$;$=$.nextSibling,l(oe)}}else if(w&8){let $=g.children;$[0]===` -`&&(p.tagName==="PRE"||p.tagName==="TEXTAREA")&&($=$.slice(1)),p.textContent!==$&&(_n(p,0)||Ot(),p.textContent=g.children)}if(M){if(J||!K||V&48){const $=p.tagName.includes("-");for(const oe in M)(J&&(oe.endsWith("value")||oe==="indeterminate")||rn(oe)&&!Lt(oe)||oe[0]==="."||$)&&s(p,oe,null,M[oe],void 0,O)}else if(M.onClick)s(p,"onClick",null,M.onClick,void 0,O);else if(V&4&&vt(M.style))for(const $ in M.style)M.style[$]}let Y;(Y=M&&M.onVnodeBeforeMount)&&Oe(Y,O,g),H&&We(g,null,O,"beforeMount"),((Y=M&&M.onVnodeMounted)||H||D)&&go(()=>{Y&&Oe(Y,O,g),D&&N.enter(p),H&&We(g,null,O,"mounted")},U)}return p.nextSibling},v=(p,g,O,U,C,K,T)=>{T=T||!!g.dynamicChildren;const M=g.children,V=M.length;for(let w=0;w{const{slotScopeIds:T}=g;T&&(C=C?C.concat(T):T);const M=o(p),V=v(i(p),g,M,O,U,C,K);return V&&vn(V)&&V.data==="]"?i(g.anchor=V):(Ot(),c(g.anchor=f("]"),M,V),V)},L=(p,g,O,U,C,K)=>{if(_n(p.parentElement,1)||Ot(),g.el=null,K){const V=q(p);for(;;){const w=i(p);if(w&&w!==V)l(w);else break}}const T=i(p),M=o(p);return l(p),n(null,g,M,T,O,U,yn(M),C),O&&(O.vnode.el=g.el,ho(O,g.el)),T},q=(p,g="[",O="]")=>{let U=0;for(;p;)if(p=i(p),p&&vn(p)&&(p.data===g&&U++,p.data===O)){if(U===0)return i(p);U--}return p},F=(p,g,O)=>{const U=g.parentNode;U&&U.replaceChild(p,g);let C=O;for(;C;)C.vnode.el===g&&(C.vnode.el=C.subTree.el=p),C=C.parent},B=p=>p.nodeType===1&&p.tagName==="TEMPLATE";return[a,h]}const yr="data-allow-mismatch",Yl={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function _n(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(yr);)e=e.parentElement;const n=e&&e.getAttribute(yr);if(n==null)return!1;if(n==="")return!0;{const s=n.split(",");return t===0&&s.includes("children")?!0:n.split(",").includes(Yl[t])}}kn().requestIdleCallback;kn().cancelIdleCallback;const bt=e=>!!e.type.__asyncLoader,Xn=e=>e.type.__isKeepAlive;function Jl(e,t){Ui(e,"a",t)}function zl(e,t){Ui(e,"da",t)}function Ui(e,t,n=ue){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(Yn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)Xn(r.parent.vnode)&&Ql(s,t,n,r),r=r.parent}}function Ql(e,t,n,s){const r=Yn(t,e,s,!0);Jn(()=>{Us(s[t],r)},n)}function Yn(e,t,n=ue,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{ze();const l=fn(n),c=je(t,n,e,o);return l(),Qe(),c});return s?r.unshift(i):r.push(i),i}}const tt=e=>(t,n=ue)=>{(!nn||e==="sp")&&Yn(e,(...s)=>t(...s),n)},Zl=tt("bm"),$t=tt("m"),ec=tt("bu"),tc=tt("u"),Wi=tt("bum"),Jn=tt("um"),nc=tt("sp"),sc=tt("rtg"),rc=tt("rtc");function ic(e,t=ue){Yn("ec",e,t)}const Ki="components";function If(e,t){return qi(Ki,e,!0,t)||e}const Bi=Symbol.for("v-ndc");function Pf(e){return le(e)?qi(Ki,e,!1)||e:e||Bi}function qi(e,t,n=!0,s=!1){const r=ae||ue;if(r){const i=r.type;{const l=Wc(i,!1);if(l&&(l===t||l===De(t)||l===Vn(De(t))))return i}const o=vr(r[e]||i[e],t)||vr(r.appContext[e],t);return!o&&s?i:o}}function vr(e,t){return e&&(e[t]||e[De(t)]||e[Vn(De(t))])}function Lf(e,t,n,s){let r;const i=n,o=k(e);if(o||le(e)){const l=o&&vt(e);let c=!1,f=!1;l&&(c=!Ie(e),f=lt(e),e=Wn(e)),r=new Array(e.length);for(let a=0,h=e.length;at(l,c,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let c=0,f=l.length;ctn(t)?!(t.type===pe||t.type===Se&&!Gi(t.children)):!0)?e:null}function Df(e,t){const n={};for(const s in e)n[/[A-Z]/.test(s)?`on:${s}`:Tn(s)]=e[s];return n}const Os=e=>e?bo(e)?Zn(e):Os(e.parent):null,qt=de(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=>Os(e.parent),$root:e=>Os(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Yi(e),$forceUpdate:e=>e.f||(e.f=()=>{Qs(e.update)}),$nextTick:e=>e.n||(e.n=cn.bind(e.proxy)),$watch:e=>Ac.bind(e)}),as=(e,t)=>e!==ne&&!e.__isScriptSetup&&Z(e,t),oc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,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 s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(as(s,t))return o[t]=1,s[t];if(r!==ne&&Z(r,t))return o[t]=2,r[t];if((f=e.propsOptions[0])&&Z(f,t))return o[t]=3,i[t];if(n!==ne&&Z(n,t))return o[t]=4,n[t];Ms&&(o[t]=0)}}const a=qt[t];let h,y;if(a)return t==="$attrs"&&_e(e.attrs,"get",""),a(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==ne&&Z(n,t))return o[t]=4,n[t];if(y=c.config.globalProperties,Z(y,t))return y[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return as(r,t)?(r[t]=n,!0):s!==ne&&Z(s,t)?(s[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:s,appContext:r,propsOptions:i}},o){let l;return!!n[o]||e!==ne&&Z(e,o)||as(t,o)||(l=i[0])&&Z(l,o)||Z(s,o)||Z(qt,o)||Z(r.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 Ff(){return lc().slots}function lc(){const e=an();return e.setupContext||(e.setupContext=So(e))}function _r(e){return k(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Ms=!0;function cc(e){const t=Yi(e),n=e.proxy,s=e.ctx;Ms=!1,t.beforeCreate&&br(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:f,created:a,beforeMount:h,mounted:y,beforeUpdate:v,updated:R,activated:L,deactivated:q,beforeDestroy:F,beforeUnmount:B,destroyed:p,unmounted:g,render:O,renderTracked:U,renderTriggered:C,errorCaptured:K,serverPrefetch:T,expose:M,inheritAttrs:V,components:w,directives:H,filters:N}=t;if(f&&ac(f,s,null),o)for(const Y in o){const $=o[Y];X($)&&(s[Y]=$.bind(n))}if(r){const Y=r.call(n,n);te(Y)&&(e.data=Dt(Y))}if(Ms=!0,i)for(const Y in i){const $=i[Y],oe=X($)?$.bind(n,n):X($.get)?$.get.bind(n,n):Ke,un=!X($)&&X($.set)?$.set.bind(n):Ke,ut=ie({get:oe,set:un});Object.defineProperty(s,Y,{enumerable:!0,configurable:!0,get:()=>ut.value,set:Ve=>ut.value=Ve})}if(l)for(const Y in l)Xi(l[Y],s,n,Y);if(c){const Y=X(c)?c.call(n):c;Reflect.ownKeys(Y).forEach($=>{gc($,Y[$])})}a&&br(a,e,"c");function D(Y,$){k($)?$.forEach(oe=>Y(oe.bind(n))):$&&Y($.bind(n))}if(D(Zl,h),D($t,y),D(ec,v),D(tc,R),D(Jl,L),D(zl,q),D(ic,K),D(rc,U),D(sc,C),D(Wi,B),D(Jn,g),D(nc,T),k(M))if(M.length){const Y=e.exposed||(e.exposed={});M.forEach($=>{Object.defineProperty(Y,$,{get:()=>n[$],set:oe=>n[$]=oe})})}else e.exposed||(e.exposed={});O&&e.render===Ke&&(e.render=O),V!=null&&(e.inheritAttrs=V),w&&(e.components=w),H&&(e.directives=H),T&&ki(e)}function ac(e,t,n=Ke){k(e)&&(e=Is(e));for(const s in e){const r=e[s];let i;te(r)?"default"in r?i=St(r.from||s,r.default,!0):i=St(r.from||s):i=St(r),fe(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function br(e,t,n){je(k(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Xi(e,t,n,s){let r=s.includes(".")?fo(n,s):()=>n[s];if(le(e)){const i=t[e];X(i)&&Le(r,i)}else if(X(e))Le(r,e.bind(n));else if(te(e))if(k(e))e.forEach(i=>Xi(i,t,n,s));else{const i=X(e.handler)?e.handler.bind(n):t[e.handler];X(i)&&Le(r,i,e)}}function Yi(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(f=>Hn(c,f,o,!0)),Hn(c,t,o)),te(t)&&i.set(t,c),c}function Hn(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&Hn(e,i,n,!0),r&&r.forEach(o=>Hn(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=fc[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const fc={data:wr,props:Sr,emits:Sr,methods:Wt,computed:Wt,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:Wt,directives:Wt,watch:dc,provide:wr,inject:uc};function wr(e,t){return t?e?function(){return de(X(e)?e.call(this,this):e,X(t)?t.call(this,this):t)}:t:e}function uc(e,t){return Wt(Is(e),Is(t))}function Is(e){if(k(e)){const t={};for(let n=0;n1)return n&&X(t)?t.call(s&&s.proxy):t}}function zi(){return!!(ue||ae||wt)}const Qi={},Zi=()=>Object.create(Qi),eo=e=>Object.getPrototypeOf(e)===Qi;function mc(e,t,n,s=!1){const r={},i=Zi();e.propsDefaults=Object.create(null),to(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:El(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function yc(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=Q(r),[c]=e.propsOptions;let f=!1;if((s||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[y,v]=no(h,t,!0);de(o,y),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 te(e)&&s.set(e,It),It;if(k(i))for(let a=0;ae[0]==="_"||e==="$stable",er=e=>k(e)?e.map(Me):[Me(e)],_c=(e,t,n)=>{if(t._n)return t;const s=kl((...r)=>er(t(...r)),n);return s._c=!1,s},so=(e,t,n)=>{const s=e._ctx;for(const r in e){if(Zs(r))continue;const i=e[r];if(X(i))t[r]=_c(r,i,s);else if(i!=null){const o=er(i);t[r]=()=>o}}},ro=(e,t)=>{const n=er(t);e.slots.default=()=>n},io=(e,t,n)=>{for(const s in t)(n||!Zs(s))&&(e[s]=t[s])},bc=(e,t,n)=>{const s=e.slots=Zi();if(e.vnode.shapeFlag&32){const r=t._;r?(io(s,t,n),n&&li(s,"_",r,!0)):so(t,s)}else t&&ro(e,t)},wc=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=ne;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:io(r,t,n):(i=!t.$stable,so(t,r)),o=t}else t&&(ro(e,t),o={default:1});if(i)for(const l in r)!Zs(l)&&o[l]==null&&delete r[l]},Ce=go;function Sc(e){return xc(e,Xl)}function xc(e,t){const n=kn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:f,setElementText:a,parentNode:h,nextSibling:y,setScopeId:v=Ke,insertStaticContent:R}=e,L=(u,d,m,S=null,_=null,b=null,I=void 0,A=null,E=!!d.dynamicChildren)=>{if(u===d)return;u&&!mt(u,d)&&(S=dn(u),Ve(u,_,b,!0),u=null),d.patchFlag===-2&&(E=!1,d.dynamicChildren=null);const{type:x,ref:W,shapeFlag:P}=d;switch(x){case xt:q(u,d,m,S);break;case pe:F(u,d,m,S);break;case Gt:u==null&&B(d,m,S,I);break;case Se:w(u,d,m,S,_,b,I,A,E);break;default:P&1?O(u,d,m,S,_,b,I,A,E):P&6?H(u,d,m,S,_,b,I,A,E):(P&64||P&128)&&x.process(u,d,m,S,_,b,I,A,E,At)}W!=null&&_&&Zt(W,u&&u.ref,b,d||u,!d)},q=(u,d,m,S)=>{if(u==null)s(d.el=l(d.children),m,S);else{const _=d.el=u.el;d.children!==u.children&&f(_,d.children)}},F=(u,d,m,S)=>{u==null?s(d.el=c(d.children||""),m,S):d.el=u.el},B=(u,d,m,S)=>{[u.el,u.anchor]=R(u.children,d,m,S,u.el,u.anchor)},p=({el:u,anchor:d},m,S)=>{let _;for(;u&&u!==d;)_=y(u),s(u,m,S),u=_;s(d,m,S)},g=({el:u,anchor:d})=>{let m;for(;u&&u!==d;)m=y(u),r(u),u=m;r(d)},O=(u,d,m,S,_,b,I,A,E)=>{d.type==="svg"?I="svg":d.type==="math"&&(I="mathml"),u==null?U(d,m,S,_,b,I,A,E):T(u,d,_,b,I,A,E)},U=(u,d,m,S,_,b,I,A)=>{let E,x;const{props:W,shapeFlag:P,transition:j,dirs:G}=u;if(E=u.el=o(u.type,b,W&&W.is,W),P&8?a(E,u.children):P&16&&K(u.children,E,null,S,_,fs(u,b),I,A),G&&We(u,null,S,"created"),C(E,u,u.scopeId,I,S),W){for(const se in W)se!=="value"&&!Lt(se)&&i(E,se,null,W[se],b,S);"value"in W&&i(E,"value",null,W.value,b),(x=W.onVnodeBeforeMount)&&Oe(x,S,u)}G&&We(u,null,S,"beforeMount");const z=oo(_,j);z&&j.beforeEnter(E),s(E,d,m),((x=W&&W.onVnodeMounted)||z||G)&&Ce(()=>{x&&Oe(x,S,u),z&&j.enter(E),G&&We(u,null,S,"mounted")},_)},C=(u,d,m,S,_)=>{if(m&&v(u,m),S)for(let b=0;b{for(let x=E;x{const A=d.el=u.el;let{patchFlag:E,dynamicChildren:x,dirs:W}=d;E|=u.patchFlag&16;const P=u.props||ne,j=d.props||ne;let G;if(m&&dt(m,!1),(G=j.onVnodeBeforeUpdate)&&Oe(G,m,d,u),W&&We(d,u,m,"beforeUpdate"),m&&dt(m,!0),(P.innerHTML&&j.innerHTML==null||P.textContent&&j.textContent==null)&&a(A,""),x?M(u.dynamicChildren,x,A,m,S,fs(d,_),b):I||$(u,d,A,null,m,S,fs(d,_),b,!1),E>0){if(E&16)V(A,P,j,m,_);else if(E&2&&P.class!==j.class&&i(A,"class",null,j.class,_),E&4&&i(A,"style",P.style,j.style,_),E&8){const z=d.dynamicProps;for(let se=0;se{G&&Oe(G,m,d,u),W&&We(d,u,m,"updated")},S)},M=(u,d,m,S,_,b,I)=>{for(let A=0;A{if(d!==m){if(d!==ne)for(const b in d)!Lt(b)&&!(b in m)&&i(u,b,d[b],null,_,S);for(const b in m){if(Lt(b))continue;const I=m[b],A=d[b];I!==A&&b!=="value"&&i(u,b,A,I,_,S)}"value"in m&&i(u,"value",d.value,m.value,_)}},w=(u,d,m,S,_,b,I,A,E)=>{const x=d.el=u?u.el:l(""),W=d.anchor=u?u.anchor:l("");let{patchFlag:P,dynamicChildren:j,slotScopeIds:G}=d;G&&(A=A?A.concat(G):G),u==null?(s(x,m,S),s(W,m,S),K(d.children||[],m,W,_,b,I,A,E)):P>0&&P&64&&j&&u.dynamicChildren?(M(u.dynamicChildren,j,m,_,b,I,A),(d.key!=null||_&&d===_.subTree)&&lo(u,d,!0)):$(u,d,m,W,_,b,I,A,E)},H=(u,d,m,S,_,b,I,A,E)=>{d.slotScopeIds=A,u==null?d.shapeFlag&512?_.ctx.activate(d,m,S,I,E):N(d,m,S,_,b,I,E):J(u,d,E)},N=(u,d,m,S,_,b,I)=>{const A=u.component=jc(u,S,_);if(Xn(u)&&(A.ctx.renderer=At),Vc(A,!1,I),A.asyncDep){if(_&&_.registerDep(A,D,I),!u.el){const E=A.subTree=ge(pe);F(null,E,d,m)}}else D(A,u,d,m,_,b,I)},J=(u,d,m)=>{const S=d.component=u.component;if(Pc(u,d,m))if(S.asyncDep&&!S.asyncResolved){Y(S,d,m);return}else S.next=d,S.update();else d.el=u.el,S.vnode=d},D=(u,d,m,S,_,b,I)=>{const A=()=>{if(u.isMounted){let{next:P,bu:j,u:G,parent:z,vnode:se}=u;{const Te=co(u);if(Te){P&&(P.el=se.el,Y(u,P,I)),Te.asyncDep.then(()=>{u.isUnmounted||A()});return}}let ee=P,xe;dt(u,!1),P?(P.el=se.el,Y(u,P,I)):P=se,j&&En(j),(xe=P.props&&P.props.onVnodeBeforeUpdate)&&Oe(xe,z,P,se),dt(u,!0);const me=us(u),Fe=u.subTree;u.subTree=me,L(Fe,me,h(Fe.el),dn(Fe),u,_,b),P.el=me.el,ee===null&&ho(u,me.el),G&&Ce(G,_),(xe=P.props&&P.props.onVnodeUpdated)&&Ce(()=>Oe(xe,z,P,se),_)}else{let P;const{el:j,props:G}=d,{bm:z,m:se,parent:ee,root:xe,type:me}=u,Fe=bt(d);if(dt(u,!1),z&&En(z),!Fe&&(P=G&&G.onVnodeBeforeMount)&&Oe(P,ee,d),dt(u,!0),j&&ss){const Te=()=>{u.subTree=us(u),ss(j,u.subTree,u,_,null)};Fe&&me.__asyncHydrate?me.__asyncHydrate(j,u,Te):Te()}else{xe.ce&&xe.ce._injectChildStyle(me);const Te=u.subTree=us(u);L(null,Te,m,S,u,_,b),d.el=Te.el}if(se&&Ce(se,_),!Fe&&(P=G&&G.onVnodeMounted)){const Te=d;Ce(()=>Oe(P,ee,Te),_)}(d.shapeFlag&256||ee&&bt(ee.vnode)&&ee.vnode.shapeFlag&256)&&u.a&&Ce(u.a,_),u.isMounted=!0,d=m=S=null}};u.scope.on();const E=u.effect=new di(A);u.scope.off();const x=u.update=E.run.bind(E),W=u.job=E.runIfDirty.bind(E);W.i=u,W.id=u.uid,E.scheduler=()=>Qs(W),dt(u,!0),x()},Y=(u,d,m)=>{d.component=u;const S=u.vnode.props;u.vnode=d,u.next=null,yc(u,d.props,S,m),wc(u,d.children,m),ze(),pr(u),Qe()},$=(u,d,m,S,_,b,I,A,E=!1)=>{const x=u&&u.children,W=u?u.shapeFlag:0,P=d.children,{patchFlag:j,shapeFlag:G}=d;if(j>0){if(j&128){un(x,P,m,S,_,b,I,A,E);return}else if(j&256){oe(x,P,m,S,_,b,I,A,E);return}}G&8?(W&16&&jt(x,_,b),P!==x&&a(m,P)):W&16?G&16?un(x,P,m,S,_,b,I,A,E):jt(x,_,b,!0):(W&8&&a(m,""),G&16&&K(P,m,S,_,b,I,A,E))},oe=(u,d,m,S,_,b,I,A,E)=>{u=u||It,d=d||It;const x=u.length,W=d.length,P=Math.min(x,W);let j;for(j=0;jW?jt(u,_,b,!0,!1,P):K(d,m,S,_,b,I,A,E,P)},un=(u,d,m,S,_,b,I,A,E)=>{let x=0;const W=d.length;let P=u.length-1,j=W-1;for(;x<=P&&x<=j;){const G=u[x],z=d[x]=E?it(d[x]):Me(d[x]);if(mt(G,z))L(G,z,m,null,_,b,I,A,E);else break;x++}for(;x<=P&&x<=j;){const G=u[P],z=d[j]=E?it(d[j]):Me(d[j]);if(mt(G,z))L(G,z,m,null,_,b,I,A,E);else break;P--,j--}if(x>P){if(x<=j){const G=j+1,z=Gj)for(;x<=P;)Ve(u[x],_,b,!0),x++;else{const G=x,z=x,se=new Map;for(x=z;x<=j;x++){const Ee=d[x]=E?it(d[x]):Me(d[x]);Ee.key!=null&&se.set(Ee.key,x)}let ee,xe=0;const me=j-z+1;let Fe=!1,Te=0;const Vt=new Array(me);for(x=0;x=me){Ve(Ee,_,b,!0);continue}let ke;if(Ee.key!=null)ke=se.get(Ee.key);else for(ee=z;ee<=j;ee++)if(Vt[ee-z]===0&&mt(Ee,d[ee])){ke=ee;break}ke===void 0?Ve(Ee,_,b,!0):(Vt[ke-z]=x+1,ke>=Te?Te=ke:Fe=!0,L(Ee,d[ke],m,null,_,b,I,A,E),xe++)}const cr=Fe?Tc(Vt):It;for(ee=cr.length-1,x=me-1;x>=0;x--){const Ee=z+x,ke=d[Ee],ar=Ee+1{const{el:b,type:I,transition:A,children:E,shapeFlag:x}=u;if(x&6){ut(u.component.subTree,d,m,S);return}if(x&128){u.suspense.move(d,m,S);return}if(x&64){I.move(u,d,m,At);return}if(I===Se){s(b,d,m);for(let P=0;PA.enter(b),_);else{const{leave:P,delayLeave:j,afterLeave:G}=A,z=()=>{u.ctx.isUnmounted?r(b):s(b,d,m)},se=()=>{P(b,()=>{z(),G&&G()})};j?j(b,z,se):se()}else s(b,d,m)},Ve=(u,d,m,S=!1,_=!1)=>{const{type:b,props:I,ref:A,children:E,dynamicChildren:x,shapeFlag:W,patchFlag:P,dirs:j,cacheIndex:G}=u;if(P===-2&&(_=!1),A!=null&&(ze(),Zt(A,null,m,u,!0),Qe()),G!=null&&(d.renderCache[G]=void 0),W&256){d.ctx.deactivate(u);return}const z=W&1&&j,se=!bt(u);let ee;if(se&&(ee=I&&I.onVnodeBeforeUnmount)&&Oe(ee,d,u),W&6)Wo(u.component,m,S);else{if(W&128){u.suspense.unmount(m,S);return}z&&We(u,null,d,"beforeUnmount"),W&64?u.type.remove(u,d,m,At,S):x&&!x.hasOnce&&(b!==Se||P>0&&P&64)?jt(x,d,m,!1,!0):(b===Se&&P&384||!_&&W&16)&&jt(E,d,m),S&&or(u)}(se&&(ee=I&&I.onVnodeUnmounted)||z)&&Ce(()=>{ee&&Oe(ee,d,u),z&&We(u,null,d,"unmounted")},m)},or=u=>{const{type:d,el:m,anchor:S,transition:_}=u;if(d===Se){Uo(m,S);return}if(d===Gt){g(u);return}const b=()=>{r(m),_&&!_.persisted&&_.afterLeave&&_.afterLeave()};if(u.shapeFlag&1&&_&&!_.persisted){const{leave:I,delayLeave:A}=_,E=()=>I(m,b);A?A(u.el,b,E):E()}else b()},Uo=(u,d)=>{let m;for(;u!==d;)m=y(u),r(u),u=m;r(d)},Wo=(u,d,m)=>{const{bum:S,scope:_,job:b,subTree:I,um:A,m:E,a:x,parent:W,slots:{__:P}}=u;Tr(E),Tr(x),S&&En(S),W&&k(P)&&P.forEach(j=>{W.renderCache[j]=void 0}),_.stop(),b&&(b.flags|=8,Ve(I,u,d,m)),A&&Ce(A,d),Ce(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},jt=(u,d,m,S=!1,_=!1,b=0)=>{for(let I=b;I{if(u.shapeFlag&6)return dn(u.component.subTree);if(u.shapeFlag&128)return u.suspense.next();const d=y(u.anchor||u.el),m=d&&d[Ul];return m?y(m):d};let ts=!1;const lr=(u,d,m)=>{u==null?d._vnode&&Ve(d._vnode,null,null,!0):L(d._vnode||null,u,d,null,null,null,m),d._vnode=u,ts||(ts=!0,pr(),Dn(),ts=!1)},At={p:L,um:Ve,m:ut,r:or,mt:N,mc:K,pc:$,pbc:M,n:dn,o:e};let ns,ss;return t&&([ns,ss]=t(At)),{render:lr,hydrate:ns,createApp:pc(lr,ns)}}function fs({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 dt({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function oo(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function lo(e,t,n=!1){const s=e.children,r=t.children;if(k(s)&&k(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function co(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:co(t)}function Tr(e){if(e)for(let t=0;tSt(Ec);function ao(e,t){return zn(e,null,t)}function Hf(e,t){return zn(e,null,{flush:"post"})}function Le(e,t,n){return zn(e,t,n)}function zn(e,t,n=ne){const{immediate:s,deep:r,flush:i,once:o}=n,l=de({},n),c=t&&s||!t&&i!=="post";let f;if(nn){if(i==="sync"){const v=Cc();f=v.__watcherHandles||(v.__watcherHandles=[])}else if(!c){const v=()=>{};return v.stop=Ke,v.resume=Ke,v.pause=Ke,v}}const a=ue;l.call=(v,R,L)=>je(v,a,R,L);let h=!1;i==="post"?l.scheduler=v=>{Ce(v,a&&a.suspense)}:i!=="sync"&&(h=!0,l.scheduler=(v,R)=>{R?v():Qs(v)}),l.augmentJob=v=>{t&&(v.flags|=4),h&&(v.flags|=2,a&&(v.id=a.uid,v.i=a))};const y=Hl(e,t,l);return nn&&(f?f.push(y):c&&y()),y}function Ac(e,t,n){const s=this.proxy,r=le(e)?e.includes(".")?fo(s,e):()=>s[e]:e.bind(s,s);let i;X(t)?i=t:(i=t.handler,n=t);const o=fn(this),l=zn(r,i.bind(s),n);return o(),l}function fo(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;rt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${De(t)}Modifiers`]||e[`${ft(t)}Modifiers`];function Oc(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||ne;let r=n;const i=t.startsWith("update:"),o=i&&Rc(s,t.slice(7));o&&(o.trim&&(r=n.map(a=>le(a)?a.trim():a)),o.number&&(r=n.map(Mn)));let l,c=s[l=Tn(t)]||s[l=Tn(De(t))];!c&&i&&(c=s[l=Tn(ft(t))]),c&&je(c,e,6,r);const f=s[l+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,je(f,e,6,r)}}function uo(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!X(e)){const c=f=>{const a=uo(f,t,!0);a&&(l=!0,de(o,a))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(te(e)&&s.set(e,null),null):(k(i)?i.forEach(c=>o[c]=null):de(o,i),te(e)&&s.set(e,o),o)}function Qn(e,t){return!e||!rn(t)?!1:(t=t.slice(2).replace(/Once$/,""),Z(e,t[0].toLowerCase()+t.slice(1))||Z(e,ft(t))||Z(e,t))}function us(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:c,render:f,renderCache:a,props:h,data:y,setupState:v,ctx:R,inheritAttrs:L}=e,q=Fn(e);let F,B;try{if(n.shapeFlag&4){const g=r||s,O=g;F=Me(f.call(O,g,a,h,v,y,R)),B=l}else{const g=t;F=Me(g.length>1?g(h,{attrs:l,slots:o,emit:c}):g(h,null)),B=t.props?l:Mc(l)}}catch(g){Xt.length=0,Gn(g,e,1),F=ge(pe)}let p=F;if(B&&L!==!1){const g=Object.keys(B),{shapeFlag:O}=p;g.length&&O&7&&(i&&g.some(ks)&&(B=Ic(B,i)),p=ct(p,B,!1,!0))}return n.dirs&&(p=ct(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&Qt(p,n.transition),F=p,Fn(q),F}const Mc=e=>{let t;for(const n in e)(n==="class"||n==="style"||rn(n))&&((t||(t={}))[n]=e[n]);return t},Ic=(e,t)=>{const n={};for(const s in e)(!ks(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Pc(e,t,n){const{props:s,children:r,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 s?Er(s,o,f):!!o;if(c&8){const a=t.dynamicProps;for(let h=0;he.__isSuspense;function go(e,t){t&&t.pendingBranch?k(e)?t.effects.push(...e):t.effects.push(e):Vl(e)}const Se=Symbol.for("v-fgt"),xt=Symbol.for("v-txt"),pe=Symbol.for("v-cmt"),Gt=Symbol.for("v-stc"),Xt=[];let Ae=null;function Ls(e=!1){Xt.push(Ae=e?null:[])}function Lc(){Xt.pop(),Ae=Xt[Xt.length-1]||null}let en=1;function Cr(e,t=!1){en+=e,e<0&&Ae&&t&&(Ae.hasOnce=!0)}function mo(e){return e.dynamicChildren=en>0?Ae||It:null,Lc(),en>0&&Ae&&Ae.push(e),e}function $f(e,t,n,s,r,i){return mo(vo(e,t,n,s,r,i,!0))}function Ns(e,t,n,s,r){return mo(ge(e,t,n,s,r,!0))}function tn(e){return e?e.__v_isVNode===!0:!1}function mt(e,t){return e.type===t.type&&e.key===t.key}const yo=({key:e})=>e??null,An=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?le(e)||fe(e)||X(e)?{i:ae,r:e,k:t,f:!!n}:e:null);function vo(e,t=null,n=null,s=0,r=null,i=e===Se?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&yo(t),ref:t&&An(t),scopeId:Li,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:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:ae};return l?(tr(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=le(n)?8:16),en>0&&!o&&Ae&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ae.push(c),c}const ge=Nc;function Nc(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===Bi)&&(e=pe),tn(e)){const l=ct(e,t,!0);return n&&tr(l,n),en>0&&!i&&Ae&&(l.shapeFlag&6?Ae[Ae.indexOf(e)]=l:Ae.push(l)),l.patchFlag=-2,l}if(Kc(e)&&(e=e.__vccOpts),t){t=Dc(t);let{class:l,style:c}=t;l&&!le(l)&&(t.class=Bs(l)),te(c)&&(Js(c)&&!k(c)&&(c=de({},c)),t.style=Ks(c))}const o=le(e)?1:po(e)?128:Ni(e)?64:te(e)?4:X(e)?2:0;return vo(e,t,n,s,r,o,i,!0)}function Dc(e){return e?Js(e)||eo(e)?de({},e):e:null}function ct(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:c}=e,f=t?Fc(r||{},t):r,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:f,key:f&&yo(f),ref:t&&t.ref?n&&i?k(i)?i.concat(An(t)):[i,An(t)]:An(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&&ct(e.ssContent),ssFallback:e.ssFallback&&ct(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&s&&Qt(a,c.clone(a)),a}function _o(e=" ",t=0){return ge(xt,null,e,t)}function jf(e,t){const n=ge(Gt,null,e);return n.staticCount=t,n}function Vf(e="",t=!1){return t?(Ls(),Ns(pe,null,e)):ge(pe,null,e)}function Me(e){return e==null||typeof e=="boolean"?ge(pe):k(e)?ge(Se,null,e.slice()):tn(e)?it(e):ge(xt,null,String(e))}function it(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:ct(e)}function tr(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(k(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),tr(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!eo(t)?t._ctx=ae:r===3&&ae&&(ae.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else X(t)?(t={default:t,_ctx:ae},n=32):(t=String(t),s&64?(n=16,t=[_o(t)]):n=8);e.children=t,e.shapeFlag|=n}function Fc(...e){const t={};for(let n=0;nue||ae;let $n,Ds;{const e=kn(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};$n=t("__VUE_INSTANCE_SETTERS__",n=>ue=n),Ds=t("__VUE_SSR_SETTERS__",n=>nn=n)}const fn=e=>{const t=ue;return $n(e),e.scope.on(),()=>{e.scope.off(),$n(t)}},Ar=()=>{ue&&ue.scope.off(),$n(null)};function bo(e){return e.vnode.shapeFlag&4}let nn=!1;function Vc(e,t=!1,n=!1){t&&Ds(t);const{props:s,children:r}=e.vnode,i=bo(e);mc(e,s,i,t),bc(e,r,n||t);const o=i?kc(e,t):void 0;return t&&Ds(!1),o}function kc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,oc);const{setup:s}=n;if(s){ze();const r=e.setupContext=s.length>1?So(e):null,i=fn(e),o=ln(s,e,0,[e.props,r]),l=ri(o);if(Qe(),i(),(l||e.sp)&&!bt(e)&&ki(e),l){if(o.then(Ar,Ar),t)return o.then(c=>{Rr(e,c)}).catch(c=>{Gn(c,e,0)});e.asyncDep=o}else Rr(e,o)}else wo(e)}function Rr(e,t,n){X(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:te(t)&&(e.setupState=Oi(t)),wo(e)}function wo(e,t,n){const s=e.type;e.render||(e.render=s.render||Ke);{const r=fn(e);ze();try{cc(e)}finally{Qe(),r()}}}const Uc={get(e,t){return _e(e,"get",""),e[t]}};function So(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Uc),slots:e.slots,emit:e.emit,expose:t}}function Zn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Oi(Cn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in qt)return qt[n](e)},has(t,n){return n in t||n in qt}})):e.proxy}function Wc(e,t=!0){return X(e)?e.displayName||e.name:e.name||t&&e.__name}function Kc(e){return X(e)&&"__vccOpts"in e}const ie=(e,t)=>Dl(e,t,nn);function Fs(e,t,n){const s=arguments.length;return s===2?te(t)&&!k(t)?tn(t)?ge(e,null,[t]):ge(e,t):ge(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&tn(n)&&(n=[n]),ge(e,t,n))}const Bc="3.5.16";/** -* @vue/runtime-dom v3.5.16 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let Hs;const Or=typeof window<"u"&&window.trustedTypes;if(Or)try{Hs=Or.createPolicy("vue",{createHTML:e=>e})}catch{}const xo=Hs?e=>Hs.createHTML(e):e=>e,qc="http://www.w3.org/2000/svg",Gc="http://www.w3.org/1998/Math/MathML",Ge=typeof document<"u"?document:null,Mr=Ge&&Ge.createElement("template"),Xc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?Ge.createElementNS(qc,e):t==="mathml"?Ge.createElementNS(Gc,e):n?Ge.createElement(e,{is:n}):Ge.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>Ge.createTextNode(e),createComment:e=>Ge.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ge.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{Mr.innerHTML=xo(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=Mr.content;if(s==="svg"||s==="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]}},nt="transition",Ut="animation",sn=Symbol("_vtc"),To={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},Yc=de({},Di,To),Jc=e=>(e.displayName="Transition",e.props=Yc,e),kf=Jc((e,{slots:t})=>Fs(Bl,zc(e),t)),ht=(e,t=[])=>{k(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ir=e=>e?k(e)?e.some(t=>t.length>1):e.length>1:!1;function zc(e){const t={};for(const w in e)w in To||(t[w]=e[w]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,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:y=`${n}-leave-active`,leaveToClass:v=`${n}-leave-to`}=e,R=Qc(r),L=R&&R[0],q=R&&R[1],{onBeforeEnter:F,onEnter:B,onEnterCancelled:p,onLeave:g,onLeaveCancelled:O,onBeforeAppear:U=F,onAppear:C=B,onAppearCancelled:K=p}=t,T=(w,H,N,J)=>{w._enterCancelled=J,pt(w,H?a:l),pt(w,H?f:o),N&&N()},M=(w,H)=>{w._isLeaving=!1,pt(w,h),pt(w,v),pt(w,y),H&&H()},V=w=>(H,N)=>{const J=w?C:B,D=()=>T(H,w,N);ht(J,[H,D]),Pr(()=>{pt(H,w?c:i),qe(H,w?a:l),Ir(J)||Lr(H,s,L,D)})};return de(t,{onBeforeEnter(w){ht(F,[w]),qe(w,i),qe(w,o)},onBeforeAppear(w){ht(U,[w]),qe(w,c),qe(w,f)},onEnter:V(!1),onAppear:V(!0),onLeave(w,H){w._isLeaving=!0;const N=()=>M(w,H);qe(w,h),w._enterCancelled?(qe(w,y),Fr()):(Fr(),qe(w,y)),Pr(()=>{w._isLeaving&&(pt(w,h),qe(w,v),Ir(g)||Lr(w,s,q,N))}),ht(g,[w,N])},onEnterCancelled(w){T(w,!1,void 0,!0),ht(p,[w])},onAppearCancelled(w){T(w,!0,void 0,!0),ht(K,[w])},onLeaveCancelled(w){M(w),ht(O,[w])}})}function Qc(e){if(e==null)return null;if(te(e))return[ds(e.enter),ds(e.leave)];{const t=ds(e);return[t,t]}}function ds(e){return Yo(e)}function qe(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[sn]||(e[sn]=new Set)).add(t)}function pt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[sn];n&&(n.delete(t),n.size||(e[sn]=void 0))}function Pr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Zc=0;function Lr(e,t,n,s){const r=e._endId=++Zc,i=()=>{r===e._endId&&s()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=ea(e,t);if(!o)return s();const f=o+"end";let a=0;const h=()=>{e.removeEventListener(f,y),i()},y=v=>{v.target===e&&++a>=c&&h()};setTimeout(()=>{a(n[R]||"").split(", "),r=s(`${nt}Delay`),i=s(`${nt}Duration`),o=Nr(r,i),l=s(`${Ut}Delay`),c=s(`${Ut}Duration`),f=Nr(l,c);let a=null,h=0,y=0;t===nt?o>0&&(a=nt,h=o,y=i.length):t===Ut?f>0&&(a=Ut,h=f,y=c.length):(h=Math.max(o,f),a=h>0?o>f?nt:Ut:null,y=a?a===nt?i.length:c.length:0);const v=a===nt&&/\b(transform|all)(,|$)/.test(s(`${nt}Property`).toString());return{type:a,timeout:h,propCount:y,hasTransform:v}}function Nr(e,t){for(;e.lengthDr(n)+Dr(e[s])))}function Dr(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Fr(){return document.body.offsetHeight}function ta(e,t,n){const s=e[sn];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Hr=Symbol("_vod"),na=Symbol("_vsh"),sa=Symbol(""),ra=/(^|;)\s*display\s*:/;function ia(e,t,n){const s=e.style,r=le(n);let i=!1;if(n&&!r){if(t)if(le(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&Rn(s,l,"")}else for(const o in t)n[o]==null&&Rn(s,o,"");for(const o in n)o==="display"&&(i=!0),Rn(s,o,n[o])}else if(r){if(t!==n){const o=s[sa];o&&(n+=";"+o),s.cssText=n,i=ra.test(n)}}else t&&e.removeAttribute("style");Hr in e&&(e[Hr]=i?s.display:"",e[na]&&(s.display="none"))}const $r=/\s*!important$/;function Rn(e,t,n){if(k(n))n.forEach(s=>Rn(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=oa(e,t);$r.test(n)?e.setProperty(ft(s),n.replace($r,""),"important"):e[s]=n}}const jr=["Webkit","Moz","ms"],hs={};function oa(e,t){const n=hs[t];if(n)return n;let s=De(t);if(s!=="filter"&&s in e)return hs[t]=s;s=Vn(s);for(let r=0;rps||(fa.then(()=>ps=0),ps=Date.now());function da(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;je(ha(s,n.value),t,5,[s])};return n.value=e,n.attached=ua(),n}function ha(e,t){if(k(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const Br=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,pa=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?ta(e,s,o):t==="style"?ia(e,n,s):rn(t)?ks(t)||ca(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):ga(e,t,s,o))?(Ur(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&kr(e,t,s,o,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!le(s))?Ur(e,De(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),kr(e,t,s,o))};function ga(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&Br(t)&&X(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return Br(t)&&le(n)?!1:t in e}const at=e=>{const t=e.props["onUpdate:modelValue"]||!1;return k(t)?n=>En(t,n):t};function ma(e){e.target.composing=!0}function qr(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Ne=Symbol("_assign"),Uf={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e[Ne]=at(r);const i=s||r.props&&r.props.type==="number";Je(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=Mn(l)),e[Ne](l)}),n&&Je(e,"change",()=>{e.value=e.value.trim()}),t||(Je(e,"compositionstart",ma),Je(e,"compositionend",qr),Je(e,"change",qr))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:r,number:i}},o){if(e[Ne]=at(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?Mn(e.value):e.value,c=t??"";l!==c&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||r&&e.value.trim()===c)||(e.value=c))}},Wf={deep:!0,created(e,t,n){e[Ne]=at(n),Je(e,"change",()=>{const s=e._modelValue,r=Ft(e),i=e.checked,o=e[Ne];if(k(s)){const l=qs(s,r),c=l!==-1;if(i&&!c)o(s.concat(r));else if(!i&&c){const f=[...s];f.splice(l,1),o(f)}}else if(Ht(s)){const l=new Set(s);i?l.add(r):l.delete(r),o(l)}else o(Eo(e,i))})},mounted:Gr,beforeUpdate(e,t,n){e[Ne]=at(n),Gr(e,t,n)}};function Gr(e,{value:t,oldValue:n},s){e._modelValue=t;let r;if(k(t))r=qs(t,s.props.value)>-1;else if(Ht(t))r=t.has(s.props.value);else{if(t===n)return;r=Et(t,Eo(e,!0))}e.checked!==r&&(e.checked=r)}const Kf={created(e,{value:t},n){e.checked=Et(t,n.props.value),e[Ne]=at(n),Je(e,"change",()=>{e[Ne](Ft(e))})},beforeUpdate(e,{value:t,oldValue:n},s){e[Ne]=at(s),t!==n&&(e.checked=Et(t,s.props.value))}},Bf={deep:!0,created(e,{value:t,modifiers:{number:n}},s){const r=Ht(t);Je(e,"change",()=>{const i=Array.prototype.filter.call(e.options,o=>o.selected).map(o=>n?Mn(Ft(o)):Ft(o));e[Ne](e.multiple?r?new Set(i):i:i[0]),e._assigning=!0,cn(()=>{e._assigning=!1})}),e[Ne]=at(s)},mounted(e,{value:t}){Xr(e,t)},beforeUpdate(e,t,n){e[Ne]=at(n)},updated(e,{value:t}){e._assigning||Xr(e,t)}};function Xr(e,t){const n=e.multiple,s=k(t);if(!(n&&!s&&!Ht(t))){for(let r=0,i=e.options.length;rString(f)===String(l)):o.selected=qs(t,l)>-1}else o.selected=t.has(l);else if(Et(Ft(o),t)){e.selectedIndex!==r&&(e.selectedIndex=r);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Ft(e){return"_value"in e?e._value:e.value}function Eo(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const ya=["ctrl","shift","alt","meta"],va={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)=>ya.some(n=>e[`${n}Key`]&&!t.includes(n))},qf=(e,t)=>{const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(r,...i)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=r=>{if(!("key"in r))return;const i=ft(r.key);if(t.some(o=>o===i||_a[o]===i))return e(r)})},ba=de({patchProp:pa},Xc);let gs,Yr=!1;function wa(){return gs=Yr?gs:Sc(ba),Yr=!0,gs}const Xf=(...e)=>{const t=wa().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=xa(s);if(r)return n(r,!0,Sa(r))},t};function Sa(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function xa(e){return le(e)?document.querySelector(e):e}const Yf=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Ta=window.__VP_SITE_DATA__;function Co(e){return ui()?(il(e),!0):!1}const ms=new WeakMap,Ea=(...e)=>{var t;const n=e[0],s=(t=an())==null?void 0:t.proxy;if(s==null&&!zi())throw new Error("injectLocal must be called in setup");return s&&ms.has(s)&&n in ms.get(s)?ms.get(s)[n]:St(...e)},Ao=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Ca=Object.prototype.toString,Aa=e=>Ca.call(e)==="[object Object]",Ct=()=>{},Jr=Ra();function Ra(){var e,t;return Ao&&((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 nr(...e){if(e.length!==1)return Pl(...e);const t=e[0];return typeof t=="function"?Bn(Ol(()=>({get:t,set:Ct}))):_t(t)}function sr(e,t){function n(...s){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,s),{fn:t,thisArg:this,args:s})).then(r).catch(i)})}return n}const Ro=e=>e();function Oa(e,t={}){let n,s,r=Ct;const i=c=>{clearTimeout(c),r(),r=Ct};let o;return c=>{const f=ce(e),a=ce(t.maxWait);return n&&i(n),f<=0||a!==void 0&&a<=0?(s&&(i(s),s=null),Promise.resolve(c())):new Promise((h,y)=>{r=t.rejectOnCancel?y:h,o=c,a&&!s&&(s=setTimeout(()=>{n&&i(n),s=null,h(o())},a)),n=setTimeout(()=>{s&&i(s),s=null,h(c())},f)})}}function Ma(...e){let t=0,n,s=!0,r=Ct,i,o,l,c,f;!fe(e[0])&&typeof e[0]=="object"?{delay:o,trailing:l=!0,leading:c=!0,rejectOnCancel:f=!1}=e[0]:[o,l=!0,c=!0,f=!1]=e;const a=()=>{n&&(clearTimeout(n),n=void 0,r(),r=Ct)};return y=>{const v=ce(o),R=Date.now()-t,L=()=>i=y();return a(),v<=0?(t=Date.now(),L()):(R>v&&(c||!s)?(t=Date.now(),L()):l&&(i=new Promise((q,F)=>{r=f?F:q,n=setTimeout(()=>{t=Date.now(),s=!0,q(L()),a()},Math.max(0,v-R))})),!c&&!n&&(n=setTimeout(()=>s=!0,v)),s=!1,i)}}function Ia(e=Ro,t={}){const{initialState:n="active"}=t,s=nr(n==="active");function r(){s.value=!1}function i(){s.value=!0}const o=(...l)=>{s.value&&e(...l)};return{isActive:Bn(s),pause:r,resume:i,eventFilter:o}}function zr(e){return e.endsWith("rem")?Number.parseFloat(e)*16:Number.parseFloat(e)}function ys(e){return Array.isArray(e)?e:[e]}function Oo(e){return an()}function Pa(e,t=200,n={}){return sr(Oa(t,n),e)}function La(e,t=200,n=!1,s=!0,r=!1){return sr(Ma(t,n,s,r),e)}function Na(e,t,n={}){const{eventFilter:s=Ro,...r}=n;return Le(e,sr(s,t),r)}function Da(e,t,n={}){const{eventFilter:s,initialState:r="active",...i}=n,{eventFilter:o,pause:l,resume:c,isActive:f}=Ia(s,{initialState:r});return{stop:Na(e,t,{...i,eventFilter:o}),pause:l,resume:c,isActive:f}}function es(e,t=!0,n){Oo()?$t(e,n):t?e():cn(e)}function Fa(e,t){Oo()&&Jn(e,t)}function Ha(e,t,n){return Le(e,t,{...n,immediate:!0})}const Ze=Ao?window:void 0;function rr(e){var t;const n=ce(e);return(t=n==null?void 0:n.$el)!=null?t:n}function et(...e){const t=[],n=()=>{t.forEach(l=>l()),t.length=0},s=(l,c,f,a)=>(l.addEventListener(c,f,a),()=>l.removeEventListener(c,f,a)),r=ie(()=>{const l=ys(ce(e[0])).filter(c=>c!=null);return l.every(c=>typeof c!="string")?l:void 0}),i=Ha(()=>{var l,c;return[(c=(l=r.value)==null?void 0:l.map(f=>rr(f)))!=null?c:[Ze].filter(f=>f!=null),ys(ce(r.value?e[1]:e[0])),ys(zs(r.value?e[2]:e[1])),ce(r.value?e[3]:e[2])]},([l,c,f,a])=>{if(n(),!(l!=null&&l.length)||!(c!=null&&c.length)||!(f!=null&&f.length))return;const h=Aa(a)?{...a}:a;t.push(...l.flatMap(y=>c.flatMap(v=>f.map(R=>s(y,v,R,h)))))},{flush:"post"}),o=()=>{i(),n()};return Co(n),o}function $a(){const e=Pe(!1),t=an();return t&&$t(()=>{e.value=!0},t),e}function ja(e){const t=$a();return ie(()=>(t.value,!!e()))}function Va(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function Jf(...e){let t,n,s={};e.length===3?(t=e[0],n=e[1],s=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],s=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:r=Ze,eventName:i="keydown",passive:o=!1,dedupe:l=!1}=s,c=Va(t);return et(r,i,a=>{a.repeat&&ce(l)||c(a)&&n(a)},o)}const ka=Symbol("vueuse-ssr-width");function Ua(){const e=zi()?Ea(ka,null):null;return typeof e=="number"?e:void 0}function Mo(e,t={}){const{window:n=Ze,ssrWidth:s=Ua()}=t,r=ja(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function"),i=Pe(typeof s=="number"),o=Pe(),l=Pe(!1),c=f=>{l.value=f.matches};return ao(()=>{if(i.value){i.value=!r.value;const f=ce(e).split(",");l.value=f.some(a=>{const h=a.includes("not all"),y=a.match(/\(\s*min-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/),v=a.match(/\(\s*max-width:\s*(-?\d+(?:\.\d*)?[a-z]+\s*)\)/);let R=!!(y||v);return y&&R&&(R=s>=zr(y[1])),v&&R&&(R=s<=zr(v[1])),h?!R:R});return}r.value&&(o.value=n.matchMedia(ce(e)),l.value=o.value.matches)}),et(o,"change",c,{passive:!0}),ie(()=>l.value)}const bn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},wn="__vueuse_ssr_handlers__",Wa=Ka();function Ka(){return wn in bn||(bn[wn]=bn[wn]||{}),bn[wn]}function Io(e,t){return Wa[e]||t}function Po(e){return Mo("(prefers-color-scheme: dark)",e)}function Ba(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 qa={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()}},Qr="vueuse-storage";function Ga(e,t,n,s={}){var r;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:f=!1,shallow:a,window:h=Ze,eventFilter:y,onError:v=N=>{console.error(N)},initOnMounted:R}=s,L=(a?Pe:_t)(typeof t=="function"?t():t),q=ie(()=>ce(e));if(!n)try{n=Io("getDefaultStorage",()=>{var N;return(N=Ze)==null?void 0:N.localStorage})()}catch(N){v(N)}if(!n)return L;const F=ce(t),B=Ba(F),p=(r=s.serializer)!=null?r:qa[B],{pause:g,resume:O}=Da(L,()=>M(L.value),{flush:i,deep:o,eventFilter:y});Le(q,()=>w(),{flush:i});let U=!1;const C=N=>{R&&!U||w(N)},K=N=>{R&&!U||H(N)};h&&l&&(n instanceof Storage?et(h,"storage",C,{passive:!0}):et(h,Qr,K)),R?es(()=>{U=!0,w()}):w();function T(N,J){if(h){const D={key:q.value,oldValue:N,newValue:J,storageArea:n};h.dispatchEvent(n instanceof Storage?new StorageEvent("storage",D):new CustomEvent(Qr,{detail:D}))}}function M(N){try{const J=n.getItem(q.value);if(N==null)T(J,null),n.removeItem(q.value);else{const D=p.write(N);J!==D&&(n.setItem(q.value,D),T(J,D))}}catch(J){v(J)}}function V(N){const J=N?N.newValue:n.getItem(q.value);if(J==null)return c&&F!=null&&n.setItem(q.value,p.write(F)),F;if(!N&&f){const D=p.read(J);return typeof f=="function"?f(D,F):B==="object"&&!Array.isArray(D)?{...F,...D}:D}else return typeof J!="string"?J:p.read(J)}function w(N){if(!(N&&N.storageArea!==n)){if(N&&N.key==null){L.value=F;return}if(!(N&&N.key!==q.value)){g();try{(N==null?void 0:N.newValue)!==p.write(L.value)&&(L.value=V(N))}catch(J){v(J)}finally{N?cn(O):O()}}}}function H(N){w(N.detail)}return L}const Xa="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function Ya(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=Ze,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||{}},y=Po({window:r}),v=ie(()=>y.value?"dark":"light"),R=c||(o==null?nr(s):Ga(o,s,i,{window:r,listenToStorageChanges:l})),L=ie(()=>R.value==="auto"?v.value:R.value),q=Io("updateHTMLAttrs",(g,O,U)=>{const C=typeof g=="string"?r==null?void 0:r.document.querySelector(g):rr(g);if(!C)return;const K=new Set,T=new Set;let M=null;if(O==="class"){const w=U.split(/\s/g);Object.values(h).flatMap(H=>(H||"").split(/\s/g)).filter(Boolean).forEach(H=>{w.includes(H)?K.add(H):T.add(H)})}else M={key:O,value:U};if(K.size===0&&T.size===0&&M===null)return;let V;a&&(V=r.document.createElement("style"),V.appendChild(document.createTextNode(Xa)),r.document.head.appendChild(V));for(const w of K)C.classList.add(w);for(const w of T)C.classList.remove(w);M&&C.setAttribute(M.key,M.value),a&&(r.getComputedStyle(V).opacity,document.head.removeChild(V))});function F(g){var O;q(t,n,(O=h[g])!=null?O:g)}function B(g){e.onChanged?e.onChanged(g,F):F(g)}Le(L,B,{flush:"post",immediate:!0}),es(()=>B(L.value));const p=ie({get(){return f?R.value:L.value},set(g){R.value=g}});return Object.assign(p,{store:R,system:v,state:L})}function Ja(e={}){const{valueDark:t="dark",valueLight:n=""}=e,s=Ya({...e,onChanged:(o,l)=>{var c;e.onChanged?(c=e.onChanged)==null||c.call(e,o==="dark",l,o):l(o)},modes:{dark:t,light:n}}),r=ie(()=>s.system.value);return ie({get(){return s.value==="dark"},set(o){const l=o?"dark":"light";r.value===l?s.value="auto":s.value=l}})}function vs(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}const Zr=1;function za(e,t={}){const{throttle:n=0,idle:s=200,onStop:r=Ct,onScroll:i=Ct,offset:o={left:0,right:0,top:0,bottom:0},eventListenerOptions:l={capture:!1,passive:!0},behavior:c="auto",window:f=Ze,onError:a=C=>{console.error(C)}}=t,h=Pe(0),y=Pe(0),v=ie({get(){return h.value},set(C){L(C,void 0)}}),R=ie({get(){return y.value},set(C){L(void 0,C)}});function L(C,K){var T,M,V,w;if(!f)return;const H=ce(e);if(!H)return;(V=H instanceof Document?f.document.body:H)==null||V.scrollTo({top:(T=ce(K))!=null?T:R.value,left:(M=ce(C))!=null?M:v.value,behavior:ce(c)});const N=((w=H==null?void 0:H.document)==null?void 0:w.documentElement)||(H==null?void 0:H.documentElement)||H;v!=null&&(h.value=N.scrollLeft),R!=null&&(y.value=N.scrollTop)}const q=Pe(!1),F=Dt({left:!0,right:!1,top:!0,bottom:!1}),B=Dt({left:!1,right:!1,top:!1,bottom:!1}),p=C=>{q.value&&(q.value=!1,B.left=!1,B.right=!1,B.top=!1,B.bottom=!1,r(C))},g=Pa(p,n+s),O=C=>{var K;if(!f)return;const T=((K=C==null?void 0:C.document)==null?void 0:K.documentElement)||(C==null?void 0:C.documentElement)||rr(C),{display:M,flexDirection:V,direction:w}=getComputedStyle(T),H=w==="rtl"?-1:1,N=T.scrollLeft;B.left=Nh.value;const J=Math.abs(N*H)<=(o.left||0),D=Math.abs(N*H)+T.clientWidth>=T.scrollWidth-(o.right||0)-Zr;M==="flex"&&V==="row-reverse"?(F.left=D,F.right=J):(F.left=J,F.right=D),h.value=N;let Y=T.scrollTop;C===f.document&&!Y&&(Y=f.document.body.scrollTop),B.top=Yy.value;const $=Math.abs(Y)<=(o.top||0),oe=Math.abs(Y)+T.clientHeight>=T.scrollHeight-(o.bottom||0)-Zr;M==="flex"&&V==="column-reverse"?(F.top=oe,F.bottom=$):(F.top=$,F.bottom=oe),y.value=Y},U=C=>{var K;if(!f)return;const T=(K=C.target.documentElement)!=null?K:C.target;O(T),q.value=!0,g(C),i(C)};return et(e,"scroll",n?La(U,n,!0,!1):U,l),es(()=>{try{const C=ce(e);if(!C)return;O(C)}catch(C){a(C)}}),et(e,"scrollend",p,l),{x:v,y:R,isScrolling:q,arrivedState:F,directions:B,measure(){const C=ce(e);f&&C&&O(C)}}}function Lo(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 _s=new WeakMap;function zf(e,t=!1){const n=Pe(t);let s=null,r="";Le(nr(e),l=>{const c=vs(ce(l));if(c){const f=c;if(_s.get(f)||_s.set(f,f.style.overflow),f.style.overflow!=="hidden"&&(r=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=vs(ce(e));!l||n.value||(Jr&&(s=et(l,"touchmove",c=>{Qa(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{const l=vs(ce(e));!l||!n.value||(Jr&&(s==null||s()),l.style.overflow=r,_s.delete(l),n.value=!1)};return Co(o),ie({get(){return n.value},set(l){l?i():o()}})}function Qf(e={}){const{window:t=Ze,...n}=e;return za(t,n)}function Zf(e={}){const{window:t=Ze,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:s=Number.POSITIVE_INFINITY,listenOrientation:r=!0,includeScrollbar:i=!0,type:o="inner"}=e,l=Pe(n),c=Pe(s),f=()=>{if(t)if(o==="outer")l.value=t.outerWidth,c.value=t.outerHeight;else if(o==="visual"&&t.visualViewport){const{width:h,height:y,scale:v}=t.visualViewport;l.value=Math.round(h*v),c.value=Math.round(y*v)}else i?(l.value=t.innerWidth,c.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,c.value=t.document.documentElement.clientHeight)};f(),es(f);const a={passive:!0};if(et("resize",f,a),t&&o==="visual"&&t.visualViewport&&et(t.visualViewport,"resize",f,a),r){const h=Mo("(orientation: portrait)");Le(h,()=>f())}return{width:l,height:c}}const bs={};var ws={};const No=/^(?:[a-z]+:|\/\/)/i,Za="vitepress-theme-appearance",Do=Symbol("stack-view:unpack"),ef=/#.*$/,tf=/[?#].*$/,nf=/(?:(^|\/)index)?\.(?:md|html)$/,ve=typeof document<"u",Fo={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function sf(e,t,n=!1){if(t===void 0)return!1;if(e=ei(`/${e}`),n)return new RegExp(t).test(e);if(ei(t)!==e)return!1;const s=t.match(ef);return s?(ve?location.hash:"")===s[0]:!0}function ei(e){return decodeURI(e).replace(tf,"").replace(nf,"$1")}function rf(e){return No.test(e)}function of(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!rf(n)&&sf(t,`^/${n}/`,!0))||"root"}function lf(e,t){const n=of(e,t),{label:s,link:r,...i}=e.locales[n]??{};Object.assign(i,{localeIndex:n});const o=df(e,t),l={head:$o(e.head??[],i.head??[],...o.map(c=>c.head??[]).reverse())};return ir(l,...o,i,e)}function Ho(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=cf(e.title,s);return n===r.slice(3)?n:`${n}${r}`}function cf(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function $o(...e){const t=[],n=new Map;for(const s of e)for(const r of s){const[i,o]=r,l=Object.entries(o)[0];if(i!=="meta"||!l){t.push(r);continue}const c=`${l[0]}=${l[1]}`,f=n.get(c);f!=null?t[f]=r:(n.set(c,t.length),t.push(r))}return t}const af=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,ff=/^[a-z]:/i;function ti(e){const t=ff.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(af,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const Ss=new Set;function uf(e){if(Ss.size===0){const n=typeof process=="object"&&(ws==null?void 0:ws.VITE_EXTRA_EXTENSIONS)||(bs==null?void 0:bs.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(s=>Ss.add(s))}const t=e.split(".").pop();return t==null||!Ss.has(t.toLowerCase())}function df({additionalConfig:e},t){if(e===void 0)return[];if(typeof e=="function")return e(t);const n=[],s=t.split("/").slice(0,-1);for(;s.length;){const r=`/${s.join("/")}/`;n.push(e[r]),s.pop()}return n.push(e["/"]),n.filter(r=>r!==void 0)}function ir(...e){const t=e.filter(r=>hf(r));if(t.length<=1)return e[0];const n=new Set(t.flatMap(r=>Reflect.ownKeys(r))),s=[...n];return new Proxy({},{get(r,i){return i===Do?t:ir(...t.map(o=>o[i]).filter(o=>o!==void 0))},set(){throw new Error("StackView is read-only and cannot be mutated.")},has(r,i){return n.has(i)},ownKeys(){return s},getOwnPropertyDescriptor(r,i){for(const o of t){const l=Object.getOwnPropertyDescriptor(o,i);if(l)return l}}})}ir.unpack=function(e){return e==null?void 0:e[Do]};function hf(e){return Object.prototype.toString.call(e)==="[object Object]"}const pf=Symbol(),Tt=Pe(Ta);function eu(e){const t=ie(()=>lf(Tt.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?_t(!0):n==="force-auto"?Po():n?Ja({storageKey:Za,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):_t(!1),r=_t(ve?location.hash:"");return ve&&window.addEventListener("hashchange",()=>{r.value=location.hash}),Le(()=>e.data,()=>{r.value=ve?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(()=>Ho(t.value,e.data)),description:ie(()=>e.data.description||t.value.description),isDark:s,hash:ie(()=>r.value)}}function gf(){const e=St(pf);if(!e)throw new Error("vitepress data not properly injected in app");return e}function mf(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function ni(e){return No.test(e)||!e.startsWith("/")?e:mf(Tt.value.base,e)}function yf(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),ve){const n="/";t=ti(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];if(s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),!s)return null;t=`${n}assets/${t}.${s}.js`}else t=`./${ti(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let On=[];function tu(e){On.push(e),Fa(()=>{On=On.filter(t=>t!==e)})}function vf(){let e=Tt.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=si(e,n);else if(Array.isArray(e))for(const s of e){const r=si(s,n);if(r){t=r;break}}return t}function si(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}const _f=Symbol(),jo="http://a.com",bf=()=>({path:"/",hash:"",query:"",component:null,data:Fo});function nu(e,t){const n=Dt(bf()),s={route:n,async go(l,c){var f,a;l=js(l),await((f=s.onBeforeRouteChange)==null?void 0:f.call(s,l))!==!1&&((!ve||await Sf(l,c))&&await i(l),o(),await((a=s.onAfterRouteChange)==null?void 0:a.call(s,l)))}};let r=null;async function i(l,c=0,f=!1){var y,v;if(await((y=s.onBeforePageLoad)==null?void 0:y.call(s,l))===!1)return;const a=new URL(l,jo),h=r=a.pathname;try{let R=await e(h);if(!R)throw new Error(`Page not found: ${h}`);if(r===h){r=null;const{default:L,__pageData:q}=R;if(!L)throw new Error(`Invalid route component: ${L}`);await((v=s.onAfterPageLoad)==null?void 0:v.call(s,l)),n.path=ve?h:ni(h),n.component=Cn(L),n.data=Cn(q),o(a),ve&&cn(()=>{let F=Tt.value.base+q.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");return!Tt.value.cleanUrls&&!F.endsWith("/")&&(F+=".html"),F!==a.pathname&&(a.pathname=F,l=F+a.search+a.hash,history.replaceState({},"",l)),$s(a.hash,!1,c)})}}catch(R){if(!/fetch|Page not found/.test(R.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(R),!f)try{const L=await fetch(Tt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await L.json(),await i(l,c,!0);return}catch{}if(r===h){r=null,n.path=ve?h:ni(h),n.component=t?Cn(t):null;const L=ve?h.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...Fo,relativePath:L},o(a)}}}function o(l=ve?location:{search:"",hash:""}){n.query=l.search,n.hash=decodeURIComponent(l.hash)}return ve&&(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:y}=new URL(f,c.baseURI),v=new URL(location.href);h===v.origin&&uf(y)&&(l.preventDefault(),s.go(a,{smoothScroll:c.classList.contains("header-anchor")}))},{capture:!0}),window.addEventListener("popstate",async l=>{var f;if(l.state===null)return;const c=js(location.href);await i(c,l.state&&l.state.scrollPosition||0),o(),await((f=s.onAfterRouteChange)==null?void 0:f.call(s,c))}),window.addEventListener("hashchange",l=>{l.preventDefault(),o()})),s}function wf(){const e=St(_f);if(!e)throw new Error("useRouter() is called without provider.");return e}function Vo(){return wf().route}function $s(e,t=!1,n=0){if(!e||n){window.scrollTo(0,n);return}let s=null;try{s=document.getElementById(decodeURIComponent(e).slice(1))}catch(r){console.warn(r)}if(s){let r=function(){!t||Math.abs(o-window.scrollY)>window.innerHeight?window.scrollTo(0,o):window.scrollTo({left:0,top:o,behavior:"smooth"})};const i=parseInt(window.getComputedStyle(s).paddingTop,10),o=window.scrollY+s.getBoundingClientRect().top-vf()+i;requestAnimationFrame(r)}}function js(e){const t=new URL(e,jo);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),Tt.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}async function Sf(e,{smoothScroll:t=!1,initialLoad:n=!1}={}){const s=js(location.href),r=new URL(e,location.origin),i=new URL(s,location.origin);if(e===s){if(!n)return $s(r.hash,t),!1}else if(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",e),r.pathname===i.pathname)return r.hash!==i.hash&&(window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:i.href,newURL:r.href})),$s(r.hash,t)),!1;return!0}const Sn=()=>On.forEach(e=>e()),su=Vi({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Vo(),{frontmatter:n,site:s}=gf();return Le(n,Sn,{deep:!0,flush:"post"}),()=>Fs(e.as,s.value.contentProps??{style:{position:"relative"}},[t.component?Fs(t.component,{onVnodeMounted:Sn,onVnodeUpdated:Sn,onVnodeUnmounted:Sn}):"404 Page Not Found"])}}),ru=Vi({setup(e,{slots:t}){const n=_t(!1);return $t(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function iu(){ve&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const s=(n=t.parentElement)==null?void 0:n.parentElement;if(!s)return;const r=Array.from(s.querySelectorAll("input")).indexOf(t);if(r<0)return;const i=s.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(f=>f.classList.contains("active"));if(!o)return;const l=i.children[r];if(!l||o===l)return;o.classList.remove("active"),l.classList.add("active");const c=s==null?void 0:s.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function ou(){if(ve){const e=new WeakMap;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(r.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()),xf(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 xf(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 s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function lu(e,t){let n=!0,s=[];const r=i=>{if(n){n=!1,i.forEach(l=>{const c=xs(l);for(const f of document.head.children)if(f.isEqualNode(c)){s.push(f);return}});return}const o=i.map(xs);s.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 s[c])}),o.forEach(l=>l&&document.head.appendChild(l)),s=[...s,...o].filter(Boolean)};ao(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[],f=Ho(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):xs(["meta",{name:"description",content:a}]),r($o(o.head,Ef(c)))})}function xs([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),e==="script"&&t.async==null&&(s.async=!1),s}function Tf(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Ef(e){return e.filter(t=>!Tf(t))}const Ts=new Set,ko=()=>document.createElement("link"),Cf=e=>{const t=ko();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Af=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let xn;const Rf=ve&&(xn=ko())&&xn.relList&&xn.relList.supports&&xn.relList.supports("prefetch")?Cf:Af;function cu(){if(!ve||!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 s=()=>{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(!Ts.has(c)){Ts.add(c);const f=yf(c);f&&Rf(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):Ts.add(l))})})};$t(s);const r=Vo();Le(()=>r.path,s),Jn(()=>{n&&n.disconnect()})}export{qf as $,Hf as A,Pe as B,ve as C,Vo as D,Of as E,tu as F,Se as G,Lf as H,If as I,ge as J,Pf as K,No as L,Fc as M,St as N,Zf as O,Ks as P,Jf as Q,cn as R,Qf as S,kf as T,Bn as U,zf as V,gc as W,Df as X,Gf as Y,Wi as Z,Yf as _,_o as a,Ff as a0,lu as a1,_f as a2,eu as a3,pf as a4,su as a5,ru as a6,Tt as a7,nu as a8,yf as a9,Xf as aa,cu as ab,ou as ac,iu as ad,Fs as ae,jf as af,Mf as ag,Kf as ah,Bf as ai,Uf as aj,Wf as ak,Ns as b,$f as c,Vi as d,Vf as e,uf as f,ni as g,ie as h,rf as i,vo as j,zs as k,sf as l,Mo as m,Bs as n,Ls as o,$t as p,tc as q,Nf as r,Jn as s,sl as t,gf as u,vf as v,kl as w,_t as x,ao as y,Le as z}; diff --git a/assets/chunks/theme.DbVD3jYa.js b/assets/chunks/theme.DbVD3jYa.js deleted file mode 100644 index f971499b..00000000 --- a/assets/chunks/theme.DbVD3jYa.js +++ /dev/null @@ -1 +0,0 @@ -import{d as h,c as u,r as d,n as S,o as r,a as j,t as T,b as k,w as v,T as pe,e as m,_ as g,u as Le,i as Oe,f as ze,g as ve,h as b,j as p,k as i,l as W,m as $e,p as O,q as Ge,s as ee,v as Ue,x as V,y as Q,z as D,A as fe,B as me,C as J,D as te,E as ye,F as Ve,G as N,H as C,I as q,J as _,K as E,L as Se,M as U,N as ne,O as je,P as Te,Q as We,R as we,S as Ne,U as qe,V as Me,W as Ie,X as Re,Y as Ke,Z as Je,$ as Ye,a0 as Qe}from"./framework.PeLcR_tw.js";const Xe=h({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(o){return(e,t)=>(r(),u("span",{class:S(["VPBadge",e.type])},[d(e.$slots,"default",{},()=>[j(T(e.text),1)])],2))}}),Ze={key:0,class:"VPBackdrop"},xe=h({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(o){return(e,t)=>(r(),k(pe,{name:"fade"},{default:v(()=>[e.show?(r(),u("div",Ze)):m("",!0)]),_:1}))}}),et=g(xe,[["__scopeId","data-v-c79a1216"]]),L=Le;function He(o,e){let t,n=!1;return()=>{t&&clearTimeout(t),n?t=setTimeout(o,e):(o(),(n=!0)&&setTimeout(()=>n=!1,e))}}function ie(o){return o.startsWith("/")?o:`/${o}`}function he(o){const{pathname:e,search:t,hash:n,protocol:s}=new URL(o,"http://a.com");if(Oe(o)||o.startsWith("#")||!s.startsWith("http")||!ze(e))return o;const{site:a}=L(),c=e.endsWith("/")||e.endsWith(".html")?o:o.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,a.value.cleanUrls?"":".html")}${t}${n}`);return ve(c)}function X({correspondingLink:o=!1}={}){const{site:e,localeIndex:t,page:n,theme:s,hash:a}=L(),c=b(()=>{var f,$;return{label:(f=e.value.locales[t.value])==null?void 0:f.label,link:(($=e.value.locales[t.value])==null?void 0:$.link)||(t.value==="root"?"/":`/${t.value}/`)}});return{localeLinks:b(()=>Object.entries(e.value.locales).flatMap(([f,$])=>c.value.label===$.label?[]:{text:$.label,link:tt($.link||(f==="root"?"/":`/${f}/`),s.value.i18nRouting!==!1&&o,n.value.relativePath.slice(c.value.link.length-1),!e.value.cleanUrls)+a.value})),currentLang:c}}function tt(o,e,t,n){return e?o.replace(/\/$/,"")+ie(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,n?".html":"")):o}const nt={class:"NotFound"},st={class:"code"},ot={class:"title"},at={class:"quote"},rt={class:"action"},it=["href","aria-label"],lt=h({__name:"NotFound",setup(o){const{theme:e}=L(),{currentLang:t}=X();return(n,s)=>{var a,c,l,f,$,P;return r(),u("div",nt,[p("p",st,T(((a=i(e).notFound)==null?void 0:a.code)??"404"),1),p("h1",ot,T(((c=i(e).notFound)==null?void 0:c.title)??"PAGE NOT FOUND"),1),s[0]||(s[0]=p("div",{class:"divider"},null,-1)),p("blockquote",at,T(((l=i(e).notFound)==null?void 0:l.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",rt,[p("a",{class:"link",href:i(ve)(((f=i(e).notFound)==null?void 0:f.link)??i(t).link),"aria-label":(($=i(e).notFound)==null?void 0:$.linkLabel)??"go to home"},T(((P=i(e).notFound)==null?void 0:P.linkText)??"Take me home"),9,it)])])}}}),ct=g(lt,[["__scopeId","data-v-829df670"]]);function Ce(o,e){if(Array.isArray(o))return Z(o);if(o==null)return[];e=ie(e);const t=Object.keys(o).sort((s,a)=>a.split("/").length-s.split("/").length).find(s=>e.startsWith(ie(s))),n=t?o[t]:[];return Array.isArray(n)?Z(n):Z(n.items,n.base)}function ut(o){const e=[];let t=0;for(const n in o){const s=o[n];if(s.items){t=e.push(s);continue}e[t]||e.push({items:[]}),e[t].items.push(s)}return e}function dt(o){const e=[];function t(n){for(const s of n)s.text&&s.link&&e.push({text:s.text,link:s.link,docFooterText:s.docFooterText}),s.items&&t(s.items)}return t(o),e}function le(o,e){return Array.isArray(e)?e.some(t=>le(o,t)):W(o,e.link)?!0:e.items?le(o,e.items):!1}function Z(o,e){return[...o].map(t=>{const n={...t},s=n.base||e;return s&&n.link&&(n.link=s+n.link),n.items&&(n.items=Z(n.items,s)),n})}function pt(){const{hasSidebar:o}=z(),e=$e("(min-width: 960px)"),t=$e("(min-width: 1280px)");return{isAsideEnabled:b(()=>!t.value&&!e.value?!1:o.value?t.value:e.value)}}const vt=/\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/,ce=[];function Ae(o){return typeof o.outline=="object"&&!Array.isArray(o.outline)&&o.outline.label||o.outlineTitle||"On this page"}function ft(o){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const n=Number(t.tagName[1]);return{element:t,title:mt(t),link:"#"+t.id,level:n}});return ht(e,o)}function mt(o){let e="";for(const t of o.childNodes)if(t.nodeType===1){if(vt.test(t.className))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function ht(o,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[n,s]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;return gt(o,n,s)}function _t(o,e){const{isAsideEnabled:t}=pt(),n=He(a,100);let s=null;O(()=>{requestAnimationFrame(a),window.addEventListener("scroll",n)}),Ge(()=>{c(location.hash)}),ee(()=>{window.removeEventListener("scroll",n)});function a(){if(!t.value)return;const l=window.scrollY,f=window.innerHeight,$=document.body.offsetHeight,P=Math.abs(l+f-$)<1,y=ce.map(({element:I,link:H})=>({link:H,top:kt(I)})).filter(({top:I})=>!Number.isNaN(I)).sort((I,H)=>I.top-H.top);if(!y.length){c(null);return}if(l<1){c(null);return}if(P){c(y[y.length-1].link);return}let w=null;for(const{link:I,top:H}of y){if(H>l+Ue()+4)break;w=I}c(w)}function c(l){s&&s.classList.remove("active"),l==null?s=null:s=o.value.querySelector(`a[href="${decodeURIComponent(l)}"]`);const f=s;f?(f.classList.add("active"),e.value.style.top=f.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function kt(o){let e=0;for(;o!==document.body;){if(o===null)return NaN;e+=o.offsetTop,o=o.offsetParent}return e}function gt(o,e,t){ce.length=0;const n=[],s=[];return o.forEach(a=>{const c={...a,children:[]};let l=s[s.length-1];for(;l&&l.level>=c.level;)s.pop(),l=s[s.length-1];if(c.element.classList.contains("ignore-header")||l&&"shouldIgnore"in l){s.push({level:c.level,shouldIgnore:!0});return}c.level>t||c.level{e=K.value?document.activeElement:void 0}),O(()=>{window.addEventListener("keyup",t)}),ee(()=>{window.removeEventListener("keyup",t)});function t(n){n.key==="Escape"&&K.value&&(o(),e==null||e.focus())}}function $t(){function o(){K.value=!0}function e(){K.value=!1}function t(){K.value?e():o()}return{isOpen:K,open:o,close:e,toggle:t}}function yt(o){const{page:e,hash:t}=L(),n=V(!1),s=b(()=>o.value.collapsed!=null),a=b(()=>!!o.value.link),c=V(!1),l=()=>{c.value=W(e.value.relativePath,o.value.link)};D([e,o,t],l),O(l);const f=b(()=>c.value?!0:o.value.items?le(e.value.relativePath,o.value.items):!1),$=b(()=>!!(o.value.items&&o.value.items.length));Q(()=>{n.value=!!(s.value&&o.value.collapsed)}),fe(()=>{(c.value||f.value)&&(n.value=!1)});function P(){s.value&&(n.value=!n.value)}return{collapsed:n,collapsible:s,isLink:a,isActiveLink:c,hasActiveLink:f,hasChildren:$,toggle:P}}const ue=me([]),Y=me([]),de=me(!1);function z(){const{frontmatter:o,theme:e}=L(),t=b(()=>!!(o.value.isHome??o.value.layout==="home")),n=b(()=>o.value.sidebar!==!1&&Y.value.length>0&&!t.value),s=b(()=>n.value&&de.value),a=b(()=>n.value?ut(Y.value):[]),c=b(()=>t.value?!1:o.value.aside!=null?!!o.value.aside:e.value.aside!==!1),l=b(()=>c.value?o.value.aside==null?e.value.aside==="left":o.value.aside==="left":!1),f=b(()=>ue.value.length>0);return{isHome:t,sidebar:ye(Y),sidebarGroups:a,hasSidebar:n,isSidebarEnabled:s,hasAside:c,leftAside:l,headers:ye(ue),hasLocalNav:f}}function Pt({closeSidebar:o}){const{frontmatter:e,page:t,theme:n}=L();D(()=>[t.value.relativePath,n.value.sidebar],([a,c])=>{const l=c?Ce(c,a):[];JSON.stringify(l)!==JSON.stringify(Y.value)&&(Y.value=l)},{immediate:!0,deep:!0,flush:"sync"}),Ve(()=>{ue.value=ft(e.value.outline??n.value.outline)}),J&&(de.value=window.innerWidth>=960,window.addEventListener("resize",()=>{de.value=window.innerWidth>=960},{passive:!0}));const s=te();D(()=>s.path,o),bt(o)}const Lt=["href","title"],Vt=h({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(o){function e({target:t}){const n=t.href.split("#")[1],s=document.getElementById(decodeURIComponent(n));s==null||s.focus({preventScroll:!0})}return(t,n)=>{const s=q("VPDocOutlineItem",!0);return r(),u("ul",{class:S(["VPDocOutlineItem",t.root?"root":"nested"])},[(r(!0),u(N,null,C(t.headers,({children:a,link:c,title:l})=>(r(),u("li",null,[p("a",{class:"outline-link",href:c,onClick:e,title:l},T(l),9,Lt),a!=null&&a.length?(r(),k(s,{key:0,headers:a},null,8,["headers"])):m("",!0)]))),256))],2)}}}),Be=g(Vt,[["__scopeId","data-v-2d0bdf9b"]]),St={class:"content"},Tt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},wt=h({__name:"VPDocAsideOutline",setup(o){const{theme:e}=L(),t=V(),n=V(),{headers:s,hasLocalNav:a}=z();return _t(t,n),(c,l)=>(r(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:S(["VPDocAsideOutline",{"has-outline":i(a)}]),ref_key:"container",ref:t},[p("div",St,[p("div",{class:"outline-marker",ref_key:"marker",ref:n},null,512),p("div",Tt,T(i(Ae)(i(e))),1),_(Be,{headers:i(s),root:!0},null,8,["headers"])])],2))}}),Nt=g(wt,[["__scopeId","data-v-60d5052e"]]),Mt={class:"VPDocAsideCarbonAds"},It=h({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(o){const e=()=>null;return(t,n)=>(r(),u("div",Mt,[_(i(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),Ht={class:"VPDocAside"},Ct=h({__name:"VPDocAside",setup(o){const{theme:e}=L();return(t,n)=>(r(),u("div",Ht,[d(t.$slots,"aside-top",{},void 0,!0),d(t.$slots,"aside-outline-before",{},void 0,!0),_(Nt),d(t.$slots,"aside-outline-after",{},void 0,!0),n[0]||(n[0]=p("div",{class:"spacer"},null,-1)),d(t.$slots,"aside-ads-before",{},void 0,!0),i(e).carbonAds?(r(),k(It,{key:0,"carbon-ads":i(e).carbonAds},null,8,["carbon-ads"])):m("",!0),d(t.$slots,"aside-ads-after",{},void 0,!0),d(t.$slots,"aside-bottom",{},void 0,!0)]))}}),At=g(Ct,[["__scopeId","data-v-3f215769"]]);function Bt(){const{theme:o,page:e}=L();return b(()=>{const{text:t="Edit this page",pattern:n=""}=o.value.editLink||{};let s;return typeof n=="function"?s=n(e.value):s=n.replace(/:path/g,e.value.filePath),{url:s,text:t}})}function Et(){const{page:o,theme:e,frontmatter:t}=L();return b(()=>{var $,P,y,w,I,H,A,M;const n=Ce(e.value.sidebar,o.value.relativePath),s=dt(n),a=Ft(s,B=>B.link.replace(/[?#].*$/,"")),c=a.findIndex(B=>W(o.value.relativePath,B.link)),l=(($=e.value.docFooter)==null?void 0:$.prev)===!1&&!t.value.prev||t.value.prev===!1,f=((P=e.value.docFooter)==null?void 0:P.next)===!1&&!t.value.next||t.value.next===!1;return{prev:l?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((y=a[c-1])==null?void 0:y.docFooterText)??((w=a[c-1])==null?void 0:w.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((I=a[c-1])==null?void 0:I.link)},next:f?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((H=a[c+1])==null?void 0:H.docFooterText)??((A=a[c+1])==null?void 0:A.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((M=a[c+1])==null?void 0:M.link)}}})}function Ft(o,e){const t=new Set;return o.filter(n=>{const s=e(n);return t.has(s)?!1:t.add(s)})}const F=h({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(o){const e=o,t=b(()=>e.tag??(e.href?"a":"span")),n=b(()=>e.href&&Se.test(e.href)||e.target==="_blank");return(s,a)=>(r(),k(E(t.value),{class:S(["VPLink",{link:s.href,"vp-external-link-icon":n.value,"no-icon":s.noIcon}]),href:s.href?i(he)(s.href):void 0,target:s.target??(n.value?"_blank":void 0),rel:s.rel??(n.value?"noreferrer":void 0)},{default:v(()=>[d(s.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Dt={class:"VPLastUpdated"},Ot=["datetime"],zt=h({__name:"VPDocFooterLastUpdated",setup(o){const{theme:e,page:t,lang:n}=L(),s=b(()=>new Date(t.value.lastUpdated)),a=b(()=>s.value.toISOString()),c=V("");return O(()=>{Q(()=>{var l,f,$;c.value=new Intl.DateTimeFormat((f=(l=e.value.lastUpdated)==null?void 0:l.formatOptions)!=null&&f.forceLocale?n.value:void 0,(($=e.value.lastUpdated)==null?void 0:$.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(s.value)})}),(l,f)=>{var $;return r(),u("p",Dt,[j(T((($=i(e).lastUpdated)==null?void 0:$.text)||i(e).lastUpdatedText||"Last updated")+": ",1),p("time",{datetime:a.value},T(c.value),9,Ot)])}}}),Gt=g(zt,[["__scopeId","data-v-e98dd255"]]),Ut={key:0,class:"VPDocFooter"},jt={key:0,class:"edit-info"},Wt={key:0,class:"edit-link"},qt={key:1,class:"last-updated"},Rt={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Kt={class:"pager"},Jt=["innerHTML"],Yt=["innerHTML"],Qt={class:"pager"},Xt=["innerHTML"],Zt=["innerHTML"],xt=h({__name:"VPDocFooter",setup(o){const{theme:e,page:t,frontmatter:n}=L(),s=Bt(),a=Et(),c=b(()=>e.value.editLink&&n.value.editLink!==!1),l=b(()=>t.value.lastUpdated),f=b(()=>c.value||l.value||a.value.prev||a.value.next);return($,P)=>{var y,w,I,H;return f.value?(r(),u("footer",Ut,[d($.$slots,"doc-footer-before",{},void 0,!0),c.value||l.value?(r(),u("div",jt,[c.value?(r(),u("div",Wt,[_(F,{class:"edit-link-button",href:i(s).url,"no-icon":!0},{default:v(()=>[P[0]||(P[0]=p("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),j(" "+T(i(s).text),1)]),_:1,__:[0]},8,["href"])])):m("",!0),l.value?(r(),u("div",qt,[_(Gt)])):m("",!0)])):m("",!0),(y=i(a).prev)!=null&&y.link||(w=i(a).next)!=null&&w.link?(r(),u("nav",Rt,[P[1]||(P[1]=p("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),p("div",Kt,[(I=i(a).prev)!=null&&I.link?(r(),k(F,{key:0,class:"pager-link prev",href:i(a).prev.link},{default:v(()=>{var A;return[p("span",{class:"desc",innerHTML:((A=i(e).docFooter)==null?void 0:A.prev)||"Previous page"},null,8,Jt),p("span",{class:"title",innerHTML:i(a).prev.text},null,8,Yt)]}),_:1},8,["href"])):m("",!0)]),p("div",Qt,[(H=i(a).next)!=null&&H.link?(r(),k(F,{key:0,class:"pager-link next",href:i(a).next.link},{default:v(()=>{var A;return[p("span",{class:"desc",innerHTML:((A=i(e).docFooter)==null?void 0:A.next)||"Next page"},null,8,Xt),p("span",{class:"title",innerHTML:i(a).next.text},null,8,Zt)]}),_:1},8,["href"])):m("",!0)])])):m("",!0)])):m("",!0)}}}),en=g(xt,[["__scopeId","data-v-e257564d"]]),tn={class:"container"},nn={class:"aside-container"},sn={class:"aside-content"},on={class:"content"},an={class:"content-container"},rn={class:"main"},ln=h({__name:"VPDoc",setup(o){const{theme:e}=L(),t=te(),{hasSidebar:n,hasAside:s,leftAside:a}=z(),c=b(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(l,f)=>{const $=q("Content");return r(),u("div",{class:S(["VPDoc",{"has-sidebar":i(n),"has-aside":i(s)}])},[d(l.$slots,"doc-top",{},void 0,!0),p("div",tn,[i(s)?(r(),u("div",{key:0,class:S(["aside",{"left-aside":i(a)}])},[f[0]||(f[0]=p("div",{class:"aside-curtain"},null,-1)),p("div",nn,[p("div",sn,[_(At,null,{"aside-top":v(()=>[d(l.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[d(l.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[d(l.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[d(l.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[d(l.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[d(l.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):m("",!0),p("div",on,[p("div",an,[d(l.$slots,"doc-before",{},void 0,!0),p("main",rn,[_($,{class:S(["vp-doc",[c.value,i(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),_(en,null,{"doc-footer-before":v(()=>[d(l.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),d(l.$slots,"doc-after",{},void 0,!0)])])]),d(l.$slots,"doc-bottom",{},void 0,!0)],2)}}}),cn=g(ln,[["__scopeId","data-v-7011f0d8"]]),un=h({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(o){const e=o,t=b(()=>e.href&&Se.test(e.href)),n=b(()=>e.tag||(e.href?"a":"button"));return(s,a)=>(r(),k(E(n.value),{class:S(["VPButton",[s.size,s.theme]]),href:s.href?i(he)(s.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:v(()=>[d(s.$slots,"default",{},()=>[j(T(s.text),1)],!0)]),_:3},8,["class","href","target","rel"]))}}),dn=g(un,[["__scopeId","data-v-01bff58b"]]),pn=["src","alt"],vn=h({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(o){return(e,t)=>{const n=q("VPImage",!0);return e.image?(r(),u(N,{key:0},[typeof e.image=="string"||"src"in e.image?(r(),u("img",U({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:i(ve)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,pn)):(r(),u(N,{key:1},[_(n,U({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),_(n,U({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):m("",!0)}}}),x=g(vn,[["__scopeId","data-v-8426fc1a"]]),fn={class:"container"},mn={class:"main"},hn={class:"heading"},_n=["innerHTML"],kn=["innerHTML"],gn=["innerHTML"],bn={key:0,class:"actions"},$n={key:0,class:"image"},yn={class:"image-container"},Pn=h({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(o){const e=ne("hero-image-slot-exists");return(t,n)=>(r(),u("div",{class:S(["VPHero",{"has-image":t.image||i(e)}])},[p("div",fn,[p("div",mn,[d(t.$slots,"home-hero-info-before",{},void 0,!0),d(t.$slots,"home-hero-info",{},()=>[p("h1",hn,[t.name?(r(),u("span",{key:0,innerHTML:t.name,class:"name clip"},null,8,_n)):m("",!0),t.text?(r(),u("span",{key:1,innerHTML:t.text,class:"text"},null,8,kn)):m("",!0)]),t.tagline?(r(),u("p",{key:0,innerHTML:t.tagline,class:"tagline"},null,8,gn)):m("",!0)],!0),d(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(r(),u("div",bn,[(r(!0),u(N,null,C(t.actions,s=>(r(),u("div",{key:s.link,class:"action"},[_(dn,{tag:"a",size:"medium",theme:s.theme,text:s.text,href:s.link,target:s.target,rel:s.rel},null,8,["theme","text","href","target","rel"])]))),128))])):m("",!0),d(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||i(e)?(r(),u("div",$n,[p("div",yn,[n[0]||(n[0]=p("div",{class:"image-bg"},null,-1)),d(t.$slots,"home-hero-image",{},()=>[t.image?(r(),k(x,{key:0,class:"image-src",image:t.image},null,8,["image"])):m("",!0)],!0)])])):m("",!0)])],2))}}),Ln=g(Pn,[["__scopeId","data-v-f930dc11"]]),Vn=h({__name:"VPHomeHero",setup(o){const{frontmatter:e}=L();return(t,n)=>i(e).hero?(r(),k(Ln,{key:0,class:"VPHomeHero",name:i(e).hero.name,text:i(e).hero.text,tagline:i(e).hero.tagline,image:i(e).hero.image,actions:i(e).hero.actions},{"home-hero-info-before":v(()=>[d(t.$slots,"home-hero-info-before")]),"home-hero-info":v(()=>[d(t.$slots,"home-hero-info")]),"home-hero-info-after":v(()=>[d(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":v(()=>[d(t.$slots,"home-hero-actions-after")]),"home-hero-image":v(()=>[d(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):m("",!0)}}),Sn={class:"box"},Tn={key:0,class:"icon"},wn=["innerHTML"],Nn=["innerHTML"],Mn=["innerHTML"],In={key:4,class:"link-text"},Hn={class:"link-text-value"},Cn=h({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(o){return(e,t)=>(r(),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",Sn,[typeof e.icon=="object"&&e.icon.wrap?(r(),u("div",Tn,[_(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"?(r(),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?(r(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,wn)):m("",!0),p("h2",{class:"title",innerHTML:e.title},null,8,Nn),e.details?(r(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,Mn)):m("",!0),e.linkText?(r(),u("div",In,[p("p",Hn,[j(T(e.linkText)+" ",1),t[0]||(t[0]=p("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):m("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),An=g(Cn,[["__scopeId","data-v-5219619b"]]),Bn={key:0,class:"VPFeatures"},En={class:"container"},Fn={class:"items"},Dn=h({__name:"VPFeatures",props:{features:{}},setup(o){const e=o,t=b(()=>{const n=e.features.length;if(n){if(n===2)return"grid-2";if(n===3)return"grid-3";if(n%3===0)return"grid-6";if(n>3)return"grid-4"}else return});return(n,s)=>n.features?(r(),u("div",Bn,[p("div",En,[p("div",Fn,[(r(!0),u(N,null,C(n.features,a=>(r(),u("div",{key:a.title,class:S(["item",[t.value]])},[_(An,{icon:a.icon,title:a.title,details:a.details,link:a.link,"link-text":a.linkText,rel:a.rel,target:a.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):m("",!0)}}),On=g(Dn,[["__scopeId","data-v-a6181336"]]),zn=h({__name:"VPHomeFeatures",setup(o){const{frontmatter:e}=L();return(t,n)=>i(e).features?(r(),k(On,{key:0,class:"VPHomeFeatures",features:i(e).features},null,8,["features"])):m("",!0)}}),Gn=h({__name:"VPHomeContent",setup(o){const{width:e}=je({initialWidth:0,includeScrollbar:!1});return(t,n)=>(r(),u("div",{class:"vp-doc container",style:Te(i(e)?{"--vp-offset":`calc(50% - ${i(e)/2}px)`}:{})},[d(t.$slots,"default",{},void 0,!0)],4))}}),Un=g(Gn,[["__scopeId","data-v-8e2d4988"]]),jn=h({__name:"VPHome",setup(o){const{frontmatter:e,theme:t}=L();return(n,s)=>{const a=q("Content");return r(),u("div",{class:S(["VPHome",{"external-link-icon-enabled":i(t).externalLinkIcon}])},[d(n.$slots,"home-hero-before",{},void 0,!0),_(Vn,null,{"home-hero-info-before":v(()=>[d(n.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[d(n.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[d(n.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[d(n.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":v(()=>[d(n.$slots,"home-hero-image",{},void 0,!0)]),_:3}),d(n.$slots,"home-hero-after",{},void 0,!0),d(n.$slots,"home-features-before",{},void 0,!0),_(zn),d(n.$slots,"home-features-after",{},void 0,!0),i(e).markdownStyles!==!1?(r(),k(Un,{key:0},{default:v(()=>[_(a)]),_:1})):(r(),k(a,{key:1}))],2)}}}),Wn=g(jn,[["__scopeId","data-v-8b561e3d"]]),qn={},Rn={class:"VPPage"};function Kn(o,e){const t=q("Content");return r(),u("div",Rn,[d(o.$slots,"page-top"),_(t),d(o.$slots,"page-bottom")])}const Jn=g(qn,[["render",Kn]]),Yn=h({__name:"VPContent",setup(o){const{page:e,frontmatter:t}=L(),{isHome:n,hasSidebar:s}=z();return(a,c)=>(r(),u("div",{class:S(["VPContent",{"has-sidebar":i(s),"is-home":i(n)}]),id:"VPContent"},[i(e).isNotFound?d(a.$slots,"not-found",{key:0},()=>[_(ct)],!0):i(t).layout==="page"?(r(),k(Jn,{key:1},{"page-top":v(()=>[d(a.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[d(a.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(t).layout==="home"?(r(),k(Wn,{key:2},{"home-hero-before":v(()=>[d(a.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":v(()=>[d(a.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[d(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[d(a.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[d(a.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":v(()=>[d(a.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[d(a.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[d(a.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[d(a.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(t).layout&&i(t).layout!=="doc"?(r(),k(E(i(t).layout),{key:3})):(r(),k(cn,{key:4},{"doc-top":v(()=>[d(a.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[d(a.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[d(a.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[d(a.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[d(a.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[d(a.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[d(a.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[d(a.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[d(a.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[d(a.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[d(a.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),Qn=g(Yn,[["__scopeId","data-v-aff0b8d7"]]),Xn={class:"container"},Zn=["innerHTML"],xn=["innerHTML"],es=h({__name:"VPFooter",setup(o){const{theme:e,frontmatter:t}=L(),{hasSidebar:n}=z();return(s,a)=>i(e).footer&&i(t).footer!==!1?(r(),u("footer",{key:0,class:S(["VPFooter",{"has-sidebar":i(n)}])},[p("div",Xn,[i(e).footer.message?(r(),u("p",{key:0,class:"message",innerHTML:i(e).footer.message},null,8,Zn)):m("",!0),i(e).footer.copyright?(r(),u("p",{key:1,class:"copyright",innerHTML:i(e).footer.copyright},null,8,xn)):m("",!0)])],2)):m("",!0)}}),ts=g(es,[["__scopeId","data-v-c3855bb3"]]),ns={class:"menu-text"},ss={class:"header"},os={class:"outline"},as=h({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(o){const e=o,{theme:t}=L(),n=V(!1),s=V(0),a=V(),c=V();function l(y){var w;(w=a.value)!=null&&w.contains(y.target)||(n.value=!1)}D(n,y=>{if(y){document.addEventListener("click",l);return}document.removeEventListener("click",l)}),We("Escape",()=>{n.value=!1}),Ve(()=>{n.value=!1});function f(){n.value=!n.value,s.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function $(y){y.target.classList.contains("outline-link")&&(c.value&&(c.value.style.transition="none"),we(()=>{n.value=!1}))}function P(){n.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(y,w)=>(r(),u("div",{class:"VPLocalNavOutlineDropdown",style:Te({"--vp-vh":s.value+"px"}),ref_key:"main",ref:a},[y.headers.length>0?(r(),u("button",{key:0,onClick:f,class:S({open:n.value})},[p("span",ns,T(i(Ae)(i(t))),1),w[0]||(w[0]=p("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(r(),u("button",{key:1,onClick:P},T(i(t).returnToTopLabel||"Return to top"),1)),_(pe,{name:"flyout"},{default:v(()=>[n.value?(r(),u("div",{key:0,ref_key:"items",ref:c,class:"items",onClick:$},[p("div",ss,[p("a",{class:"top-link",href:"#",onClick:P},T(i(t).returnToTopLabel||"Return to top"),1)]),p("div",os,[_(Be,{headers:y.headers},null,8,["headers"])])],512)):m("",!0)]),_:1})],4))}}),rs=g(as,[["__scopeId","data-v-5fabb9ca"]]),is={class:"container"},ls=["aria-expanded"],cs={class:"menu-text"},us=h({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(o){const{theme:e}=L(),{isHome:t,hasSidebar:n,headers:s,hasLocalNav:a}=z(),{y:c}=Ne(),l=V(0);O(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))});const f=b(()=>({VPLocalNav:!0,"has-sidebar":n.value,empty:!a.value,fixed:!a.value&&!n.value}));return($,P)=>!i(t)&&(i(a)||i(n)||i(c)>=l.value)?(r(),u("div",{key:0,class:S(f.value)},[p("div",is,[i(n)?(r(),u("button",{key:0,class:"menu","aria-expanded":$.open,"aria-controls":"VPSidebarNav",onClick:P[0]||(P[0]=y=>$.$emit("open-menu"))},[P[1]||(P[1]=p("span",{class:"vpi-align-left menu-icon"},null,-1)),p("span",cs,T(i(e).sidebarMenuLabel||"Menu"),1)],8,ls)):m("",!0),_(rs,{headers:i(s),navHeight:l.value},null,8,["headers","navHeight"])])],2)):m("",!0)}}),ds=g(us,[["__scopeId","data-v-e30e5487"]]);function ps(){const o=V(!1);function e(){o.value=!0,window.addEventListener("resize",s)}function t(){o.value=!1,window.removeEventListener("resize",s)}function n(){o.value?t():e()}function s(){window.outerWidth>=768&&t()}const a=te();return D(()=>a.path,t),{isScreenOpen:o,openScreen:e,closeScreen:t,toggleScreen:n}}const vs={},fs={class:"VPSwitch",type:"button",role:"switch"},ms={class:"check"},hs={key:0,class:"icon"};function _s(o,e){return r(),u("button",fs,[p("span",ms,[o.$slots.default?(r(),u("span",hs,[d(o.$slots,"default",{},void 0,!0)])):m("",!0)])])}const ks=g(vs,[["render",_s],["__scopeId","data-v-1d5665e3"]]),gs=h({__name:"VPSwitchAppearance",setup(o){const{isDark:e,theme:t}=L(),n=ne("toggle-appearance",()=>{e.value=!e.value}),s=V("");return fe(()=>{s.value=e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme"}),(a,c)=>(r(),k(ks,{title:s.value,class:"VPSwitchAppearance","aria-checked":i(e),onClick:i(n)},{default:v(()=>c[0]||(c[0]=[p("span",{class:"vpi-sun sun"},null,-1),p("span",{class:"vpi-moon moon"},null,-1)])),_:1,__:[0]},8,["title","aria-checked","onClick"]))}}),_e=g(gs,[["__scopeId","data-v-5337faa4"]]),bs={key:0,class:"VPNavBarAppearance"},$s=h({__name:"VPNavBarAppearance",setup(o){const{site:e}=L();return(t,n)=>i(e).appearance&&i(e).appearance!=="force-dark"&&i(e).appearance!=="force-auto"?(r(),u("div",bs,[_(_e)])):m("",!0)}}),ys=g($s,[["__scopeId","data-v-6c893767"]]),ke=V();let Ee=!1,re=0;function Ps(o){const e=V(!1);if(J){!Ee&&Ls(),re++;const t=D(ke,n=>{var s,a,c;n===o.el.value||(s=o.el.value)!=null&&s.contains(n)?(e.value=!0,(a=o.onFocus)==null||a.call(o)):(e.value=!1,(c=o.onBlur)==null||c.call(o))});ee(()=>{t(),re--,re||Vs()})}return qe(e)}function Ls(){document.addEventListener("focusin",Fe),Ee=!0,ke.value=document.activeElement}function Vs(){document.removeEventListener("focusin",Fe)}function Fe(){ke.value=document.activeElement}const Ss={class:"VPMenuLink"},Ts=["innerHTML"],ws=h({__name:"VPMenuLink",props:{item:{}},setup(o){const{page:e}=L();return(t,n)=>(r(),u("div",Ss,[_(F,{class:S({active:i(W)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon},{default:v(()=>[p("span",{innerHTML:t.item.text},null,8,Ts)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),se=g(ws,[["__scopeId","data-v-35975db6"]]),Ns={class:"VPMenuGroup"},Ms={key:0,class:"title"},Is=h({__name:"VPMenuGroup",props:{text:{},items:{}},setup(o){return(e,t)=>(r(),u("div",Ns,[e.text?(r(),u("p",Ms,T(e.text),1)):m("",!0),(r(!0),u(N,null,C(e.items,n=>(r(),u(N,null,["link"in n?(r(),k(se,{key:0,item:n},null,8,["item"])):m("",!0)],64))),256))]))}}),Hs=g(Is,[["__scopeId","data-v-74489cb8"]]),Cs={class:"VPMenu"},As={key:0,class:"items"},Bs=h({__name:"VPMenu",props:{items:{}},setup(o){return(e,t)=>(r(),u("div",Cs,[e.items?(r(),u("div",As,[(r(!0),u(N,null,C(e.items,n=>(r(),u(N,{key:JSON.stringify(n)},["link"in n?(r(),k(se,{key:0,item:n},null,8,["item"])):"component"in n?(r(),k(E(n.component),U({key:1,ref_for:!0},n.props),null,16)):(r(),k(Hs,{key:2,text:n.text,items:n.items},null,8,["text","items"]))],64))),128))])):m("",!0),d(e.$slots,"default",{},void 0,!0)]))}}),Es=g(Bs,[["__scopeId","data-v-c9afd7f1"]]),Fs=["aria-expanded","aria-label"],Ds={key:0,class:"text"},Os=["innerHTML"],zs={key:1,class:"vpi-more-horizontal icon"},Gs={class:"menu"},Us=h({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(o){const e=V(!1),t=V();Ps({el:t,onBlur:n});function n(){e.value=!1}return(s,a)=>(r(),u("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:a[1]||(a[1]=c=>e.value=!0),onMouseleave:a[2]||(a[2]=c=>e.value=!1)},[p("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":s.label,onClick:a[0]||(a[0]=c=>e.value=!e.value)},[s.button||s.icon?(r(),u("span",Ds,[s.icon?(r(),u("span",{key:0,class:S([s.icon,"option-icon"])},null,2)):m("",!0),s.button?(r(),u("span",{key:1,innerHTML:s.button},null,8,Os)):m("",!0),a[3]||(a[3]=p("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(r(),u("span",zs))],8,Fs),p("div",Gs,[_(Es,{items:s.items},{default:v(()=>[d(s.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),ge=g(Us,[["__scopeId","data-v-3ab3deac"]]),js=["href","aria-label","innerHTML"],Ws=h({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(o){const e=o,t=V();O(async()=>{var a;await we();const s=(a=t.value)==null?void 0:a.children[0];s instanceof HTMLElement&&s.className.startsWith("vpi-social-")&&(getComputedStyle(s).maskImage||getComputedStyle(s).webkitMaskImage)==="none"&&s.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${e.icon}.svg')`)});const n=b(()=>typeof e.icon=="object"?e.icon.svg:``);return(s,a)=>(r(),u("a",{ref_key:"el",ref:t,class:"VPSocialLink no-icon",href:s.link,"aria-label":s.ariaLabel??(typeof s.icon=="string"?s.icon:""),target:"_blank",rel:"noopener",innerHTML:n.value},null,8,js))}}),qs=g(Ws,[["__scopeId","data-v-bd121fe5"]]),Rs={class:"VPSocialLinks"},Ks=h({__name:"VPSocialLinks",props:{links:{}},setup(o){return(e,t)=>(r(),u("div",Rs,[(r(!0),u(N,null,C(e.links,({link:n,icon:s,ariaLabel:a})=>(r(),k(qs,{key:n,icon:s,link:n,ariaLabel:a},null,8,["icon","link","ariaLabel"]))),128))]))}}),be=g(Ks,[["__scopeId","data-v-d474d15f"]]),Js={key:0,class:"group translations"},Ys={class:"trans-title"},Qs={key:1,class:"group"},Xs={class:"item appearance"},Zs={class:"label"},xs={class:"appearance-action"},eo={key:2,class:"group"},to={class:"item social-links"},no=h({__name:"VPNavBarExtra",setup(o){const{site:e,theme:t}=L(),{localeLinks:n,currentLang:s}=X({correspondingLink:!0}),a=b(()=>n.value.length&&s.value.label||e.value.appearance||t.value.socialLinks);return(c,l)=>a.value?(r(),k(ge,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[i(n).length&&i(s).label?(r(),u("div",Js,[p("p",Ys,T(i(s).label),1),(r(!0),u(N,null,C(i(n),f=>(r(),k(se,{key:f.link,item:f},null,8,["item"]))),128))])):m("",!0),i(e).appearance&&i(e).appearance!=="force-dark"&&i(e).appearance!=="force-auto"?(r(),u("div",Qs,[p("div",Xs,[p("p",Zs,T(i(t).darkModeSwitchLabel||"Appearance"),1),p("div",xs,[_(_e)])])])):m("",!0),i(t).socialLinks?(r(),u("div",eo,[p("div",to,[_(be,{class:"social-links-list",links:i(t).socialLinks},null,8,["links"])])])):m("",!0)]),_:1})):m("",!0)}}),so=g(no,[["__scopeId","data-v-bb2aa2f0"]]),oo=["aria-expanded"],ao=h({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(o){return(e,t)=>(r(),u("button",{type:"button",class:S(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=n=>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,oo))}}),ro=g(ao,[["__scopeId","data-v-e5dd9c1c"]]),io=["innerHTML"],lo=h({__name:"VPNavBarMenuLink",props:{item:{}},setup(o){const{page:e}=L();return(t,n)=>(r(),k(F,{class:S({VPNavBarMenuLink:!0,active:i(W)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,tabindex:"0"},{default:v(()=>[p("span",{innerHTML:t.item.text},null,8,io)]),_:1},8,["class","href","target","rel","no-icon"]))}}),co=g(lo,[["__scopeId","data-v-e56f3d57"]]),uo=h({__name:"VPNavBarMenuGroup",props:{item:{}},setup(o){const e=o,{page:t}=L(),n=a=>"component"in a?!1:"link"in a?W(t.value.relativePath,a.link,!!e.item.activeMatch):a.items.some(n),s=b(()=>n(e.item));return(a,c)=>(r(),k(ge,{class:S({VPNavBarMenuGroup:!0,active:i(W)(i(t).relativePath,a.item.activeMatch,!!a.item.activeMatch)||s.value}),button:a.item.text,items:a.item.items},null,8,["class","button","items"]))}}),po={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},vo=h({__name:"VPNavBarMenu",setup(o){const{theme:e}=L();return(t,n)=>i(e).nav?(r(),u("nav",po,[n[0]||(n[0]=p("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(r(!0),u(N,null,C(i(e).nav,s=>(r(),u(N,{key:JSON.stringify(s)},["link"in s?(r(),k(co,{key:0,item:s},null,8,["item"])):"component"in s?(r(),k(E(s.component),U({key:1,ref_for:!0},s.props),null,16)):(r(),k(uo,{key:2,item:s},null,8,["item"]))],64))),128))])):m("",!0)}}),fo=g(vo,[["__scopeId","data-v-39714824"]]);function mo(o){const{localeIndex:e,theme:t}=L();function n(s){var H,A,M;const a=s.split("."),c=(H=t.value.search)==null?void 0:H.options,l=c&&typeof c=="object",f=l&&((M=(A=c.locales)==null?void 0:A[e.value])==null?void 0:M.translations)||null,$=l&&c.translations||null;let P=f,y=$,w=o;const I=a.pop();for(const B of a){let G=null;const R=w==null?void 0:w[B];R&&(G=w=R);const oe=y==null?void 0:y[B];oe&&(G=y=oe);const ae=P==null?void 0:P[B];ae&&(G=P=ae),R||(w=G),oe||(y=G),ae||(P=G)}return(P==null?void 0:P[I])??(y==null?void 0:y[I])??(w==null?void 0:w[I])??""}return n}const ho=["aria-label"],_o={class:"DocSearch-Button-Container"},ko={class:"DocSearch-Button-Placeholder"},Pe=h({__name:"VPNavBarSearchButton",setup(o){const t=mo({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(n,s)=>(r(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":i(t)("button.buttonAriaLabel")},[p("span",_o,[s[0]||(s[0]=p("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),p("span",ko,T(i(t)("button.buttonText")),1)]),s[1]||(s[1]=p("span",{class:"DocSearch-Button-Keys"},[p("kbd",{class:"DocSearch-Button-Key"}),p("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,ho))}}),go={class:"VPNavBarSearch"},bo={id:"local-search"},$o={key:1,id:"docsearch"},yo=h({__name:"VPNavBarSearch",setup(o){const e=()=>null,t=()=>null,{theme:n}=L(),s=V(!1),a=V(!1);O(()=>{});function c(){s.value||(s.value=!0,setTimeout(l,16))}function l(){const P=new Event("keydown");P.key="k",P.metaKey=!0,window.dispatchEvent(P),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||l()},16)}const f=V(!1),$="";return(P,y)=>{var w;return r(),u("div",go,[i($)==="local"?(r(),u(N,{key:0},[f.value?(r(),k(i(e),{key:0,onClose:y[0]||(y[0]=I=>f.value=!1)})):m("",!0),p("div",bo,[_(Pe,{onClick:y[1]||(y[1]=I=>f.value=!0)})])],64)):i($)==="algolia"?(r(),u(N,{key:1},[s.value?(r(),k(i(t),{key:0,algolia:((w=i(n).search)==null?void 0:w.options)??i(n).algolia,onVnodeBeforeMount:y[2]||(y[2]=I=>a.value=!0)},null,8,["algolia"])):m("",!0),a.value?m("",!0):(r(),u("div",$o,[_(Pe,{onClick:c})]))],64)):m("",!0)])}}}),Po=h({__name:"VPNavBarSocialLinks",setup(o){const{theme:e}=L();return(t,n)=>i(e).socialLinks?(r(),k(be,{key:0,class:"VPNavBarSocialLinks",links:i(e).socialLinks},null,8,["links"])):m("",!0)}}),Lo=g(Po,[["__scopeId","data-v-0394ad82"]]),Vo=["href","rel","target"],So=["innerHTML"],To={key:2},wo=h({__name:"VPNavBarTitle",setup(o){const{site:e,theme:t}=L(),{hasSidebar:n}=z(),{currentLang:s}=X(),a=b(()=>{var f;return typeof t.value.logoLink=="string"?t.value.logoLink:(f=t.value.logoLink)==null?void 0:f.link}),c=b(()=>{var f;return typeof t.value.logoLink=="string"||(f=t.value.logoLink)==null?void 0:f.rel}),l=b(()=>{var f;return typeof t.value.logoLink=="string"||(f=t.value.logoLink)==null?void 0:f.target});return(f,$)=>(r(),u("div",{class:S(["VPNavBarTitle",{"has-sidebar":i(n)}])},[p("a",{class:"title",href:a.value??i(he)(i(s).link),rel:c.value,target:l.value},[d(f.$slots,"nav-bar-title-before",{},void 0,!0),i(t).logo?(r(),k(x,{key:0,class:"logo",image:i(t).logo},null,8,["image"])):m("",!0),i(t).siteTitle?(r(),u("span",{key:1,innerHTML:i(t).siteTitle},null,8,So)):i(t).siteTitle===void 0?(r(),u("span",To,T(i(e).title),1)):m("",!0),d(f.$slots,"nav-bar-title-after",{},void 0,!0)],8,Vo)],2))}}),No=g(wo,[["__scopeId","data-v-1e38c6bc"]]),Mo={class:"items"},Io={class:"title"},Ho=h({__name:"VPNavBarTranslations",setup(o){const{theme:e}=L(),{localeLinks:t,currentLang:n}=X({correspondingLink:!0});return(s,a)=>i(t).length&&i(n).label?(r(),k(ge,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:i(e).langMenuLabel||"Change language"},{default:v(()=>[p("div",Mo,[p("p",Io,T(i(n).label),1),(r(!0),u(N,null,C(i(t),c=>(r(),k(se,{key:c.link,item:c},null,8,["item"]))),128))])]),_:1},8,["label"])):m("",!0)}}),Co=g(Ho,[["__scopeId","data-v-88af2de4"]]),Ao={class:"wrapper"},Bo={class:"container"},Eo={class:"title"},Fo={class:"content"},Do={class:"content-body"},Oo=h({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(o){const e=o,{y:t}=Ne(),{isHome:n,hasSidebar:s}=z(),a=V({});return fe(()=>{a.value={"has-sidebar":s.value,home:n.value,top:t.value===0,"screen-open":e.isScreenOpen}}),(c,l)=>(r(),u("div",{class:S(["VPNavBar",a.value])},[p("div",Ao,[p("div",Bo,[p("div",Eo,[_(No,null,{"nav-bar-title-before":v(()=>[d(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[d(c.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),p("div",Fo,[p("div",Do,[d(c.$slots,"nav-bar-content-before",{},void 0,!0),_(yo,{class:"search"}),_(fo,{class:"menu"}),_(Co,{class:"translations"}),_(ys,{class:"appearance"}),_(Lo,{class:"social-links"}),_(so,{class:"extra"}),d(c.$slots,"nav-bar-content-after",{},void 0,!0),_(ro,{class:"hamburger",active:c.isScreenOpen,onClick:l[0]||(l[0]=f=>c.$emit("toggle-screen"))},null,8,["active"])])])])]),l[1]||(l[1]=p("div",{class:"divider"},[p("div",{class:"divider-line"})],-1))],2))}}),zo=g(Oo,[["__scopeId","data-v-0ae64501"]]),Go={key:0,class:"VPNavScreenAppearance"},Uo={class:"text"},jo=h({__name:"VPNavScreenAppearance",setup(o){const{site:e,theme:t}=L();return(n,s)=>i(e).appearance&&i(e).appearance!=="force-dark"&&i(e).appearance!=="force-auto"?(r(),u("div",Go,[p("p",Uo,T(i(t).darkModeSwitchLabel||"Appearance"),1),_(_e)])):m("",!0)}}),Wo=g(jo,[["__scopeId","data-v-b44890b2"]]),qo=["innerHTML"],Ro=h({__name:"VPNavScreenMenuLink",props:{item:{}},setup(o){const e=ne("close-screen");return(t,n)=>(r(),k(F,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:i(e)},{default:v(()=>[p("span",{innerHTML:t.item.text},null,8,qo)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Ko=g(Ro,[["__scopeId","data-v-df37e6dd"]]),Jo=["innerHTML"],Yo=h({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(o){const e=ne("close-screen");return(t,n)=>(r(),k(F,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:i(e)},{default:v(()=>[p("span",{innerHTML:t.item.text},null,8,Jo)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),De=g(Yo,[["__scopeId","data-v-3e9c20e4"]]),Qo={class:"VPNavScreenMenuGroupSection"},Xo={key:0,class:"title"},Zo=h({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(o){return(e,t)=>(r(),u("div",Qo,[e.text?(r(),u("p",Xo,T(e.text),1)):m("",!0),(r(!0),u(N,null,C(e.items,n=>(r(),k(De,{key:n.text,item:n},null,8,["item"]))),128))]))}}),xo=g(Zo,[["__scopeId","data-v-4b7a798b"]]),ea=["aria-controls","aria-expanded"],ta=["innerHTML"],na=["id"],sa={key:0,class:"item"},oa={key:1,class:"item"},aa={key:2,class:"group"},ra=h({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(o){const e=o,t=V(!1),n=b(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function s(){t.value=!t.value}return(a,c)=>(r(),u("div",{class:S(["VPNavScreenMenuGroup",{open:t.value}])},[p("button",{class:"button","aria-controls":n.value,"aria-expanded":t.value,onClick:s},[p("span",{class:"button-text",innerHTML:a.text},null,8,ta),c[0]||(c[0]=p("span",{class:"vpi-plus button-icon"},null,-1))],8,ea),p("div",{id:n.value,class:"items"},[(r(!0),u(N,null,C(a.items,l=>(r(),u(N,{key:JSON.stringify(l)},["link"in l?(r(),u("div",sa,[_(De,{item:l},null,8,["item"])])):"component"in l?(r(),u("div",oa,[(r(),k(E(l.component),U({ref_for:!0},l.props,{"screen-menu":""}),null,16))])):(r(),u("div",aa,[_(xo,{text:l.text,items:l.items},null,8,["text","items"])]))],64))),128))],8,na)],2))}}),ia=g(ra,[["__scopeId","data-v-956364f9"]]),la={key:0,class:"VPNavScreenMenu"},ca=h({__name:"VPNavScreenMenu",setup(o){const{theme:e}=L();return(t,n)=>i(e).nav?(r(),u("nav",la,[(r(!0),u(N,null,C(i(e).nav,s=>(r(),u(N,{key:JSON.stringify(s)},["link"in s?(r(),k(Ko,{key:0,item:s},null,8,["item"])):"component"in s?(r(),k(E(s.component),U({key:1,ref_for:!0},s.props,{"screen-menu":""}),null,16)):(r(),k(ia,{key:2,text:s.text||"",items:s.items},null,8,["text","items"]))],64))),128))])):m("",!0)}}),ua=h({__name:"VPNavScreenSocialLinks",setup(o){const{theme:e}=L();return(t,n)=>i(e).socialLinks?(r(),k(be,{key:0,class:"VPNavScreenSocialLinks",links:i(e).socialLinks},null,8,["links"])):m("",!0)}}),da={class:"list"},pa=h({__name:"VPNavScreenTranslations",setup(o){const{localeLinks:e,currentLang:t}=X({correspondingLink:!0}),n=V(!1);function s(){n.value=!n.value}return(a,c)=>i(e).length&&i(t).label?(r(),u("div",{key:0,class:S(["VPNavScreenTranslations",{open:n.value}])},[p("button",{class:"title",onClick:s},[c[0]||(c[0]=p("span",{class:"vpi-languages icon lang"},null,-1)),j(" "+T(i(t).label)+" ",1),c[1]||(c[1]=p("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),p("ul",da,[(r(!0),u(N,null,C(i(e),l=>(r(),u("li",{key:l.link,class:"item"},[_(F,{class:"link",href:l.link},{default:v(()=>[j(T(l.text),1)]),_:2},1032,["href"])]))),128))])],2)):m("",!0)}}),va=g(pa,[["__scopeId","data-v-858fe1a4"]]),fa={class:"container"},ma=h({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(o){const e=V(null),t=Me(J?document.body:null);return(n,s)=>(r(),k(pe,{name:"fade",onEnter:s[0]||(s[0]=a=>t.value=!0),onAfterLeave:s[1]||(s[1]=a=>t.value=!1)},{default:v(()=>[n.open?(r(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[p("div",fa,[d(n.$slots,"nav-screen-content-before",{},void 0,!0),_(ca,{class:"menu"}),_(va,{class:"translations"}),_(Wo,{class:"appearance"}),_(ua,{class:"social-links"}),d(n.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):m("",!0)]),_:3}))}}),ha=g(ma,[["__scopeId","data-v-f2779853"]]),_a={key:0,class:"VPNav"},ka=h({__name:"VPNav",setup(o){const{isScreenOpen:e,closeScreen:t,toggleScreen:n}=ps(),{frontmatter:s}=L(),a=b(()=>s.value.navbar!==!1);return Ie("close-screen",t),Q(()=>{J&&document.documentElement.classList.toggle("hide-nav",!a.value)}),(c,l)=>a.value?(r(),u("header",_a,[_(zo,{"is-screen-open":i(e),onToggleScreen:i(n)},{"nav-bar-title-before":v(()=>[d(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[d(c.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[d(c.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[d(c.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),_(ha,{open:i(e)},{"nav-screen-content-before":v(()=>[d(c.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[d(c.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):m("",!0)}}),ga=g(ka,[["__scopeId","data-v-ae24b3ad"]]),ba=["role","tabindex"],$a={key:1,class:"items"},ya=h({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(o){const e=o,{collapsed:t,collapsible:n,isLink:s,isActiveLink:a,hasActiveLink:c,hasChildren:l,toggle:f}=yt(b(()=>e.item)),$=b(()=>l.value?"section":"div"),P=b(()=>s.value?"a":"div"),y=b(()=>l.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),w=b(()=>s.value?void 0:"button"),I=b(()=>[[`level-${e.depth}`],{collapsible:n.value},{collapsed:t.value},{"is-link":s.value},{"is-active":a.value},{"has-active":c.value}]);function H(M){"key"in M&&M.key!=="Enter"||!e.item.link&&f()}function A(){e.item.link&&f()}return(M,B)=>{const G=q("VPSidebarItem",!0);return r(),k(E($.value),{class:S(["VPSidebarItem",I.value])},{default:v(()=>[M.item.text?(r(),u("div",U({key:0,class:"item",role:w.value},Re(M.item.items?{click:H,keydown:H}:{},!0),{tabindex:M.item.items&&0}),[B[1]||(B[1]=p("div",{class:"indicator"},null,-1)),M.item.link?(r(),k(F,{key:0,tag:P.value,class:"link",href:M.item.link,rel:M.item.rel,target:M.item.target},{default:v(()=>[(r(),k(E(y.value),{class:"text",innerHTML:M.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(r(),k(E(y.value),{key:1,class:"text",innerHTML:M.item.text},null,8,["innerHTML"])),M.item.collapsed!=null&&M.item.items&&M.item.items.length?(r(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:A,onKeydown:Ke(A,["enter"]),tabindex:"0"},B[0]||(B[0]=[p("span",{class:"vpi-chevron-right caret-icon"},null,-1)]),32)):m("",!0)],16,ba)):m("",!0),M.item.items&&M.item.items.length?(r(),u("div",$a,[M.depth<5?(r(!0),u(N,{key:0},C(M.item.items,R=>(r(),k(G,{key:R.text,item:R,depth:M.depth+1},null,8,["item","depth"]))),128)):m("",!0)])):m("",!0)]),_:1},8,["class"])}}}),Pa=g(ya,[["__scopeId","data-v-d81de50c"]]),La=h({__name:"VPSidebarGroup",props:{items:{}},setup(o){const e=V(!0);let t=null;return O(()=>{t=setTimeout(()=>{t=null,e.value=!1},300)}),Je(()=>{t!=null&&(clearTimeout(t),t=null)}),(n,s)=>(r(!0),u(N,null,C(n.items,a=>(r(),u("div",{key:a.text,class:S(["group",{"no-transition":e.value}])},[_(Pa,{item:a,depth:0},null,8,["item"])],2))),128))}}),Va=g(La,[["__scopeId","data-v-8d50c081"]]),Sa={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Ta=h({__name:"VPSidebar",props:{open:{type:Boolean}},setup(o){const{sidebarGroups:e,hasSidebar:t}=z(),n=o,s=V(null),a=Me(J?document.body:null);D([n,s],()=>{var l;n.open?(a.value=!0,(l=s.value)==null||l.focus()):a.value=!1},{immediate:!0,flush:"post"});const c=V(0);return D(e,()=>{c.value+=1},{deep:!0}),(l,f)=>i(t)?(r(),u("aside",{key:0,class:S(["VPSidebar",{open:l.open}]),ref_key:"navEl",ref:s,onClick:f[0]||(f[0]=Ye(()=>{},["stop"]))},[f[2]||(f[2]=p("div",{class:"curtain"},null,-1)),p("nav",Sa,[f[1]||(f[1]=p("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),d(l.$slots,"sidebar-nav-before",{},void 0,!0),(r(),k(Va,{items:i(e),key:c.value},null,8,["items"])),d(l.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):m("",!0)}}),wa=g(Ta,[["__scopeId","data-v-cbecfdd4"]]),Na=h({__name:"VPSkipLink",setup(o){const{theme:e}=L(),t=te(),n=V();D(()=>t.path,()=>n.value.focus());function s({target:a}){const c=document.getElementById(decodeURIComponent(a.hash).slice(1));if(c){const l=()=>{c.removeAttribute("tabindex"),c.removeEventListener("blur",l)};c.setAttribute("tabindex","-1"),c.addEventListener("blur",l),c.focus(),window.scrollTo(0,0)}}return(a,c)=>(r(),u(N,null,[p("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),p("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s},T(i(e).skipToContentLabel||"Skip to content"),1)],64))}}),Ma=g(Na,[["__scopeId","data-v-0b0ada53"]]),Ia=h({__name:"Layout",setup(o){const{isOpen:e,open:t,close:n}=$t();Pt({closeSidebar:n});const{frontmatter:s}=L(),a=Qe(),c=b(()=>!!a["home-hero-image"]);return Ie("hero-image-slot-exists",c),(l,f)=>{const $=q("Content");return i(s).layout!==!1?(r(),u("div",{key:0,class:S(["Layout",i(s).pageClass])},[d(l.$slots,"layout-top",{},void 0,!0),_(Ma),_(et,{class:"backdrop",show:i(e),onClick:i(n)},null,8,["show","onClick"]),_(ga,null,{"nav-bar-title-before":v(()=>[d(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[d(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[d(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[d(l.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[d(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[d(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),_(ds,{open:i(e),onOpenMenu:i(t)},null,8,["open","onOpenMenu"]),_(wa,{open:i(e)},{"sidebar-nav-before":v(()=>[d(l.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[d(l.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),_(Qn,null,{"page-top":v(()=>[d(l.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[d(l.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[d(l.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[d(l.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":v(()=>[d(l.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[d(l.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[d(l.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[d(l.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":v(()=>[d(l.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[d(l.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[d(l.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[d(l.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[d(l.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[d(l.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[d(l.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[d(l.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[d(l.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[d(l.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[d(l.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[d(l.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[d(l.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[d(l.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[d(l.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),_(ts),d(l.$slots,"layout-bottom",{},void 0,!0)],2)):(r(),k($,{key:1}))}}}),Ha=g(Ia,[["__scopeId","data-v-5e06b97a"]]),Ca={xmini:[[0,2]],mini:[],small:[[920,6],[768,5],[640,4],[480,3],[0,2]],medium:[[960,5],[832,4],[640,3],[480,2]],big:[[832,3],[640,2]]};function Aa({el:o,size:e="medium"}){const t=He(n,100);O(()=>{n(),window.addEventListener("resize",t)}),ee(()=>{window.removeEventListener("resize",t)});function n(){Ba(o.value,e)}}function Ba(o,e){const t=o.children.length,n=o.querySelectorAll(".vp-sponsor-grid-item:not(.empty)").length,s=Ea(o,e,n);Da(o,s,t,n)}function Ea(o,e,t){const n=Ca[e],s=window.innerWidth;let a=1;return n.some(([c,l])=>{if(s>=c)return a=t0?za(o,e):Ga(o,e*-1))}function za(o,e){for(let t=0;t(r(),u("div",{class:S(["VPSponsorsGrid vp-sponsor-grid",[n.size]]),ref_key:"el",ref:t},[(r(!0),u(N,null,C(n.data,a=>(r(),u("div",{key:a.name,class:"vp-sponsor-grid-item"},[p("a",{class:"vp-sponsor-grid-link",href:a.url,target:"_blank",rel:"sponsored noopener"},[p("article",ja,[p("h4",Wa,T(a.name),1),p("img",{class:"vp-sponsor-grid-image",src:a.img,alt:a.name},null,8,qa)])],8,Ua)]))),128))],2))}}),Ka={key:0,class:"vp-sponsor-tier"},Qa=h({__name:"VPSponsors",props:{mode:{default:"normal"},tier:{},size:{},data:{}},setup(o){const e=o,t=b(()=>e.data.some(s=>"items"in s)?e.data:[{tier:e.tier,size:e.size,items:e.data}]);return(n,s)=>(r(),u("div",{class:S(["VPSponsors vp-sponsor",[n.mode]])},[(r(!0),u(N,null,C(t.value,(a,c)=>(r(),u("section",{key:c,class:"vp-sponsor-section"},[a.tier?(r(),u("h3",Ka,T(a.tier),1)):m("",!0),_(Ra,{size:a.size,data:a.items},null,8,["size","data"])]))),128))],2))}}),Ja={Layout:Ha,enhanceApp:({app:o})=>{o.component("Badge",Xe)}},Xa={...Ja,setup(){const{lang:o}=Le();Q(()=>{J&&(document.cookie=`nf_lang=${o.value}; expires=Mon, 1 Jan 2024 00:00:00 UTC; path=/`)})}};export{Xa as R,Qa as _}; diff --git a/assets/chunks/theme.MOrVMOSc.js b/assets/chunks/theme.MOrVMOSc.js new file mode 100644 index 00000000..b91224a8 --- /dev/null +++ b/assets/chunks/theme.MOrVMOSc.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPAlgoliaSearchBox.nRDYEdJs.js","assets/chunks/framework.Bhsyh9kO.js"])))=>i.map(i=>d[i]); +import{d as m,c as u,r as d,n as L,o as a,a as R,t as S,b as _,w as v,T as ce,e as f,_ as k,u as Pe,i as Oe,f as ze,g as ue,h as b,j as p,k as i,l as U,m as be,p as D,q as Ge,s as Y,v as Re,x as P,y as X,z as F,A as de,B as pe,C as K,D as ee,E as $e,F as Le,G as N,H,I as j,J as h,K as A,L as Ve,M as G,N as te,O as Se,P as Ue,Q as je,R as Te,S as we,U as We,V as Ke,W as qe,X as Ne,Y as Ie,Z as Je,$ as Ye,a0 as Xe,a1 as Qe,a2 as Ze}from"./framework.Bhsyh9kO.js";const xe=m({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(o){return(e,t)=>(a(),u("span",{class:L(["VPBadge",e.type])},[d(e.$slots,"default",{},()=>[R(S(e.text),1)])],2))}}),et={key:0,class:"VPBackdrop"},tt=m({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(o){return(e,t)=>(a(),_(ce,{name:"fade"},{default:v(()=>[e.show?(a(),u("div",et)):f("",!0)]),_:1}))}}),nt=k(tt,[["__scopeId","data-v-c79a1216"]]),$=Pe;function Me(o,e){let t,n=!1;return()=>{t&&clearTimeout(t),n?t=setTimeout(o,e):(o(),(n=!0)&&setTimeout(()=>n=!1,e))}}function oe(o){return o.startsWith("/")?o:`/${o}`}function ve(o){const{pathname:e,search:t,hash:n,protocol:s}=new URL(o,"http://a.com");if(Oe(o)||o.startsWith("#")||!s.startsWith("http")||!ze(e))return o;const{site:r}=$(),c=e.endsWith("/")||e.endsWith(".html")?o:o.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${t}${n}`);return ue(c)}function Q({correspondingLink:o=!1}={}){const{site:e,localeIndex:t,page:n,theme:s,hash:r}=$(),c=b(()=>({label:e.value.locales[t.value]?.label,link:e.value.locales[t.value]?.link||(t.value==="root"?"/":`/${t.value}/`)}));return{localeLinks:b(()=>Object.entries(e.value.locales).flatMap(([g,V])=>c.value.label===V.label?[]:{text:V.label,link:st(V.link||(g==="root"?"/":`/${g}/`),s.value.i18nRouting!==!1&&o,n.value.relativePath.slice(c.value.link.length-1),!e.value.cleanUrls)+r.value})),currentLang:c}}function st(o,e,t,n){return e?o.replace(/\/$/,"")+oe(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,n?".html":"")):o}const ot={class:"NotFound"},at={class:"code"},rt={class:"title"},it={class:"quote"},lt={class:"action"},ct=["href","aria-label"],ut=m({__name:"NotFound",setup(o){const{theme:e}=$(),{currentLang:t}=Q();return(n,s)=>(a(),u("div",ot,[p("p",at,S(i(e).notFound?.code??"404"),1),p("h1",rt,S(i(e).notFound?.title??"PAGE NOT FOUND"),1),s[0]||(s[0]=p("div",{class:"divider"},null,-1)),p("blockquote",it,S(i(e).notFound?.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",lt,[p("a",{class:"link",href:i(ue)(i(e).notFound?.link??i(t).link),"aria-label":i(e).notFound?.linkLabel??"go to home"},S(i(e).notFound?.linkText??"Take me home"),9,ct)])]))}}),dt=k(ut,[["__scopeId","data-v-829df670"]]);function Ce(o,e){if(Array.isArray(o))return Z(o);if(o==null)return[];e=oe(e);const t=Object.keys(o).sort((s,r)=>r.split("/").length-s.split("/").length).find(s=>e.startsWith(oe(s))),n=t?o[t]:[];return Array.isArray(n)?Z(n):Z(n.items,n.base)}function pt(o){const e=[];let t=0;for(const n in o){const s=o[n];if(s.items){t=e.push(s);continue}e[t]||e.push({items:[]}),e[t].items.push(s)}return e}function vt(o){const e=[];function t(n){for(const s of n)s.text&&s.link&&e.push({text:s.text,link:s.link,docFooterText:s.docFooterText}),s.items&&t(s.items)}return t(o),e}function ae(o,e){return Array.isArray(e)?e.some(t=>ae(o,t)):U(o,e.link)?!0:e.items?ae(o,e.items):!1}function Z(o,e){return[...o].map(t=>{const n={...t},s=n.base||e;return s&&n.link&&(n.link=s+n.link.replace(/^\//,s.endsWith("/")?"":"/")),n.items&&(n.items=Z(n.items,s)),n})}function ft(){const{hasSidebar:o}=O(),e=be("(min-width: 960px)"),t=be("(min-width: 1280px)");return{isAsideEnabled:b(()=>!t.value&&!e.value?!1:o.value?t.value:e.value)}}const mt=/\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/,re=[];function He(o){return typeof o.outline=="object"&&!Array.isArray(o.outline)&&o.outline.label||o.outlineTitle||"On this page"}function ht(o){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const n=Number(t.tagName[1]);return{element:t,title:_t(t),link:"#"+t.id,level:n}});return kt(e,o)}function _t(o){let e="";for(const t of o.childNodes)if(t.nodeType===1){if(mt.test(t.className))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function kt(o,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[n,s]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;return $t(o,n,s)}function gt(o,e){const{isAsideEnabled:t}=ft(),n=Me(r,100);let s=null;D(()=>{requestAnimationFrame(r),window.addEventListener("scroll",n)}),Ge(()=>{c(location.hash)}),Y(()=>{window.removeEventListener("scroll",n)});function r(){if(!t.value)return;const l=window.scrollY,g=window.innerHeight,V=document.body.offsetHeight,T=Math.abs(l+g-V)<1,I=re.map(({element:w,link:y})=>({link:y,top:bt(w)})).filter(({top:w})=>!Number.isNaN(w)).sort((w,y)=>w.top-y.top);if(!I.length){c(null);return}if(l<1){c(null);return}if(T){c(I[I.length-1].link);return}let M=null;for(const{link:w,top:y}of I){if(y>l+Re()+4)break;M=w}c(M)}function c(l){s&&s.classList.remove("active"),l==null?s=null:s=o.value.querySelector(`a[href="${decodeURIComponent(l)}"]`);const g=s;g?(g.classList.add("active"),e.value.style.top=g.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function bt(o){let e=0;for(;o!==document.body;){if(o===null)return NaN;e+=o.offsetTop,o=o.offsetParent}return e}function $t(o,e,t){re.length=0;const n=[],s=[];return o.forEach(r=>{const c={...r,children:[]};let l=s[s.length-1];for(;l&&l.level>=c.level;)s.pop(),l=s[s.length-1];if(c.element.classList.contains("ignore-header")||l&&"shouldIgnore"in l){s.push({level:c.level,shouldIgnore:!0});return}c.level>t||c.level{e=W.value?document.activeElement:void 0}),D(()=>{window.addEventListener("keyup",t)}),Y(()=>{window.removeEventListener("keyup",t)});function t(n){n.key==="Escape"&&W.value&&(o(),e?.focus())}}function Pt(){function o(){W.value=!0}function e(){W.value=!1}function t(){W.value?e():o()}return{isOpen:W,open:o,close:e,toggle:t}}function Lt(o){const{page:e,hash:t}=$(),n=P(!1),s=b(()=>o.value.collapsed!=null),r=b(()=>!!o.value.link),c=P(!1),l=()=>{c.value=U(e.value.relativePath,o.value.link)};F([e,o,t],l),D(l);const g=b(()=>c.value?!0:o.value.items?ae(e.value.relativePath,o.value.items):!1),V=b(()=>!!(o.value.items&&o.value.items.length));X(()=>{n.value=!!(s.value&&o.value.collapsed)}),de(()=>{(c.value||g.value)&&(n.value=!1)});function T(){s.value&&(n.value=!n.value)}return{collapsed:n,collapsible:s,isLink:r,isActiveLink:c,hasActiveLink:g,hasChildren:V,toggle:T}}const ie=pe([]),J=pe([]),le=pe(!1);function O(){const{frontmatter:o,theme:e}=$(),t=b(()=>!!(o.value.isHome??o.value.layout==="home")),n=b(()=>o.value.sidebar!==!1&&J.value.length>0&&!t.value),s=b(()=>n.value&&le.value),r=b(()=>n.value?pt(J.value):[]),c=b(()=>t.value?!1:o.value.aside!=null?!!o.value.aside:e.value.aside!==!1),l=b(()=>c.value?o.value.aside==null?e.value.aside==="left":o.value.aside==="left":!1),g=b(()=>ie.value.length>0);return{isHome:t,sidebar:$e(J),sidebarGroups:r,hasSidebar:n,isSidebarEnabled:s,hasAside:c,leftAside:l,headers:$e(ie),hasLocalNav:g}}function Vt({closeSidebar:o}){const{frontmatter:e,page:t,theme:n}=$();F(()=>[t.value.relativePath,n.value.sidebar],([r,c])=>{const l=c?Ce(c,r):[];JSON.stringify(l)!==JSON.stringify(J.value)&&(J.value=l)},{immediate:!0,deep:!0,flush:"sync"}),Le(()=>{ie.value=ht(e.value.outline??n.value.outline)}),K&&(le.value=window.innerWidth>=960,window.addEventListener("resize",()=>{le.value=window.innerWidth>=960},{passive:!0}));const s=ee();F(()=>s.path,o),yt(o)}const Ae=Symbol("layout-info"),St=["href","title"],Tt=m({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(o){function e({target:t}){const n=t.href.split("#")[1];document.getElementById(decodeURIComponent(n))?.focus({preventScroll:!0})}return(t,n)=>{const s=j("VPDocOutlineItem",!0);return a(),u("ul",{class:L(["VPDocOutlineItem",t.root?"root":"nested"])},[(a(!0),u(N,null,H(t.headers,({children:r,link:c,title:l})=>(a(),u("li",null,[p("a",{class:"outline-link",href:c,onClick:e,title:l},S(l),9,St),r?.length?(a(),_(s,{key:0,headers:r},null,8,["headers"])):f("",!0)]))),256))],2)}}}),Be=k(Tt,[["__scopeId","data-v-2d0bdf9b"]]),wt={class:"content"},Nt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},It=m({__name:"VPDocAsideOutline",setup(o){const{theme:e}=$(),t=P(),n=P(),{headers:s,hasLocalNav:r}=O();return gt(t,n),(c,l)=>(a(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:L(["VPDocAsideOutline",{"has-outline":i(r)}]),ref_key:"container",ref:t},[p("div",wt,[p("div",{class:"outline-marker",ref_key:"marker",ref:n},null,512),p("div",Nt,S(i(He)(i(e))),1),h(Be,{headers:i(s),root:!0},null,8,["headers"])])],2))}}),Mt=k(It,[["__scopeId","data-v-60d5052e"]]),Ct={class:"VPDocAsideCarbonAds"},Ht=m({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(o){const e=()=>null;return(t,n)=>(a(),u("div",Ct,[h(i(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),At={class:"VPDocAside"},Bt=m({__name:"VPDocAside",setup(o){const{theme:e}=$();return(t,n)=>(a(),u("div",At,[d(t.$slots,"aside-top",{},void 0,!0),d(t.$slots,"aside-outline-before",{},void 0,!0),h(Mt),d(t.$slots,"aside-outline-after",{},void 0,!0),n[0]||(n[0]=p("div",{class:"spacer"},null,-1)),d(t.$slots,"aside-ads-before",{},void 0,!0),i(e).carbonAds?(a(),_(Ht,{key:0,"carbon-ads":i(e).carbonAds},null,8,["carbon-ads"])):f("",!0),d(t.$slots,"aside-ads-after",{},void 0,!0),d(t.$slots,"aside-bottom",{},void 0,!0)]))}}),Et=k(Bt,[["__scopeId","data-v-3f215769"]]);function Ft(){const{theme:o,page:e}=$();return b(()=>{const{text:t="Edit this page",pattern:n=""}=o.value.editLink||{};let s;return typeof n=="function"?s=n(e.value):s=n.replace(/:path/g,e.value.filePath),{url:s,text:t}})}function Dt(){const{page:o,theme:e,frontmatter:t}=$();return b(()=>{const n=Ce(e.value.sidebar,o.value.relativePath),s=vt(n),r=Ot(s,V=>V.link.replace(/[?#].*$/,"")),c=r.findIndex(V=>U(o.value.relativePath,V.link)),l=e.value.docFooter?.prev===!1&&!t.value.prev||t.value.prev===!1,g=e.value.docFooter?.next===!1&&!t.value.next||t.value.next===!1;return{prev:l?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??r[c-1]?.docFooterText??r[c-1]?.text,link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??r[c-1]?.link},next:g?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??r[c+1]?.docFooterText??r[c+1]?.text,link:(typeof t.value.next=="object"?t.value.next.link:void 0)??r[c+1]?.link}}})}function Ot(o,e){const t=new Set;return o.filter(n=>{const s=e(n);return t.has(s)?!1:t.add(s)})}const B=m({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(o){const e=o,t=b(()=>e.tag??(e.href?"a":"span")),n=b(()=>e.href&&Ve.test(e.href)||e.target==="_blank");return(s,r)=>(a(),_(A(t.value),{class:L(["VPLink",{link:s.href,"vp-external-link-icon":n.value,"no-icon":s.noIcon}]),href:s.href?i(ve)(s.href):void 0,target:s.target??(n.value?"_blank":void 0),rel:s.rel??(n.value?"noreferrer":void 0)},{default:v(()=>[d(s.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),zt={class:"VPLastUpdated"},Gt=["datetime"],Rt=m({__name:"VPDocFooterLastUpdated",setup(o){const{theme:e,page:t,lang:n}=$(),s=b(()=>new Date(t.value.lastUpdated)),r=b(()=>s.value.toISOString()),c=P("");return D(()=>{X(()=>{c.value=new Intl.DateTimeFormat(e.value.lastUpdated?.formatOptions?.forceLocale?n.value:void 0,e.value.lastUpdated?.formatOptions??{dateStyle:"short",timeStyle:"short"}).format(s.value)})}),(l,g)=>(a(),u("p",zt,[R(S(i(e).lastUpdated?.text||i(e).lastUpdatedText||"Last updated")+": ",1),p("time",{datetime:r.value},S(c.value),9,Gt)]))}}),Ut=k(Rt,[["__scopeId","data-v-e98dd255"]]),jt={key:0,class:"VPDocFooter"},Wt={key:0,class:"edit-info"},Kt={key:0,class:"edit-link"},qt={key:1,class:"last-updated"},Jt={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Yt={class:"pager"},Xt=["innerHTML"],Qt=["innerHTML"],Zt={class:"pager"},xt=["innerHTML"],en=["innerHTML"],tn=m({__name:"VPDocFooter",setup(o){const{theme:e,page:t,frontmatter:n}=$(),s=Ft(),r=Dt(),c=b(()=>e.value.editLink&&n.value.editLink!==!1),l=b(()=>t.value.lastUpdated),g=b(()=>c.value||l.value||r.value.prev||r.value.next);return(V,T)=>g.value?(a(),u("footer",jt,[d(V.$slots,"doc-footer-before",{},void 0,!0),c.value||l.value?(a(),u("div",Wt,[c.value?(a(),u("div",Kt,[h(B,{class:"edit-link-button",href:i(s).url,"no-icon":!0},{default:v(()=>[T[0]||(T[0]=p("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),R(" "+S(i(s).text),1)]),_:1},8,["href"])])):f("",!0),l.value?(a(),u("div",qt,[h(Ut)])):f("",!0)])):f("",!0),i(r).prev?.link||i(r).next?.link?(a(),u("nav",Jt,[T[1]||(T[1]=p("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),p("div",Yt,[i(r).prev?.link?(a(),_(B,{key:0,class:"pager-link prev",href:i(r).prev.link},{default:v(()=>[p("span",{class:"desc",innerHTML:i(e).docFooter?.prev||"Previous page"},null,8,Xt),p("span",{class:"title",innerHTML:i(r).prev.text},null,8,Qt)]),_:1},8,["href"])):f("",!0)]),p("div",Zt,[i(r).next?.link?(a(),_(B,{key:0,class:"pager-link next",href:i(r).next.link},{default:v(()=>[p("span",{class:"desc",innerHTML:i(e).docFooter?.next||"Next page"},null,8,xt),p("span",{class:"title",innerHTML:i(r).next.text},null,8,en)]),_:1},8,["href"])):f("",!0)])])):f("",!0)])):f("",!0)}}),nn=k(tn,[["__scopeId","data-v-e257564d"]]),sn={class:"container"},on={class:"aside-container"},an={class:"aside-content"},rn={class:"content"},ln={class:"content-container"},cn={class:"main"},un=m({__name:"VPDoc",setup(o){const{theme:e}=$(),t=ee(),{hasSidebar:n,hasAside:s,leftAside:r}=O(),c=b(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(l,g)=>{const V=j("Content");return a(),u("div",{class:L(["VPDoc",{"has-sidebar":i(n),"has-aside":i(s)}])},[d(l.$slots,"doc-top",{},void 0,!0),p("div",sn,[i(s)?(a(),u("div",{key:0,class:L(["aside",{"left-aside":i(r)}])},[g[0]||(g[0]=p("div",{class:"aside-curtain"},null,-1)),p("div",on,[p("div",an,[h(Et,null,{"aside-top":v(()=>[d(l.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[d(l.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[d(l.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[d(l.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[d(l.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[d(l.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),p("div",rn,[p("div",ln,[d(l.$slots,"doc-before",{},void 0,!0),p("main",cn,[h(V,{class:L(["vp-doc",[c.value,i(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),h(nn,null,{"doc-footer-before":v(()=>[d(l.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),d(l.$slots,"doc-after",{},void 0,!0)])])]),d(l.$slots,"doc-bottom",{},void 0,!0)],2)}}}),dn=k(un,[["__scopeId","data-v-7011f0d8"]]),pn=m({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(o){const e=o,t=b(()=>e.href&&Ve.test(e.href)),n=b(()=>e.tag||(e.href?"a":"button"));return(s,r)=>(a(),_(A(n.value),{class:L(["VPButton",[s.size,s.theme]]),href:s.href?i(ve)(s.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:v(()=>[d(s.$slots,"default",{},()=>[R(S(s.text),1)],!0)]),_:3},8,["class","href","target","rel"]))}}),vn=k(pn,[["__scopeId","data-v-01bff58b"]]),fn=["src","alt"],mn=m({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(o){return(e,t)=>{const n=j("VPImage",!0);return e.image?(a(),u(N,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),u("img",G({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:i(ue)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,fn)):(a(),u(N,{key:1},[h(n,G({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(n,G({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}}),x=k(mn,[["__scopeId","data-v-8426fc1a"]]),hn={class:"container"},_n={class:"main"},kn={class:"heading"},gn=["innerHTML"],bn=["innerHTML"],$n=["innerHTML"],yn={key:0,class:"actions"},Pn={key:0,class:"image"},Ln={class:"image-container"},Vn=m({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(o){const{heroImageSlotExists:e}=te(Ae);return(t,n)=>(a(),u("div",{class:L(["VPHero",{"has-image":t.image||i(e)}])},[p("div",hn,[p("div",_n,[d(t.$slots,"home-hero-info-before",{},void 0,!0),d(t.$slots,"home-hero-info",{},()=>[p("h1",kn,[t.name?(a(),u("span",{key:0,innerHTML:t.name,class:"name clip"},null,8,gn)):f("",!0),t.text?(a(),u("span",{key:1,innerHTML:t.text,class:"text"},null,8,bn)):f("",!0)]),t.tagline?(a(),u("p",{key:0,innerHTML:t.tagline,class:"tagline"},null,8,$n)):f("",!0)],!0),d(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(a(),u("div",yn,[(a(!0),u(N,null,H(t.actions,s=>(a(),u("div",{key:s.link,class:"action"},[h(vn,{tag:"a",size:"medium",theme:s.theme,text:s.text,href:s.link,target:s.target,rel:s.rel},null,8,["theme","text","href","target","rel"])]))),128))])):f("",!0),d(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||i(e)?(a(),u("div",Pn,[p("div",Ln,[n[0]||(n[0]=p("div",{class:"image-bg"},null,-1)),d(t.$slots,"home-hero-image",{},()=>[t.image?(a(),_(x,{key:0,class:"image-src",image:t.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}}),Sn=k(Vn,[["__scopeId","data-v-1e96e9e8"]]),Tn=m({__name:"VPHomeHero",setup(o){const{frontmatter:e}=$();return(t,n)=>i(e).hero?(a(),_(Sn,{key:0,class:"VPHomeHero",name:i(e).hero.name,text:i(e).hero.text,tagline:i(e).hero.tagline,image:i(e).hero.image,actions:i(e).hero.actions},{"home-hero-info-before":v(()=>[d(t.$slots,"home-hero-info-before")]),"home-hero-info":v(()=>[d(t.$slots,"home-hero-info")]),"home-hero-info-after":v(()=>[d(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":v(()=>[d(t.$slots,"home-hero-actions-after")]),"home-hero-image":v(()=>[d(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),wn={class:"box"},Nn={key:0,class:"icon"},In=["innerHTML"],Mn=["innerHTML"],Cn=["innerHTML"],Hn={key:4,class:"link-text"},An={class:"link-text-value"},Bn=m({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(o){return(e,t)=>(a(),_(B,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:v(()=>[p("article",wn,[typeof e.icon=="object"&&e.icon.wrap?(a(),u("div",Nn,[h(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(),_(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,In)):f("",!0),p("h2",{class:"title",innerHTML:e.title},null,8,Mn),e.details?(a(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,Cn)):f("",!0),e.linkText?(a(),u("div",Hn,[p("p",An,[R(S(e.linkText)+" ",1),t[0]||(t[0]=p("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),En=k(Bn,[["__scopeId","data-v-5219619b"]]),Fn={key:0,class:"VPFeatures"},Dn={class:"container"},On={class:"items"},zn=m({__name:"VPFeatures",props:{features:{}},setup(o){const e=o,t=b(()=>{const n=e.features.length;if(n){if(n===2)return"grid-2";if(n===3)return"grid-3";if(n%3===0)return"grid-6";if(n>3)return"grid-4"}else return});return(n,s)=>n.features?(a(),u("div",Fn,[p("div",Dn,[p("div",On,[(a(!0),u(N,null,H(n.features,r=>(a(),u("div",{key:r.title,class:L(["item",[t.value]])},[h(En,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):f("",!0)}}),Gn=k(zn,[["__scopeId","data-v-a6181336"]]),Rn=m({__name:"VPHomeFeatures",setup(o){const{frontmatter:e}=$();return(t,n)=>i(e).features?(a(),_(Gn,{key:0,class:"VPHomeFeatures",features:i(e).features},null,8,["features"])):f("",!0)}}),Un=m({__name:"VPHomeContent",setup(o){const{width:e}=Ue({initialWidth:0,includeScrollbar:!1});return(t,n)=>(a(),u("div",{class:"vp-doc container",style:Se(i(e)?{"--vp-offset":`calc(50% - ${i(e)/2}px)`}:{})},[d(t.$slots,"default",{},void 0,!0)],4))}}),jn=k(Un,[["__scopeId","data-v-8e2d4988"]]),Wn=m({__name:"VPHome",setup(o){const{frontmatter:e,theme:t}=$();return(n,s)=>{const r=j("Content");return a(),u("div",{class:L(["VPHome",{"external-link-icon-enabled":i(t).externalLinkIcon}])},[d(n.$slots,"home-hero-before",{},void 0,!0),h(Tn,null,{"home-hero-info-before":v(()=>[d(n.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[d(n.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[d(n.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[d(n.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":v(()=>[d(n.$slots,"home-hero-image",{},void 0,!0)]),_:3}),d(n.$slots,"home-hero-after",{},void 0,!0),d(n.$slots,"home-features-before",{},void 0,!0),h(Rn),d(n.$slots,"home-features-after",{},void 0,!0),i(e).markdownStyles!==!1?(a(),_(jn,{key:0},{default:v(()=>[h(r)]),_:1})):(a(),_(r,{key:1}))],2)}}}),Kn=k(Wn,[["__scopeId","data-v-8b561e3d"]]),qn={},Jn={class:"VPPage"};function Yn(o,e){const t=j("Content");return a(),u("div",Jn,[d(o.$slots,"page-top"),h(t),d(o.$slots,"page-bottom")])}const Xn=k(qn,[["render",Yn]]),Qn=m({__name:"VPContent",setup(o){const{page:e,frontmatter:t}=$(),{isHome:n,hasSidebar:s}=O();return(r,c)=>(a(),u("div",{class:L(["VPContent",{"has-sidebar":i(s),"is-home":i(n)}]),id:"VPContent"},[i(e).isNotFound?d(r.$slots,"not-found",{key:0},()=>[h(dt)],!0):i(t).layout==="page"?(a(),_(Xn,{key:1},{"page-top":v(()=>[d(r.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[d(r.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(t).layout==="home"?(a(),_(Kn,{key:2},{"home-hero-before":v(()=>[d(r.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":v(()=>[d(r.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[d(r.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[d(r.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[d(r.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":v(()=>[d(r.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[d(r.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[d(r.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[d(r.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(t).layout&&i(t).layout!=="doc"?(a(),_(A(i(t).layout),{key:3})):(a(),_(dn,{key:4},{"doc-top":v(()=>[d(r.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[d(r.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[d(r.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[d(r.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[d(r.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[d(r.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[d(r.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[d(r.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[d(r.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[d(r.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[d(r.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),Zn=k(Qn,[["__scopeId","data-v-aff0b8d7"]]),xn={class:"container"},es=["innerHTML"],ts=["innerHTML"],ns=m({__name:"VPFooter",setup(o){const{theme:e,frontmatter:t}=$(),{hasSidebar:n}=O();return(s,r)=>i(e).footer&&i(t).footer!==!1?(a(),u("footer",{key:0,class:L(["VPFooter",{"has-sidebar":i(n)}])},[p("div",xn,[i(e).footer.message?(a(),u("p",{key:0,class:"message",innerHTML:i(e).footer.message},null,8,es)):f("",!0),i(e).footer.copyright?(a(),u("p",{key:1,class:"copyright",innerHTML:i(e).footer.copyright},null,8,ts)):f("",!0)])],2)):f("",!0)}}),ss=k(ns,[["__scopeId","data-v-c3855bb3"]]),os={class:"menu-text"},as={class:"header"},rs={class:"outline"},is=m({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(o){const e=o,{theme:t}=$(),n=P(!1),s=P(0),r=P(),c=P();function l(I){r.value?.contains(I.target)||(n.value=!1)}F(n,I=>{if(I){document.addEventListener("click",l);return}document.removeEventListener("click",l)}),je("Escape",()=>{n.value=!1}),Le(()=>{n.value=!1});function g(){n.value=!n.value,s.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function V(I){I.target.classList.contains("outline-link")&&(c.value&&(c.value.style.transition="none"),Te(()=>{n.value=!1}))}function T(){n.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(I,M)=>(a(),u("div",{class:"VPLocalNavOutlineDropdown",style:Se({"--vp-vh":s.value+"px"}),ref_key:"main",ref:r},[I.headers.length>0?(a(),u("button",{key:0,onClick:g,class:L({open:n.value})},[p("span",os,S(i(He)(i(t))),1),M[0]||(M[0]=p("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(a(),u("button",{key:1,onClick:T},S(i(t).returnToTopLabel||"Return to top"),1)),h(ce,{name:"flyout"},{default:v(()=>[n.value?(a(),u("div",{key:0,ref_key:"items",ref:c,class:"items",onClick:V},[p("div",as,[p("a",{class:"top-link",href:"#",onClick:T},S(i(t).returnToTopLabel||"Return to top"),1)]),p("div",rs,[h(Be,{headers:I.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}}),ls=k(is,[["__scopeId","data-v-0bf0e06f"]]),cs={class:"container"},us=["aria-expanded"],ds={class:"menu-text"},ps=m({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(o){const{theme:e}=$(),{isHome:t,hasSidebar:n,headers:s,hasLocalNav:r}=O(),{y:c}=we(),l=P(0);D(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))});const g=b(()=>({VPLocalNav:!0,"has-sidebar":n.value,empty:!r.value,fixed:!r.value&&!n.value}));return(V,T)=>!i(t)&&(i(r)||i(n)||i(c)>=l.value)?(a(),u("div",{key:0,class:L(g.value)},[p("div",cs,[i(n)?(a(),u("button",{key:0,class:"menu","aria-expanded":V.open,"aria-controls":"VPSidebarNav",onClick:T[0]||(T[0]=I=>V.$emit("open-menu"))},[T[1]||(T[1]=p("span",{class:"vpi-align-left menu-icon"},null,-1)),p("span",ds,S(i(e).sidebarMenuLabel||"Menu"),1)],8,us)):f("",!0),h(ls,{headers:i(s),navHeight:l.value},null,8,["headers","navHeight"])])],2)):f("",!0)}}),vs=k(ps,[["__scopeId","data-v-8acdfeb5"]]);function fs(){const o=P(!1);function e(){o.value=!0,window.addEventListener("resize",s)}function t(){o.value=!1,window.removeEventListener("resize",s)}function n(){o.value?t():e()}function s(){window.outerWidth>=768&&t()}const r=ee();return F(()=>r.path,t),{isScreenOpen:o,openScreen:e,closeScreen:t,toggleScreen:n}}const fe=Symbol("nav"),ms={},hs={class:"VPSwitch",type:"button",role:"switch"},_s={class:"check"},ks={key:0,class:"icon"};function gs(o,e){return a(),u("button",hs,[p("span",_s,[o.$slots.default?(a(),u("span",ks,[d(o.$slots,"default",{},void 0,!0)])):f("",!0)])])}const bs=k(ms,[["render",gs],["__scopeId","data-v-1d5665e3"]]),$s=m({__name:"VPSwitchAppearance",setup(o){const{isDark:e,theme:t}=$(),n=te("toggle-appearance",()=>{e.value=!e.value}),s=P("");return de(()=>{s.value=e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme"}),(r,c)=>(a(),_(bs,{title:s.value,class:"VPSwitchAppearance","aria-checked":i(e),onClick:i(n)},{default:v(()=>[...c[0]||(c[0]=[p("span",{class:"vpi-sun sun"},null,-1),p("span",{class:"vpi-moon moon"},null,-1)])]),_:1},8,["title","aria-checked","onClick"]))}}),me=k($s,[["__scopeId","data-v-5337faa4"]]),ys={key:0,class:"VPNavBarAppearance"},Ps=m({__name:"VPNavBarAppearance",setup(o){const{site:e}=$();return(t,n)=>i(e).appearance&&i(e).appearance!=="force-dark"&&i(e).appearance!=="force-auto"?(a(),u("div",ys,[h(me)])):f("",!0)}}),Ls=k(Ps,[["__scopeId","data-v-6c893767"]]),he=P();let Ee=!1,se=0;function Vs(o){const e=P(!1);if(K){!Ee&&Ss(),se++;const t=F(he,n=>{n===o.el.value||o.el.value?.contains(n)?(e.value=!0,o.onFocus?.()):(e.value=!1,o.onBlur?.())});Y(()=>{t(),se--,se||Ts()})}return We(e)}function Ss(){document.addEventListener("focusin",Fe),Ee=!0,he.value=document.activeElement}function Ts(){document.removeEventListener("focusin",Fe)}function Fe(){he.value=document.activeElement}const ws={class:"VPMenuLink"},Ns=["innerHTML"],Is=m({__name:"VPMenuLink",props:{item:{}},setup(o){const{page:e}=$();return(t,n)=>(a(),u("div",ws,[h(B,{class:L({active:i(U)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon},{default:v(()=>[p("span",{innerHTML:t.item.text},null,8,Ns)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),ne=k(Is,[["__scopeId","data-v-cd834e02"]]),Ms={class:"VPMenuGroup"},Cs={key:0,class:"title"},Hs=m({__name:"VPMenuGroup",props:{text:{},items:{}},setup(o){return(e,t)=>(a(),u("div",Ms,[e.text?(a(),u("p",Cs,S(e.text),1)):f("",!0),(a(!0),u(N,null,H(e.items,n=>(a(),u(N,{key:JSON.stringify(n)},["link"in n?(a(),_(ne,{key:0,item:n},null,8,["item"])):f("",!0)],64))),128))]))}}),As=k(Hs,[["__scopeId","data-v-1963e1bb"]]),Bs={class:"VPMenu"},Es={key:0,class:"items"},Fs=m({__name:"VPMenu",props:{items:{}},setup(o){return(e,t)=>(a(),u("div",Bs,[e.items?(a(),u("div",Es,[(a(!0),u(N,null,H(e.items,n=>(a(),u(N,{key:JSON.stringify(n)},["link"in n?(a(),_(ne,{key:0,item:n},null,8,["item"])):"component"in n?(a(),_(A(n.component),G({key:1,ref_for:!0},n.props),null,16)):(a(),_(As,{key:2,text:n.text,items:n.items},null,8,["text","items"]))],64))),128))])):f("",!0),d(e.$slots,"default",{},void 0,!0)]))}}),Ds=k(Fs,[["__scopeId","data-v-25a6cce8"]]),Os=["aria-expanded","aria-label"],zs={key:0,class:"text"},Gs=["innerHTML"],Rs={key:1,class:"vpi-more-horizontal icon"},Us={class:"menu"},js=m({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(o){const e=P(!1),t=P();Vs({el:t,onBlur:n});function n(){e.value=!1}return(s,r)=>(a(),u("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:r[1]||(r[1]=c=>e.value=!0),onMouseleave:r[2]||(r[2]=c=>e.value=!1)},[p("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":s.label,onClick:r[0]||(r[0]=c=>e.value=!e.value)},[s.button||s.icon?(a(),u("span",zs,[s.icon?(a(),u("span",{key:0,class:L([s.icon,"option-icon"])},null,2)):f("",!0),s.button?(a(),u("span",{key:1,innerHTML:s.button},null,8,Gs)):f("",!0),r[3]||(r[3]=p("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(a(),u("span",Rs))],8,Os),p("div",Us,[h(Ds,{items:s.items},{default:v(()=>[d(s.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),_e=k(js,[["__scopeId","data-v-42cb505d"]]),Ws=["href","aria-label","rel","innerHTML"],Ks=m({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{},me:{type:Boolean}},setup(o){const e=o,t=P();D(async()=>{await Te();const s=t.value?.children[0];s instanceof HTMLElement&&s.className.startsWith("vpi-social-")&&(getComputedStyle(s).maskImage||getComputedStyle(s).webkitMaskImage)==="none"&&s.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${e.icon}.svg')`)});const n=b(()=>typeof e.icon=="object"?e.icon.svg:``);return(s,r)=>(a(),u("a",{ref_key:"el",ref:t,class:"VPSocialLink no-icon",href:s.link,"aria-label":s.ariaLabel??(typeof s.icon=="string"?s.icon:""),target:"_blank",rel:s.me?"me noopener":"noopener",innerHTML:n.value},null,8,Ws))}}),qs=k(Ks,[["__scopeId","data-v-591a6b30"]]),Js={class:"VPSocialLinks"},Ys=m({__name:"VPSocialLinks",props:{links:{},me:{type:Boolean,default:!0}},setup(o){return(e,t)=>(a(),u("div",Js,[(a(!0),u(N,null,H(e.links,({link:n,icon:s,ariaLabel:r})=>(a(),_(qs,{key:n,icon:s,link:n,ariaLabel:r,me:e.me},null,8,["icon","link","ariaLabel","me"]))),128))]))}}),ke=k(Ys,[["__scopeId","data-v-d07f11e6"]]),Xs={key:0,class:"group translations"},Qs={class:"trans-title"},Zs={key:1,class:"group"},xs={class:"item appearance"},eo={class:"label"},to={class:"appearance-action"},no={key:2,class:"group"},so={class:"item social-links"},oo=m({__name:"VPNavBarExtra",setup(o){const{site:e,theme:t}=$(),{localeLinks:n,currentLang:s}=Q({correspondingLink:!0}),r=b(()=>n.value.length&&s.value.label||e.value.appearance||t.value.socialLinks);return(c,l)=>r.value?(a(),_(_e,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[i(n).length&&i(s).label?(a(),u("div",Xs,[p("p",Qs,S(i(s).label),1),(a(!0),u(N,null,H(i(n),g=>(a(),_(ne,{key:g.link,item:g},null,8,["item"]))),128))])):f("",!0),i(e).appearance&&i(e).appearance!=="force-dark"&&i(e).appearance!=="force-auto"?(a(),u("div",Zs,[p("div",xs,[p("p",eo,S(i(t).darkModeSwitchLabel||"Appearance"),1),p("div",to,[h(me)])])])):f("",!0),i(t).socialLinks?(a(),u("div",no,[p("div",so,[h(ke,{class:"social-links-list",links:i(t).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}}),ao=k(oo,[["__scopeId","data-v-bb2aa2f0"]]),ro=["aria-expanded"],io=m({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(o){return(e,t)=>(a(),u("button",{type:"button",class:L(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=n=>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,ro))}}),lo=k(io,[["__scopeId","data-v-e5dd9c1c"]]),co=["innerHTML"],uo=m({__name:"VPNavBarMenuLink",props:{item:{}},setup(o){const{page:e}=$();return(t,n)=>(a(),_(B,{class:L({VPNavBarMenuLink:!0,active:i(U)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,tabindex:"0"},{default:v(()=>[p("span",{innerHTML:t.item.text},null,8,co)]),_:1},8,["class","href","target","rel","no-icon"]))}}),po=k(uo,[["__scopeId","data-v-e56f3d57"]]),vo=m({__name:"VPNavBarMenuGroup",props:{item:{}},setup(o){const e=o,{page:t}=$(),n=r=>"component"in r?!1:"link"in r?U(t.value.relativePath,r.link,!!e.item.activeMatch):r.items.some(n),s=b(()=>n(e.item));return(r,c)=>(a(),_(_e,{class:L({VPNavBarMenuGroup:!0,active:i(U)(i(t).relativePath,r.item.activeMatch,!!r.item.activeMatch)||s.value}),button:r.item.text,items:r.item.items},null,8,["class","button","items"]))}}),fo={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},mo=m({__name:"VPNavBarMenu",setup(o){const{theme:e}=$();return(t,n)=>i(e).nav?(a(),u("nav",fo,[n[0]||(n[0]=p("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(a(!0),u(N,null,H(i(e).nav,s=>(a(),u(N,{key:JSON.stringify(s)},["link"in s?(a(),_(po,{key:0,item:s},null,8,["item"])):"component"in s?(a(),_(A(s.component),G({key:1,ref_for:!0},s.props),null,16)):(a(),_(vo,{key:2,item:s},null,8,["item"]))],64))),128))])):f("",!0)}}),ho=k(mo,[["__scopeId","data-v-39714824"]]);function _o(o){const{localeIndex:e,theme:t}=$();function n(s){const r=s.split("."),c=t.value.search?.options,l=c&&typeof c=="object",g=l&&c.locales?.[e.value]?.translations||null,V=l&&c.translations||null;let T=g,I=V,M=o;const w=r.pop();for(const y of r){let E=null;const C=M?.[y];C&&(E=M=C);const z=I?.[y];z&&(E=I=z);const q=T?.[y];q&&(E=T=q),C||(M=E),z||(I=E),q||(T=E)}return T?.[w]??I?.[w]??M?.[w]??""}return n}const ko=["aria-label"],go={class:"DocSearch-Button-Container"},bo={class:"DocSearch-Button-Placeholder"},ye=m({__name:"VPNavBarSearchButton",setup(o){const t=_o({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(n,s)=>(a(),u("button",{type:"button","aria-label":i(t)("button.buttonAriaLabel"),"aria-keyshortcuts":"/ control+k meta+k",class:"DocSearch DocSearch-Button"},[p("span",go,[s[0]||(s[0]=p("span",{class:"vpi-search DocSearch-Search-Icon"},null,-1)),p("span",bo,S(i(t)("button.buttonText")),1)]),s[1]||(s[1]=p("span",{class:"DocSearch-Button-Keys"},[p("kbd",{class:"DocSearch-Button-Key"}),p("kbd",{class:"DocSearch-Button-Key"})],-1))],8,ko))}}),$o={class:"VPNavBarSearch"},yo={id:"local-search"},Po={key:1,id:"docsearch"},Lo=m({__name:"VPNavBarSearch",setup(o){const e=()=>null,t=Ke(()=>qe(()=>import("./VPAlgoliaSearchBox.nRDYEdJs.js"),__vite__mapDeps([0,1]))),{theme:n}=$(),s=P(!1),r=P(!1),c=()=>{const M="VPAlgoliaPreconnect";(window.requestIdleCallback||setTimeout)(()=>{const y=document.createElement("link");y.id=M,y.rel="preconnect",y.href=`https://${(n.value.search?.options??n.value.algolia).appId}-dsn.algolia.net`,y.crossOrigin="",document.head.appendChild(y)})};D(()=>{c();const M=y=>{(y.key?.toLowerCase()==="k"&&(y.metaKey||y.ctrlKey)||!V(y)&&y.key==="/")&&(y.preventDefault(),l(),w())},w=()=>{window.removeEventListener("keydown",M)};window.addEventListener("keydown",M),Y(w)});function l(){s.value||(s.value=!0,setTimeout(g,16))}function g(){const M=new Event("keydown");M.key="k",M.metaKey=!0,window.dispatchEvent(M),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||g()},16)}function V(M){const w=M.target,y=w.tagName;return w.isContentEditable||y==="INPUT"||y==="SELECT"||y==="TEXTAREA"}const T=P(!1),I="algolia";return(M,w)=>(a(),u("div",$o,[i(I)==="local"?(a(),u(N,{key:0},[T.value?(a(),_(i(e),{key:0,onClose:w[0]||(w[0]=y=>T.value=!1)})):f("",!0),p("div",yo,[h(ye,{onClick:w[1]||(w[1]=y=>T.value=!0)})])],64)):i(I)==="algolia"?(a(),u(N,{key:1},[s.value?(a(),_(i(t),{key:0,algolia:i(n).search?.options??i(n).algolia,onVnodeBeforeMount:w[2]||(w[2]=y=>r.value=!0)},null,8,["algolia"])):f("",!0),r.value?f("",!0):(a(),u("div",Po,[h(ye,{onClick:l})]))],64)):f("",!0)]))}}),Vo=m({__name:"VPNavBarSocialLinks",setup(o){const{theme:e}=$();return(t,n)=>i(e).socialLinks?(a(),_(ke,{key:0,class:"VPNavBarSocialLinks",links:i(e).socialLinks},null,8,["links"])):f("",!0)}}),So=k(Vo,[["__scopeId","data-v-0394ad82"]]),To=["href","rel","target"],wo=["innerHTML"],No={key:2},Io=m({__name:"VPNavBarTitle",setup(o){const{site:e,theme:t}=$(),{hasSidebar:n}=O(),{currentLang:s}=Q(),r=b(()=>typeof t.value.logoLink=="string"?t.value.logoLink:t.value.logoLink?.link),c=b(()=>typeof t.value.logoLink=="string"?void 0:t.value.logoLink?.rel),l=b(()=>typeof t.value.logoLink=="string"?void 0:t.value.logoLink?.target);return(g,V)=>(a(),u("div",{class:L(["VPNavBarTitle",{"has-sidebar":i(n)}])},[p("a",{class:"title",href:r.value??i(ve)(i(s).link),rel:c.value,target:l.value},[d(g.$slots,"nav-bar-title-before",{},void 0,!0),i(t).logo?(a(),_(x,{key:0,class:"logo",image:i(t).logo},null,8,["image"])):f("",!0),i(t).siteTitle?(a(),u("span",{key:1,innerHTML:i(t).siteTitle},null,8,wo)):i(t).siteTitle===void 0?(a(),u("span",No,S(i(e).title),1)):f("",!0),d(g.$slots,"nav-bar-title-after",{},void 0,!0)],8,To)],2))}}),Mo=k(Io,[["__scopeId","data-v-1e38c6bc"]]),Co={class:"items"},Ho={class:"title"},Ao=m({__name:"VPNavBarTranslations",setup(o){const{theme:e}=$(),{localeLinks:t,currentLang:n}=Q({correspondingLink:!0});return(s,r)=>i(t).length&&i(n).label?(a(),_(_e,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:i(e).langMenuLabel||"Change language"},{default:v(()=>[p("div",Co,[p("p",Ho,S(i(n).label),1),(a(!0),u(N,null,H(i(t),c=>(a(),_(ne,{key:c.link,item:c},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}}),Bo=k(Ao,[["__scopeId","data-v-88af2de4"]]),Eo={class:"wrapper"},Fo={class:"container"},Do={class:"title"},Oo={class:"content"},zo={class:"content-body"},Go=m({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(o){const e=o,{y:t}=we(),{isHome:n,hasSidebar:s}=O(),r=P({});return de(()=>{r.value={"has-sidebar":s.value,home:n.value,top:t.value===0,"screen-open":e.isScreenOpen}}),(c,l)=>(a(),u("div",{class:L(["VPNavBar",r.value])},[p("div",Eo,[p("div",Fo,[p("div",Do,[h(Mo,null,{"nav-bar-title-before":v(()=>[d(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[d(c.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),p("div",Oo,[p("div",zo,[d(c.$slots,"nav-bar-content-before",{},void 0,!0),h(Lo,{class:"search"}),h(ho,{class:"menu"}),h(Bo,{class:"translations"}),h(Ls,{class:"appearance"}),h(So,{class:"social-links"}),h(ao,{class:"extra"}),d(c.$slots,"nav-bar-content-after",{},void 0,!0),h(lo,{class:"hamburger",active:c.isScreenOpen,onClick:l[0]||(l[0]=g=>c.$emit("toggle-screen"))},null,8,["active"])])])])]),l[1]||(l[1]=p("div",{class:"divider"},[p("div",{class:"divider-line"})],-1))],2))}}),Ro=k(Go,[["__scopeId","data-v-2a96a3d0"]]),Uo={key:0,class:"VPNavScreenAppearance"},jo={class:"text"},Wo=m({__name:"VPNavScreenAppearance",setup(o){const{site:e,theme:t}=$();return(n,s)=>i(e).appearance&&i(e).appearance!=="force-dark"&&i(e).appearance!=="force-auto"?(a(),u("div",Uo,[p("p",jo,S(i(t).darkModeSwitchLabel||"Appearance"),1),h(me)])):f("",!0)}}),Ko=k(Wo,[["__scopeId","data-v-b44890b2"]]),qo=["innerHTML"],Jo=m({__name:"VPNavScreenMenuLink",props:{item:{}},setup(o){const{closeScreen:e}=te(fe);return(t,n)=>(a(),_(B,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:i(e)},{default:v(()=>[p("span",{innerHTML:t.item.text},null,8,qo)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Yo=k(Jo,[["__scopeId","data-v-83cc0379"]]),Xo=["innerHTML"],Qo=m({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(o){const{closeScreen:e}=te(fe);return(t,n)=>(a(),_(B,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:i(e)},{default:v(()=>[p("span",{innerHTML:t.item.text},null,8,Xo)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),De=k(Qo,[["__scopeId","data-v-aa6008ea"]]),Zo={class:"VPNavScreenMenuGroupSection"},xo={key:0,class:"title"},ea=m({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(o){return(e,t)=>(a(),u("div",Zo,[e.text?(a(),u("p",xo,S(e.text),1)):f("",!0),(a(!0),u(N,null,H(e.items,n=>(a(),_(De,{key:n.text,item:n},null,8,["item"]))),128))]))}}),ta=k(ea,[["__scopeId","data-v-4b7a798b"]]),na=["aria-controls","aria-expanded"],sa=["innerHTML"],oa=["id"],aa={key:0,class:"item"},ra={key:1,class:"item"},ia={key:2,class:"group"},la=m({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(o){const e=o,t=P(!1),n=b(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function s(){t.value=!t.value}return(r,c)=>(a(),u("div",{class:L(["VPNavScreenMenuGroup",{open:t.value}])},[p("button",{class:"button","aria-controls":n.value,"aria-expanded":t.value,onClick:s},[p("span",{class:"button-text",innerHTML:r.text},null,8,sa),c[0]||(c[0]=p("span",{class:"vpi-plus button-icon"},null,-1))],8,na),p("div",{id:n.value,class:"items"},[(a(!0),u(N,null,H(r.items,l=>(a(),u(N,{key:JSON.stringify(l)},["link"in l?(a(),u("div",aa,[h(De,{item:l},null,8,["item"])])):"component"in l?(a(),u("div",ra,[(a(),_(A(l.component),G({ref_for:!0},l.props,{"screen-menu":""}),null,16))])):(a(),u("div",ia,[h(ta,{text:l.text,items:l.items},null,8,["text","items"])]))],64))),128))],8,oa)],2))}}),ca=k(la,[["__scopeId","data-v-956364f9"]]),ua={key:0,class:"VPNavScreenMenu"},da=m({__name:"VPNavScreenMenu",setup(o){const{theme:e}=$();return(t,n)=>i(e).nav?(a(),u("nav",ua,[(a(!0),u(N,null,H(i(e).nav,s=>(a(),u(N,{key:JSON.stringify(s)},["link"in s?(a(),_(Yo,{key:0,item:s},null,8,["item"])):"component"in s?(a(),_(A(s.component),G({key:1,ref_for:!0},s.props,{"screen-menu":""}),null,16)):(a(),_(ca,{key:2,text:s.text||"",items:s.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),pa=m({__name:"VPNavScreenSocialLinks",setup(o){const{theme:e}=$();return(t,n)=>i(e).socialLinks?(a(),_(ke,{key:0,class:"VPNavScreenSocialLinks",links:i(e).socialLinks},null,8,["links"])):f("",!0)}}),va={class:"list"},fa=m({__name:"VPNavScreenTranslations",setup(o){const{localeLinks:e,currentLang:t}=Q({correspondingLink:!0}),n=P(!1);function s(){n.value=!n.value}return(r,c)=>i(e).length&&i(t).label?(a(),u("div",{key:0,class:L(["VPNavScreenTranslations",{open:n.value}])},[p("button",{class:"title",onClick:s},[c[0]||(c[0]=p("span",{class:"vpi-languages icon lang"},null,-1)),R(" "+S(i(t).label)+" ",1),c[1]||(c[1]=p("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),p("ul",va,[(a(!0),u(N,null,H(i(e),l=>(a(),u("li",{key:l.link,class:"item"},[h(B,{class:"link",href:l.link},{default:v(()=>[R(S(l.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}}),ma=k(fa,[["__scopeId","data-v-858fe1a4"]]),ha={class:"container"},_a=m({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(o){const e=P(null),t=Ne(K?document.body:null);return(n,s)=>(a(),_(ce,{name:"fade",onEnter:s[0]||(s[0]=r=>t.value=!0),onAfterLeave:s[1]||(s[1]=r=>t.value=!1)},{default:v(()=>[n.open?(a(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[p("div",ha,[d(n.$slots,"nav-screen-content-before",{},void 0,!0),h(da,{class:"menu"}),h(ma,{class:"translations"}),h(Ko,{class:"appearance"}),h(pa,{class:"social-links"}),d(n.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}}),ka=k(_a,[["__scopeId","data-v-f2779853"]]),ga={key:0,class:"VPNav"},ba=m({__name:"VPNav",setup(o){const{isScreenOpen:e,closeScreen:t,toggleScreen:n}=fs(),{frontmatter:s}=$(),r=b(()=>s.value.navbar!==!1);return Ie(fe,{closeScreen:t}),X(()=>{K&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(c,l)=>r.value?(a(),u("header",ga,[h(Ro,{"is-screen-open":i(e),onToggleScreen:i(n)},{"nav-bar-title-before":v(()=>[d(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[d(c.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[d(c.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[d(c.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),h(ka,{open:i(e)},{"nav-screen-content-before":v(()=>[d(c.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[d(c.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}}),$a=k(ba,[["__scopeId","data-v-9f75dce3"]]),ya=["role","tabindex"],Pa={key:1,class:"items"},La=m({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(o){const e=o,{collapsed:t,collapsible:n,isLink:s,isActiveLink:r,hasActiveLink:c,hasChildren:l,toggle:g}=Lt(b(()=>e.item)),V=b(()=>l.value?"section":"div"),T=b(()=>s.value?"a":"div"),I=b(()=>l.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),M=b(()=>s.value?void 0:"button"),w=b(()=>[[`level-${e.depth}`],{collapsible:n.value},{collapsed:t.value},{"is-link":s.value},{"is-active":r.value},{"has-active":c.value}]);function y(C){"key"in C&&C.key!=="Enter"||!e.item.link&&g()}function E(){e.item.link&&g()}return(C,z)=>{const q=j("VPSidebarItem",!0);return a(),_(A(V.value),{class:L(["VPSidebarItem",w.value])},{default:v(()=>[C.item.text?(a(),u("div",G({key:0,class:"item",role:M.value},Je(C.item.items?{click:y,keydown:y}:{},!0),{tabindex:C.item.items&&0}),[z[1]||(z[1]=p("div",{class:"indicator"},null,-1)),C.item.link?(a(),_(B,{key:0,tag:T.value,class:"link",href:C.item.link,rel:C.item.rel,target:C.item.target},{default:v(()=>[(a(),_(A(I.value),{class:"text",innerHTML:C.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),_(A(I.value),{key:1,class:"text",innerHTML:C.item.text},null,8,["innerHTML"])),C.item.collapsed!=null&&C.item.items&&C.item.items.length?(a(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:E,onKeydown:Ye(E,["enter"]),tabindex:"0"},[...z[0]||(z[0]=[p("span",{class:"vpi-chevron-right caret-icon"},null,-1)])],32)):f("",!0)],16,ya)):f("",!0),C.item.items&&C.item.items.length?(a(),u("div",Pa,[C.depth<5?(a(!0),u(N,{key:0},H(C.item.items,ge=>(a(),_(q,{key:ge.text,item:ge,depth:C.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}}),Va=k(La,[["__scopeId","data-v-d81de50c"]]),Sa=m({__name:"VPSidebarGroup",props:{items:{}},setup(o){const e=P(!0);let t=null;return D(()=>{t=setTimeout(()=>{t=null,e.value=!1},300)}),Xe(()=>{t!=null&&(clearTimeout(t),t=null)}),(n,s)=>(a(!0),u(N,null,H(n.items,r=>(a(),u("div",{key:r.text,class:L(["group",{"no-transition":e.value}])},[h(Va,{item:r,depth:0},null,8,["item"])],2))),128))}}),Ta=k(Sa,[["__scopeId","data-v-8d50c081"]]),wa={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Na=m({__name:"VPSidebar",props:{open:{type:Boolean}},setup(o){const{sidebarGroups:e,hasSidebar:t}=O(),n=o,s=P(null),r=Ne(K?document.body:null);F([n,s],()=>{n.open?(r.value=!0,s.value?.focus()):r.value=!1},{immediate:!0,flush:"post"});const c=P(0);return F(e,()=>{c.value+=1},{deep:!0}),(l,g)=>i(t)?(a(),u("aside",{key:0,class:L(["VPSidebar",{open:l.open}]),ref_key:"navEl",ref:s,onClick:g[0]||(g[0]=Qe(()=>{},["stop"]))},[g[2]||(g[2]=p("div",{class:"curtain"},null,-1)),p("nav",wa,[g[1]||(g[1]=p("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),d(l.$slots,"sidebar-nav-before",{},void 0,!0),(a(),_(Ta,{items:i(e),key:c.value},null,8,["items"])),d(l.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}}),Ia=k(Na,[["__scopeId","data-v-e7c6e512"]]),Ma=m({__name:"VPSkipLink",setup(o){const{theme:e}=$(),t=ee(),n=P();F(()=>t.path,()=>n.value.focus());function s({target:r}){const c=document.getElementById(decodeURIComponent(r.hash).slice(1));if(c){const l=()=>{c.removeAttribute("tabindex"),c.removeEventListener("blur",l)};c.setAttribute("tabindex","-1"),c.addEventListener("blur",l),c.focus(),window.scrollTo(0,0)}}return(r,c)=>(a(),u(N,null,[p("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),p("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s},S(i(e).skipToContentLabel||"Skip to content"),1)],64))}}),Ca=k(Ma,[["__scopeId","data-v-0b0ada53"]]),Ha=m({__name:"Layout",setup(o){const{isOpen:e,open:t,close:n}=Pt();Vt({closeSidebar:n});const{frontmatter:s}=$(),r=Ze(),c=b(()=>!!r["home-hero-image"]);return Ie(Ae,{heroImageSlotExists:c}),(l,g)=>{const V=j("Content");return i(s).layout!==!1?(a(),u("div",{key:0,class:L(["Layout",i(s).pageClass])},[d(l.$slots,"layout-top",{},void 0,!0),h(Ca),h(nt,{class:"backdrop",show:i(e),onClick:i(n)},null,8,["show","onClick"]),h($a,null,{"nav-bar-title-before":v(()=>[d(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[d(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[d(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[d(l.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[d(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[d(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),h(vs,{open:i(e),onOpenMenu:i(t)},null,8,["open","onOpenMenu"]),h(Ia,{open:i(e)},{"sidebar-nav-before":v(()=>[d(l.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[d(l.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),h(Zn,null,{"page-top":v(()=>[d(l.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[d(l.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[d(l.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[d(l.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":v(()=>[d(l.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[d(l.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[d(l.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[d(l.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":v(()=>[d(l.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[d(l.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[d(l.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[d(l.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[d(l.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[d(l.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[d(l.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[d(l.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[d(l.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[d(l.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[d(l.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[d(l.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[d(l.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[d(l.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[d(l.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),h(ss),d(l.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),_(V,{key:1}))}}}),Aa=k(Ha,[["__scopeId","data-v-1df9f90f"]]),Ba={xmini:[[0,2]],mini:[],small:[[920,6],[768,5],[640,4],[480,3],[0,2]],medium:[[960,5],[832,4],[640,3],[480,2]],big:[[832,3],[640,2]]};function Ea({el:o,size:e="medium"}){const t=Me(n,100);D(()=>{n(),window.addEventListener("resize",t)}),Y(()=>{window.removeEventListener("resize",t)});function n(){Fa(o.value,e)}}function Fa(o,e){const t=o.children.length,n=o.querySelectorAll(".vp-sponsor-grid-item:not(.empty)").length,s=Da(o,e,n);za(o,s,t,n)}function Da(o,e,t){const n=Ba[e],s=window.innerWidth;let r=1;return n.some(([c,l])=>{if(s>=c)return r=t0?Ra(o,e):Ua(o,e*-1))}function Ra(o,e){for(let t=0;t(a(),u("div",{class:L(["VPSponsorsGrid vp-sponsor-grid",[n.size]]),ref_key:"el",ref:t},[(a(!0),u(N,null,H(n.data,r=>(a(),u("div",{key:r.name,class:"vp-sponsor-grid-item"},[p("a",{class:"vp-sponsor-grid-link",href:r.url,target:"_blank",rel:"sponsored noopener"},[p("article",Wa,[p("img",{class:"vp-sponsor-grid-image",src:r.img,alt:r.name},null,8,Ka)])],8,ja)]))),128))],2))}}),Ja={key:0,class:"vp-sponsor-tier"},Qa=m({__name:"VPSponsors",props:{mode:{default:"normal"},tier:{},size:{},data:{}},setup(o){const e=o,t=b(()=>e.data.some(s=>"items"in s)?e.data:[{tier:e.tier,size:e.size,items:e.data}]);return(n,s)=>(a(),u("div",{class:L(["VPSponsors vp-sponsor",[n.mode]])},[(a(!0),u(N,null,H(t.value,(r,c)=>(a(),u("section",{key:c,class:"vp-sponsor-section"},[r.tier?(a(),u("h3",Ja,S(r.tier),1)):f("",!0),h(qa,{size:r.size,data:r.items},null,8,["size","data"])]))),128))],2))}}),Ya={Layout:Aa,enhanceApp:({app:o})=>{o.component("Badge",xe)}},Za={...Ya,setup(){const{lang:o}=Pe();X(()=>{K&&(document.cookie=`nf_lang=${o.value}; expires=Mon, 1 Jan 2024 00:00:00 UTC; path=/`)})}};export{Za as R,Qa as _,$ as u}; diff --git a/assets/deps-craft-yml.md.DWPKeuXi.lean.js b/assets/deps-craft-yml.md.DWPKeuXi.lean.js deleted file mode 100644 index a8ac15c5..00000000 --- a/assets/deps-craft-yml.md.DWPKeuXi.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as a,o as n,af as l}from"./chunks/framework.PeLcR_tw.js";const E=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"deps-craft-yml.md","filePath":"deps-craft-yml.md"}'),t={name:"deps-craft-yml.md"};function p(e,s,h,k,r,d){return n(),a("div",null,s[0]||(s[0]=[l("",1)]))}const c=i(t,[["render",p]]);export{E as __pageData,c as default}; diff --git a/assets/deps-craft-yml.md.DWPKeuXi.js b/assets/deps-craft-yml.md.DqNYV3B0.js similarity index 94% rename from assets/deps-craft-yml.md.DWPKeuXi.js rename to assets/deps-craft-yml.md.DqNYV3B0.js index 7b64a337..0f8ced0c 100644 --- a/assets/deps-craft-yml.md.DWPKeuXi.js +++ b/assets/deps-craft-yml.md.DqNYV3B0.js @@ -1,4 +1,4 @@ -import{_ as i,c as a,o as n,af as l}from"./chunks/framework.PeLcR_tw.js";const E=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"deps-craft-yml.md","filePath":"deps-craft-yml.md"}'),t={name:"deps-craft-yml.md"};function p(e,s,h,k,r,d){return n(),a("div",null,s[0]||(s[0]=[l(`
    yaml
    # PHP version to build (default: 8.4)
    +import{_ as i,c as a,o as n,ah as l}from"./chunks/framework.Bhsyh9kO.js";const E=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"deps-craft-yml.md","filePath":"deps-craft-yml.md"}'),t={name:"deps-craft-yml.md"};function p(e,s,h,k,r,d){return n(),a("div",null,[...s[0]||(s[0]=[l(`
    yaml
    # PHP version to build (default: 8.4)
     php-version: 8.4
     # [REQUIRED] Static PHP extensions to build (list or comma-separated are both accepted)
     extensions: bcmath,fileinfo,phar,zlib,sodium,posix,pcntl
    @@ -65,4 +65,4 @@ import{_ as i,c as a,o as n,af as l}from"./chunks/framework.PeLcR_tw.js";const E
     # Extra environment variables
     extra-env:
       # e.g. Use github token to avoid rate limit
    -  GITHUB_TOKEN: your-github-token
    `,1)]))}const c=i(t,[["render",p]]);export{E as __pageData,c as default}; + GITHUB_TOKEN: your-github-token
    `,1)])])}const c=i(t,[["render",p]]);export{E as __pageData,c as default}; diff --git a/assets/deps-craft-yml.md.DqNYV3B0.lean.js b/assets/deps-craft-yml.md.DqNYV3B0.lean.js new file mode 100644 index 00000000..4baf204e --- /dev/null +++ b/assets/deps-craft-yml.md.DqNYV3B0.lean.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as n,ah as l}from"./chunks/framework.Bhsyh9kO.js";const E=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"deps-craft-yml.md","filePath":"deps-craft-yml.md"}'),t={name:"deps-craft-yml.md"};function p(e,s,h,k,r,d){return n(),a("div",null,[...s[0]||(s[0]=[l("",1)])])}const c=i(t,[["render",p]]);export{E as __pageData,c as default}; diff --git a/assets/deps-map-ext.md.B9knsysL.js b/assets/deps-map-ext.md.B9knsysL.js deleted file mode 100644 index 2fe4ec8a..00000000 --- a/assets/deps-map-ext.md.B9knsysL.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as d,c as b,o as r,af as l}from"./chunks/framework.PeLcR_tw.js";const c=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"deps-map-ext.md","filePath":"deps-map-ext.md"}'),s={name:"deps-map-ext.md"};function i(e,t,o,p,a,n){return r(),b("div",null,t[0]||(t[0]=[l('

    Linux

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvpcntlunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    liburing
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    macOS

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    glfwglfw
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    Windows

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqpopenssllibrabbitmq
    brotlibrotli
    bz2bzip2
    curlzlib
    openssl
    curl
    dbaqdbm
    domxmllibxml2
    zlib
    evsockets
    ffilibffi-win
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gmsslgmssl
    iconvlibiconv-win
    igbinarysession
    apcu
    intlicu-static-win
    libxmlxml
    mbregexmbstringonig
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    parallelpthreads4w
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    pdo_pgsqlpdo
    pgsql
    postgresql-win
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql-win
    pharzlib
    redissession
    igbinary
    msgpack
    simplexmlxmllibxml2
    soapxmllibxml2
    sodiumlibsodium
    sqlite3sqlite
    ssh2openssl
    zlib
    libssh2
    swowopenssl
    curl
    openssl
    curl
    xlswriterzlib
    zip
    openssl
    xmliconvlibxml2
    xmlreaderxml
    dom
    libxml2
    xmlwriterxmllibxml2
    xzxz
    yamllibyaml
    zipzlib
    bz2
    libzip
    zlib
    bzip2
    xz
    zlibzlib

    FreeBSD

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    evsockets
    ftpopenssl
    mbregexmbstringonig
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    pdo_mysqlpdo
    mysqlnd
    pharzlib
    xzxz
    zlibzlib
    ',8)]))}const g=d(s,[["render",i]]);export{c as __pageData,g as default}; diff --git a/assets/deps-map-ext.md.B9knsysL.lean.js b/assets/deps-map-ext.md.B9knsysL.lean.js deleted file mode 100644 index a39ab432..00000000 --- a/assets/deps-map-ext.md.B9knsysL.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as d,c as b,o as r,af as l}from"./chunks/framework.PeLcR_tw.js";const c=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"deps-map-ext.md","filePath":"deps-map-ext.md"}'),s={name:"deps-map-ext.md"};function i(e,t,o,p,a,n){return r(),b("div",null,t[0]||(t[0]=[l("",8)]))}const g=d(s,[["render",i]]);export{c as __pageData,g as default}; diff --git a/assets/deps-map-ext.md.BVAR3McO.js b/assets/deps-map-ext.md.BVAR3McO.js new file mode 100644 index 00000000..981fab1d --- /dev/null +++ b/assets/deps-map-ext.md.BVAR3McO.js @@ -0,0 +1 @@ +import{_ as d,c as b,o as r,ah as l}from"./chunks/framework.Bhsyh9kO.js";const c=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"deps-map-ext.md","filePath":"deps-map-ext.md"}'),s={name:"deps-map-ext.md"};function i(e,t,o,p,a,n){return r(),b("div",null,[...t[0]||(t[0]=[l('

    Linux

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvpcntlunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    liburing
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    macOS

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    glfwglfw
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    Windows

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqpopenssllibrabbitmq
    brotlibrotli
    bz2bzip2
    curlzlib
    openssl
    curl
    dbaqdbm
    domxmllibxml2
    zlib
    evsockets
    ffilibffi-win
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gmsslgmssl
    iconvlibiconv-win
    igbinarysession
    apcu
    intlicu-static-win
    libxmlxml
    mbregexmbstringonig
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    parallelpthreads4w
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    pdo_pgsqlpdo
    pgsql
    postgresql-win
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql-win
    pharzlib
    redissession
    igbinary
    msgpack
    simplexmlxmllibxml2
    soapxmllibxml2
    sodiumlibsodium
    sqlite3sqlite
    ssh2openssl
    zlib
    libssh2
    swowopenssl
    curl
    openssl
    curl
    xlswriterzlib
    zip
    openssl
    xmliconvlibxml2
    xmlreaderxml
    dom
    libxml2
    xmlwriterxmllibxml2
    xzxz
    yamllibyaml
    zipzlib
    bz2
    libzip
    zlib
    bzip2
    xz
    zlibzlib

    FreeBSD

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    evsockets
    ftpopenssl
    mbregexmbstringonig
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    pdo_mysqlpdo
    mysqlnd
    pharzlib
    xzxz
    zlibzlib
    ',8)])])}const g=d(s,[["render",i]]);export{c as __pageData,g as default}; diff --git a/assets/deps-map-ext.md.BVAR3McO.lean.js b/assets/deps-map-ext.md.BVAR3McO.lean.js new file mode 100644 index 00000000..0f756575 --- /dev/null +++ b/assets/deps-map-ext.md.BVAR3McO.lean.js @@ -0,0 +1 @@ +import{_ as d,c as b,o as r,ah as l}from"./chunks/framework.Bhsyh9kO.js";const c=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"deps-map-ext.md","filePath":"deps-map-ext.md"}'),s={name:"deps-map-ext.md"};function i(e,t,o,p,a,n){return r(),b("div",null,[...t[0]||(t[0]=[l("",8)])])}const g=d(s,[["render",i]]);export{c as __pageData,g as default}; diff --git a/assets/deps-map-lib.md.BnsDnV_s.js b/assets/deps-map-lib.md.BnsDnV_s.js new file mode 100644 index 00000000..ec0b845d --- /dev/null +++ b/assets/deps-map-lib.md.BnsDnV_s.js @@ -0,0 +1 @@ +import{_ as d,c as b,o as r,ah as i}from"./chunks/framework.Bhsyh9kO.js";const z=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"deps-map-lib.md","filePath":"deps-map-lib.md"}'),l={name:"deps-map-lib.md"};function e(s,t,p,a,n,o){return r(),b("div",null,[...t[0]||(t[0]=[i('

    Linux

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libaclattr
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    macOS

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    Windows

    Library NameRequired LibrariesSuggested Libraries
    curlzlib
    libssh2
    nghttp2
    brotli
    zstd
    freetypezliblibpng
    bzip2
    brotli
    libjpegzlib
    libpngzlib
    librabbitmqopenssl
    libssh2openssl
    libxml2libiconv-winzlib
    libzipzlib
    bzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib

    FreeBSD

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    opensslzlib
    ',8)])])}const c=d(l,[["render",e]]);export{z as __pageData,c as default}; diff --git a/assets/deps-map-lib.md.BnsDnV_s.lean.js b/assets/deps-map-lib.md.BnsDnV_s.lean.js new file mode 100644 index 00000000..2a59366d --- /dev/null +++ b/assets/deps-map-lib.md.BnsDnV_s.lean.js @@ -0,0 +1 @@ +import{_ as d,c as b,o as r,ah as i}from"./chunks/framework.Bhsyh9kO.js";const z=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"deps-map-lib.md","filePath":"deps-map-lib.md"}'),l={name:"deps-map-lib.md"};function e(s,t,p,a,n,o){return r(),b("div",null,[...t[0]||(t[0]=[i("",8)])])}const c=d(l,[["render",e]]);export{z as __pageData,c as default}; diff --git a/assets/deps-map-lib.md.DOtBR8NX.js b/assets/deps-map-lib.md.DOtBR8NX.js deleted file mode 100644 index a2b56128..00000000 --- a/assets/deps-map-lib.md.DOtBR8NX.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as d,c as b,o as r,af as i}from"./chunks/framework.PeLcR_tw.js";const z=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"deps-map-lib.md","filePath":"deps-map-lib.md"}'),l={name:"deps-map-lib.md"};function e(s,t,p,a,n,o){return r(),b("div",null,t[0]||(t[0]=[i('

    Linux

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libaclattr
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    macOS

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    Windows

    Library NameRequired LibrariesSuggested Libraries
    curlzlib
    libssh2
    nghttp2
    brotli
    zstd
    freetypezliblibpng
    bzip2
    brotli
    libjpegzlib
    libpngzlib
    librabbitmqopenssl
    libssh2openssl
    libxml2libiconv-winzlib
    libzipzlib
    bzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib

    FreeBSD

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    opensslzlib
    ',8)]))}const c=d(l,[["render",e]]);export{z as __pageData,c as default}; diff --git a/assets/deps-map-lib.md.DOtBR8NX.lean.js b/assets/deps-map-lib.md.DOtBR8NX.lean.js deleted file mode 100644 index 622a3ed9..00000000 --- a/assets/deps-map-lib.md.DOtBR8NX.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as d,c as b,o as r,af as i}from"./chunks/framework.PeLcR_tw.js";const z=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"deps-map-lib.md","filePath":"deps-map-lib.md"}'),l={name:"deps-map-lib.md"};function e(s,t,p,a,n,o){return r(),b("div",null,t[0]||(t[0]=[i("",8)]))}const c=d(l,[["render",e]]);export{z as __pageData,c as default}; diff --git a/assets/en_contributing_index.md.C8tXDL1f.js b/assets/en_contributing_index.md.C8tXDL1f.js deleted file mode 100644 index bf49658f..00000000 --- a/assets/en_contributing_index.md.C8tXDL1f.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,c as i,o,af as n}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"Contributing","description":"","frontmatter":{},"headers":[],"relativePath":"en/contributing/index.md","filePath":"en/contributing/index.md"}'),a={name:"en/contributing/index.md"};function r(s,e,c,l,d,h){return o(),i("div",null,e[0]||(e[0]=[n('

    Contributing

    Thank you for being here, this project welcomes your contributions!

    Contribution Guide

    If you have code or documentation to contribute, here's what you need to know first.

    1. What type of code are you contributing? (new extensions, bug fixes, security issues, project framework optimizations, documentation)
    2. If you contribute new files or new snippets, is your code checked by php-cs-fixer and phpstan?
    3. Have you fully read the Developer Guide before contributing code?

    If you can answer the above questions and have made changes to the code, you can initiate a Pull Request in the project GitHub repository in time. After the code review is completed, the code can be modified according to the suggestion, or directly merged into the main branch.

    Contribution Type

    The main purpose of this project is to compile statically linked PHP binaries, and the command line processing function is written based on symfony/console. Before development, if you are not familiar with it, Check out the symfony/console documentation first.

    Security Update

    Because this project is basically a PHP project running locally, generally speaking, there will be no remote attacks. But if you find such a problem, please **DO NOT submit a PR or Issue in the GitHub repository, You need to contact the project maintainer (crazywhalecc) via mail.

    Fix Bugs

    Fixing bugs generally does not involve modification of the project structure and framework, so if you can locate the wrong code and fix it directly, please submit a PR directly.

    New Extensions

    For adding a new extension, you need to understand some basic structure of the project and how to add a new extension according to the existing logic. It will be covered in detail in the next section on this page. In general, you will need:

    1. Evaluate whether the extension can be compiled inline into PHP.
    2. Evaluate whether the extension's dependent libraries (if any) can be compiled statically.
    3. Write library compile commands on different platforms.
    4. Verify that the extension and its dependencies are compatible with existing extensions and dependencies.
    5. Verify that the extension works normally in cli, micro, fpm, embed SAPIs.
    6. Write documentation and add your extension.

    Project Framework Optimization

    If you are already familiar with the working principle of symfony/console, and at the same time want to make some modifications or optimizations to the framework of the project, please understand the following things first:

    1. Adding extensions does not belong to project framework optimization, but if you find that you have to optimize the framework when adding new extensions, you need to modify the framework itself before adding extensions.
    2. For some large-scale logical modifications (such as those involving LibraryBase, Extension objects, etc.), it is recommended to submit an Issue or Draft PR for discussion first.
    3. In the early stage of the project, it was a pure private development project, and there were some Chinese comments in the code. After internationalizing your project you can submit a PR to translate these comments into English.
    4. Please do not submit more useless code fragments in the code, such as a large number of unused variables, methods, classes, and code that has been rewritten many times.
    ',18)]))}const p=t(a,[["render",r]]);export{m as __pageData,p as default}; diff --git a/assets/en_contributing_index.md.fCA6lXnW.js b/assets/en_contributing_index.md.fCA6lXnW.js new file mode 100644 index 00000000..71b168b9 --- /dev/null +++ b/assets/en_contributing_index.md.fCA6lXnW.js @@ -0,0 +1 @@ +import{_ as t,c as i,o,ah as n}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"Contributing","description":"","frontmatter":{},"headers":[],"relativePath":"en/contributing/index.md","filePath":"en/contributing/index.md"}'),a={name:"en/contributing/index.md"};function r(s,e,c,l,d,h){return o(),i("div",null,[...e[0]||(e[0]=[n('

    Contributing

    Thank you for being here, this project welcomes your contributions!

    Contribution Guide

    If you have code or documentation to contribute, here's what you need to know first.

    1. What type of code are you contributing? (new extensions, bug fixes, security issues, project framework optimizations, documentation)
    2. If you contribute new files or new snippets, is your code checked by php-cs-fixer and phpstan?
    3. Have you fully read the Developer Guide before contributing code?

    If you can answer the above questions and have made changes to the code, you can initiate a Pull Request in the project GitHub repository in time. After the code review is completed, the code can be modified according to the suggestion, or directly merged into the main branch.

    Contribution Type

    The main purpose of this project is to compile statically linked PHP binaries, and the command line processing function is written based on symfony/console. Before development, if you are not familiar with it, Check out the symfony/console documentation first.

    Security Update

    Because this project is basically a PHP project running locally, generally speaking, there will be no remote attacks. But if you find such a problem, please **DO NOT submit a PR or Issue in the GitHub repository, You need to contact the project maintainer (crazywhalecc) via mail.

    Fix Bugs

    Fixing bugs generally does not involve modification of the project structure and framework, so if you can locate the wrong code and fix it directly, please submit a PR directly.

    New Extensions

    For adding a new extension, you need to understand some basic structure of the project and how to add a new extension according to the existing logic. It will be covered in detail in the next section on this page. In general, you will need:

    1. Evaluate whether the extension can be compiled inline into PHP.
    2. Evaluate whether the extension's dependent libraries (if any) can be compiled statically.
    3. Write library compile commands on different platforms.
    4. Verify that the extension and its dependencies are compatible with existing extensions and dependencies.
    5. Verify that the extension works normally in cli, micro, fpm, embed SAPIs.
    6. Write documentation and add your extension.

    Project Framework Optimization

    If you are already familiar with the working principle of symfony/console, and at the same time want to make some modifications or optimizations to the framework of the project, please understand the following things first:

    1. Adding extensions does not belong to project framework optimization, but if you find that you have to optimize the framework when adding new extensions, you need to modify the framework itself before adding extensions.
    2. For some large-scale logical modifications (such as those involving LibraryBase, Extension objects, etc.), it is recommended to submit an Issue or Draft PR for discussion first.
    3. In the early stage of the project, it was a pure private development project, and there were some Chinese comments in the code. After internationalizing your project you can submit a PR to translate these comments into English.
    4. Please do not submit more useless code fragments in the code, such as a large number of unused variables, methods, classes, and code that has been rewritten many times.
    ',18)])])}const p=t(a,[["render",r]]);export{m as __pageData,p as default}; diff --git a/assets/en_contributing_index.md.C8tXDL1f.lean.js b/assets/en_contributing_index.md.fCA6lXnW.lean.js similarity index 60% rename from assets/en_contributing_index.md.C8tXDL1f.lean.js rename to assets/en_contributing_index.md.fCA6lXnW.lean.js index 30f6a8cd..1f6b8ab0 100644 --- a/assets/en_contributing_index.md.C8tXDL1f.lean.js +++ b/assets/en_contributing_index.md.fCA6lXnW.lean.js @@ -1 +1 @@ -import{_ as t,c as i,o,af as n}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"Contributing","description":"","frontmatter":{},"headers":[],"relativePath":"en/contributing/index.md","filePath":"en/contributing/index.md"}'),a={name:"en/contributing/index.md"};function r(s,e,c,l,d,h){return o(),i("div",null,e[0]||(e[0]=[n("",18)]))}const p=t(a,[["render",r]]);export{m as __pageData,p as default}; +import{_ as t,c as i,o,ah as n}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"Contributing","description":"","frontmatter":{},"headers":[],"relativePath":"en/contributing/index.md","filePath":"en/contributing/index.md"}'),a={name:"en/contributing/index.md"};function r(s,e,c,l,d,h){return o(),i("div",null,[...e[0]||(e[0]=[n("",18)])])}const p=t(a,[["render",r]]);export{m as __pageData,p as default}; diff --git a/assets/en_develop_craft-yml.md.BDq8uWIr.lean.js b/assets/en_develop_craft-yml.md.BDq8uWIr.lean.js deleted file mode 100644 index 999d1bfd..00000000 --- a/assets/en_develop_craft-yml.md.BDq8uWIr.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as a,o as n,af as l}from"./chunks/framework.PeLcR_tw.js";const c=JSON.parse('{"title":"craft.yml Configuration","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"en/develop/craft-yml.md","filePath":"en/develop/craft-yml.md"}'),t={name:"en/develop/craft-yml.md"};function p(e,s,h,k,r,d){return n(),a("div",null,s[0]||(s[0]=[l("",2)]))}const E=i(t,[["render",p]]);export{c as __pageData,E as default}; diff --git a/assets/en_develop_craft-yml.md.BDq8uWIr.js b/assets/en_develop_craft-yml.md.Ci97ssL7.js similarity index 93% rename from assets/en_develop_craft-yml.md.BDq8uWIr.js rename to assets/en_develop_craft-yml.md.Ci97ssL7.js index 3864f772..efc37542 100644 --- a/assets/en_develop_craft-yml.md.BDq8uWIr.js +++ b/assets/en_develop_craft-yml.md.Ci97ssL7.js @@ -1,4 +1,4 @@ -import{_ as i,c as a,o as n,af as l}from"./chunks/framework.PeLcR_tw.js";const c=JSON.parse('{"title":"craft.yml Configuration","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"en/develop/craft-yml.md","filePath":"en/develop/craft-yml.md"}'),t={name:"en/develop/craft-yml.md"};function p(e,s,h,k,r,d){return n(),a("div",null,s[0]||(s[0]=[l(`

    craft.yml Configuration

    yaml
    # PHP version to build (default: 8.4)
    +import{_ as i,c as a,o as n,ah as l}from"./chunks/framework.Bhsyh9kO.js";const c=JSON.parse('{"title":"craft.yml Configuration","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"en/develop/craft-yml.md","filePath":"en/develop/craft-yml.md"}'),t={name:"en/develop/craft-yml.md"};function p(e,s,h,k,r,d){return n(),a("div",null,[...s[0]||(s[0]=[l(`

    craft.yml Configuration

    yaml
    # PHP version to build (default: 8.4)
     php-version: 8.4
     # [REQUIRED] Static PHP extensions to build (list or comma-separated are both accepted)
     extensions: bcmath,fileinfo,phar,zlib,sodium,posix,pcntl
    @@ -65,4 +65,4 @@ import{_ as i,c as a,o as n,af as l}from"./chunks/framework.PeLcR_tw.js";const c
     # Extra environment variables
     extra-env:
       # e.g. Use github token to avoid rate limit
    -  GITHUB_TOKEN: your-github-token
    `,2)]))}const E=i(t,[["render",p]]);export{c as __pageData,E as default}; + GITHUB_TOKEN: your-github-token
    `,2)])])}const E=i(t,[["render",p]]);export{c as __pageData,E as default}; diff --git a/assets/en_develop_craft-yml.md.Ci97ssL7.lean.js b/assets/en_develop_craft-yml.md.Ci97ssL7.lean.js new file mode 100644 index 00000000..0c30d0bb --- /dev/null +++ b/assets/en_develop_craft-yml.md.Ci97ssL7.lean.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as n,ah as l}from"./chunks/framework.Bhsyh9kO.js";const c=JSON.parse('{"title":"craft.yml Configuration","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"en/develop/craft-yml.md","filePath":"en/develop/craft-yml.md"}'),t={name:"en/develop/craft-yml.md"};function p(e,s,h,k,r,d){return n(),a("div",null,[...s[0]||(s[0]=[l("",2)])])}const E=i(t,[["render",p]]);export{c as __pageData,E as default}; diff --git a/assets/en_develop_doctor-module.md.DYVfKght.js b/assets/en_develop_doctor-module.md.BTDyp-aK.js similarity index 87% rename from assets/en_develop_doctor-module.md.DYVfKght.js rename to assets/en_develop_doctor-module.md.BTDyp-aK.js index db93ed28..a99373f2 100644 --- a/assets/en_develop_doctor-module.md.DYVfKght.js +++ b/assets/en_develop_doctor-module.md.BTDyp-aK.js @@ -1,4 +1,4 @@ -import{_ as i,c as a,o as e,af as t}from"./chunks/framework.PeLcR_tw.js";const E=JSON.parse('{"title":"Doctor module","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/doctor-module.md","filePath":"en/develop/doctor-module.md"}'),h={name:"en/develop/doctor-module.md"};function n(l,s,k,p,r,d){return e(),a("div",null,s[0]||(s[0]=[t(`

    Doctor module

    The Doctor module is a relatively independent module used to check the system environment, which can be entered with the command bin/spc doctor, and the entry command class is in DoctorCommand.php.

    The Doctor module is a checklist with a series of check items and automatic repair items. These items are stored in the src/SPC/doctor/item/ directory, And two Attributes are used as check item tags and auto-fix item tags: #[AsCheckItem] and #[AsFixItem].

    Take the existing check item if necessary tools are installed, which is used to check whether the packages necessary for compilation are installed in the macOS system. The following is its source code:

    php
    use SPC\\doctor\\AsCheckItem;
    +import{_ as i,c as a,o as e,ah as t}from"./chunks/framework.Bhsyh9kO.js";const E=JSON.parse('{"title":"Doctor module","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/doctor-module.md","filePath":"en/develop/doctor-module.md"}'),h={name:"en/develop/doctor-module.md"};function n(l,s,k,p,r,d){return e(),a("div",null,[...s[0]||(s[0]=[t(`

    Doctor module

    The Doctor module is a relatively independent module used to check the system environment, which can be entered with the command bin/spc doctor, and the entry command class is in DoctorCommand.php.

    The Doctor module is a checklist with a series of check items and automatic repair items. These items are stored in the src/SPC/doctor/item/ directory, And two Attributes are used as check item tags and auto-fix item tags: #[AsCheckItem] and #[AsFixItem].

    Take the existing check item if necessary tools are installed, which is used to check whether the packages necessary for compilation are installed in the macOS system. The following is its source code:

    php
    use SPC\\doctor\\AsCheckItem;
     use SPC\\doctor\\AsFixItem;
     use SPC\\doctor\\CheckResult;
     
    @@ -26,4 +26,4 @@ import{_ as i,c as a,o as e,af as t}from"./chunks/framework.PeLcR_tw.js";const E
             }
         }
         return true;
    -}

    #[AsFixItem()] first parameter is the name of the fix item, and this method must return True or False. When False is returned, the automatic repair failed and manual handling is required.

    In the code here, shell()->exec() is the method of executing commands of the project, which is used to replace exec() and system(), and also provides debugging, obtaining execution status, entering directories, etc. characteristic.

    `,13)]))}const c=i(h,[["render",n]]);export{E as __pageData,c as default}; +}

    #[AsFixItem()] first parameter is the name of the fix item, and this method must return True or False. When False is returned, the automatic repair failed and manual handling is required.

    In the code here, shell()->exec() is the method of executing commands of the project, which is used to replace exec() and system(), and also provides debugging, obtaining execution status, entering directories, etc. characteristic.

    `,13)])])}const c=i(h,[["render",n]]);export{E as __pageData,c as default}; diff --git a/assets/en_develop_doctor-module.md.BTDyp-aK.lean.js b/assets/en_develop_doctor-module.md.BTDyp-aK.lean.js new file mode 100644 index 00000000..8c55e209 --- /dev/null +++ b/assets/en_develop_doctor-module.md.BTDyp-aK.lean.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as e,ah as t}from"./chunks/framework.Bhsyh9kO.js";const E=JSON.parse('{"title":"Doctor module","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/doctor-module.md","filePath":"en/develop/doctor-module.md"}'),h={name:"en/develop/doctor-module.md"};function n(l,s,k,p,r,d){return e(),a("div",null,[...s[0]||(s[0]=[t("",13)])])}const c=i(h,[["render",n]]);export{E as __pageData,c as default}; diff --git a/assets/en_develop_doctor-module.md.DYVfKght.lean.js b/assets/en_develop_doctor-module.md.DYVfKght.lean.js deleted file mode 100644 index 35fc494b..00000000 --- a/assets/en_develop_doctor-module.md.DYVfKght.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as a,o as e,af as t}from"./chunks/framework.PeLcR_tw.js";const E=JSON.parse('{"title":"Doctor module","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/doctor-module.md","filePath":"en/develop/doctor-module.md"}'),h={name:"en/develop/doctor-module.md"};function n(l,s,k,p,r,d){return e(),a("div",null,s[0]||(s[0]=[t("",13)]))}const c=i(h,[["render",n]]);export{E as __pageData,c as default}; diff --git a/assets/en_develop_index.md.DSlquryN.js b/assets/en_develop_index.md.DSlquryN.js deleted file mode 100644 index b6152d13..00000000 --- a/assets/en_develop_index.md.DSlquryN.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,c as o,o as n,af as i}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"Start Developing","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/index.md","filePath":"en/develop/index.md"}'),s={name:"en/develop/index.md"};function a(r,e,l,p,c,d){return n(),o("div",null,e[0]||(e[0]=[i('

    Start Developing

    Developing this project requires the installation and deployment of a PHP environment, as well as some extensions and Composer commonly used in PHP projects.

    The development environment and running environment of the project are almost exactly the same. You can refer to the Manual Build section to install system PHP or use the pre-built static PHP of this project as the environment. I will not go into details here.

    Regardless of its purpose, this project itself is actually a php-cli program. You can edit and develop it as a normal PHP project. At the same time, you need to understand the Shell languages of different systems.

    The current purpose of this project is to compile statically compiled independent PHP, but the main part also includes compiling static versions of many dependent libraries, so you can reuse this set of compilation logic to build independent binary versions of other programs, such as Nginx, etc.

    Environment preparation

    A PHP environment is required to develop this project. You can use the PHP that comes with the system, or you can use the static PHP built by this project.

    Regardless of which PHP you use, in your development environment you need to install these extensions:

    curl,dom,filter,mbstring,openssl,pcntl,phar,posix,sodium,tokenizer,xml,xmlwriter

    The static-php-cli project itself does not require so many extensions, but during the development process, you will use tools such as Composer and PHPUnit, which require these extensions.

    For micro self-executing binaries built by static-php-cli itself, only pcntl,posix,mbstring,tokenizer,phar is required.

    Start development

    Continuing down to see the project structure documentation, you can learn how static-php-cli works.

    ',13)]))}const u=t(s,[["render",a]]);export{m as __pageData,u as default}; diff --git a/assets/en_develop_index.md.DSlquryN.lean.js b/assets/en_develop_index.md.DSlquryN.lean.js deleted file mode 100644 index a06412b8..00000000 --- a/assets/en_develop_index.md.DSlquryN.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,c as o,o as n,af as i}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"Start Developing","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/index.md","filePath":"en/develop/index.md"}'),s={name:"en/develop/index.md"};function a(r,e,l,p,c,d){return n(),o("div",null,e[0]||(e[0]=[i("",13)]))}const u=t(s,[["render",a]]);export{m as __pageData,u as default}; diff --git a/assets/en_develop_index.md.DUNrUVP9.js b/assets/en_develop_index.md.DUNrUVP9.js new file mode 100644 index 00000000..1f3e5eaa --- /dev/null +++ b/assets/en_develop_index.md.DUNrUVP9.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as n,ah as i}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"Start Developing","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/index.md","filePath":"en/develop/index.md"}'),s={name:"en/develop/index.md"};function a(r,e,l,p,c,d){return n(),o("div",null,[...e[0]||(e[0]=[i('

    Start Developing

    Developing this project requires the installation and deployment of a PHP environment, as well as some extensions and Composer commonly used in PHP projects.

    The development environment and running environment of the project are almost exactly the same. You can refer to the Manual Build section to install system PHP or use the pre-built static PHP of this project as the environment. I will not go into details here.

    Regardless of its purpose, this project itself is actually a php-cli program. You can edit and develop it as a normal PHP project. At the same time, you need to understand the Shell languages of different systems.

    The current purpose of this project is to compile statically compiled independent PHP, but the main part also includes compiling static versions of many dependent libraries, so you can reuse this set of compilation logic to build independent binary versions of other programs, such as Nginx, etc.

    Environment preparation

    A PHP environment is required to develop this project. You can use the PHP that comes with the system, or you can use the static PHP built by this project.

    Regardless of which PHP you use, in your development environment you need to install these extensions:

    curl,dom,filter,mbstring,openssl,pcntl,phar,posix,sodium,tokenizer,xml,xmlwriter

    The static-php-cli project itself does not require so many extensions, but during the development process, you will use tools such as Composer and PHPUnit, which require these extensions.

    For micro self-executing binaries built by static-php-cli itself, only pcntl,posix,mbstring,tokenizer,phar is required.

    Start development

    Continuing down to see the project structure documentation, you can learn how static-php-cli works.

    ',13)])])}const u=t(s,[["render",a]]);export{m as __pageData,u as default}; diff --git a/assets/en_develop_index.md.DUNrUVP9.lean.js b/assets/en_develop_index.md.DUNrUVP9.lean.js new file mode 100644 index 00000000..8ea7a137 --- /dev/null +++ b/assets/en_develop_index.md.DUNrUVP9.lean.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as n,ah as i}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"Start Developing","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/index.md","filePath":"en/develop/index.md"}'),s={name:"en/develop/index.md"};function a(r,e,l,p,c,d){return n(),o("div",null,[...e[0]||(e[0]=[i("",13)])])}const u=t(s,[["render",a]]);export{m as __pageData,u as default}; diff --git a/assets/en_develop_php-src-changes.md.DadHFaGC.js b/assets/en_develop_php-src-changes.md.DadHFaGC.js deleted file mode 100644 index 8c48111e..00000000 --- a/assets/en_develop_php-src-changes.md.DadHFaGC.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as t,o as a,af as o}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"Modifications to PHP source code","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/php-src-changes.md","filePath":"en/develop/php-src-changes.md"}'),s={name:"en/develop/php-src-changes.md"};function n(c,e,r,l,h,p){return a(),t("div",null,e[0]||(e[0]=[o('

    Modifications to PHP source code

    During the static compilation process, static-php-cli made some modifications to the PHP source code in order to achieve good compatibility, performance, and security. The following is a description of the current modifications to the PHP source code.

    Based on the patches provided by the phpmicro project, static-php-cli has made some modifications to the PHP source code to meet the needs of static compilation. The patches currently used by static-php-cli during compilation in the patch list are:

    • static_opcache
    • static_extensions_win32
    • cli_checks
    • disable_huge_page
    • vcruntime140
    • win32
    • zend_stream
    • cli_static
    • macos_iconv
    • phar

    PHP <= 8.1 libxml patch

    Because PHP only provides security updates for 8.1 and stops updating older versions, static-php-cli applies the libxml compilation patch that has been applied in newer versions of PHP to PHP 8.1 and below.

    gd extension Windows patch

    Compiling the gd extension under Windows requires major changes to the config.w32 file. static-php-cli has made some changes to the gd extension to make it easier to compile under Windows.

    YAML extension Windows patch

    YAML extension needs to modify the config.w32 file to compile under Windows. static-php-cli has made some modifications to the YAML extension to make it easier to compile under Windows.

    static-php-cli version information insertion

    When compiling, static-php-cli will insert the static-php-cli version information into the PHP version information for easy identification.

    Add option to hardcode INI

    When using the -I parameter to hardcode INI into static PHP functionality, static-php-cli will modify the PHP source code to insert the hardcoded content.

    Linux system repair patch

    Some compilation environments may lack some system header files or libraries. static-php-cli will automatically fix these problems during compilation, such as:

    • HAVE_STRLCAT missing problem
    • HAVE_STRLCPY missing problem

    Fiber issue fix patch for Windows

    When compiling PHP on Windows, there will be some issues with the Fiber extension. static-php-cli will automatically fix these issues during compilation (modify config.w32 in php-src).

    ',20)]))}const f=i(s,[["render",n]]);export{m as __pageData,f as default}; diff --git a/assets/en_develop_php-src-changes.md.DadHFaGC.lean.js b/assets/en_develop_php-src-changes.md.DadHFaGC.lean.js deleted file mode 100644 index cdddd7ab..00000000 --- a/assets/en_develop_php-src-changes.md.DadHFaGC.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as t,o as a,af as o}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"Modifications to PHP source code","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/php-src-changes.md","filePath":"en/develop/php-src-changes.md"}'),s={name:"en/develop/php-src-changes.md"};function n(c,e,r,l,h,p){return a(),t("div",null,e[0]||(e[0]=[o("",20)]))}const f=i(s,[["render",n]]);export{m as __pageData,f as default}; diff --git a/assets/en_develop_php-src-changes.md.dN8aSiwg.js b/assets/en_develop_php-src-changes.md.dN8aSiwg.js new file mode 100644 index 00000000..c914a750 --- /dev/null +++ b/assets/en_develop_php-src-changes.md.dN8aSiwg.js @@ -0,0 +1 @@ +import{_ as i,c as t,o as a,ah as o}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"Modifications to PHP source code","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/php-src-changes.md","filePath":"en/develop/php-src-changes.md"}'),s={name:"en/develop/php-src-changes.md"};function n(c,e,r,l,h,p){return a(),t("div",null,[...e[0]||(e[0]=[o('

    Modifications to PHP source code

    During the static compilation process, static-php-cli made some modifications to the PHP source code in order to achieve good compatibility, performance, and security. The following is a description of the current modifications to the PHP source code.

    Based on the patches provided by the phpmicro project, static-php-cli has made some modifications to the PHP source code to meet the needs of static compilation. The patches currently used by static-php-cli during compilation in the patch list are:

    • static_opcache
    • static_extensions_win32
    • cli_checks
    • disable_huge_page
    • vcruntime140
    • win32
    • zend_stream
    • cli_static
    • macos_iconv
    • phar

    PHP <= 8.1 libxml patch

    Because PHP only provides security updates for 8.1 and stops updating older versions, static-php-cli applies the libxml compilation patch that has been applied in newer versions of PHP to PHP 8.1 and below.

    gd extension Windows patch

    Compiling the gd extension under Windows requires major changes to the config.w32 file. static-php-cli has made some changes to the gd extension to make it easier to compile under Windows.

    YAML extension Windows patch

    YAML extension needs to modify the config.w32 file to compile under Windows. static-php-cli has made some modifications to the YAML extension to make it easier to compile under Windows.

    static-php-cli version information insertion

    When compiling, static-php-cli will insert the static-php-cli version information into the PHP version information for easy identification.

    Add option to hardcode INI

    When using the -I parameter to hardcode INI into static PHP functionality, static-php-cli will modify the PHP source code to insert the hardcoded content.

    Linux system repair patch

    Some compilation environments may lack some system header files or libraries. static-php-cli will automatically fix these problems during compilation, such as:

    • HAVE_STRLCAT missing problem
    • HAVE_STRLCPY missing problem

    Fiber issue fix patch for Windows

    When compiling PHP on Windows, there will be some issues with the Fiber extension. static-php-cli will automatically fix these issues during compilation (modify config.w32 in php-src).

    ',20)])])}const f=i(s,[["render",n]]);export{m as __pageData,f as default}; diff --git a/assets/en_develop_php-src-changes.md.dN8aSiwg.lean.js b/assets/en_develop_php-src-changes.md.dN8aSiwg.lean.js new file mode 100644 index 00000000..fde1612d --- /dev/null +++ b/assets/en_develop_php-src-changes.md.dN8aSiwg.lean.js @@ -0,0 +1 @@ +import{_ as i,c as t,o as a,ah as o}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"Modifications to PHP source code","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/php-src-changes.md","filePath":"en/develop/php-src-changes.md"}'),s={name:"en/develop/php-src-changes.md"};function n(c,e,r,l,h,p){return a(),t("div",null,[...e[0]||(e[0]=[o("",20)])])}const f=i(s,[["render",n]]);export{m as __pageData,f as default}; diff --git a/assets/en_develop_source-module.md.CeJEgS_j.lean.js b/assets/en_develop_source-module.md.CeJEgS_j.lean.js deleted file mode 100644 index f2b5cc9e..00000000 --- a/assets/en_develop_source-module.md.CeJEgS_j.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as a,o as e,af as t}from"./chunks/framework.PeLcR_tw.js";const E=JSON.parse('{"title":"Source module","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/source-module.md","filePath":"en/develop/source-module.md"}'),n={name:"en/develop/source-module.md"};function l(h,s,p,o,k,d){return e(),a("div",null,s[0]||(s[0]=[t("",75)]))}const c=i(n,[["render",l]]);export{E as __pageData,c as default}; diff --git a/assets/en_develop_source-module.md.CeJEgS_j.js b/assets/en_develop_source-module.md.hhJuiZD0.js similarity index 95% rename from assets/en_develop_source-module.md.CeJEgS_j.js rename to assets/en_develop_source-module.md.hhJuiZD0.js index 29063ec7..d71bf70e 100644 --- a/assets/en_develop_source-module.md.CeJEgS_j.js +++ b/assets/en_develop_source-module.md.hhJuiZD0.js @@ -1,4 +1,4 @@ -import{_ as i,c as a,o as e,af as t}from"./chunks/framework.PeLcR_tw.js";const E=JSON.parse('{"title":"Source module","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/source-module.md","filePath":"en/develop/source-module.md"}'),n={name:"en/develop/source-module.md"};function l(h,s,p,o,k,d){return e(),a("div",null,s[0]||(s[0]=[t(`

    Source module

    The download source module of static-php-cli is a major module. It includes dependent libraries, external extensions, PHP source code download methods and file decompression methods. The download configuration file mainly involves the source.json and pkg.json file, which records the download method of all downloadable sources.

    The main commands involved in the download function are bin/spc download and bin/spc extract. The download command is a downloader that downloads sources according to the configuration file, and the extract command is an extractor that extract sources from downloaded files.

    Generally speaking, downloading sources may be slow because these sources come from various official websites, GitHub, and other different locations. At the same time, they also occupy a large space, so you can download the sources once and reuse them.

    The configuration file of the downloader is source.json, which contains the download methods of all sources. You can add the source download methods you need, or modify the existing source download methods.

    The download configuration structure of each source is as follows. The following is the source download configuration corresponding to the libevent extension:

    json
    {
    +import{_ as i,c as a,o as e,ah as t}from"./chunks/framework.Bhsyh9kO.js";const E=JSON.parse('{"title":"Source module","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/source-module.md","filePath":"en/develop/source-module.md"}'),n={name:"en/develop/source-module.md"};function l(h,s,p,o,k,d){return e(),a("div",null,[...s[0]||(s[0]=[t(`

    Source module

    The download source module of static-php-cli is a major module. It includes dependent libraries, external extensions, PHP source code download methods and file decompression methods. The download configuration file mainly involves the source.json and pkg.json file, which records the download method of all downloadable sources.

    The main commands involved in the download function are bin/spc download and bin/spc extract. The download command is a downloader that downloads sources according to the configuration file, and the extract command is an extractor that extract sources from downloaded files.

    Generally speaking, downloading sources may be slow because these sources come from various official websites, GitHub, and other different locations. At the same time, they also occupy a large space, so you can download the sources once and reuse them.

    The configuration file of the downloader is source.json, which contains the download methods of all sources. You can add the source download methods you need, or modify the existing source download methods.

    The download configuration structure of each source is as follows. The following is the source download configuration corresponding to the libevent extension:

    json
    {
       "libevent": {
         "type": "ghrel",
         "repo": "libevent/libevent",
    @@ -117,4 +117,4 @@ import{_ as i,c as a,o as e,af as t}from"./chunks/framework.PeLcR_tw.js";const E
           ]
         }
       }
    -}
    `,75)]))}const c=i(n,[["render",l]]);export{E as __pageData,c as default}; +}
    `,75)])])}const c=i(n,[["render",l]]);export{E as __pageData,c as default}; diff --git a/assets/en_develop_source-module.md.hhJuiZD0.lean.js b/assets/en_develop_source-module.md.hhJuiZD0.lean.js new file mode 100644 index 00000000..76a075b2 --- /dev/null +++ b/assets/en_develop_source-module.md.hhJuiZD0.lean.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as e,ah as t}from"./chunks/framework.Bhsyh9kO.js";const E=JSON.parse('{"title":"Source module","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/source-module.md","filePath":"en/develop/source-module.md"}'),n={name:"en/develop/source-module.md"};function l(h,s,p,o,k,d){return e(),a("div",null,[...s[0]||(s[0]=[t("",75)])])}const c=i(n,[["render",l]]);export{E as __pageData,c as default}; diff --git a/assets/en_develop_structure.md.D1kBTweh.js b/assets/en_develop_structure.md.D1kBTweh.js deleted file mode 100644 index 91d140af..00000000 --- a/assets/en_develop_structure.md.D1kBTweh.js +++ /dev/null @@ -1,10 +0,0 @@ -import{_ as o,c as t,o as c,af as d}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"Introduction to project structure","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/structure.md","filePath":"en/develop/structure.md"}'),a={name:"en/develop/structure.md"};function r(i,e,s,n,p,l){return c(),t("div",null,e[0]||(e[0]=[d(`

    Introduction to project structure

    static-php-cli mainly contains three logical components: sources, dependent libraries, and extensions. These components contains 4 configuration files: source.json, pkg.json, lib.json, and ext.json.

    A complete process for building standalone static PHP is:

    1. Use the source download module Downloader to download specified or all source codes. These sources include PHP source code, dependent library source code, and extension source code.
    2. Use the source decompression module SourceExtractor to decompress the downloaded sources to the compilation directory.
    3. Use the dependency tool to calculate the dependent extensions and dependent libraries of the currently added extension, and then compile each library that needs to be compiled in the order of dependencies.
    4. After building each dependent library using Builder under the corresponding operating system, install it to the buildroot directory.
    5. If external extensions are included (the source code does not contain extensions within PHP), copy the external extensions to the source/php-src/ext/ directory.
    6. Use Builder to build the PHP source code and build target to the buildroot directory.

    The project is mainly divided into several folders:

    • bin/: used to store program entry files, including bin/spc, bin/spc-alpine-docker, bin/setup-runtime.
    • config/: Contains all the extensions and dependent libraries supported by the project, as well as the download link and download methods of these sources. It is divided into files: lib.json, ext.json, source.json, pkg.json, pre-built.json .
    • src/: The core code of the project, including the entire framework and commands for compiling various extensions and libraries.
    • vendor/: The directory that Composer depends on, you do not need to make any modifications to it.

    The operating principle is to start a ConsoleApplication of symfony/console, and then parse the commands entered by the user in the terminal.

    Basic command line structure

    bin/spc is an entry file, including the Unix common #!/usr/bin/env php, which is used to allow the system to automatically execute with the PHP interpreter installed on the system. After the project executes new ConsoleApplication(), the framework will automatically register them as commands.

    The project does not directly use the Command registration method and command execution method recommended by Symfony. Here are small changes:

    1. Each command uses the #[AsCommand()] Attribute to register the name and description.
    2. Abstract execute() so that all commands are based on BaseCommand (which is based on Symfony\\Component\\Console\\Command\\Command), and the execution code of each command itself is written in the handle() method .
    3. Added variable $no_motd to BaseCommand, which is used to display the Figlet greeting when the command is executed.
    4. BaseCommand saves InputInterface and OutputInterface as member variables. You can use $this->input and $this->output within the command class.

    Basic source code structure

    The source code of the project is located in the src/SPC directory, supports automatic loading of the PSR-4 standard, and contains the following subdirectories and classes:

    • src/SPC/builder/: The core compilation command code used to build libraries, PHP and related extensions under different operating systems, and also includes some compilation system tool methods.
    • src/SPC/command/: All commands of the project are here.
    • src/SPC/doctor/: Doctor module, which is a relatively independent module used to check the system environment. It can be entered using the command bin/spc doctor.
    • src/SPC/exception/: exception class.
    • src/SPC/store/: Classes related to storage, files and sources are all here.
    • src/SPC/util/: Some reusable tool methods are here.
    • src/SPC/ConsoleApplication.php: command line program entry file.

    If you have read the source code, you may find that there is also a src/globals/ directory, which is used to store some global variables, global methods, and non-PSR-4 standard PHP source code that is relied upon during the build process, such as extension sanity check code etc.

    Phar application directory issue

    Like other php-cli projects, spc itself has additional considerations for paths. Because spc can run in multiple modes such as php-cli directly, micro SAPI, php-cli with Phar, vendor with Phar, etc., there are ambiguities in various root directories. A complete explanation is given here. This problem is generally common in the base class path selection problem of accessing files in PHP projects, especially when used with micro.sfx.

    Note that this may only be useful for you when developing Phar projects or PHP frameworks.

    Next, we will treat static-php-cli (that is, spc) as a normal php command line program. You can understand spc as any of your own php-cli applications for reference.

    There are three basic constant theoretical values below. We recommend that you introduce these three constants when writing PHP projects:

    • WORKING_DIR: the working directory when executing PHP scripts

    • SOURCE_ROOT_DIR or ROOT_DIR: the root directory of the project folder, generally the directory where composer.json is located

    • FRAMEWORK_ROOT_DIR: the root directory of the framework used, which may be used by self-developed frameworks. Generally, the framework directory is read-only

    You can define these constants in your framework entry or cli applications to facilitate the use of paths in your project.

    The following are PHP built-in constant values, which have been defined inside the PHP interpreter:

    • __DIR__: the directory where the file of the currently executed script is located

    • __FILE__: the file path of the currently executed script

    Git project mode (source)

    Git project mode refers to a framework or program itself stored in plain text in the current folder, and running through php path/to/entry.php.

    Assume that your project is stored in the /home/example/static-php-cli/ directory, or your project is the framework itself, which contains project files such as composer.json:

    composer.json
    -src/App/MyCommand.app
    -vendor/*
    -bin/entry.php

    We assume that the above constants are obtained from src/App/MyCommand.php:

    ConstantValue
    WORKING_DIR/home/example/static-php-cli
    SOURCE_ROOT_DIR/home/example/static-php-cli
    FRAMEWORK_ROOT_DIR/home/example/static-php-cli
    __DIR__/home/example/static-php-cli/src/App
    __FILE__/home/example/static-php-cli/src/App/MyCommand.php

    In this case, the values of WORKING_DIR, SOURCE_ROOT_DIR, and FRAMEWORK_ROOT_DIR are exactly the same: /home/example/static-php-cli.

    The source code of the framework and the source code of the application are both in the current path.

    Vendor library mode (vendor)

    The vendor library mode generally means that your project is a framework or is installed into the project as a composer dependency by other applications, and the storage location is in the vendor/author/XXX directory.

    Suppose your project is crazywhalecc/static-php-cli, and you or others install this project in another project using composer require.

    We assume that static-php-cli contains all files except the vendor directory with the same Git mode, and get the constant value from src/App/MyCommand, Directory constant should be:

    ConstantValue
    WORKING_DIR/home/example/another-app
    SOURCE_ROOT_DIR/home/example/another-app
    FRAMEWORK_ROOT_DIR/home/example/another-app/vendor/crazywhalecc/static-php-cli
    __DIR__/home/example/another-app/vendor/crazywhalecc/static-php-cli/src/App
    __FILE__/home/example/another-app/vendor/crazywhalecc/static-php-cli/src/App/MyCommand.php

    Here SOURCE_ROOT_DIR refers to the root directory of the project using static-php-cli.

    Git project Phar mode (source-phar)

    Git project Phar mode refers to the mode of packaging the project directory of the Git project mode into a phar file. We assume that /home/example/static-php-cli will be packaged into a Phar file, and the directory has the following files:

    composer.json
    -src/App/MyCommand.app
    -vendor/*
    -bin/entry.php

    When packaged into app.phar and stored in the /home/example/static-php-cli directory, app.phar is executed at this time. Assuming that the src/App/MyCommand code is executed, the constant is obtained in the file:

    ConstantValue
    WORKING_DIR/home/example/static-php-cli
    SOURCE_ROOT_DIRphar:///home/example/static-php-cli/app.phar/
    FRAMEWORK_ROOT_DIRphar:///home/example/static-php-cli/app.phar/
    __DIR__phar:///home/example/static-php-cli/app.phar/src/App
    __FILE__phar:///home/example/static-php-cli/app.phar/src/App/MyCommand.php

    Because the phar:// protocol is required to read files in the phar itself, the project root directory and the framework directory will be different from WORKING_DIR.

    Vendor Library Phar Mode (vendor-phar)

    Vendor Library Phar Mode means that your project is installed as a framework in other projects and stored in the vendor directory.

    We assume that your project directory structure is as follows:

    composer.json                           # Composer configuration file of the current project
    -box.json                                # Configuration file for packaging Phar
    -another-app.php                         # Entry file of another project
    -vendor/crazywhalecc/static-php-cli/*    # Your project is used as a dependent library

    When packaging these files under the directory /home/example/another-app/ into app.phar, the value of the following constant for your project should be:

    ConstantValue
    WORKING_DIR/home/example/another-app
    SOURCE_ROOT_DIRphar:///home/example/another-app/app.phar/
    FRAMEWORK_ROOT_DIRphar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli
    __DIR__phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App
    __FILE__phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App/MyCommand.php
    `,50)]))}const u=o(a,[["render",r]]);export{m as __pageData,u as default}; diff --git a/assets/en_develop_structure.md.D1kBTweh.lean.js b/assets/en_develop_structure.md.D1kBTweh.lean.js deleted file mode 100644 index 2cd47cdf..00000000 --- a/assets/en_develop_structure.md.D1kBTweh.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as o,c as t,o as c,af as d}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"Introduction to project structure","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/structure.md","filePath":"en/develop/structure.md"}'),a={name:"en/develop/structure.md"};function r(i,e,s,n,p,l){return c(),t("div",null,e[0]||(e[0]=[d("",50)]))}const u=o(a,[["render",r]]);export{m as __pageData,u as default}; diff --git a/assets/en_develop_structure.md.X2JId3N9.js b/assets/en_develop_structure.md.X2JId3N9.js new file mode 100644 index 00000000..bf9f95cf --- /dev/null +++ b/assets/en_develop_structure.md.X2JId3N9.js @@ -0,0 +1,10 @@ +import{_ as o,c as t,o as c,ah as d}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"Introduction to project structure","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/structure.md","filePath":"en/develop/structure.md"}'),a={name:"en/develop/structure.md"};function r(i,e,s,n,p,l){return c(),t("div",null,[...e[0]||(e[0]=[d(`

    Introduction to project structure

    static-php-cli mainly contains three logical components: sources, dependent libraries, and extensions. These components contains 4 configuration files: source.json, pkg.json, lib.json, and ext.json.

    A complete process for building standalone static PHP is:

    1. Use the source download module Downloader to download specified or all source codes. These sources include PHP source code, dependent library source code, and extension source code.
    2. Use the source decompression module SourceExtractor to decompress the downloaded sources to the compilation directory.
    3. Use the dependency tool to calculate the dependent extensions and dependent libraries of the currently added extension, and then compile each library that needs to be compiled in the order of dependencies.
    4. After building each dependent library using Builder under the corresponding operating system, install it to the buildroot directory.
    5. If external extensions are included (the source code does not contain extensions within PHP), copy the external extensions to the source/php-src/ext/ directory.
    6. Use Builder to build the PHP source code and build target to the buildroot directory.

    The project is mainly divided into several folders:

    • bin/: used to store program entry files, including bin/spc, bin/spc-alpine-docker, bin/setup-runtime.
    • config/: Contains all the extensions and dependent libraries supported by the project, as well as the download link and download methods of these sources. It is divided into files: lib.json, ext.json, source.json, pkg.json, pre-built.json .
    • src/: The core code of the project, including the entire framework and commands for compiling various extensions and libraries.
    • vendor/: The directory that Composer depends on, you do not need to make any modifications to it.

    The operating principle is to start a ConsoleApplication of symfony/console, and then parse the commands entered by the user in the terminal.

    Basic command line structure

    bin/spc is an entry file, including the Unix common #!/usr/bin/env php, which is used to allow the system to automatically execute with the PHP interpreter installed on the system. After the project executes new ConsoleApplication(), the framework will automatically register them as commands.

    The project does not directly use the Command registration method and command execution method recommended by Symfony. Here are small changes:

    1. Each command uses the #[AsCommand()] Attribute to register the name and description.
    2. Abstract execute() so that all commands are based on BaseCommand (which is based on Symfony\\Component\\Console\\Command\\Command), and the execution code of each command itself is written in the handle() method .
    3. Added variable $no_motd to BaseCommand, which is used to display the Figlet greeting when the command is executed.
    4. BaseCommand saves InputInterface and OutputInterface as member variables. You can use $this->input and $this->output within the command class.

    Basic source code structure

    The source code of the project is located in the src/SPC directory, supports automatic loading of the PSR-4 standard, and contains the following subdirectories and classes:

    • src/SPC/builder/: The core compilation command code used to build libraries, PHP and related extensions under different operating systems, and also includes some compilation system tool methods.
    • src/SPC/command/: All commands of the project are here.
    • src/SPC/doctor/: Doctor module, which is a relatively independent module used to check the system environment. It can be entered using the command bin/spc doctor.
    • src/SPC/exception/: exception class.
    • src/SPC/store/: Classes related to storage, files and sources are all here.
    • src/SPC/util/: Some reusable tool methods are here.
    • src/SPC/ConsoleApplication.php: command line program entry file.

    If you have read the source code, you may find that there is also a src/globals/ directory, which is used to store some global variables, global methods, and non-PSR-4 standard PHP source code that is relied upon during the build process, such as extension sanity check code etc.

    Phar application directory issue

    Like other php-cli projects, spc itself has additional considerations for paths. Because spc can run in multiple modes such as php-cli directly, micro SAPI, php-cli with Phar, vendor with Phar, etc., there are ambiguities in various root directories. A complete explanation is given here. This problem is generally common in the base class path selection problem of accessing files in PHP projects, especially when used with micro.sfx.

    Note that this may only be useful for you when developing Phar projects or PHP frameworks.

    Next, we will treat static-php-cli (that is, spc) as a normal php command line program. You can understand spc as any of your own php-cli applications for reference.

    There are three basic constant theoretical values below. We recommend that you introduce these three constants when writing PHP projects:

    • WORKING_DIR: the working directory when executing PHP scripts

    • SOURCE_ROOT_DIR or ROOT_DIR: the root directory of the project folder, generally the directory where composer.json is located

    • FRAMEWORK_ROOT_DIR: the root directory of the framework used, which may be used by self-developed frameworks. Generally, the framework directory is read-only

    You can define these constants in your framework entry or cli applications to facilitate the use of paths in your project.

    The following are PHP built-in constant values, which have been defined inside the PHP interpreter:

    • __DIR__: the directory where the file of the currently executed script is located

    • __FILE__: the file path of the currently executed script

    Git project mode (source)

    Git project mode refers to a framework or program itself stored in plain text in the current folder, and running through php path/to/entry.php.

    Assume that your project is stored in the /home/example/static-php-cli/ directory, or your project is the framework itself, which contains project files such as composer.json:

    composer.json
    +src/App/MyCommand.app
    +vendor/*
    +bin/entry.php

    We assume that the above constants are obtained from src/App/MyCommand.php:

    ConstantValue
    WORKING_DIR/home/example/static-php-cli
    SOURCE_ROOT_DIR/home/example/static-php-cli
    FRAMEWORK_ROOT_DIR/home/example/static-php-cli
    __DIR__/home/example/static-php-cli/src/App
    __FILE__/home/example/static-php-cli/src/App/MyCommand.php

    In this case, the values of WORKING_DIR, SOURCE_ROOT_DIR, and FRAMEWORK_ROOT_DIR are exactly the same: /home/example/static-php-cli.

    The source code of the framework and the source code of the application are both in the current path.

    Vendor library mode (vendor)

    The vendor library mode generally means that your project is a framework or is installed into the project as a composer dependency by other applications, and the storage location is in the vendor/author/XXX directory.

    Suppose your project is crazywhalecc/static-php-cli, and you or others install this project in another project using composer require.

    We assume that static-php-cli contains all files except the vendor directory with the same Git mode, and get the constant value from src/App/MyCommand, Directory constant should be:

    ConstantValue
    WORKING_DIR/home/example/another-app
    SOURCE_ROOT_DIR/home/example/another-app
    FRAMEWORK_ROOT_DIR/home/example/another-app/vendor/crazywhalecc/static-php-cli
    __DIR__/home/example/another-app/vendor/crazywhalecc/static-php-cli/src/App
    __FILE__/home/example/another-app/vendor/crazywhalecc/static-php-cli/src/App/MyCommand.php

    Here SOURCE_ROOT_DIR refers to the root directory of the project using static-php-cli.

    Git project Phar mode (source-phar)

    Git project Phar mode refers to the mode of packaging the project directory of the Git project mode into a phar file. We assume that /home/example/static-php-cli will be packaged into a Phar file, and the directory has the following files:

    composer.json
    +src/App/MyCommand.app
    +vendor/*
    +bin/entry.php

    When packaged into app.phar and stored in the /home/example/static-php-cli directory, app.phar is executed at this time. Assuming that the src/App/MyCommand code is executed, the constant is obtained in the file:

    ConstantValue
    WORKING_DIR/home/example/static-php-cli
    SOURCE_ROOT_DIRphar:///home/example/static-php-cli/app.phar/
    FRAMEWORK_ROOT_DIRphar:///home/example/static-php-cli/app.phar/
    __DIR__phar:///home/example/static-php-cli/app.phar/src/App
    __FILE__phar:///home/example/static-php-cli/app.phar/src/App/MyCommand.php

    Because the phar:// protocol is required to read files in the phar itself, the project root directory and the framework directory will be different from WORKING_DIR.

    Vendor Library Phar Mode (vendor-phar)

    Vendor Library Phar Mode means that your project is installed as a framework in other projects and stored in the vendor directory.

    We assume that your project directory structure is as follows:

    composer.json                           # Composer configuration file of the current project
    +box.json                                # Configuration file for packaging Phar
    +another-app.php                         # Entry file of another project
    +vendor/crazywhalecc/static-php-cli/*    # Your project is used as a dependent library

    When packaging these files under the directory /home/example/another-app/ into app.phar, the value of the following constant for your project should be:

    ConstantValue
    WORKING_DIR/home/example/another-app
    SOURCE_ROOT_DIRphar:///home/example/another-app/app.phar/
    FRAMEWORK_ROOT_DIRphar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli
    __DIR__phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App
    __FILE__phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App/MyCommand.php
    `,50)])])}const u=o(a,[["render",r]]);export{m as __pageData,u as default}; diff --git a/assets/en_develop_structure.md.X2JId3N9.lean.js b/assets/en_develop_structure.md.X2JId3N9.lean.js new file mode 100644 index 00000000..095a869f --- /dev/null +++ b/assets/en_develop_structure.md.X2JId3N9.lean.js @@ -0,0 +1 @@ +import{_ as o,c as t,o as c,ah as d}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"Introduction to project structure","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/structure.md","filePath":"en/develop/structure.md"}'),a={name:"en/develop/structure.md"};function r(i,e,s,n,p,l){return c(),t("div",null,[...e[0]||(e[0]=[d("",50)])])}const u=o(a,[["render",r]]);export{m as __pageData,u as default}; diff --git a/assets/en_develop_system-build-tools.md.DK4AaCy_.js b/assets/en_develop_system-build-tools.md.BmQhyTle.js similarity index 68% rename from assets/en_develop_system-build-tools.md.DK4AaCy_.js rename to assets/en_develop_system-build-tools.md.BmQhyTle.js index 0ac53756..ca6eca0f 100644 --- a/assets/en_develop_system-build-tools.md.DK4AaCy_.js +++ b/assets/en_develop_system-build-tools.md.BmQhyTle.js @@ -1,4 +1,4 @@ -import{_ as i,c as a,o as e,af as n}from"./chunks/framework.PeLcR_tw.js";const d=JSON.parse('{"title":"Compilation Tools","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/system-build-tools.md","filePath":"en/develop/system-build-tools.md"}'),t={name:"en/develop/system-build-tools.md"};function l(o,s,p,h,c,r){return e(),a("div",null,s[0]||(s[0]=[n(`

    Compilation Tools

    static-php-cli uses many system compilation tools when building static PHP. These tools mainly include:

    • autoconf: used to generate configure scripts.
    • make: used to execute Makefile.
    • cmake: used to execute CMakeLists.txt.
    • pkg-config: Used to find the installation path of dependent libraries.
    • gcc: used to compile C/C++ projects under Linux.
    • clang: used to compile C/C++ projects under macOS.

    For Linux and macOS operating systems, these tools can usually be installed through the package manager, which is written in the doctor module. Theoretically we can also compile and download these tools manually, but this will increase the complexity of compilation, so we do not recommend this.

    Linux Compilation Tools

    For Linux systems, different distributions have different installation methods for compilation tools. And for static compilation, the package management of some distributions cannot install libraries and tools for pure static compilation. Therefore, for the Linux platform and its different distributions, we currently provide a variety of compilation environment preparations.

    Glibc Environment

    The glibc environment refers to the underlying libc library of the system (that is, the C standard library that all programs written in C language are dynamically linked to) uses glibc, which is the default environment for most distributions. For example: Ubuntu, Debian, CentOS, RHEL, openSUSE, Arch Linux, etc.

    In the glibc environment, the package management and compiler we use point to glibc by default, and glibc cannot be statically linked well. One of the reasons it cannot be statically linked is that its network library nss cannot be compiled statically.

    For the glibc environment, in static-php-cli and spc in 2.0-RC8 and later, you can choose two ways to build static PHP:

    1. Use Docker to build, you can use bin/spc-alpine-docker to build, it will build an Alpine Linux docker image.
    2. Use bin/spc doctor --auto-fix to install the musl-wrapper and musl-cross-make packages, and then build directly. (Related source code)

    Generally speaking, the build results in these two environments are consistent, and you can choose according to actual needs.

    In the doctor module, static-php-cli will first detect the current Linux distribution. If the current distribution is a glibc environment, you will be prompted to install the musl-wrapper and musl-cross-make packages.

    The process of installing musl-wrapper in the glibc environment is as follows:

    1. Download the specific version of musl-wrapper source code from the musl official website.
    2. Use gcc installed from the package management to compile the musl-wrapper source code and generate musl-libc and other libraries: ./configure --disable-gcc-wrapper && make -j && sudo make install.
    3. The musl-wrapper related libraries will be installed in the /usr/local/musl directory.

    The process of installing musl-cross-make in the glibc environment is as follows:

    1. Download the precompiled musl-cross-make compressed package from dl.static-php.dev .
    2. Unzip to the /usr/local/musl directory.

    TIP

    In the glibc environment, static compilation can be achieved by directly installing musl-wrapper, but musl-wrapper only contains musl-gcc and not musl-g++, which means that C++ code cannot be compiled. So we need musl-cross-make to provide musl-g++.

    The reason why the musl-cross-make package cannot be compiled directly locally is that its compilation environment requirements are relatively high (requires more than 36GB of memory, compiled under Alpine Linux), so we provide precompiled binary packages that can be used for all Linux distributions.

    At the same time, the package management of some distributions provides musl-wrapper, but musl-cross-make needs to match the corresponding musl-wrapper version, so we do not use package management to install musl-wrapper.

    Compiling musl-cross-make will be introduced in the musl-cross-make Toolchain Compilation section of this chapter.

    Musl Environment

    The musl environment refers to the system's underlying libc library that uses musl, which is a lightweight C standard library that can be well statically linked.

    For the currently popular Linux distributions, Alpine Linux uses the musl environment, so static-php-cli can directly build static PHP under Alpine Linux. You only need to install basic compilation tools (such as gcc, cmake, etc.) directly from the package management.

    For other distributions, if your distribution uses the musl environment, you can also use static-php-cli to build static PHP directly after installing the necessary compilation tools.

    TIP

    In the musl environment, static-php-cli will automatically skip the installation of musl-wrapper and musl-cross-make.

    Docker Environment

    The Docker environment refers to using Docker containers to build static PHP. You can use bin/spc-alpine-docker to build. Before executing this command, you need to install Docker first, and then execute bin/spc-alpine-docker in the project root directory.

    After executing bin/spc-alpine-docker, static-php-cli will automatically download the Alpine Linux image and then build a cwcc-spc-x86_64 or cwcc-spc-aarch64 image. Then all build process is performed within this image, which is equivalent to compiling in Alpine Linux.

    musl-cross-make Toolchain Compilation

    In Linux, although you do not need to manually compile the musl-cross-make tool, if you want to understand its compilation process, you can refer here. Another important reason is that this may not be compiled using automated tools such as CI and Actions, because the existing CI service compilation environment does not meet the compilation requirements of musl-cross-make, and the configuration that meets the requirements is too expensive.

    The compilation process of musl-cross-make is as follows:

    Prepare an Alpine Linux environment (either directly installed or using Docker). The compilation process requires more than 36GB of memory, so you need to compile on a machine with larger memory. Without this much memory, compilation may fail.

    Then write the following content into the config.mak file:

    makefile
    STAT = -static --static
    +import{_ as i,c as a,o as e,ah as n}from"./chunks/framework.Bhsyh9kO.js";const d=JSON.parse('{"title":"Compilation Tools","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/system-build-tools.md","filePath":"en/develop/system-build-tools.md"}'),t={name:"en/develop/system-build-tools.md"};function l(o,s,p,h,c,r){return e(),a("div",null,[...s[0]||(s[0]=[n(`

    Compilation Tools

    static-php-cli uses many system compilation tools when building static PHP. These tools mainly include:

    • autoconf: used to generate configure scripts.
    • make: used to execute Makefile.
    • cmake: used to execute CMakeLists.txt.
    • pkg-config: Used to find the installation path of dependent libraries.
    • gcc: used to compile C/C++ projects under Linux.
    • clang: used to compile C/C++ projects under macOS.

    For Linux and macOS operating systems, these tools can usually be installed through the package manager, which is written in the doctor module. Theoretically we can also compile and download these tools manually, but this will increase the complexity of compilation, so we do not recommend this.

    Linux Compilation Tools

    For Linux systems, different distributions have different installation methods for compilation tools. And for static compilation, the package management of some distributions cannot install libraries and tools for pure static compilation. Therefore, for the Linux platform and its different distributions, we currently provide a variety of compilation environment preparations.

    Glibc Environment

    The glibc environment refers to the underlying libc library of the system (that is, the C standard library that all programs written in C language are dynamically linked to) uses glibc, which is the default environment for most distributions. For example: Ubuntu, Debian, CentOS, RHEL, openSUSE, Arch Linux, etc.

    In the glibc environment, the package management and compiler we use point to glibc by default, and glibc cannot be statically linked well. One of the reasons it cannot be statically linked is that its network library nss cannot be compiled statically.

    For the glibc environment, in static-php-cli and spc in 2.0-RC8 and later, you can choose two ways to build static PHP:

    1. Use Docker to build, you can use bin/spc-alpine-docker to build, it will build an Alpine Linux docker image.
    2. Use bin/spc doctor --auto-fix to install the musl-wrapper and musl-cross-make packages, and then build directly. (Related source code)

    Generally speaking, the build results in these two environments are consistent, and you can choose according to actual needs.

    In the doctor module, static-php-cli will first detect the current Linux distribution. If the current distribution is a glibc environment, you will be prompted to install the musl-wrapper and musl-cross-make packages.

    The process of installing musl-wrapper in the glibc environment is as follows:

    1. Download the specific version of musl-wrapper source code from the musl official website.
    2. Use gcc installed from the package management to compile the musl-wrapper source code and generate musl-libc and other libraries: ./configure --disable-gcc-wrapper && make -j && sudo make install.
    3. The musl-wrapper related libraries will be installed in the /usr/local/musl directory.

    The process of installing musl-cross-make in the glibc environment is as follows:

    1. Download the precompiled musl-cross-make compressed package from dl.static-php.dev .
    2. Unzip to the /usr/local/musl directory.

    TIP

    In the glibc environment, static compilation can be achieved by directly installing musl-wrapper, but musl-wrapper only contains musl-gcc and not musl-g++, which means that C++ code cannot be compiled. So we need musl-cross-make to provide musl-g++.

    The reason why the musl-cross-make package cannot be compiled directly locally is that its compilation environment requirements are relatively high (requires more than 36GB of memory, compiled under Alpine Linux), so we provide precompiled binary packages that can be used for all Linux distributions.

    At the same time, the package management of some distributions provides musl-wrapper, but musl-cross-make needs to match the corresponding musl-wrapper version, so we do not use package management to install musl-wrapper.

    Compiling musl-cross-make will be introduced in the musl-cross-make Toolchain Compilation section of this chapter.

    Musl Environment

    The musl environment refers to the system's underlying libc library that uses musl, which is a lightweight C standard library that can be well statically linked.

    For the currently popular Linux distributions, Alpine Linux uses the musl environment, so static-php-cli can directly build static PHP under Alpine Linux. You only need to install basic compilation tools (such as gcc, cmake, etc.) directly from the package management.

    For other distributions, if your distribution uses the musl environment, you can also use static-php-cli to build static PHP directly after installing the necessary compilation tools.

    TIP

    In the musl environment, static-php-cli will automatically skip the installation of musl-wrapper and musl-cross-make.

    Docker Environment

    The Docker environment refers to using Docker containers to build static PHP. You can use bin/spc-alpine-docker to build. Before executing this command, you need to install Docker first, and then execute bin/spc-alpine-docker in the project root directory.

    After executing bin/spc-alpine-docker, static-php-cli will automatically download the Alpine Linux image and then build a cwcc-spc-x86_64 or cwcc-spc-aarch64 image. Then all build process is performed within this image, which is equivalent to compiling in Alpine Linux.

    musl-cross-make Toolchain Compilation

    In Linux, although you do not need to manually compile the musl-cross-make tool, if you want to understand its compilation process, you can refer here. Another important reason is that this may not be compiled using automated tools such as CI and Actions, because the existing CI service compilation environment does not meet the compilation requirements of musl-cross-make, and the configuration that meets the requirements is too expensive.

    The compilation process of musl-cross-make is as follows:

    Prepare an Alpine Linux environment (either directly installed or using Docker). The compilation process requires more than 36GB of memory, so you need to compile on a machine with larger memory. Without this much memory, compilation may fail.

    Then write the following content into the config.mak file:

    makefile
    STAT = -static --static
     FLAG = -g0 -Os -Wno-error
     
     ifneq ($(NATIVE),)
    @@ -65,4 +65,4 @@ import{_ as i,c as a,o as e,af as n}from"./chunks/framework.PeLcR_tw.js";const d
     sed -i 's/poison calloc/poison/g' ./gcc-13.2.0/gcc/system.h
     make TARGET=x86_64-linux-musl -j
     make TARGET=x86_64-linux-musl install -j
    -tar cvzf x86_64-musl-toolchain.tgz output/*

    TIP

    All the above scripts are suitable for x86_64 architecture Linux. If you need to build musl-cross-make for the ARM environment, just replace all x86_64 above with aarch64.

    This compilation process may fail due to insufficient memory, network problems, etc. You can try a few more times, or use a machine with larger memory to compile. If you encounter problems or you have better improvement solutions, go to Discussion.

    macOS Environment

    For macOS systems, the main compilation tool we use is clang, which is the default compiler for macOS systems and is also the compiler of Xcode.

    Compiling under macOS mainly relies on Xcode or Xcode Command Line Tools. You can download Xcode from the App Store, or execute xcode-select --install in the terminal to install Xcode Command Line Tools.

    In addition, in the doctor environment check module, static-php-cli will check whether Homebrew, compilation tools, etc. are installed on the macOS system. If not, you will be prompted to install them. I will not go into details here.

    FreeBSD Environment

    FreeBSD is also a Unix system, and its compilation tools are similar to macOS. You can directly use the package management pkg to install clang and other compilation tools through the doctor command.

    pkg-config Compilation (*nix only)

    If you observe the compilation log when using static-php-cli to build static PHP, you will find that no matter what is compiled, pkg-config will be compiled first. This is because pkg-config is a library used to find dependencies. In earlier versions of static-php-cli, we directly used the pkg-config tool installed by package management, but this would cause some problems, such as:

    • Even if PKG_CONFIG_PATH is specified, pkg-config will try to find dependent packages from the system path.
    • Since pkg-config will look for dependent packages from the system path, if a dependent package with the same name exists in the system, compilation may fail.

    In order to avoid the above problems, we compile pkg-config into buildroot/bin in user mode and use it. We use parameters such as --without-sysroot to avoid looking for dependent packages from the system path.

    `,50)]))}const m=i(t,[["render",l]]);export{d as __pageData,m as default}; +tar cvzf x86_64-musl-toolchain.tgz output/*

    TIP

    All the above scripts are suitable for x86_64 architecture Linux. If you need to build musl-cross-make for the ARM environment, just replace all x86_64 above with aarch64.

    This compilation process may fail due to insufficient memory, network problems, etc. You can try a few more times, or use a machine with larger memory to compile. If you encounter problems or you have better improvement solutions, go to Discussion.

    macOS Environment

    For macOS systems, the main compilation tool we use is clang, which is the default compiler for macOS systems and is also the compiler of Xcode.

    Compiling under macOS mainly relies on Xcode or Xcode Command Line Tools. You can download Xcode from the App Store, or execute xcode-select --install in the terminal to install Xcode Command Line Tools.

    In addition, in the doctor environment check module, static-php-cli will check whether Homebrew, compilation tools, etc. are installed on the macOS system. If not, you will be prompted to install them. I will not go into details here.

    FreeBSD Environment

    FreeBSD is also a Unix system, and its compilation tools are similar to macOS. You can directly use the package management pkg to install clang and other compilation tools through the doctor command.

    pkg-config Compilation (*nix only)

    If you observe the compilation log when using static-php-cli to build static PHP, you will find that no matter what is compiled, pkg-config will be compiled first. This is because pkg-config is a library used to find dependencies. In earlier versions of static-php-cli, we directly used the pkg-config tool installed by package management, but this would cause some problems, such as:

    • Even if PKG_CONFIG_PATH is specified, pkg-config will try to find dependent packages from the system path.
    • Since pkg-config will look for dependent packages from the system path, if a dependent package with the same name exists in the system, compilation may fail.

    In order to avoid the above problems, we compile pkg-config into buildroot/bin in user mode and use it. We use parameters such as --without-sysroot to avoid looking for dependent packages from the system path.

    `,50)])])}const m=i(t,[["render",l]]);export{d as __pageData,m as default}; diff --git a/assets/en_develop_system-build-tools.md.BmQhyTle.lean.js b/assets/en_develop_system-build-tools.md.BmQhyTle.lean.js new file mode 100644 index 00000000..9a94fed5 --- /dev/null +++ b/assets/en_develop_system-build-tools.md.BmQhyTle.lean.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as e,ah as n}from"./chunks/framework.Bhsyh9kO.js";const d=JSON.parse('{"title":"Compilation Tools","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/system-build-tools.md","filePath":"en/develop/system-build-tools.md"}'),t={name:"en/develop/system-build-tools.md"};function l(o,s,p,h,c,r){return e(),a("div",null,[...s[0]||(s[0]=[n("",50)])])}const m=i(t,[["render",l]]);export{d as __pageData,m as default}; diff --git a/assets/en_develop_system-build-tools.md.DK4AaCy_.lean.js b/assets/en_develop_system-build-tools.md.DK4AaCy_.lean.js deleted file mode 100644 index a3df1311..00000000 --- a/assets/en_develop_system-build-tools.md.DK4AaCy_.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as a,o as e,af as n}from"./chunks/framework.PeLcR_tw.js";const d=JSON.parse('{"title":"Compilation Tools","description":"","frontmatter":{},"headers":[],"relativePath":"en/develop/system-build-tools.md","filePath":"en/develop/system-build-tools.md"}'),t={name:"en/develop/system-build-tools.md"};function l(o,s,p,h,c,r){return e(),a("div",null,s[0]||(s[0]=[n("",50)]))}const m=i(t,[["render",l]]);export{d as __pageData,m as default}; diff --git a/assets/en_faq_index.md.DnHLgGcl.js b/assets/en_faq_index.md.B89Sredc.js similarity index 65% rename from assets/en_faq_index.md.DnHLgGcl.js rename to assets/en_faq_index.md.B89Sredc.js index 86d69567..cb94bd32 100644 --- a/assets/en_faq_index.md.DnHLgGcl.js +++ b/assets/en_faq_index.md.B89Sredc.js @@ -1,4 +1,4 @@ -import{_ as i,c as o,o as s,af as t}from"./chunks/framework.PeLcR_tw.js";const u=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"en/faq/index.md","filePath":"en/faq/index.md"}'),a={name:"en/faq/index.md"};function n(l,e,r,c,d,p){return s(),o("div",null,e[0]||(e[0]=[t(`

    FAQ

    Here will be some questions that you may encounter easily. There are currently many, but I need to take time to organize them.

    What is the path of php.ini ?

    On Linux, macOS and FreeBSD, the path of php.ini is /usr/local/etc/php/php.ini. On Windows, the path is C:\\windows\\php.ini or the current directory of php.exe. The directory where to look for php.ini can be changed on *nix using the manual build option --with-config-file-path.

    In addition, on Linux, macOS and FreeBSD, .ini files present in the /usr/local/etc/php/conf.d directory will also be loaded. On Windows, this path is empty by default. The directory can be changed using the manual build option --with-config-file-scan-dir.

    php.ini will also be searched for in the other standard locations.

    Can statically-compiled PHP install extensions?

    Because the principle of installing PHP extensions under the normal mode is to use .so type dynamic link library to install new extensions, and we use the static link PHP compiled by this project. However, static linking has different definitions in different operating systems.

    First of all, for Linux systems, statically linked binaries will not link the system's dynamic link library. Purely statically linked binaries (build with -all-static) cannot load dynamic libraries, so new extensions cannot be added. At the same time, in pure static mode, you cannot use extensions such as ffi to load external .so modules.

    You can use the command ldd buildroot/bin/php to check whether the binary you built under Linux is purely statically linked.

    If you build GNU libc based PHP, you can use the ffi extension to load external .so modules and load .so extensions with the same ABI.

    For example, you can use the following command to build a static PHP binary dynamically linked with glibc, supporting FFI extensions and loading the xdebug.so extension of the same PHP version and the same TS type:

    bash
    bin/spc-gnu-docker download --for-extensions=ffi,xml --with-php=8.4
    +import{_ as i,c as o,o as s,ah as t}from"./chunks/framework.Bhsyh9kO.js";const u=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"en/faq/index.md","filePath":"en/faq/index.md"}'),a={name:"en/faq/index.md"};function n(l,e,r,c,d,p){return s(),o("div",null,[...e[0]||(e[0]=[t(`

    FAQ

    Here will be some questions that you may encounter easily. There are currently many, but I need to take time to organize them.

    What is the path of php.ini ?

    On Linux, macOS and FreeBSD, the path of php.ini is /usr/local/etc/php/php.ini. On Windows, the path is C:\\windows\\php.ini or the current directory of php.exe. The directory where to look for php.ini can be changed on *nix using the manual build option --with-config-file-path.

    In addition, on Linux, macOS and FreeBSD, .ini files present in the /usr/local/etc/php/conf.d directory will also be loaded. On Windows, this path is empty by default. The directory can be changed using the manual build option --with-config-file-scan-dir.

    php.ini will also be searched for in the other standard locations.

    Can statically-compiled PHP install extensions?

    Because the principle of installing PHP extensions under the normal mode is to use .so type dynamic link library to install new extensions, and we use the static link PHP compiled by this project. However, static linking has different definitions in different operating systems.

    First of all, for Linux systems, statically linked binaries will not link the system's dynamic link library. Purely statically linked binaries (build with -all-static) cannot load dynamic libraries, so new extensions cannot be added. At the same time, in pure static mode, you cannot use extensions such as ffi to load external .so modules.

    You can use the command ldd buildroot/bin/php to check whether the binary you built under Linux is purely statically linked.

    If you build GNU libc based PHP, you can use the ffi extension to load external .so modules and load .so extensions with the same ABI.

    For example, you can use the following command to build a static PHP binary dynamically linked with glibc, supporting FFI extensions and loading the xdebug.so extension of the same PHP version and the same TS type:

    bash
    bin/spc-gnu-docker download --for-extensions=ffi,xml --with-php=8.4
     bin/spc-gnu-docker build ffi,xml --build-cli --debug
     
    -buildroot/bin/php -d "zend_extension=/path/to/php{PHP_VER}-{ts/nts}/xdebug.so" --ri xdebug

    For macOS platform, almost all binaries under macOS cannot be truly purely statically linked, and almost all binaries will link macOS system libraries: /usr/lib/libresolv.9.dylib and /usr/lib/libSystem.B.dylib. So on macOS, you can directly use SPC to build statically compiled PHP binaries with dynamically linked extensions:

    1. Build shared extension xxx.so using: --build-shared=XXX option. e.g. bin/spc build bcmath,zlib --build-shared=xdebug --build-cli
    2. You will get buildroot/modules/xdebug.so and buildroot/bin/php.
    3. The xdebug.so file could be used for php that version and thread-safe are the same.

    Can it support Oracle database extension?

    Some extensions that rely on closed source libraries, such as oci8, sourceguardian, etc., they do not provide purely statically compiled dependent library files (.a), only dynamic dependent library files (.so). These extensions cannot be compiled into static-php-cli using source code, so this project may never support these extensions. However, in theory you can access and use such extensions under macOS and Linux according to the above questions.

    If you have a need for such extensions, or most people have needs for these closed-source extensions, see the discussion on standalone-php-cli. Welcome to leave a message.

    Does it support Windows?

    The project currently supports Windows, but the number of supported extensions is small. Windows support is not perfect. There are mainly the following problems:

    1. The compilation process of Windows is different from that of *nix, and the toolchain used is also different. The compilation tools used to compile the dependent libraries of each extension are almost completely different.
    2. The demand for the Windows version will also be advanced based on the needs of all people who use this project. If many people need it, I will support related extensions as soon as possible.

    Can I protect my source code with micro?

    You can't. micro.sfx is essentially combining php and php code into one file, there is no process of compiling or encrypting the PHP code.

    First of all, php-src is the official interpreter of PHP code, and there is no PHP compiler compatible with mainstream branches on the market. I saw on the Internet that there is a project called BPC (Binary PHP Compiler?) that can compile PHP into binary, but there are many restrictions.

    The direction of encrypting and protecting the code is not the same as compiling. After compiling, the code can also be obtained through reverse engineering and other methods. The real protection is still carried out by means of packing and encrypting the code.

    Therefore, this project (static-php-cli) and related projects (lwmbs, swoole-cli) all provide a convenient compilation tool for php-src source code. The phpmicro referenced by this project and related projects is only a package of PHP's sapi interface, not a compilation tool for PHP code. The compiler for PHP code is a completely different project, so the extra cases are not taken into account. If you are interested in encryption, you can consider using existing encryption technologies, such as Swoole Compiler, Source Guardian, etc.

    Unable to use ssl

    Update: This issue has been fixed in the latest version of static-php-cli, which now reads the system's certificate file by default. If you still have problems, try the solution below.

    When using curl, pgsql, etc. to request an HTTPS website or establish an SSL connection, there may be an error:80000002:system library::No such file or directory error. This error is caused by statically compiled PHP without specifying openssl.cafile via php.ini.

    You can solve this problem by specifying php.ini before using PHP and adding openssl.cafile=/path/to/your-cert.pem in the INI.

    For Linux systems, you can download the cacert.pem file from the curl official website, or you can use the certificate file that comes with the system. For the certificate locations of different distros, please refer to Golang docs.

    INI configuration openssl.cafile cannot be set dynamically using the ini_set() function, because openssl.cafile is a PHP_INI_SYSTEM type configuration and can only be set in the php.ini file.

    Why don't we support older versions of PHP?

    Because older versions of PHP have many problems, such as security issues, performance issues, and functional issues. In addition, many older versions of PHP are not compatible with the latest dependency libraries, which is one of the reasons why older versions of PHP are not supported.

    You can use older versions compiled earlier by static-php-cli, such as PHP 8.0, but earlier versions will not be explicitly supported.

    `,35)]))}const f=i(a,[["render",n]]);export{u as __pageData,f as default}; +buildroot/bin/php -d "zend_extension=/path/to/php{PHP_VER}-{ts/nts}/xdebug.so" --ri xdebug

    For macOS platform, almost all binaries under macOS cannot be truly purely statically linked, and almost all binaries will link macOS system libraries: /usr/lib/libresolv.9.dylib and /usr/lib/libSystem.B.dylib. So on macOS, you can directly use SPC to build statically compiled PHP binaries with dynamically linked extensions:

    1. Build shared extension xxx.so using: --build-shared=XXX option. e.g. bin/spc build bcmath,zlib --build-shared=xdebug --build-cli
    2. You will get buildroot/modules/xdebug.so and buildroot/bin/php.
    3. The xdebug.so file could be used for php that version and thread-safe are the same.

    Can it support Oracle database extension?

    Some extensions that rely on closed source libraries, such as oci8, sourceguardian, etc., they do not provide purely statically compiled dependent library files (.a), only dynamic dependent library files (.so). These extensions cannot be compiled into static-php-cli using source code, so this project may never support these extensions. However, in theory you can access and use such extensions under macOS and Linux according to the above questions.

    If you have a need for such extensions, or most people have needs for these closed-source extensions, see the discussion on standalone-php-cli. Welcome to leave a message.

    Does it support Windows?

    The project currently supports Windows, but the number of supported extensions is small. Windows support is not perfect. There are mainly the following problems:

    1. The compilation process of Windows is different from that of *nix, and the toolchain used is also different. The compilation tools used to compile the dependent libraries of each extension are almost completely different.
    2. The demand for the Windows version will also be advanced based on the needs of all people who use this project. If many people need it, I will support related extensions as soon as possible.

    Can I protect my source code with micro?

    You can't. micro.sfx is essentially combining php and php code into one file, there is no process of compiling or encrypting the PHP code.

    First of all, php-src is the official interpreter of PHP code, and there is no PHP compiler compatible with mainstream branches on the market. I saw on the Internet that there is a project called BPC (Binary PHP Compiler?) that can compile PHP into binary, but there are many restrictions.

    The direction of encrypting and protecting the code is not the same as compiling. After compiling, the code can also be obtained through reverse engineering and other methods. The real protection is still carried out by means of packing and encrypting the code.

    Therefore, this project (static-php-cli) and related projects (lwmbs, swoole-cli) all provide a convenient compilation tool for php-src source code. The phpmicro referenced by this project and related projects is only a package of PHP's sapi interface, not a compilation tool for PHP code. The compiler for PHP code is a completely different project, so the extra cases are not taken into account. If you are interested in encryption, you can consider using existing encryption technologies, such as Swoole Compiler, Source Guardian, etc.

    Unable to use ssl

    Update: This issue has been fixed in the latest version of static-php-cli, which now reads the system's certificate file by default. If you still have problems, try the solution below.

    When using curl, pgsql, etc. to request an HTTPS website or establish an SSL connection, there may be an error:80000002:system library::No such file or directory error. This error is caused by statically compiled PHP without specifying openssl.cafile via php.ini.

    You can solve this problem by specifying php.ini before using PHP and adding openssl.cafile=/path/to/your-cert.pem in the INI.

    For Linux systems, you can download the cacert.pem file from the curl official website, or you can use the certificate file that comes with the system. For the certificate locations of different distros, please refer to Golang docs.

    INI configuration openssl.cafile cannot be set dynamically using the ini_set() function, because openssl.cafile is a PHP_INI_SYSTEM type configuration and can only be set in the php.ini file.

    Why don't we support older versions of PHP?

    Because older versions of PHP have many problems, such as security issues, performance issues, and functional issues. In addition, many older versions of PHP are not compatible with the latest dependency libraries, which is one of the reasons why older versions of PHP are not supported.

    You can use older versions compiled earlier by static-php-cli, such as PHP 8.0, but earlier versions will not be explicitly supported.

    `,35)])])}const f=i(a,[["render",n]]);export{u as __pageData,f as default}; diff --git a/assets/en_faq_index.md.B89Sredc.lean.js b/assets/en_faq_index.md.B89Sredc.lean.js new file mode 100644 index 00000000..05231159 --- /dev/null +++ b/assets/en_faq_index.md.B89Sredc.lean.js @@ -0,0 +1 @@ +import{_ as i,c as o,o as s,ah as t}from"./chunks/framework.Bhsyh9kO.js";const u=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"en/faq/index.md","filePath":"en/faq/index.md"}'),a={name:"en/faq/index.md"};function n(l,e,r,c,d,p){return s(),o("div",null,[...e[0]||(e[0]=[t("",35)])])}const f=i(a,[["render",n]]);export{u as __pageData,f as default}; diff --git a/assets/en_faq_index.md.DnHLgGcl.lean.js b/assets/en_faq_index.md.DnHLgGcl.lean.js deleted file mode 100644 index 86665400..00000000 --- a/assets/en_faq_index.md.DnHLgGcl.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as o,o as s,af as t}from"./chunks/framework.PeLcR_tw.js";const u=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"en/faq/index.md","filePath":"en/faq/index.md"}'),a={name:"en/faq/index.md"};function n(l,e,r,c,d,p){return s(),o("div",null,e[0]||(e[0]=[t("",35)]))}const f=i(a,[["render",n]]);export{u as __pageData,f as default}; diff --git a/assets/en_guide_action-build.md.BCJvLz8l.js b/assets/en_guide_action-build.md.BCJvLz8l.js deleted file mode 100644 index 3a79cab9..00000000 --- a/assets/en_guide_action-build.md.BCJvLz8l.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,c as o,o as i,af as n}from"./chunks/framework.PeLcR_tw.js";const h=JSON.parse('{"title":"GitHub Action Build","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/action-build.md","filePath":"en/guide/action-build.md"}'),a={name:"en/guide/action-build.md"};function l(r,e,s,c,d,u){return i(),o("div",null,e[0]||(e[0]=[n('

    GitHub Action Build

    Action Build refers to compiling directly using GitHub Action.

    If you don't want to compile it yourself, you can download the artifact from the existing Action in this project, or you can download it from a self-hosted server:Enter.

    Self-hosted binaries are also built from Actions: repo. The extensions included are: bcmath,bz2,calendar,ctype,curl,dom,exif,fileinfo,filter,ftp,gd,gmp,iconv,xml,mbstring,mbregex,mysqlnd,openssl, pcntl,pdo,pdo_mysql,pdo_sqlite,phar,posix,redis,session,simplexml,soap,sockets,sqlite3,tokenizer,xmlwriter,xmlreader,zlib,zip

    Build Guide

    Using GitHub Action makes it easy to build a statically compiled PHP and phpmicro, while also defining the extensions to compile.

    1. Fork project.
    2. Go to the Actions of the project and select CI.
    3. Select Run workflow, fill in the PHP version you want to compile, the target type, and the list of extensions. (extensions comma separated, e.g. bcmath,curl,mbstring)
    4. After waiting for about a period of time, enter the corresponding task and get Artifacts.

    If you enable debug, all logs will be output at build time, including compiled logs, for troubleshooting.

    If you need to build in other environments, you can use manual build.

    Extensions

    You can go to extensions check here to see if all the extensions you need currently support. and then go to command generator select the extension you need to compile, copy the extensions string to extensions option.

    ',11)]))}const m=t(a,[["render",l]]);export{h as __pageData,m as default}; diff --git a/assets/en_guide_action-build.md.BCJvLz8l.lean.js b/assets/en_guide_action-build.md.BCJvLz8l.lean.js deleted file mode 100644 index 3afca8e2..00000000 --- a/assets/en_guide_action-build.md.BCJvLz8l.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,c as o,o as i,af as n}from"./chunks/framework.PeLcR_tw.js";const h=JSON.parse('{"title":"GitHub Action Build","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/action-build.md","filePath":"en/guide/action-build.md"}'),a={name:"en/guide/action-build.md"};function l(r,e,s,c,d,u){return i(),o("div",null,e[0]||(e[0]=[n("",11)]))}const m=t(a,[["render",l]]);export{h as __pageData,m as default}; diff --git a/assets/en_guide_action-build.md.Dnzq6gNC.js b/assets/en_guide_action-build.md.Dnzq6gNC.js new file mode 100644 index 00000000..8b6342ea --- /dev/null +++ b/assets/en_guide_action-build.md.Dnzq6gNC.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as i,ah as n}from"./chunks/framework.Bhsyh9kO.js";const h=JSON.parse('{"title":"GitHub Action Build","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/action-build.md","filePath":"en/guide/action-build.md"}'),a={name:"en/guide/action-build.md"};function l(r,e,s,c,d,u){return i(),o("div",null,[...e[0]||(e[0]=[n('

    GitHub Action Build

    Action Build refers to compiling directly using GitHub Action.

    If you don't want to compile it yourself, you can download the artifact from the existing Action in this project, or you can download it from a self-hosted server:Enter.

    Self-hosted binaries are also built from Actions: repo. The extensions included are: bcmath,bz2,calendar,ctype,curl,dom,exif,fileinfo,filter,ftp,gd,gmp,iconv,xml,mbstring,mbregex,mysqlnd,openssl, pcntl,pdo,pdo_mysql,pdo_sqlite,phar,posix,redis,session,simplexml,soap,sockets,sqlite3,tokenizer,xmlwriter,xmlreader,zlib,zip

    Build Guide

    Using GitHub Action makes it easy to build a statically compiled PHP and phpmicro, while also defining the extensions to compile.

    1. Fork project.
    2. Go to the Actions of the project and select CI.
    3. Select Run workflow, fill in the PHP version you want to compile, the target type, and the list of extensions. (extensions comma separated, e.g. bcmath,curl,mbstring)
    4. After waiting for about a period of time, enter the corresponding task and get Artifacts.

    If you enable debug, all logs will be output at build time, including compiled logs, for troubleshooting.

    If you need to build in other environments, you can use manual build.

    Extensions

    You can go to extensions check here to see if all the extensions you need currently support. and then go to command generator select the extension you need to compile, copy the extensions string to extensions option.

    ',11)])])}const m=t(a,[["render",l]]);export{h as __pageData,m as default}; diff --git a/assets/en_guide_action-build.md.Dnzq6gNC.lean.js b/assets/en_guide_action-build.md.Dnzq6gNC.lean.js new file mode 100644 index 00000000..f427a341 --- /dev/null +++ b/assets/en_guide_action-build.md.Dnzq6gNC.lean.js @@ -0,0 +1 @@ +import{_ as t,c as o,o as i,ah as n}from"./chunks/framework.Bhsyh9kO.js";const h=JSON.parse('{"title":"GitHub Action Build","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/action-build.md","filePath":"en/guide/action-build.md"}'),a={name:"en/guide/action-build.md"};function l(r,e,s,c,d,u){return i(),o("div",null,[...e[0]||(e[0]=[n("",11)])])}const m=t(a,[["render",l]]);export{h as __pageData,m as default}; diff --git a/assets/en_guide_build-on-windows.md.CG23CkLK.lean.js b/assets/en_guide_build-on-windows.md.CG23CkLK.lean.js deleted file mode 100644 index 5292adff..00000000 --- a/assets/en_guide_build-on-windows.md.CG23CkLK.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as s,o as a,af as t}from"./chunks/framework.PeLcR_tw.js";const k=JSON.parse('{"title":"Build on Windows","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/build-on-windows.md","filePath":"en/guide/build-on-windows.md"}'),l={name:"en/guide/build-on-windows.md"};function o(n,i,h,d,r,p){return a(),s("div",null,i[0]||(i[0]=[t("",64)]))}const u=e(l,[["render",o]]);export{k as __pageData,u as default}; diff --git a/assets/en_guide_build-on-windows.md.CG23CkLK.js b/assets/en_guide_build-on-windows.md.DiYVSaPG.js similarity index 81% rename from assets/en_guide_build-on-windows.md.CG23CkLK.js rename to assets/en_guide_build-on-windows.md.DiYVSaPG.js index 2d12bbab..21c12518 100644 --- a/assets/en_guide_build-on-windows.md.CG23CkLK.js +++ b/assets/en_guide_build-on-windows.md.DiYVSaPG.js @@ -1,4 +1,4 @@ -import{_ as e,c as s,o as a,af as t}from"./chunks/framework.PeLcR_tw.js";const k=JSON.parse('{"title":"Build on Windows","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/build-on-windows.md","filePath":"en/guide/build-on-windows.md"}'),l={name:"en/guide/build-on-windows.md"};function o(n,i,h,d,r,p){return a(),s("div",null,i[0]||(i[0]=[t(`

    Build on Windows

    Because the Windows system is an NT kernel, the compilation tools and operating system interfaces used by Unix-like operating systems are almost completely different, so the build process on Windows will be slightly different from that of Unix systems.

    GitHub Actions Build

    Building the Windows version of static-php from Actions is now supported. Like Linux and macOS, you need to Fork the static-php-cli repository to your GitHub account first, then you can enter Extension List to select the extension to be compiled, and then go to your own CI on Windows select the PHP version, fill in the extension list (comma separated), and click Run.

    If you're going to develop or build locally, please read on.

    Requirements

    The tools required to build static PHP on Windows are the same as PHP's official Windows build tools. You can read Official Documentation.

    To sum up, you need the following environment and tools:

    • Windows 10/11 (requires build 17063 or later)
    • Visual Studio 2019/2022 (recommended 2022)
    • C++ desktop development for Visual Studio
    • Git for Windows
    • php-sdk-binary-tools (can be installed automatically using doctor)
    • strawberry-perl (can be installed automatically using doctor)
    • nasm (can be installed automatically using doctor)

    TIP

    The construction of static-php-cli on Windows refers to using MSVC to build PHP and is not based on MinGW, Cygwin, WSL and other environments.

    If you prefer to use WSL, please refer to the chapter on Building on Linux.

    After installing Visual Studio and selecting the C++ desktop development workload, you may download about 8GB of compilation tools, and the download speed depends on your network conditions.

    Install Git

    Git for Windows can be downloaded and installed from here Standalone Installer 64-bit version, installed in the default location (C:\\Program Files\\Git\\). If you don't want to download and install manually, you can also use Visual Studio Installer and check Git in the Individual component tab.

    Prepare static-php-cli

    Downloading the static-php-cli project is very simple, just use git clone. It is recommended to place the project in C:\\spc-build\\ or a similar directory. It is best not to have spaces in the path.

    shell
    mkdir "C:\\spc-build"
    +import{_ as e,c as s,o as a,ah as t}from"./chunks/framework.Bhsyh9kO.js";const k=JSON.parse('{"title":"Build on Windows","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/build-on-windows.md","filePath":"en/guide/build-on-windows.md"}'),l={name:"en/guide/build-on-windows.md"};function o(n,i,h,d,r,p){return a(),s("div",null,[...i[0]||(i[0]=[t(`

    Build on Windows

    Because the Windows system is an NT kernel, the compilation tools and operating system interfaces used by Unix-like operating systems are almost completely different, so the build process on Windows will be slightly different from that of Unix systems.

    GitHub Actions Build

    Building the Windows version of static-php from Actions is now supported. Like Linux and macOS, you need to Fork the static-php-cli repository to your GitHub account first, then you can enter Extension List to select the extension to be compiled, and then go to your own CI on Windows select the PHP version, fill in the extension list (comma separated), and click Run.

    If you're going to develop or build locally, please read on.

    Requirements

    The tools required to build static PHP on Windows are the same as PHP's official Windows build tools. You can read Official Documentation.

    To sum up, you need the following environment and tools:

    • Windows 10/11 (requires build 17063 or later)
    • Visual Studio 2019/2022 (recommended 2022)
    • C++ desktop development for Visual Studio
    • Git for Windows
    • php-sdk-binary-tools (can be installed automatically using doctor)
    • strawberry-perl (can be installed automatically using doctor)
    • nasm (can be installed automatically using doctor)

    TIP

    The construction of static-php-cli on Windows refers to using MSVC to build PHP and is not based on MinGW, Cygwin, WSL and other environments.

    If you prefer to use WSL, please refer to the chapter on Building on Linux.

    After installing Visual Studio and selecting the C++ desktop development workload, you may download about 8GB of compilation tools, and the download speed depends on your network conditions.

    Install Git

    Git for Windows can be downloaded and installed from here Standalone Installer 64-bit version, installed in the default location (C:\\Program Files\\Git\\). If you don't want to download and install manually, you can also use Visual Studio Installer and check Git in the Individual component tab.

    Prepare static-php-cli

    Downloading the static-php-cli project is very simple, just use git clone. It is recommended to place the project in C:\\spc-build\\ or a similar directory. It is best not to have spaces in the path.

    shell
    mkdir "C:\\spc-build"
     cd C:\\spc-build
     git clone https://github.com/crazywhalecc/static-php-cli.git
     cd static-php-cli

    It is a bit strange that static-php-cli itself requires a PHP environment, but now you can quickly install the PHP environment through a script. Generally, your computer will not have the Windows version of PHP installed, so we recommend that you use bin/setup-runtime directly after downloading static-php-cli to install PHP and Composer in the current directory.

    shell
    # Install PHP and Composer to the ./runtime/ directory
    @@ -20,4 +20,4 @@ import{_ as e,c as s,o as a,af as t}from"./chunks/framework.PeLcR_tw.js";const k
     my-app.exe

    Use php.exe

    After php.exe is compiled, it is located in the buildroot\\bin\\ directory. You can copy it to any location for use.

    shell
    .\\php -v

    Use micro.sfx

    phpmicro is a SelF-extracted eXecutable SAPI module, provided by phpmicro project. But this project is using a fork of phpmicro, because we need to add some features to it. It can put php runtime and your source code together.

    The final compilation result will output a file named ./micro.sfx, which needs to be used with your PHP source code like code.php. This file will be located in the path buildroot/bin/micro.sfx.

    Prepare your project source code, which can be a single PHP file or a Phar file, for use.

    If you want to combine phar files, you must add phar extension when compiling!

    shell
    # code.php "<?php echo 'Hello world' . PHP_EOL;"
     bin/spc micro:combine code.php -O my-app.exe
     # Run it!!! Copy it to another computer!!!
    -./my-app.exe

    If you package a PHAR file, just replace code.php with the phar file path. You can use box-project/box to package your CLI project as Phar, It is then combined with phpmicro to produce a standalone executable binary.

    For more details on the micro:combine command, refer to command on Unix systems.

    `,64)]))}const u=e(l,[["render",o]]);export{k as __pageData,u as default}; +./my-app.exe

    If you package a PHAR file, just replace code.php with the phar file path. You can use box-project/box to package your CLI project as Phar, It is then combined with phpmicro to produce a standalone executable binary.

    For more details on the micro:combine command, refer to command on Unix systems.

    `,64)])])}const u=e(l,[["render",o]]);export{k as __pageData,u as default}; diff --git a/assets/en_guide_build-on-windows.md.DiYVSaPG.lean.js b/assets/en_guide_build-on-windows.md.DiYVSaPG.lean.js new file mode 100644 index 00000000..fa2a5e33 --- /dev/null +++ b/assets/en_guide_build-on-windows.md.DiYVSaPG.lean.js @@ -0,0 +1 @@ +import{_ as e,c as s,o as a,ah as t}from"./chunks/framework.Bhsyh9kO.js";const k=JSON.parse('{"title":"Build on Windows","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/build-on-windows.md","filePath":"en/guide/build-on-windows.md"}'),l={name:"en/guide/build-on-windows.md"};function o(n,i,h,d,r,p){return a(),s("div",null,[...i[0]||(i[0]=[t("",64)])])}const u=e(l,[["render",o]]);export{k as __pageData,u as default}; diff --git a/assets/en_guide_build-with-glibc.md.BDBCsGWa.js b/assets/en_guide_build-with-glibc.md.BDBCsGWa.js deleted file mode 100644 index cdbba3d2..00000000 --- a/assets/en_guide_build-with-glibc.md.BDBCsGWa.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as t,o as s,af as a}from"./chunks/framework.PeLcR_tw.js";const h=JSON.parse('{"title":"Build glibc Compatible Linux Binary","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/build-with-glibc.md","filePath":"en/guide/build-with-glibc.md"}'),n={name:"en/guide/build-with-glibc.md"};function l(o,i,r,c,u,b){return s(),t("div",null,i[0]||(i[0]=[a('

    Build glibc Compatible Linux Binary

    Why Build glibc Compatible Binary

    Currently, the binaries built by static-php-cli on Linux by default are based on musl-libc (statically linked). musl-libc is a lightweight libc implementation that aims to be compatible with glibc and provides good support for pure static linking. This means that the compiled static PHP executable can be used on almost any Linux distribution without worrying about the versions of libc, libstdc++, etc.

    However, there are some issues with pure static linking of musl-libc binaries on Linux:

    • The dl() function in PHP cannot be used to load dynamic libraries and external PHP extensions.
    • The FFI extension in PHP cannot be used.
    • In some extreme cases, performance issues may occur. See musl-libc performance issues.

    Different Linux distributions use different default libc. For example, Alpine Linux uses musl libc, while most Linux distributions use glibc. However, even so, we cannot directly use any distribution using glibc to build portable static binaries because glibc has some issues:

    • Binaries built with gcc and other tools on newer versions of distributions cannot run on older versions of distributions.
    • glibc is not recommended to be statically linked because some of its features require the support of dynamic libraries.

    However, we can use Docker to solve this problem. The final output is a binary dynamically linked with glibc and some necessary libraries, but statically linked with all other dependencies.

    1. Use an older version of a Linux distribution (such as CentOS 7.x), which has an older version of glibc but can run on most modern Linux distributions.
    2. Build the static binary of PHP in this container so that it can run on most modern Linux distributions.

    Using glibc static binaries can run on most modern Linux distributions but cannot run on musl libc distributions, such as CentOS 6, Alpine Linux, etc.

    Build glibc Compatible Linux Binary

    The latest version of static-php-cli includes the bin/spc-gnu-docker script, which can create a CentOS 7.x (glibc-2.17) Docker container with one click and build a glibc compatible PHP static binary in the container.

    Then, run the following command once. The first run will take a long time because it needs to download the CentOS 7.x image and some build tools.

    bash
    bin/spc-gnu-docker

    After the image is built, you will see the same command help menu as bin/spc, which means the container is ready.

    After the container is ready, you can refer to the local build section to build your PHP static binary. Just replace bin/spc or ./spc with bin/spc-gnu-docker.

    bash
    bin/spc-gnu-docker build bcmath,ctype,openssl,pdo,phar,posix,session,tokenizer,xml,zip --build-cli --debug

    Notes

    In rare cases, glibc-based static PHP may encounter segment faults and other errors, but there are currently few examples. If you encounter any issues, please submit an issue.

    glibc build is an extended feature and is not part of the default static-php support. If you have related issues or requirements, please indicate that you are building based on glibc when submitting an issue.

    If you need to build glibc-based binaries without using Docker, please refer to the bin/spc-gnu-docker script to manually create a similar environment.

    Please keep in mind that we only support glibc build with bin/spc-gnu-docker. Compilation on RHEL 9 & 10 has been tested and is stable, but if you run into issues, we may choose not to fix them.

    ',22)]))}const p=e(n,[["render",l]]);export{h as __pageData,p as default}; diff --git a/assets/en_guide_build-with-glibc.md.BDBCsGWa.lean.js b/assets/en_guide_build-with-glibc.md.BDBCsGWa.lean.js deleted file mode 100644 index 5bf6199f..00000000 --- a/assets/en_guide_build-with-glibc.md.BDBCsGWa.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as t,o as s,af as a}from"./chunks/framework.PeLcR_tw.js";const h=JSON.parse('{"title":"Build glibc Compatible Linux Binary","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/build-with-glibc.md","filePath":"en/guide/build-with-glibc.md"}'),n={name:"en/guide/build-with-glibc.md"};function l(o,i,r,c,u,b){return s(),t("div",null,i[0]||(i[0]=[a("",22)]))}const p=e(n,[["render",l]]);export{h as __pageData,p as default}; diff --git a/assets/en_guide_build-with-glibc.md.CkVR75n5.js b/assets/en_guide_build-with-glibc.md.CkVR75n5.js new file mode 100644 index 00000000..93c7d612 --- /dev/null +++ b/assets/en_guide_build-with-glibc.md.CkVR75n5.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as s,ah as a}from"./chunks/framework.Bhsyh9kO.js";const h=JSON.parse('{"title":"Build glibc Compatible Linux Binary","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/build-with-glibc.md","filePath":"en/guide/build-with-glibc.md"}'),n={name:"en/guide/build-with-glibc.md"};function l(o,i,r,c,u,b){return s(),t("div",null,[...i[0]||(i[0]=[a('

    Build glibc Compatible Linux Binary

    Why Build glibc Compatible Binary

    Currently, the binaries built by static-php-cli on Linux by default are based on musl-libc (statically linked). musl-libc is a lightweight libc implementation that aims to be compatible with glibc and provides good support for pure static linking. This means that the compiled static PHP executable can be used on almost any Linux distribution without worrying about the versions of libc, libstdc++, etc.

    However, there are some issues with pure static linking of musl-libc binaries on Linux:

    • The dl() function in PHP cannot be used to load dynamic libraries and external PHP extensions.
    • The FFI extension in PHP cannot be used.
    • In some extreme cases, performance issues may occur. See musl-libc performance issues.

    Different Linux distributions use different default libc. For example, Alpine Linux uses musl libc, while most Linux distributions use glibc. However, even so, we cannot directly use any distribution using glibc to build portable static binaries because glibc has some issues:

    • Binaries built with gcc and other tools on newer versions of distributions cannot run on older versions of distributions.
    • glibc is not recommended to be statically linked because some of its features require the support of dynamic libraries.

    However, we can use Docker to solve this problem. The final output is a binary dynamically linked with glibc and some necessary libraries, but statically linked with all other dependencies.

    1. Use an older version of a Linux distribution (such as CentOS 7.x), which has an older version of glibc but can run on most modern Linux distributions.
    2. Build the static binary of PHP in this container so that it can run on most modern Linux distributions.

    Using glibc static binaries can run on most modern Linux distributions but cannot run on musl libc distributions, such as CentOS 6, Alpine Linux, etc.

    Build glibc Compatible Linux Binary

    The latest version of static-php-cli includes the bin/spc-gnu-docker script, which can create a CentOS 7.x (glibc-2.17) Docker container with one click and build a glibc compatible PHP static binary in the container.

    Then, run the following command once. The first run will take a long time because it needs to download the CentOS 7.x image and some build tools.

    bash
    bin/spc-gnu-docker

    After the image is built, you will see the same command help menu as bin/spc, which means the container is ready.

    After the container is ready, you can refer to the local build section to build your PHP static binary. Just replace bin/spc or ./spc with bin/spc-gnu-docker.

    bash
    bin/spc-gnu-docker build bcmath,ctype,openssl,pdo,phar,posix,session,tokenizer,xml,zip --build-cli --debug

    Notes

    In rare cases, glibc-based static PHP may encounter segment faults and other errors, but there are currently few examples. If you encounter any issues, please submit an issue.

    glibc build is an extended feature and is not part of the default static-php support. If you have related issues or requirements, please indicate that you are building based on glibc when submitting an issue.

    If you need to build glibc-based binaries without using Docker, please refer to the bin/spc-gnu-docker script to manually create a similar environment.

    Please keep in mind that we only support glibc build with bin/spc-gnu-docker. Compilation on RHEL 9 & 10 has been tested and is stable, but if you run into issues, we may choose not to fix them.

    ',22)])])}const p=e(n,[["render",l]]);export{h as __pageData,p as default}; diff --git a/assets/en_guide_build-with-glibc.md.CkVR75n5.lean.js b/assets/en_guide_build-with-glibc.md.CkVR75n5.lean.js new file mode 100644 index 00000000..6cbe88aa --- /dev/null +++ b/assets/en_guide_build-with-glibc.md.CkVR75n5.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as s,ah as a}from"./chunks/framework.Bhsyh9kO.js";const h=JSON.parse('{"title":"Build glibc Compatible Linux Binary","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/build-with-glibc.md","filePath":"en/guide/build-with-glibc.md"}'),n={name:"en/guide/build-with-glibc.md"};function l(o,i,r,c,u,b){return s(),t("div",null,[...i[0]||(i[0]=[a("",22)])])}const p=e(n,[["render",l]]);export{h as __pageData,p as default}; diff --git a/assets/en_guide_cli-generator.md.BsPNkB0u.js b/assets/en_guide_cli-generator.md.Dw8fQLl3.js similarity index 81% rename from assets/en_guide_cli-generator.md.BsPNkB0u.js rename to assets/en_guide_cli-generator.md.Dw8fQLl3.js index 2c19e2b5..478ab7f9 100644 --- a/assets/en_guide_cli-generator.md.BsPNkB0u.js +++ b/assets/en_guide_cli-generator.md.Dw8fQLl3.js @@ -1 +1 @@ -import{C as t}from"./chunks/CliGenerator.u1Ew-M_q.js";import{d as a,c as o,o as n,af as r,J as i}from"./chunks/framework.PeLcR_tw.js";const p=JSON.parse('{"title":"CLI Build Command Generator","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"en/guide/cli-generator.md","filePath":"en/guide/cli-generator.md"}'),s={name:"en/guide/cli-generator.md"},_=a({...s,setup(l){return(c,e)=>(n(),o("div",null,[e[0]||(e[0]=r('

    CLI Build Command Generator

    TIP

    The extensions selected below may contain extensions that are not supported by the selected operating system, which may cause compilation to fail. Please check Supported Extensions first.

    ',2)),i(t,{lang:"en"})]))}});export{p as __pageData,_ as default}; +import{C as t}from"./chunks/CliGenerator.CXyXM4cX.js";import{d as a,c as o,o as n,ah as r,J as i}from"./chunks/framework.Bhsyh9kO.js";const p=JSON.parse('{"title":"CLI Build Command Generator","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"en/guide/cli-generator.md","filePath":"en/guide/cli-generator.md"}'),s={name:"en/guide/cli-generator.md"},_=a({...s,setup(l){return(c,e)=>(n(),o("div",null,[e[0]||(e[0]=r('

    CLI Build Command Generator

    TIP

    The extensions selected below may contain extensions that are not supported by the selected operating system, which may cause compilation to fail. Please check Supported Extensions first.

    ',2)),i(t,{lang:"en"})]))}});export{p as __pageData,_ as default}; diff --git a/assets/en_guide_cli-generator.md.BsPNkB0u.lean.js b/assets/en_guide_cli-generator.md.Dw8fQLl3.lean.js similarity index 62% rename from assets/en_guide_cli-generator.md.BsPNkB0u.lean.js rename to assets/en_guide_cli-generator.md.Dw8fQLl3.lean.js index 13ef5393..05d1ece7 100644 --- a/assets/en_guide_cli-generator.md.BsPNkB0u.lean.js +++ b/assets/en_guide_cli-generator.md.Dw8fQLl3.lean.js @@ -1 +1 @@ -import{C as t}from"./chunks/CliGenerator.u1Ew-M_q.js";import{d as a,c as o,o as n,af as r,J as i}from"./chunks/framework.PeLcR_tw.js";const p=JSON.parse('{"title":"CLI Build Command Generator","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"en/guide/cli-generator.md","filePath":"en/guide/cli-generator.md"}'),s={name:"en/guide/cli-generator.md"},_=a({...s,setup(l){return(c,e)=>(n(),o("div",null,[e[0]||(e[0]=r("",2)),i(t,{lang:"en"})]))}});export{p as __pageData,_ as default}; +import{C as t}from"./chunks/CliGenerator.CXyXM4cX.js";import{d as a,c as o,o as n,ah as r,J as i}from"./chunks/framework.Bhsyh9kO.js";const p=JSON.parse('{"title":"CLI Build Command Generator","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"en/guide/cli-generator.md","filePath":"en/guide/cli-generator.md"}'),s={name:"en/guide/cli-generator.md"},_=a({...s,setup(l){return(c,e)=>(n(),o("div",null,[e[0]||(e[0]=r("",2)),i(t,{lang:"en"})]))}});export{p as __pageData,_ as default}; diff --git a/assets/en_guide_deps-map.md.BUF4uebw.js b/assets/en_guide_deps-map.md.BUF4uebw.js new file mode 100644 index 00000000..080d67de --- /dev/null +++ b/assets/en_guide_deps-map.md.BUF4uebw.js @@ -0,0 +1 @@ +import{_ as d,c as b,o as r,ah as l}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"Dependency Table","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"en/guide/deps-map.md","filePath":"en/guide/deps-map.md"}'),i={name:"en/guide/deps-map.md"};function e(s,t,o,n,a,p){return r(),b("div",null,[...t[0]||(t[0]=[l('

    Dependency Table

    When compiling PHP, each extension and library has dependencies, which may be required or optional. You can choose whether to include these optional dependencies.

    For example, when compiling the gd extension under Linux, the zlib,libpng libraries and the zlib extension are forced to be compiled, while the libavif,libwebp,libjpeg,freetype libraries are optional libraries and will not be compiled by default unless specified by the --with-libs=avif,webp,jpeg,freetype option.

    • For optional extensions (optional features of extensions), you need to specify them manually at compile time, for example, to enable igbinary support for Redis: bin/spc build redis,igbinary.
    • For optional libraries, you need to compile and specify them through the --with-libs=XXX option.
    • If you want to enable all optional extensions, you can use bin/spc build redis --with-suggested-exts.
    • If you want to enable all optional libraries, you can use --with-suggested-libs.

    Extension Dependency Table

    Linux

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvpcntlunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    liburing
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    macOS

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    glfwglfw
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    Windows

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqpopenssllibrabbitmq
    brotlibrotli
    bz2bzip2
    curlzlib
    openssl
    curl
    dbaqdbm
    domxmllibxml2
    zlib
    evsockets
    ffilibffi-win
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gmsslgmssl
    iconvlibiconv-win
    igbinarysession
    apcu
    intlicu-static-win
    libxmlxml
    mbregexmbstringonig
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    parallelpthreads4w
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    pdo_pgsqlpdo
    pgsql
    postgresql-win
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql-win
    pharzlib
    redissession
    igbinary
    msgpack
    simplexmlxmllibxml2
    soapxmllibxml2
    sodiumlibsodium
    sqlite3sqlite
    ssh2openssl
    zlib
    libssh2
    swowopenssl
    curl
    openssl
    curl
    xlswriterzlib
    zip
    openssl
    xmliconvlibxml2
    xmlreaderxml
    dom
    libxml2
    xmlwriterxmllibxml2
    xzxz
    yamllibyaml
    zipzlib
    bz2
    libzip
    zlib
    bzip2
    xz
    zlibzlib

    FreeBSD

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    evsockets
    ftpopenssl
    mbregexmbstringonig
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    pdo_mysqlpdo
    mysqlnd
    pharzlib
    xzxz
    zlibzlib

    Library Dependency Table

    Linux

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libaclattr
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    macOS

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    Windows

    Library NameRequired LibrariesSuggested Libraries
    curlzlib
    libssh2
    nghttp2
    brotli
    zstd
    freetypezliblibpng
    bzip2
    brotli
    libjpegzlib
    libpngzlib
    librabbitmqopenssl
    libssh2openssl
    libxml2libiconv-winzlib
    libzipzlib
    bzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib

    FreeBSD

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    opensslzlib
    ',22)])])}const h=d(i,[["render",e]]);export{m as __pageData,h as default}; diff --git a/assets/en_guide_deps-map.md.BUF4uebw.lean.js b/assets/en_guide_deps-map.md.BUF4uebw.lean.js new file mode 100644 index 00000000..63bd77c9 --- /dev/null +++ b/assets/en_guide_deps-map.md.BUF4uebw.lean.js @@ -0,0 +1 @@ +import{_ as d,c as b,o as r,ah as l}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"Dependency Table","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"en/guide/deps-map.md","filePath":"en/guide/deps-map.md"}'),i={name:"en/guide/deps-map.md"};function e(s,t,o,n,a,p){return r(),b("div",null,[...t[0]||(t[0]=[l("",22)])])}const h=d(i,[["render",e]]);export{m as __pageData,h as default}; diff --git a/assets/en_guide_deps-map.md.C4W5Fd15.js b/assets/en_guide_deps-map.md.C4W5Fd15.js deleted file mode 100644 index e70c19d1..00000000 --- a/assets/en_guide_deps-map.md.C4W5Fd15.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as d,c as b,o as r,af as l}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"Dependency Table","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"en/guide/deps-map.md","filePath":"en/guide/deps-map.md"}'),i={name:"en/guide/deps-map.md"};function e(s,t,o,n,a,p){return r(),b("div",null,t[0]||(t[0]=[l('

    Dependency Table

    When compiling PHP, each extension and library has dependencies, which may be required or optional. You can choose whether to include these optional dependencies.

    For example, when compiling the gd extension under Linux, the zlib,libpng libraries and the zlib extension are forced to be compiled, while the libavif,libwebp,libjpeg,freetype libraries are optional libraries and will not be compiled by default unless specified by the --with-libs=avif,webp,jpeg,freetype option.

    • For optional extensions (optional features of extensions), you need to specify them manually at compile time, for example, to enable igbinary support for Redis: bin/spc build redis,igbinary.
    • For optional libraries, you need to compile and specify them through the --with-libs=XXX option.
    • If you want to enable all optional extensions, you can use bin/spc build redis --with-suggested-exts.
    • If you want to enable all optional libraries, you can use --with-suggested-libs.

    Extension Dependency Table

    Linux

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvpcntlunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    liburing
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    macOS

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    glfwglfw
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    Windows

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqpopenssllibrabbitmq
    brotlibrotli
    bz2bzip2
    curlzlib
    openssl
    curl
    dbaqdbm
    domxmllibxml2
    zlib
    evsockets
    ffilibffi-win
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gmsslgmssl
    iconvlibiconv-win
    igbinarysession
    apcu
    intlicu-static-win
    libxmlxml
    mbregexmbstringonig
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    parallelpthreads4w
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    pdo_pgsqlpdo
    pgsql
    postgresql-win
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql-win
    pharzlib
    redissession
    igbinary
    msgpack
    simplexmlxmllibxml2
    soapxmllibxml2
    sodiumlibsodium
    sqlite3sqlite
    ssh2openssl
    zlib
    libssh2
    swowopenssl
    curl
    openssl
    curl
    xlswriterzlib
    zip
    openssl
    xmliconvlibxml2
    xmlreaderxml
    dom
    libxml2
    xmlwriterxmllibxml2
    xzxz
    yamllibyaml
    zipzlib
    bz2
    libzip
    zlib
    bzip2
    xz
    zlibzlib

    FreeBSD

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    evsockets
    ftpopenssl
    mbregexmbstringonig
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    pdo_mysqlpdo
    mysqlnd
    pharzlib
    xzxz
    zlibzlib

    Library Dependency Table

    Linux

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libaclattr
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    macOS

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    Windows

    Library NameRequired LibrariesSuggested Libraries
    curlzlib
    libssh2
    nghttp2
    brotli
    zstd
    freetypezliblibpng
    bzip2
    brotli
    libjpegzlib
    libpngzlib
    librabbitmqopenssl
    libssh2openssl
    libxml2libiconv-winzlib
    libzipzlib
    bzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib

    FreeBSD

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    opensslzlib
    ',22)]))}const h=d(i,[["render",e]]);export{m as __pageData,h as default}; diff --git a/assets/en_guide_deps-map.md.C4W5Fd15.lean.js b/assets/en_guide_deps-map.md.C4W5Fd15.lean.js deleted file mode 100644 index 3c0039b7..00000000 --- a/assets/en_guide_deps-map.md.C4W5Fd15.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as d,c as b,o as r,af as l}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"Dependency Table","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"en/guide/deps-map.md","filePath":"en/guide/deps-map.md"}'),i={name:"en/guide/deps-map.md"};function e(s,t,o,n,a,p){return r(),b("div",null,t[0]||(t[0]=[l("",22)]))}const h=d(i,[["render",e]]);export{m as __pageData,h as default}; diff --git a/assets/en_guide_env-vars.md.DzVATbtO.js b/assets/en_guide_env-vars.md.51DQ7bvx.js similarity index 72% rename from assets/en_guide_env-vars.md.DzVATbtO.js rename to assets/en_guide_env-vars.md.51DQ7bvx.js index a46127a2..67529089 100644 --- a/assets/en_guide_env-vars.md.DzVATbtO.js +++ b/assets/en_guide_env-vars.md.51DQ7bvx.js @@ -1,4 +1,4 @@ -import{_ as i,c as t,o as a,af as n}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"Environment variables","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/env-vars.md","filePath":"en/guide/env-vars.md"}'),s={name:"en/guide/env-vars.md"};function r(o,e,l,d,c,h){return a(),t("div",null,e[0]||(e[0]=[n(`

    Environment variables

    All environment variables mentioned in the list on this page have default values unless otherwise noted. You can override the default values by setting these environment variables.

    Environment variables list

    Starting from version 2.3.5, we have centralized the environment variables in the config/env.ini file. You can set environment variables by modifying this file.

    We divide the environment variables supported by static-php-cli into three types:

    • Global internal environment variables: declared after static-php-cli starts, you can use getenv() to get them internally in static-php-cli, and you can override them before starting static-php-cli.
    • Fixed environment variables: declared after static-php-cli starts, you can only use getenv() to get them, but you cannot override them through shell scripts.
    • Config file environment variables: declared before static-php-cli build, you can set these environment variables by modifying the config/env.ini file or through shell scripts.

    You can read the comments for each parameter in config/env.ini to understand its purpose.

    Custom environment variables

    Generally, you don't need to modify any of the following environment variables as they are already set to optimal values. However, if you have special needs, you can set these environment variables to meet your needs (for example, you need to debug PHP performance under different compilation parameters).

    If you want to use custom environment variables, you can use the export command in the terminal or set the environment variables directly before the command, for example:

    shell
    # export first
    +import{_ as i,c as t,o as a,ah as n}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"Environment variables","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/env-vars.md","filePath":"en/guide/env-vars.md"}'),s={name:"en/guide/env-vars.md"};function r(o,e,l,d,c,h){return a(),t("div",null,[...e[0]||(e[0]=[n(`

    Environment variables

    All environment variables mentioned in the list on this page have default values unless otherwise noted. You can override the default values by setting these environment variables.

    Environment variables list

    Starting from version 2.3.5, we have centralized the environment variables in the config/env.ini file. You can set environment variables by modifying this file.

    We divide the environment variables supported by static-php-cli into three types:

    • Global internal environment variables: declared after static-php-cli starts, you can use getenv() to get them internally in static-php-cli, and you can override them before starting static-php-cli.
    • Fixed environment variables: declared after static-php-cli starts, you can only use getenv() to get them, but you cannot override them through shell scripts.
    • Config file environment variables: declared before static-php-cli build, you can set these environment variables by modifying the config/env.ini file or through shell scripts.

    You can read the comments for each parameter in config/env.ini to understand its purpose.

    Custom environment variables

    Generally, you don't need to modify any of the following environment variables as they are already set to optimal values. However, if you have special needs, you can set these environment variables to meet your needs (for example, you need to debug PHP performance under different compilation parameters).

    If you want to use custom environment variables, you can use the export command in the terminal or set the environment variables directly before the command, for example:

    shell
    # export first
     export SPC_CONCURRENCY=4
     bin/spc build mbstring,pcntl --build-cli
     
    @@ -9,4 +9,4 @@ import{_ as i,c as t,o as a,af as n}from"./chunks/framework.PeLcR_tw.js";const m
     SPC_CONCURRENCY=4
     
     [linux]
    -SPC_DEFAULT_C_FLAGS="-O3"

    Library environment variables (Unix only)

    Starting from 2.2.0, static-php-cli supports custom environment variables for all compilation dependent library commands of macOS, Linux, FreeBSD and other Unix systems.

    In this way, you can adjust the behavior of compiling dependent libraries through environment variables at any time. For example, you can set the optimization parameters for compiling the xxx library through xxx_CFLAGS=-O0.

    Of course, not every library supports the injection of environment variables. We currently provide three wildcard environment variables with the suffixes:

    • _CFLAGS: CFLAGS for the compiler
    • _LDFLAGS: LDFLAGS for the linker
    • _LIBS: LIBS for the linker

    The prefix is the name of the dependent library, and the specific name of the library is subject to lib.json. Among them, the library name with - needs to replace - with _.

    Here is an example of an optimization option that replaces the openssl library compilation:

    shell
    openssl_CFLAGS="-O0"

    The library name uses the same name listed in lib.json and is case-sensitive.

    TIP

    When no relevant environment variables are specified, except for the following variables, the remaining values are empty by default:

    var namevar default value
    pkg_config_CFLAGSmacOS: $SPC_DEFAULT_C_FLAGS -Wimplicit-function-declaration -Wno-int-conversion, Other: empty
    pkg_config_LDFLAGSLinux: --static, Other: empty
    imagemagick_LDFLAGSLinux: -static, Other: empty
    imagemagick_LIBSmacOS: -liconv, Other: empty
    ldap_LDFLAGS-L$BUILD_LIB_PATH
    openssl_CFLAGSLinux: $SPC_DEFAULT_C_FLAGS, Other: empty
    others...empty

    The following table is a list of library names that support customizing the above three variables:

    lib name
    brotli
    bzip
    curl
    freetype
    gettext
    gmp
    imagemagick
    ldap
    libargon2
    libavif
    libcares
    libevent
    openssl

    TIP

    Because adapting custom environment variables to each library is a particularly tedious task, and in most cases you do not need custom environment variables for these libraries, so we currently only support custom environment variables for some libraries.

    If the library you need to customize environment variables is not listed above, you can submit your request through GitHub Issue.

    `,29)]))}const b=i(s,[["render",r]]);export{m as __pageData,b as default}; +SPC_DEFAULT_C_FLAGS="-O3"

    Library environment variables (Unix only)

    Starting from 2.2.0, static-php-cli supports custom environment variables for all compilation dependent library commands of macOS, Linux, FreeBSD and other Unix systems.

    In this way, you can adjust the behavior of compiling dependent libraries through environment variables at any time. For example, you can set the optimization parameters for compiling the xxx library through xxx_CFLAGS=-O0.

    Of course, not every library supports the injection of environment variables. We currently provide three wildcard environment variables with the suffixes:

    • _CFLAGS: CFLAGS for the compiler
    • _LDFLAGS: LDFLAGS for the linker
    • _LIBS: LIBS for the linker

    The prefix is the name of the dependent library, and the specific name of the library is subject to lib.json. Among them, the library name with - needs to replace - with _.

    Here is an example of an optimization option that replaces the openssl library compilation:

    shell
    openssl_CFLAGS="-O0"

    The library name uses the same name listed in lib.json and is case-sensitive.

    TIP

    When no relevant environment variables are specified, except for the following variables, the remaining values are empty by default:

    var namevar default value
    pkg_config_CFLAGSmacOS: $SPC_DEFAULT_C_FLAGS -Wimplicit-function-declaration -Wno-int-conversion, Other: empty
    pkg_config_LDFLAGSLinux: --static, Other: empty
    imagemagick_LDFLAGSLinux: -static, Other: empty
    imagemagick_LIBSmacOS: -liconv, Other: empty
    ldap_LDFLAGS-L$BUILD_LIB_PATH
    openssl_CFLAGSLinux: $SPC_DEFAULT_C_FLAGS, Other: empty
    others...empty

    The following table is a list of library names that support customizing the above three variables:

    lib name
    brotli
    bzip
    curl
    freetype
    gettext
    gmp
    imagemagick
    ldap
    libargon2
    libavif
    libcares
    libevent
    openssl

    TIP

    Because adapting custom environment variables to each library is a particularly tedious task, and in most cases you do not need custom environment variables for these libraries, so we currently only support custom environment variables for some libraries.

    If the library you need to customize environment variables is not listed above, you can submit your request through GitHub Issue.

    `,29)])])}const b=i(s,[["render",r]]);export{m as __pageData,b as default}; diff --git a/assets/en_guide_env-vars.md.51DQ7bvx.lean.js b/assets/en_guide_env-vars.md.51DQ7bvx.lean.js new file mode 100644 index 00000000..5b9b75fa --- /dev/null +++ b/assets/en_guide_env-vars.md.51DQ7bvx.lean.js @@ -0,0 +1 @@ +import{_ as i,c as t,o as a,ah as n}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"Environment variables","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/env-vars.md","filePath":"en/guide/env-vars.md"}'),s={name:"en/guide/env-vars.md"};function r(o,e,l,d,c,h){return a(),t("div",null,[...e[0]||(e[0]=[n("",29)])])}const b=i(s,[["render",r]]);export{m as __pageData,b as default}; diff --git a/assets/en_guide_env-vars.md.DzVATbtO.lean.js b/assets/en_guide_env-vars.md.DzVATbtO.lean.js deleted file mode 100644 index 373f65cf..00000000 --- a/assets/en_guide_env-vars.md.DzVATbtO.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as t,o as a,af as n}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"Environment variables","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/env-vars.md","filePath":"en/guide/env-vars.md"}'),s={name:"en/guide/env-vars.md"};function r(o,e,l,d,c,h){return a(),t("div",null,e[0]||(e[0]=[n("",29)]))}const b=i(s,[["render",r]]);export{m as __pageData,b as default}; diff --git a/assets/en_guide_extension-notes.md.C-_d-XlC.js b/assets/en_guide_extension-notes.md.C-_d-XlC.js deleted file mode 100644 index 51a2c874..00000000 --- a/assets/en_guide_extension-notes.md.C-_d-XlC.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as o,c as a,o as i,af as l}from"./chunks/framework.PeLcR_tw.js";const b=JSON.parse('{"title":"Extension Notes","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/extension-notes.md","filePath":"en/guide/extension-notes.md"}'),s={name:"en/guide/extension-notes.md"};function t(n,e,r,d,h,c){return i(),a("div",null,e[0]||(e[0]=[l('

    Extension Notes

    Because it is a static compilation, extensions will not compile 100% perfectly, and different extensions have different requirements for PHP and the environment, which will be listed one by one here.

    curl

    HTTP3 support is not enabled by default, compile with --with-libs="nghttp2,nghttp3,ngtcp2" to enable HTTP3 support for PHP >= 8.4.

    When using curl to request HTTPS, there may be an error:80000002:system library::No such file or directory error. For details on the solution, see FAQ - Unable to use ssl.

    phpmicro

    1. Only PHP >= 8.0 is supported.

    swoole

    1. swoole >= 5.0 Only PHP >= 8.0 is supported.
    2. swoole Currently, curl hooks are not supported for PHP 8.0.x (which may be fixed in the future).
    3. When compiling, if only swoole extension is included, the supported Swoole database coroutine hook will not be fully enabled. If you need to use it, please add the corresponding swoole-hook-xxx extension.
    4. The zend_mm_heap corrupted problem may occur in swoole under some extension combinations. The cause has not yet been found.

    swoole-hook-pgsql

    swoole-hook-pgsql is not an extension, it's a Hook feature of Swoole. If you use swoole,swoole-hook-pgsql, you will enable Swoole's PostgreSQL client and the coroutine mode of the pdo_pgsql extension.

    swoole-hook-pgsql conflicts with the pdo_pgsql extension. If you want to use Swoole and pdo_pgsql, please delete the pdo_pgsql extension and enable swoole and swoole-hook-pgsql. This extension contains an implementation of the coroutine environment for pdo_pgsql.

    On macOS systems, pdo_pgsql may not be able to connect to the postgresql server normally, please use it with caution.

    swoole-hook-mysql

    swoole-hook-mysql is not an extension, it's a Hook feature of Swoole. If you use swoole,swoole-hook-mysql, you will enable the coroutine mode of Swoole's mysqlnd and pdo_mysql.

    swoole-hook-sqlite

    swoole-hook-sqlite is not an extension, it's a Hook feature of Swoole. If you use swoole,swoole-hook-sqlite, you will enable the coroutine mode of Swoole's pdo_sqlite (Swoole must be 5.1 or above).

    swoole-hook-sqlite conflicts with the pdo_sqlite extension. If you want to use Swoole and pdo_sqlite, please delete the pdo_sqlite extension and enable swoole and swoole-hook-sqlite. This extension contains an implementation of the coroutine environment for pdo_sqlite.

    swoole-hook-odbc

    swoole-hook-odbc is not an extension, it's a Hook feature of Swoole. If you use swoole,swoole-hook-odbc, you will enable the coroutine mode of Swoole's odbc extension.

    swoole-hook-odbc conflicts with the pdo_odbc extension. If you want to use Swoole and pdo_odbc, please delete the pdo_odbc extension and enable swoole and swoole-hook-odbc. This extension contains an implementation of the coroutine environment for pdo_odbc.

    swow

    1. Only PHP 8.0+ is supported.

    imagick

    1. OpenMP support is disabled, this is recommended by the maintainers and also the case system packages.

    imap

    1. Kerberos is not supported
    2. ext-imap is not thread safe due to the underlying c-client. It's not possible to use it in --enable-zts builds.
    3. The extension was dropped from php 8.4, we recommend you look for an alternative implementation, such as Webklex/php-imap

    gd

    1. gd Extension relies on more additional Graphics library. By default, using bin/spc build gd directly will not support some Graphics library, such as libjpeg, libavif, etc. Currently, it supports four libraries: freetype,libjpeg,libavif,libwebp. Therefore, the following command can be used to introduce them into the gd library:
    bash
    bin/spc build gd --with-libs=freetype,libjpeg,libavif,libwebp --build-cli

    mcrypt

    1. Currently not supported, and this extension will not be supported in the future. #32

    oci8

    1. oci8 is an extension of the Oracle database, because the library on which the extension provided by Oracle does not provide a statically compiled version (.a) or source code, and this extension cannot be compiled into php by static linking, so it cannot be supported.

    xdebug

    1. Xdebug is only buildable as a shared extension. On Linux, you'll need to use a SPC_TARGET like native-native -dynamic or native-native-gnu.
    2. When using Linux/glibc or macOS, you can compile Xdebug as a shared extension using --build-shared="xdebug". The compiled ./php binary can be configured and run by specifying the INI, eg ./php -d 'zend_extension=/path/to/xdebug.so' your-code.php.

    xml

    1. xml includes xml, xmlreader, xmlwriter, xsl, dom, simplexml, etc. When adding xml extensions, it is best to enable these extensions at the same time.
    2. libxml is included in xml extension. Enabling xml is equivalent to enabling libxml.

    glfw

    1. glfw depends on OpenGL, and linux environment also needs X11, which cannot be linked statically.
    2. macOS platform, we can compile and link system builtin OpenGL and related libraries dynamically.

    rar

    1. The rar extension currently has a problem when compiling phpmicro with the common extension collection in the macOS x86_64 environment.

    pgsql

    pgsql ssl connection is not compatible with openssl 3.2.0. See:

    pgsql 16.2 has fixed this bug, now it's working.

    When pgsql uses SSL connection, there may be error:80000002:system library::No such file or directory error, For details on the solution, see FAQ - Unable to use ssl.

    openssl

    When using openssl-based extensions (such as curl, pgsql and other network libraries), there may be an error:80000002:system library::No such file or directory error. For details on the solution, see FAQ - Unable to use ssl.

    password-argon2

    1. password-argon2 is not a standard extension. The algorithm PASSWORD_ARGON2ID for the password_hash function needs libsodium or libargon2 to work.
    2. using password-argon2 enables multithread support for this.

    ffi

    1. Due to the limitation of musl libc's static linkage, you cannot use ffi because dynamic libraries cannot be loaded. If you need to use the ffi extension, see Compile PHP with GNU libc.
    2. macOS supports the ffi extension, but errors will occur when some kernels do not contain debugging symbols.
    3. Windows x64 supports the ffi extension.

    xhprof

    The xhprof extension consists of three parts: xhprof_extension, xhprof_html, xhprof_libs. Only xhprof_extension is included in the compiled binary. If you need to use xhprof, please download the source code from pecl.php.net/package/xhprof and specify the xhprof_libs and xhprof_html paths for use.

    event

    If you enable event extension on macOS, the openpty will be disabled due to issue:

    parallel

    Parallel is only supported on PHP 8.0 ZTS and above.

    spx

    1. SPX does not support Windows, and the official repository does not support static compilation. static-php-cli uses a modified version.

    mimalloc

    1. This is not technically an extension, but a library.
    2. Building with --with-libs="mimalloc" on Linux or macOS will override the default allocator.
    3. This is experimental for now, but is recommended in threaded environments.
    ',64)]))}const u=o(s,[["render",t]]);export{b as __pageData,u as default}; diff --git a/assets/en_guide_extension-notes.md.C-_d-XlC.lean.js b/assets/en_guide_extension-notes.md.C-_d-XlC.lean.js deleted file mode 100644 index 2fa7c9ba..00000000 --- a/assets/en_guide_extension-notes.md.C-_d-XlC.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as o,c as a,o as i,af as l}from"./chunks/framework.PeLcR_tw.js";const b=JSON.parse('{"title":"Extension Notes","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/extension-notes.md","filePath":"en/guide/extension-notes.md"}'),s={name:"en/guide/extension-notes.md"};function t(n,e,r,d,h,c){return i(),a("div",null,e[0]||(e[0]=[l("",64)]))}const u=o(s,[["render",t]]);export{b as __pageData,u as default}; diff --git a/assets/en_guide_extension-notes.md.CHFGRiKx.js b/assets/en_guide_extension-notes.md.CHFGRiKx.js new file mode 100644 index 00000000..4cd87cec --- /dev/null +++ b/assets/en_guide_extension-notes.md.CHFGRiKx.js @@ -0,0 +1 @@ +import{_ as o,c as a,o as i,ah as l}from"./chunks/framework.Bhsyh9kO.js";const b=JSON.parse('{"title":"Extension Notes","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/extension-notes.md","filePath":"en/guide/extension-notes.md"}'),s={name:"en/guide/extension-notes.md"};function t(n,e,r,d,h,c){return i(),a("div",null,[...e[0]||(e[0]=[l('

    Extension Notes

    Because it is a static compilation, extensions will not compile 100% perfectly, and different extensions have different requirements for PHP and the environment, which will be listed one by one here.

    curl

    HTTP3 support is not enabled by default, compile with --with-libs="nghttp2,nghttp3,ngtcp2" to enable HTTP3 support for PHP >= 8.4.

    When using curl to request HTTPS, there may be an error:80000002:system library::No such file or directory error. For details on the solution, see FAQ - Unable to use ssl.

    phpmicro

    1. Only PHP >= 8.0 is supported.

    swoole

    1. swoole >= 5.0 Only PHP >= 8.0 is supported.
    2. swoole Currently, curl hooks are not supported for PHP 8.0.x (which may be fixed in the future).
    3. When compiling, if only swoole extension is included, the supported Swoole database coroutine hook will not be fully enabled. If you need to use it, please add the corresponding swoole-hook-xxx extension.
    4. The zend_mm_heap corrupted problem may occur in swoole under some extension combinations. The cause has not yet been found.

    swoole-hook-pgsql

    swoole-hook-pgsql is not an extension, it's a Hook feature of Swoole. If you use swoole,swoole-hook-pgsql, you will enable Swoole's PostgreSQL client and the coroutine mode of the pdo_pgsql extension.

    swoole-hook-pgsql conflicts with the pdo_pgsql extension. If you want to use Swoole and pdo_pgsql, please delete the pdo_pgsql extension and enable swoole and swoole-hook-pgsql. This extension contains an implementation of the coroutine environment for pdo_pgsql.

    On macOS systems, pdo_pgsql may not be able to connect to the postgresql server normally, please use it with caution.

    swoole-hook-mysql

    swoole-hook-mysql is not an extension, it's a Hook feature of Swoole. If you use swoole,swoole-hook-mysql, you will enable the coroutine mode of Swoole's mysqlnd and pdo_mysql.

    swoole-hook-sqlite

    swoole-hook-sqlite is not an extension, it's a Hook feature of Swoole. If you use swoole,swoole-hook-sqlite, you will enable the coroutine mode of Swoole's pdo_sqlite (Swoole must be 5.1 or above).

    swoole-hook-sqlite conflicts with the pdo_sqlite extension. If you want to use Swoole and pdo_sqlite, please delete the pdo_sqlite extension and enable swoole and swoole-hook-sqlite. This extension contains an implementation of the coroutine environment for pdo_sqlite.

    swoole-hook-odbc

    swoole-hook-odbc is not an extension, it's a Hook feature of Swoole. If you use swoole,swoole-hook-odbc, you will enable the coroutine mode of Swoole's odbc extension.

    swoole-hook-odbc conflicts with the pdo_odbc extension. If you want to use Swoole and pdo_odbc, please delete the pdo_odbc extension and enable swoole and swoole-hook-odbc. This extension contains an implementation of the coroutine environment for pdo_odbc.

    swow

    1. Only PHP 8.0+ is supported.

    imagick

    1. OpenMP support is disabled, this is recommended by the maintainers and also the case system packages.

    imap

    1. Kerberos is not supported
    2. ext-imap is not thread safe due to the underlying c-client. It's not possible to use it in --enable-zts builds.
    3. The extension was dropped from php 8.4, we recommend you look for an alternative implementation, such as Webklex/php-imap

    gd

    1. gd Extension relies on more additional Graphics library. By default, using bin/spc build gd directly will not support some Graphics library, such as libjpeg, libavif, etc. Currently, it supports four libraries: freetype,libjpeg,libavif,libwebp. Therefore, the following command can be used to introduce them into the gd library:
    bash
    bin/spc build gd --with-libs=freetype,libjpeg,libavif,libwebp --build-cli

    mcrypt

    1. Currently not supported, and this extension will not be supported in the future. #32

    oci8

    1. oci8 is an extension of the Oracle database, because the library on which the extension provided by Oracle does not provide a statically compiled version (.a) or source code, and this extension cannot be compiled into php by static linking, so it cannot be supported.

    xdebug

    1. Xdebug is only buildable as a shared extension. On Linux, you'll need to use a SPC_TARGET like native-native -dynamic or native-native-gnu.
    2. When using Linux/glibc or macOS, you can compile Xdebug as a shared extension using --build-shared="xdebug". The compiled ./php binary can be configured and run by specifying the INI, eg ./php -d 'zend_extension=/path/to/xdebug.so' your-code.php.

    xml

    1. xml includes xml, xmlreader, xmlwriter, xsl, dom, simplexml, etc. When adding xml extensions, it is best to enable these extensions at the same time.
    2. libxml is included in xml extension. Enabling xml is equivalent to enabling libxml.

    glfw

    1. glfw depends on OpenGL, and linux environment also needs X11, which cannot be linked statically.
    2. macOS platform, we can compile and link system builtin OpenGL and related libraries dynamically.

    rar

    1. The rar extension currently has a problem when compiling phpmicro with the common extension collection in the macOS x86_64 environment.

    pgsql

    pgsql ssl connection is not compatible with openssl 3.2.0. See:

    pgsql 16.2 has fixed this bug, now it's working.

    When pgsql uses SSL connection, there may be error:80000002:system library::No such file or directory error, For details on the solution, see FAQ - Unable to use ssl.

    openssl

    When using openssl-based extensions (such as curl, pgsql and other network libraries), there may be an error:80000002:system library::No such file or directory error. For details on the solution, see FAQ - Unable to use ssl.

    password-argon2

    1. password-argon2 is not a standard extension. The algorithm PASSWORD_ARGON2ID for the password_hash function needs libsodium or libargon2 to work.
    2. using password-argon2 enables multithread support for this.

    ffi

    1. Due to the limitation of musl libc's static linkage, you cannot use ffi because dynamic libraries cannot be loaded. If you need to use the ffi extension, see Compile PHP with GNU libc.
    2. macOS supports the ffi extension, but errors will occur when some kernels do not contain debugging symbols.
    3. Windows x64 supports the ffi extension.

    xhprof

    The xhprof extension consists of three parts: xhprof_extension, xhprof_html, xhprof_libs. Only xhprof_extension is included in the compiled binary. If you need to use xhprof, please download the source code from pecl.php.net/package/xhprof and specify the xhprof_libs and xhprof_html paths for use.

    event

    If you enable event extension on macOS, the openpty will be disabled due to issue:

    parallel

    Parallel is only supported on PHP 8.0 ZTS and above.

    spx

    1. SPX does not support Windows, and the official repository does not support static compilation. static-php-cli uses a modified version.

    mimalloc

    1. This is not technically an extension, but a library.
    2. Building with --with-libs="mimalloc" on Linux or macOS will override the default allocator.
    3. This is experimental for now, but is recommended in threaded environments.
    ',64)])])}const u=o(s,[["render",t]]);export{b as __pageData,u as default}; diff --git a/assets/en_guide_extension-notes.md.CHFGRiKx.lean.js b/assets/en_guide_extension-notes.md.CHFGRiKx.lean.js new file mode 100644 index 00000000..329b87ec --- /dev/null +++ b/assets/en_guide_extension-notes.md.CHFGRiKx.lean.js @@ -0,0 +1 @@ +import{_ as o,c as a,o as i,ah as l}from"./chunks/framework.Bhsyh9kO.js";const b=JSON.parse('{"title":"Extension Notes","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/extension-notes.md","filePath":"en/guide/extension-notes.md"}'),s={name:"en/guide/extension-notes.md"};function t(n,e,r,d,h,c){return i(),a("div",null,[...e[0]||(e[0]=[l("",64)])])}const u=o(s,[["render",t]]);export{b as __pageData,u as default}; diff --git a/assets/en_guide_extensions.md.8tYHqn_N.js b/assets/en_guide_extensions.md.UqRV3ESR.js similarity index 92% rename from assets/en_guide_extensions.md.8tYHqn_N.js rename to assets/en_guide_extensions.md.UqRV3ESR.js index 35e8b9b6..46605fb2 100644 --- a/assets/en_guide_extensions.md.8tYHqn_N.js +++ b/assets/en_guide_extensions.md.UqRV3ESR.js @@ -1 +1 @@ -import{_ as o}from"./chunks/SearchTable.Cw3TiMBP.js";import{c as i,o as s,af as t,J as a}from"./chunks/framework.PeLcR_tw.js";const d=JSON.parse('{"title":"Extensions","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/extensions.md","filePath":"en/guide/extensions.md"}'),n={name:"en/guide/extensions.md"},u=Object.assign(n,{setup(l){return(r,e)=>(s(),i("div",null,[e[0]||(e[0]=t('

    Extensions

    • yes: supported
    • blank: not supported yet, or WIP
    • no with issue link: confirmed to be unavailable due to issue
    • partial with issue link: supported but not perfect due to issue
    ',2)),a(o),e[1]||(e[1]=t('

    TIP

    If an extension you need is missing, you can create a Feature Request.

    Some extensions or libraries that the extension depends on will have some optional features. For example, the gd library optionally supports libwebp, freetype, etc. If you only use bin/spc build gd --build-cli they will not be included (static-php-cli defaults to the minimum dependency principle).

    For more information about optional libraries, see Extensions, Library Dependency Map. For optional libraries, you can also select an extension from the Command Generator and then select optional libraries.

    ',1))]))}});export{d as __pageData,u as default}; +import{_ as o}from"./chunks/SearchTable.Dddvtmwz.js";import{c as i,o as s,ah as t,J as a}from"./chunks/framework.Bhsyh9kO.js";const d=JSON.parse('{"title":"Extensions","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/extensions.md","filePath":"en/guide/extensions.md"}'),n={name:"en/guide/extensions.md"},u=Object.assign(n,{setup(l){return(r,e)=>(s(),i("div",null,[e[0]||(e[0]=t('

    Extensions

    • yes: supported
    • blank: not supported yet, or WIP
    • no with issue link: confirmed to be unavailable due to issue
    • partial with issue link: supported but not perfect due to issue
    ',2)),a(o),e[1]||(e[1]=t('

    TIP

    If an extension you need is missing, you can create a Feature Request.

    Some extensions or libraries that the extension depends on will have some optional features. For example, the gd library optionally supports libwebp, freetype, etc. If you only use bin/spc build gd --build-cli they will not be included (static-php-cli defaults to the minimum dependency principle).

    For more information about optional libraries, see Extensions, Library Dependency Map. For optional libraries, you can also select an extension from the Command Generator and then select optional libraries.

    ',1))]))}});export{d as __pageData,u as default}; diff --git a/assets/en_guide_extensions.md.8tYHqn_N.lean.js b/assets/en_guide_extensions.md.UqRV3ESR.lean.js similarity index 73% rename from assets/en_guide_extensions.md.8tYHqn_N.lean.js rename to assets/en_guide_extensions.md.UqRV3ESR.lean.js index 057577a7..05f99016 100644 --- a/assets/en_guide_extensions.md.8tYHqn_N.lean.js +++ b/assets/en_guide_extensions.md.UqRV3ESR.lean.js @@ -1 +1 @@ -import{_ as o}from"./chunks/SearchTable.Cw3TiMBP.js";import{c as i,o as s,af as t,J as a}from"./chunks/framework.PeLcR_tw.js";const d=JSON.parse('{"title":"Extensions","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/extensions.md","filePath":"en/guide/extensions.md"}'),n={name:"en/guide/extensions.md"},u=Object.assign(n,{setup(l){return(r,e)=>(s(),i("div",null,[e[0]||(e[0]=t("",2)),a(o),e[1]||(e[1]=t("",1))]))}});export{d as __pageData,u as default}; +import{_ as o}from"./chunks/SearchTable.Dddvtmwz.js";import{c as i,o as s,ah as t,J as a}from"./chunks/framework.Bhsyh9kO.js";const d=JSON.parse('{"title":"Extensions","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/extensions.md","filePath":"en/guide/extensions.md"}'),n={name:"en/guide/extensions.md"},u=Object.assign(n,{setup(l){return(r,e)=>(s(),i("div",null,[e[0]||(e[0]=t("",2)),a(o),e[1]||(e[1]=t("",1))]))}});export{d as __pageData,u as default}; diff --git a/assets/en_guide_index.md.BC5dTAQW.js b/assets/en_guide_index.md.BC5dTAQW.js new file mode 100644 index 00000000..baee1aac --- /dev/null +++ b/assets/en_guide_index.md.BC5dTAQW.js @@ -0,0 +1 @@ +import{_ as t,c as i,o,ah as r}from"./chunks/framework.Bhsyh9kO.js";const h=JSON.parse('{"title":"Guide","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/index.md","filePath":"en/guide/index.md"}'),n={name:"en/guide/index.md"};function a(s,e,d,l,p,c){return o(),i("div",null,[...e[0]||(e[0]=[r('

    Guide

    Static php cli is a tool used to build statically compiled PHP binaries, currently supporting Linux and macOS systems.

    In the guide section, you will learn how to use static php cli to build standalone PHP programs.

    Compilation Environment

    The following is the architecture support situation, where ⚙️ represents support for GitHub Action build, 💻 represents support for local manual build, and empty represents temporarily not supported.

    x86_64aarch64
    macOS⚙️ 💻⚙️ 💻
    Linux⚙️ 💻⚙️ 💻
    Windows⚙️ 💻
    FreeBSD💻💻

    Among them, Linux is currently only tested on Ubuntu, Debian, and Alpine distributions, and other distributions have not been tested, which cannot guarantee successful compilation. For untested distributions, local compilation can be done using methods such as Docker to avoid environmental issues.

    There are two architectures for macOS: x86_64 and Arm, but binaries compiled on one architecture cannot be directly used on the other architecture. Rosetta 2 cannot guarantee that programs compiled with Arm architecture can fully run on x86_64 environment.

    Windows currently only supports the x86_64 architecture, and does not support 32-bit x86 or arm64 architecture.

    Supported PHP Version

    Currently, static php cli supports PHP versions 8.1 to 8.5, and theoretically supports PHP 8.0 and earlier versions. Simply select the earlier version when downloading. However, due to some extensions and special components that have stopped supporting earlier versions of PHP, static-php-cli will not explicitly support earlier versions. We recommend that you compile the latest PHP version possible for a better experience.

    ',12)])])}const m=t(n,[["render",a]]);export{h as __pageData,m as default}; diff --git a/assets/en_guide_index.md.BC5dTAQW.lean.js b/assets/en_guide_index.md.BC5dTAQW.lean.js new file mode 100644 index 00000000..552bcfdd --- /dev/null +++ b/assets/en_guide_index.md.BC5dTAQW.lean.js @@ -0,0 +1 @@ +import{_ as t,c as i,o,ah as r}from"./chunks/framework.Bhsyh9kO.js";const h=JSON.parse('{"title":"Guide","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/index.md","filePath":"en/guide/index.md"}'),n={name:"en/guide/index.md"};function a(s,e,d,l,p,c){return o(),i("div",null,[...e[0]||(e[0]=[r("",12)])])}const m=t(n,[["render",a]]);export{h as __pageData,m as default}; diff --git a/assets/en_guide_index.md.By6XUN6E.js b/assets/en_guide_index.md.By6XUN6E.js deleted file mode 100644 index 2db90cf9..00000000 --- a/assets/en_guide_index.md.By6XUN6E.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,c as i,o,af as r}from"./chunks/framework.PeLcR_tw.js";const h=JSON.parse('{"title":"Guide","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/index.md","filePath":"en/guide/index.md"}'),n={name:"en/guide/index.md"};function a(s,e,d,l,p,c){return o(),i("div",null,e[0]||(e[0]=[r('

    Guide

    Static php cli is a tool used to build statically compiled PHP binaries, currently supporting Linux and macOS systems.

    In the guide section, you will learn how to use static php cli to build standalone PHP programs.

    Compilation Environment

    The following is the architecture support situation, where ⚙️ represents support for GitHub Action build, 💻 represents support for local manual build, and empty represents temporarily not supported.

    x86_64aarch64
    macOS⚙️ 💻⚙️ 💻
    Linux⚙️ 💻⚙️ 💻
    Windows⚙️ 💻
    FreeBSD💻💻

    Among them, Linux is currently only tested on Ubuntu, Debian, and Alpine distributions, and other distributions have not been tested, which cannot guarantee successful compilation. For untested distributions, local compilation can be done using methods such as Docker to avoid environmental issues.

    There are two architectures for macOS: x86_64 and Arm, but binaries compiled on one architecture cannot be directly used on the other architecture. Rosetta 2 cannot guarantee that programs compiled with Arm architecture can fully run on x86_64 environment.

    Windows currently only supports the x86_64 architecture, and does not support 32-bit x86 or arm64 architecture.

    Supported PHP Version

    Currently, static php cli supports PHP versions 8.1 to 8.5, and theoretically supports PHP 8.0 and earlier versions. Simply select the earlier version when downloading. However, due to some extensions and special components that have stopped supporting earlier versions of PHP, static-php-cli will not explicitly support earlier versions. We recommend that you compile the latest PHP version possible for a better experience.

    ',12)]))}const m=t(n,[["render",a]]);export{h as __pageData,m as default}; diff --git a/assets/en_guide_index.md.By6XUN6E.lean.js b/assets/en_guide_index.md.By6XUN6E.lean.js deleted file mode 100644 index f3b74d1d..00000000 --- a/assets/en_guide_index.md.By6XUN6E.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,c as i,o,af as r}from"./chunks/framework.PeLcR_tw.js";const h=JSON.parse('{"title":"Guide","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/index.md","filePath":"en/guide/index.md"}'),n={name:"en/guide/index.md"};function a(s,e,d,l,p,c){return o(),i("div",null,e[0]||(e[0]=[r("",12)]))}const m=t(n,[["render",a]]);export{h as __pageData,m as default}; diff --git a/assets/en_guide_manual-build.md.BS1NEyZX.lean.js b/assets/en_guide_manual-build.md.BS1NEyZX.lean.js deleted file mode 100644 index 6e613614..00000000 --- a/assets/en_guide_manual-build.md.BS1NEyZX.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as e,o as a,af as n}from"./chunks/framework.PeLcR_tw.js";const k=JSON.parse('{"title":"Build (Linux, macOS, FreeBSD)","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"en/guide/manual-build.md","filePath":"en/guide/manual-build.md"}'),t={name:"en/guide/manual-build.md"};function l(p,i,h,o,d,r){return a(),e("div",null,i[0]||(i[0]=[n("",136)]))}const g=s(t,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/en_guide_manual-build.md.BS1NEyZX.js b/assets/en_guide_manual-build.md.D7BTH2HF.js similarity index 98% rename from assets/en_guide_manual-build.md.BS1NEyZX.js rename to assets/en_guide_manual-build.md.D7BTH2HF.js index eb152e9e..cbe5c5c6 100644 --- a/assets/en_guide_manual-build.md.BS1NEyZX.js +++ b/assets/en_guide_manual-build.md.D7BTH2HF.js @@ -1,4 +1,4 @@ -import{_ as s,c as e,o as a,af as n}from"./chunks/framework.PeLcR_tw.js";const k=JSON.parse('{"title":"Build (Linux, macOS, FreeBSD)","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"en/guide/manual-build.md","filePath":"en/guide/manual-build.md"}'),t={name:"en/guide/manual-build.md"};function l(p,i,h,o,d,r){return a(),e("div",null,i[0]||(i[0]=[n(`

    Build (Linux, macOS, FreeBSD)

    This section covers the build process for Linux, macOS, and FreeBSD. If you want to build on Windows, also need to read Build on Windows.

    This project provides a binary file of static-php-cli. You can directly download the binary file of the corresponding platform and then use it to build static PHP. Currently, the platforms supported by spc binary are Linux and macOS.

    Here's how to download from self-hosted server:

    bash
    # Download from self-hosted nightly builds (sync with main branch)
    +import{_ as s,c as e,o as a,ah as n}from"./chunks/framework.Bhsyh9kO.js";const k=JSON.parse('{"title":"Build (Linux, macOS, FreeBSD)","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"en/guide/manual-build.md","filePath":"en/guide/manual-build.md"}'),t={name:"en/guide/manual-build.md"};function l(p,i,h,o,d,r){return a(),e("div",null,[...i[0]||(i[0]=[n(`

    Build (Linux, macOS, FreeBSD)

    This section covers the build process for Linux, macOS, and FreeBSD. If you want to build on Windows, also need to read Build on Windows.

    This project provides a binary file of static-php-cli. You can directly download the binary file of the corresponding platform and then use it to build static PHP. Currently, the platforms supported by spc binary are Linux and macOS.

    Here's how to download from self-hosted server:

    bash
    # Download from self-hosted nightly builds (sync with main branch)
     # For Linux x86_64
     curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-x86_64
     # For Linux aarch64
    @@ -197,4 +197,4 @@ import{_ as s,c as e,o as a,af as n}from"./chunks/framework.PeLcR_tw.js";const k
     clang embed.c $(bin/spc spc-config bcmath,zlib) -o embed
     
     ./embed
    -# out: Hello world!
    `,136)]))}const g=s(t,[["render",l]]);export{k as __pageData,g as default}; +# out: Hello world!
    `,136)])])}const g=s(t,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/en_guide_manual-build.md.D7BTH2HF.lean.js b/assets/en_guide_manual-build.md.D7BTH2HF.lean.js new file mode 100644 index 00000000..9eaffa8d --- /dev/null +++ b/assets/en_guide_manual-build.md.D7BTH2HF.lean.js @@ -0,0 +1 @@ +import{_ as s,c as e,o as a,ah as n}from"./chunks/framework.Bhsyh9kO.js";const k=JSON.parse('{"title":"Build (Linux, macOS, FreeBSD)","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"en/guide/manual-build.md","filePath":"en/guide/manual-build.md"}'),t={name:"en/guide/manual-build.md"};function l(p,i,h,o,d,r){return a(),e("div",null,[...i[0]||(i[0]=[n("",136)])])}const g=s(t,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/en_guide_troubleshooting.md.BvJgQKvb.js b/assets/en_guide_troubleshooting.md.BvJgQKvb.js deleted file mode 100644 index a30acacf..00000000 --- a/assets/en_guide_troubleshooting.md.BvJgQKvb.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as o,c as t,o as a,af as r}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"Troubleshooting","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/troubleshooting.md","filePath":"en/guide/troubleshooting.md"}'),n={name:"en/guide/troubleshooting.md"};function i(s,e,l,d,c,u){return a(),t("div",null,e[0]||(e[0]=[r('

    Troubleshooting

    Various failures may be encountered in the process of using static-php-cli, here will describe how to check the errors by yourself and report Issue.

    Download Failure

    Problems with downloading resources are one of the most common problems with spc. The main reason is that the addresses used for SPC download resources are generally the official website of the corresponding project or GitHub, etc., and these websites may occasionally go down and block IP addresses. After encountering a download failure, you can try to call the download command multiple times.

    When downloading extensions, you may eventually see errors like curl: (56) The requested URL returned error: 403 which are often caused by github rate limiting. You can verify this by adding --debug to the command and will see something like [DEBU] Running command (no output) : curl -sfSL "https://api.github.com/repos/openssl/openssl/releases".

    To fix this, create a personal access token on GitHub and set it as an environment variable GITHUB_TOKEN=<XXX>.

    If you confirm that the address is indeed inaccessible, you can submit an Issue or PR to update the url or download type.

    Doctor Can't Fix Something

    In most cases, the doctor module can automatically repair and install missing system environments, but there are also special circumstances where the automatic repair function cannot be used normally.

    Due to system limitations (for example, software such as Visual Studio cannot be automatically installed under Windows), the automatic repair function cannot be used for some projects. When encountering a function that cannot be automatically repaired, if you encounter the words Some check items can not be fixed, it means that it cannot be automatically repaired. Please submit an issue according to the method displayed on the terminal or repair the environment yourself.

    Compile Error

    When you encounter a compilation error, if the --debug log is not enabled, please enable the debug log first, and then determine the command that reported the error. The error terminal output is very important for fixing compilation errors. When submitting an issue, please upload the last error fragment of the terminal log (or the entire terminal log output), and include the spc command and parameters used.

    If you are rebuilding, please refer to the Local Build - Multiple Builds section.

    ',13)]))}const p=o(n,[["render",i]]);export{m as __pageData,p as default}; diff --git a/assets/en_guide_troubleshooting.md.BvJgQKvb.lean.js b/assets/en_guide_troubleshooting.md.BvJgQKvb.lean.js deleted file mode 100644 index 277a053a..00000000 --- a/assets/en_guide_troubleshooting.md.BvJgQKvb.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as o,c as t,o as a,af as r}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"Troubleshooting","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/troubleshooting.md","filePath":"en/guide/troubleshooting.md"}'),n={name:"en/guide/troubleshooting.md"};function i(s,e,l,d,c,u){return a(),t("div",null,e[0]||(e[0]=[r("",13)]))}const p=o(n,[["render",i]]);export{m as __pageData,p as default}; diff --git a/assets/en_guide_troubleshooting.md.D19jRB1K.js b/assets/en_guide_troubleshooting.md.D19jRB1K.js new file mode 100644 index 00000000..9d9a1a94 --- /dev/null +++ b/assets/en_guide_troubleshooting.md.D19jRB1K.js @@ -0,0 +1 @@ +import{_ as o,c as t,o as a,ah as r}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"Troubleshooting","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/troubleshooting.md","filePath":"en/guide/troubleshooting.md"}'),n={name:"en/guide/troubleshooting.md"};function i(s,e,l,d,c,u){return a(),t("div",null,[...e[0]||(e[0]=[r('

    Troubleshooting

    Various failures may be encountered in the process of using static-php-cli, here will describe how to check the errors by yourself and report Issue.

    Download Failure

    Problems with downloading resources are one of the most common problems with spc. The main reason is that the addresses used for SPC download resources are generally the official website of the corresponding project or GitHub, etc., and these websites may occasionally go down and block IP addresses. After encountering a download failure, you can try to call the download command multiple times.

    When downloading extensions, you may eventually see errors like curl: (56) The requested URL returned error: 403 which are often caused by github rate limiting. You can verify this by adding --debug to the command and will see something like [DEBU] Running command (no output) : curl -sfSL "https://api.github.com/repos/openssl/openssl/releases".

    To fix this, create a personal access token on GitHub and set it as an environment variable GITHUB_TOKEN=<XXX>.

    If you confirm that the address is indeed inaccessible, you can submit an Issue or PR to update the url or download type.

    Doctor Can't Fix Something

    In most cases, the doctor module can automatically repair and install missing system environments, but there are also special circumstances where the automatic repair function cannot be used normally.

    Due to system limitations (for example, software such as Visual Studio cannot be automatically installed under Windows), the automatic repair function cannot be used for some projects. When encountering a function that cannot be automatically repaired, if you encounter the words Some check items can not be fixed, it means that it cannot be automatically repaired. Please submit an issue according to the method displayed on the terminal or repair the environment yourself.

    Compile Error

    When you encounter a compilation error, if the --debug log is not enabled, please enable the debug log first, and then determine the command that reported the error. The error terminal output is very important for fixing compilation errors. When submitting an issue, please upload the last error fragment of the terminal log (or the entire terminal log output), and include the spc command and parameters used.

    If you are rebuilding, please refer to the Local Build - Multiple Builds section.

    ',13)])])}const p=o(n,[["render",i]]);export{m as __pageData,p as default}; diff --git a/assets/en_guide_troubleshooting.md.D19jRB1K.lean.js b/assets/en_guide_troubleshooting.md.D19jRB1K.lean.js new file mode 100644 index 00000000..9b8c30be --- /dev/null +++ b/assets/en_guide_troubleshooting.md.D19jRB1K.lean.js @@ -0,0 +1 @@ +import{_ as o,c as t,o as a,ah as r}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"Troubleshooting","description":"","frontmatter":{},"headers":[],"relativePath":"en/guide/troubleshooting.md","filePath":"en/guide/troubleshooting.md"}'),n={name:"en/guide/troubleshooting.md"};function i(s,e,l,d,c,u){return a(),t("div",null,[...e[0]||(e[0]=[r("",13)])])}const p=o(n,[["render",i]]);export{m as __pageData,p as default}; diff --git a/assets/en_index.md.kO-e39M0.js b/assets/en_index.md.WiGlW8EH.js similarity index 93% rename from assets/en_index.md.kO-e39M0.js rename to assets/en_index.md.WiGlW8EH.js index 1df4a0ee..062da561 100644 --- a/assets/en_index.md.kO-e39M0.js +++ b/assets/en_index.md.WiGlW8EH.js @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.PeLcR_tw.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"static-php-cli","tagline":"Build standalone PHP binary on Linux, macOS, FreeBSD, Windows, with PHP project together, with popular extensions included.","actions":[{"theme":"brand","text":"Guide","link":"./guide/"}]},"features":[{"title":"Static CLI Binary","details":"You can easily compile a standalone php binary for general use. Including CLI, FPM sapi."},{"title":"Micro Self-Extracted Executable","details":"You can compile a self-extracted executable and build with your php source code."},{"title":"Dependency Management","details":"static-php-cli comes with dependency management and supports installation of different types of PHP extensions."}]},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md"}'),n={name:"en/index.md"};function i(o,s,c,d,r,l){return a(),t("div")}const m=e(n,[["render",i]]);export{u as __pageData,m as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.Bhsyh9kO.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"static-php-cli","tagline":"Build standalone PHP binary on Linux, macOS, FreeBSD, Windows, with PHP project together, with popular extensions included.","actions":[{"theme":"brand","text":"Guide","link":"./guide/"}]},"features":[{"title":"Static CLI Binary","details":"You can easily compile a standalone php binary for general use. Including CLI, FPM sapi."},{"title":"Micro Self-Extracted Executable","details":"You can compile a self-extracted executable and build with your php source code."},{"title":"Dependency Management","details":"static-php-cli comes with dependency management and supports installation of different types of PHP extensions."}]},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md"}'),n={name:"en/index.md"};function i(o,s,c,d,r,l){return a(),t("div")}const m=e(n,[["render",i]]);export{u as __pageData,m as default}; diff --git a/assets/en_index.md.kO-e39M0.lean.js b/assets/en_index.md.WiGlW8EH.lean.js similarity index 93% rename from assets/en_index.md.kO-e39M0.lean.js rename to assets/en_index.md.WiGlW8EH.lean.js index 1df4a0ee..062da561 100644 --- a/assets/en_index.md.kO-e39M0.lean.js +++ b/assets/en_index.md.WiGlW8EH.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.PeLcR_tw.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"static-php-cli","tagline":"Build standalone PHP binary on Linux, macOS, FreeBSD, Windows, with PHP project together, with popular extensions included.","actions":[{"theme":"brand","text":"Guide","link":"./guide/"}]},"features":[{"title":"Static CLI Binary","details":"You can easily compile a standalone php binary for general use. Including CLI, FPM sapi."},{"title":"Micro Self-Extracted Executable","details":"You can compile a self-extracted executable and build with your php source code."},{"title":"Dependency Management","details":"static-php-cli comes with dependency management and supports installation of different types of PHP extensions."}]},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md"}'),n={name:"en/index.md"};function i(o,s,c,d,r,l){return a(),t("div")}const m=e(n,[["render",i]]);export{u as __pageData,m as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.Bhsyh9kO.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"static-php-cli","tagline":"Build standalone PHP binary on Linux, macOS, FreeBSD, Windows, with PHP project together, with popular extensions included.","actions":[{"theme":"brand","text":"Guide","link":"./guide/"}]},"features":[{"title":"Static CLI Binary","details":"You can easily compile a standalone php binary for general use. Including CLI, FPM sapi."},{"title":"Micro Self-Extracted Executable","details":"You can compile a self-extracted executable and build with your php source code."},{"title":"Dependency Management","details":"static-php-cli comes with dependency management and supports installation of different types of PHP extensions."}]},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md"}'),n={name:"en/index.md"};function i(o,s,c,d,r,l){return a(),t("div")}const m=e(n,[["render",i]]);export{u as __pageData,m as default}; diff --git a/assets/extension-notes.md.DkpYDq7p.js b/assets/extension-notes.md.BB7Xlw1w.js similarity index 81% rename from assets/extension-notes.md.DkpYDq7p.js rename to assets/extension-notes.md.BB7Xlw1w.js index c546f9cf..a185d04d 100644 --- a/assets/extension-notes.md.DkpYDq7p.js +++ b/assets/extension-notes.md.BB7Xlw1w.js @@ -1 +1 @@ -import{_ as e,c as t,o as n}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"extension-notes.md","filePath":"extension-notes.md"}'),o={name:"extension-notes.md"};function s(a,r,c,i,p,_){return n(),t("div")}const f=e(o,[["render",s]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as n}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"extension-notes.md","filePath":"extension-notes.md"}'),o={name:"extension-notes.md"};function s(a,r,c,i,p,_){return n(),t("div")}const f=e(o,[["render",s]]);export{m as __pageData,f as default}; diff --git a/assets/extension-notes.md.DkpYDq7p.lean.js b/assets/extension-notes.md.BB7Xlw1w.lean.js similarity index 81% rename from assets/extension-notes.md.DkpYDq7p.lean.js rename to assets/extension-notes.md.BB7Xlw1w.lean.js index c546f9cf..a185d04d 100644 --- a/assets/extension-notes.md.DkpYDq7p.lean.js +++ b/assets/extension-notes.md.BB7Xlw1w.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as n}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"extension-notes.md","filePath":"extension-notes.md"}'),o={name:"extension-notes.md"};function s(a,r,c,i,p,_){return n(),t("div")}const f=e(o,[["render",s]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as n}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"extension-notes.md","filePath":"extension-notes.md"}'),o={name:"extension-notes.md"};function s(a,r,c,i,p,_){return n(),t("div")}const f=e(o,[["render",s]]);export{m as __pageData,f as default}; diff --git a/assets/extensions.md.Cm2bD6Wz.js b/assets/extensions.md.Cm2bD6Wz.js deleted file mode 100644 index a3c4b4db..00000000 --- a/assets/extensions.md.Cm2bD6Wz.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as d,c as e,o as s,af as y}from"./chunks/framework.PeLcR_tw.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"extensions.md","filePath":"extensions.md"}'),r={name:"extensions.md"};function o(n,t,a,l,i,h){return s(),e("div",null,t[0]||(t[0]=[y('
    Extension NameLinuxmacOSFreeBSDWindows
    amqpyesyesyes
    apcuyesyesyesyes
    astyesyesyesyes
    bcmathyesyesyesyes
    brotliyesyesyesyes
    bz2yesyesyesyes
    calendaryesyesyesyes
    ctypeyesyesyesyes
    curlyesyesyesyes
    dbayesyesyesyes
    dioyesyesyes
    domyesyesyes
    dsyesyesyesyes
    enchant
    evyesyesyesyes
    eventyesyes
    exifyesyesyesyes
    ffipartialyesyes
    fileinfoyesyesyesyes
    filteryesyesyesyes
    ftpyesyesyesyes
    gdyesyesyes
    gettextyesyes
    glfwnoyesno
    gmpyesyes
    gmsslyesyesyes
    grpcyesyes
    iconvyesyesyes
    igbinaryyesyesyes
    imagickyesyes
    imapyesyes
    inotifyyesnono
    intlyesyesyes
    ldapyesyes
    libxmlyesyesyes
    lz4yesyes
    mbregexyesyesyesyes
    mbstringyesyesyesyes
    mcryptnononono
    memcacheyesyes
    memcachedyesyes
    mongodbyesyes
    msgpackyesyesyes
    mysqliyesyesyesyes
    mysqlndyesyesyesyes
    oci8nonono
    odbcyesyes
    opcacheyesyesyesyes
    opensslyesyesyesyes
    opentelemetryyesyesyes
    parallelyesyesyes
    password-argon2yesyes
    pcntlyesyesyesno
    pdoyesyesyesyes
    pdo_mysqlyesyesyesyes
    pdo_odbcyesyesyes
    pdo_pgsqlyesyesyes
    pdo_sqliteyesyesyes
    pdo_sqlsrvyesyesyes
    pgsqlyesyesyes
    pharyesyesyesyes
    posixyesyesyesno
    protobufyesyes
    raryespartialyes
    rdkafkayesyes
    readlineyesyes
    redisyesyesyes
    sessionyesyesyesyes
    shmopyesyesyesyes
    simdjsonyesyesyesyes
    simplexmlyesyesyes
    snappyyesyes
    soapyesyesyes
    socketsyesyesyesyes
    sodiumyesyesyes
    spxyesyesno
    sqlite3yesyesyes
    sqlsrvyesyesyes
    ssh2yesyesyes
    swooleyesyesno
    swoole-hook-mysqlyesyesno
    swoole-hook-pgsqlyespartialno
    swoole-hook-sqliteyesyesno
    swoole-hook-odbcyesyesno
    swowyesyesyes
    sysvmsgyesyesno
    sysvsemyesyesno
    sysvshmyesyesyes
    tidyyesyes
    tokenizeryesyesyesyes
    uuidyesyes
    uvyesyes
    xdebugpartialpartialno
    xhprofyesyes
    xlswriteryesyesyes
    xmlyesyesyes
    xmlreaderyesyesyes
    xmlwriteryesyesyes
    xslyesyes
    xzyesyesyesyes
    yacyesyesyes
    yamlyesyesyes
    zipyesyesyes
    zlibyesyesyesyes
    zstdyesyes
    ',1)]))}const x=d(r,[["render",o]]);export{p as __pageData,x as default}; diff --git a/assets/extensions.md.Cm2bD6Wz.lean.js b/assets/extensions.md.Cm2bD6Wz.lean.js deleted file mode 100644 index 54433e93..00000000 --- a/assets/extensions.md.Cm2bD6Wz.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as d,c as e,o as s,af as y}from"./chunks/framework.PeLcR_tw.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"extensions.md","filePath":"extensions.md"}'),r={name:"extensions.md"};function o(n,t,a,l,i,h){return s(),e("div",null,t[0]||(t[0]=[y("",1)]))}const x=d(r,[["render",o]]);export{p as __pageData,x as default}; diff --git a/assets/extensions.md.hO1GVZPt.js b/assets/extensions.md.hO1GVZPt.js new file mode 100644 index 00000000..f71b11bb --- /dev/null +++ b/assets/extensions.md.hO1GVZPt.js @@ -0,0 +1 @@ +import{_ as d,c as e,o as s,ah as y}from"./chunks/framework.Bhsyh9kO.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"extensions.md","filePath":"extensions.md"}'),r={name:"extensions.md"};function o(n,t,a,l,i,h){return s(),e("div",null,[...t[0]||(t[0]=[y('
    Extension NameLinuxmacOSFreeBSDWindows
    amqpyesyesyes
    apcuyesyesyesyes
    astyesyesyesyes
    bcmathyesyesyesyes
    brotliyesyesyesyes
    bz2yesyesyesyes
    calendaryesyesyesyes
    ctypeyesyesyesyes
    curlyesyesyesyes
    dbayesyesyesyes
    dioyesyesyes
    domyesyesyes
    dsyesyesyesyes
    enchant
    evyesyesyesyes
    eventyesyes
    exifyesyesyesyes
    ffipartialyesyes
    fileinfoyesyesyesyes
    filteryesyesyesyes
    ftpyesyesyesyes
    gdyesyesyes
    gettextyesyes
    glfwnoyesno
    gmpyesyes
    gmsslyesyesyes
    grpcyesyes
    iconvyesyesyes
    igbinaryyesyesyes
    imagickyesyes
    imapyesyes
    inotifyyesnono
    intlyesyesyes
    ldapyesyes
    libxmlyesyesyes
    lz4yesyes
    mbregexyesyesyesyes
    mbstringyesyesyesyes
    mcryptnononono
    memcacheyesyes
    memcachedyesyes
    mongodbyesyes
    msgpackyesyesyes
    mysqliyesyesyesyes
    mysqlndyesyesyesyes
    oci8nonono
    odbcyesyes
    opcacheyesyesyesyes
    opensslyesyesyesyes
    opentelemetryyesyesyes
    parallelyesyesyes
    password-argon2yesyes
    pcntlyesyesyesno
    pdoyesyesyesyes
    pdo_mysqlyesyesyesyes
    pdo_odbcyesyesyes
    pdo_pgsqlyesyesyes
    pdo_sqliteyesyesyes
    pdo_sqlsrvyesyesyes
    pgsqlyesyesyes
    pharyesyesyesyes
    posixyesyesyesno
    protobufyesyes
    raryespartialyes
    rdkafkayesyes
    readlineyesyes
    redisyesyesyes
    sessionyesyesyesyes
    shmopyesyesyesyes
    simdjsonyesyesyesyes
    simplexmlyesyesyes
    snappyyesyes
    soapyesyesyes
    socketsyesyesyesyes
    sodiumyesyesyes
    spxyesyesno
    sqlite3yesyesyes
    sqlsrvyesyesyes
    ssh2yesyesyes
    swooleyesyesno
    swoole-hook-mysqlyesyesno
    swoole-hook-pgsqlyespartialno
    swoole-hook-sqliteyesyesno
    swoole-hook-odbcyesyesno
    swowyesyesyes
    sysvmsgyesyesno
    sysvsemyesyesno
    sysvshmyesyesyes
    tidyyesyes
    tokenizeryesyesyesyes
    uuidyesyes
    uvyesyes
    xdebugpartialpartialno
    xhprofyesyes
    xlswriteryesyesyes
    xmlyesyesyes
    xmlreaderyesyesyes
    xmlwriteryesyesyes
    xslyesyes
    xzyesyesyesyes
    yacyesyesyes
    yamlyesyesyes
    zipyesyesyes
    zlibyesyesyesyes
    zstdyesyes
    ',1)])])}const x=d(r,[["render",o]]);export{p as __pageData,x as default}; diff --git a/assets/extensions.md.hO1GVZPt.lean.js b/assets/extensions.md.hO1GVZPt.lean.js new file mode 100644 index 00000000..31193433 --- /dev/null +++ b/assets/extensions.md.hO1GVZPt.lean.js @@ -0,0 +1 @@ +import{_ as d,c as e,o as s,ah as y}from"./chunks/framework.Bhsyh9kO.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"extensions.md","filePath":"extensions.md"}'),r={name:"extensions.md"};function o(n,t,a,l,i,h){return s(),e("div",null,[...t[0]||(t[0]=[y("",1)])])}const x=d(r,[["render",o]]);export{p as __pageData,x as default}; diff --git a/assets/index.md.wJBxKTzp.js b/assets/index.md.AJG02Jxt.js similarity index 91% rename from assets/index.md.wJBxKTzp.js rename to assets/index.md.AJG02Jxt.js index 84481039..c850cc26 100644 --- a/assets/index.md.wJBxKTzp.js +++ b/assets/index.md.AJG02Jxt.js @@ -1 +1 @@ -import{_ as n}from"./chunks/theme.DbVD3jYa.js";import{c as o,o as s,j as t,J as i,a as r,k as l}from"./chunks/framework.PeLcR_tw.js";const h=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"static-php-cli","tagline":"Build standalone PHP binary on Linux, macOS, FreeBSD, Windows, with PHP project together, with popular extensions included.","actions":[{"theme":"brand","text":"Get Started","link":"/en/guide/"},{"theme":"alt","text":"中文文档","link":"/zh/"}]},"features":[{"title":"Static CLI Binary","details":"You can easily compile a standalone php binary for general use. Including CLI, FPM sapi."},{"title":"Micro Self-Extracted Executable","details":"You can compile a self-extracted executable and build with your php source code."},{"title":"Dependency Management","details":"static-php-cli comes with dependency management and supports installation of different types of PHP extensions."}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),c={name:"index.md"},f=Object.assign(c,{setup(d){const a=[{name:"Beyond Code",img:"/images/beyondcode-seeklogo.png",url:"https://beyondco.de/"},{name:"NativePHP",img:"/images/nativephp-logo.svg",url:"https://nativephp.com/"}];return(p,e)=>(s(),o("div",null,[e[0]||(e[0]=t("h2",{id:"special-sponsors",tabindex:"-1"},[r("Special Sponsors "),t("a",{class:"header-anchor",href:"#special-sponsors","aria-label":"Permalink to “Special Sponsors”"},"​")],-1)),i(l(n),{data:a})]))}});export{h as __pageData,f as default}; +import{_ as n}from"./chunks/theme.MOrVMOSc.js";import{c as o,o as s,j as t,J as i,a as r,k as l}from"./chunks/framework.Bhsyh9kO.js";const h=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"static-php-cli","tagline":"Build standalone PHP binary on Linux, macOS, FreeBSD, Windows, with PHP project together, with popular extensions included.","actions":[{"theme":"brand","text":"Get Started","link":"/en/guide/"},{"theme":"alt","text":"中文文档","link":"/zh/"}]},"features":[{"title":"Static CLI Binary","details":"You can easily compile a standalone php binary for general use. Including CLI, FPM sapi."},{"title":"Micro Self-Extracted Executable","details":"You can compile a self-extracted executable and build with your php source code."},{"title":"Dependency Management","details":"static-php-cli comes with dependency management and supports installation of different types of PHP extensions."}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),c={name:"index.md"},f=Object.assign(c,{setup(d){const a=[{name:"Beyond Code",img:"/images/beyondcode-seeklogo.png",url:"https://beyondco.de/"},{name:"NativePHP",img:"/images/nativephp-logo.svg",url:"https://nativephp.com/"}];return(p,e)=>(s(),o("div",null,[e[0]||(e[0]=t("h2",{id:"special-sponsors",tabindex:"-1"},[r("Special Sponsors "),t("a",{class:"header-anchor",href:"#special-sponsors","aria-label":"Permalink to “Special Sponsors”"},"​")],-1)),i(l(n),{data:a})]))}});export{h as __pageData,f as default}; diff --git a/assets/index.md.wJBxKTzp.lean.js b/assets/index.md.AJG02Jxt.lean.js similarity index 91% rename from assets/index.md.wJBxKTzp.lean.js rename to assets/index.md.AJG02Jxt.lean.js index 84481039..c850cc26 100644 --- a/assets/index.md.wJBxKTzp.lean.js +++ b/assets/index.md.AJG02Jxt.lean.js @@ -1 +1 @@ -import{_ as n}from"./chunks/theme.DbVD3jYa.js";import{c as o,o as s,j as t,J as i,a as r,k as l}from"./chunks/framework.PeLcR_tw.js";const h=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"static-php-cli","tagline":"Build standalone PHP binary on Linux, macOS, FreeBSD, Windows, with PHP project together, with popular extensions included.","actions":[{"theme":"brand","text":"Get Started","link":"/en/guide/"},{"theme":"alt","text":"中文文档","link":"/zh/"}]},"features":[{"title":"Static CLI Binary","details":"You can easily compile a standalone php binary for general use. Including CLI, FPM sapi."},{"title":"Micro Self-Extracted Executable","details":"You can compile a self-extracted executable and build with your php source code."},{"title":"Dependency Management","details":"static-php-cli comes with dependency management and supports installation of different types of PHP extensions."}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),c={name:"index.md"},f=Object.assign(c,{setup(d){const a=[{name:"Beyond Code",img:"/images/beyondcode-seeklogo.png",url:"https://beyondco.de/"},{name:"NativePHP",img:"/images/nativephp-logo.svg",url:"https://nativephp.com/"}];return(p,e)=>(s(),o("div",null,[e[0]||(e[0]=t("h2",{id:"special-sponsors",tabindex:"-1"},[r("Special Sponsors "),t("a",{class:"header-anchor",href:"#special-sponsors","aria-label":"Permalink to “Special Sponsors”"},"​")],-1)),i(l(n),{data:a})]))}});export{h as __pageData,f as default}; +import{_ as n}from"./chunks/theme.MOrVMOSc.js";import{c as o,o as s,j as t,J as i,a as r,k as l}from"./chunks/framework.Bhsyh9kO.js";const h=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"static-php-cli","tagline":"Build standalone PHP binary on Linux, macOS, FreeBSD, Windows, with PHP project together, with popular extensions included.","actions":[{"theme":"brand","text":"Get Started","link":"/en/guide/"},{"theme":"alt","text":"中文文档","link":"/zh/"}]},"features":[{"title":"Static CLI Binary","details":"You can easily compile a standalone php binary for general use. Including CLI, FPM sapi."},{"title":"Micro Self-Extracted Executable","details":"You can compile a self-extracted executable and build with your php source code."},{"title":"Dependency Management","details":"static-php-cli comes with dependency management and supports installation of different types of PHP extensions."}]},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),c={name:"index.md"},f=Object.assign(c,{setup(d){const a=[{name:"Beyond Code",img:"/images/beyondcode-seeklogo.png",url:"https://beyondco.de/"},{name:"NativePHP",img:"/images/nativephp-logo.svg",url:"https://nativephp.com/"}];return(p,e)=>(s(),o("div",null,[e[0]||(e[0]=t("h2",{id:"special-sponsors",tabindex:"-1"},[r("Special Sponsors "),t("a",{class:"header-anchor",href:"#special-sponsors","aria-label":"Permalink to “Special Sponsors”"},"​")],-1)),i(l(n),{data:a})]))}});export{h as __pageData,f as default}; diff --git a/assets/style.384sric5.css b/assets/style.384sric5.css deleted file mode 100644 index f9a22783..00000000 --- a/assets/style.384sric5.css +++ /dev/null @@ -1 +0,0 @@ -@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: #3c3c43;--vp-c-text-2: #67676c;--vp-c-text-3: #929295}.dark{--vp-c-text-1: #dfdfd6;--vp-c-text-2: #98989f;--vp-c-text-3: #6a6a71}: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, 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-2);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-2);--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)}:lang(es),:lang(pt){--vp-code-copy-copied-text-content: "Copiado"}:lang(fa){--vp-code-copy-copied-text-content: "کپی شد"}:lang(ko){--vp-code-copy-copied-text-content: "복사됨"}:lang(ru){--vp-code-copy-copied-text-content: "Скопировано"}:lang(zh){--vp-code-copy-copied-text-content: "已复制"}: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")}.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 .shiki span{color:var(--shiki-dark, inherit)}html:not(.dark) .shiki 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{-moz-tab-size:4;-o-tab-size:4;tab-size:4}.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;-webkit-user-select:none;user-select:none;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(:is(.no-icon,svg a,:has(img,svg))):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]):not(:is(.no-icon,svg a,:has(img,svg))):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-c79a1216]{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-c79a1216],.VPBackdrop.fade-leave-to[data-v-c79a1216]{opacity:0}.VPBackdrop.fade-leave-active[data-v-c79a1216]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-c79a1216]{display:none}}.NotFound[data-v-829df670]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-829df670]{padding:96px 32px 168px}}.code[data-v-829df670]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-829df670]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-829df670]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-829df670]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-829df670]{padding-top:20px}.link[data-v-829df670]{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-829df670]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-2d0bdf9b]{position:relative;z-index:1}.nested[data-v-2d0bdf9b]{padding-right:16px;padding-left:16px}.outline-link[data-v-2d0bdf9b]{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-2d0bdf9b]:hover,.outline-link.active[data-v-2d0bdf9b]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-2d0bdf9b]{padding-left:13px}.VPDocAsideOutline[data-v-60d5052e]{display:none}.VPDocAsideOutline.has-outline[data-v-60d5052e]{display:block}.content[data-v-60d5052e]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-60d5052e]{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-60d5052e]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-3f215769]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-3f215769]{flex-grow:1}.VPDocAside[data-v-3f215769] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-3f215769] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-3f215769] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-e98dd255]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-e98dd255]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-e257564d]{margin-top:64px}.edit-info[data-v-e257564d]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-e257564d]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-e257564d]{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-e257564d]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-e257564d]{margin-right:8px}.prev-next[data-v-e257564d]{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-e257564d]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-e257564d]{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-e257564d]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-e257564d]{margin-left:auto;text-align:right}.desc[data-v-e257564d]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-e257564d]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-7011f0d8]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-7011f0d8]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-7011f0d8]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-7011f0d8]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-7011f0d8]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-7011f0d8]{display:flex;justify-content:center}.VPDoc .aside[data-v-7011f0d8]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-7011f0d8]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-7011f0d8]{max-width:1104px}}.container[data-v-7011f0d8]{margin:0 auto;width:100%}.aside[data-v-7011f0d8]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-7011f0d8]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-7011f0d8]{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-7011f0d8]::-webkit-scrollbar{display:none}.aside-curtain[data-v-7011f0d8]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%);pointer-events:none}.aside-content[data-v-7011f0d8]{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-7011f0d8]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-7011f0d8]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-7011f0d8]{order:1;margin:0;min-width:640px}}.content-container[data-v-7011f0d8]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-7011f0d8]{max-width:688px}.VPButton[data-v-01bff58b]{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-01bff58b]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-01bff58b]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-01bff58b]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-01bff58b]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-01bff58b]: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-01bff58b]: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-01bff58b]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-01bff58b]: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-01bff58b]: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-01bff58b]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-01bff58b]: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-01bff58b]: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-8426fc1a]{display:none}.dark .VPImage.light[data-v-8426fc1a]{display:none}.VPHero[data-v-f930dc11]{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-f930dc11]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-f930dc11]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-f930dc11]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-f930dc11]{flex-direction:row}}.main[data-v-f930dc11]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-f930dc11]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-f930dc11]{text-align:left}}@media (min-width: 960px){.main[data-v-f930dc11]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-f930dc11]{max-width:592px}}.heading[data-v-f930dc11]{display:flex;flex-direction:column}.name[data-v-f930dc11],.text[data-v-f930dc11]{width:fit-content;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-f930dc11],.VPHero.has-image .text[data-v-f930dc11]{margin:0 auto}.name[data-v-f930dc11]{color:var(--vp-home-hero-name-color)}.clip[data-v-f930dc11]{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-f930dc11],.text[data-v-f930dc11]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-f930dc11],.text[data-v-f930dc11]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-f930dc11],.VPHero.has-image .text[data-v-f930dc11]{margin:0}}.tagline[data-v-f930dc11]{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-f930dc11]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-f930dc11]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-f930dc11]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-f930dc11]{margin:0}}.actions[data-v-f930dc11]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-f930dc11]{justify-content:center}@media (min-width: 640px){.actions[data-v-f930dc11]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-f930dc11]{justify-content:flex-start}}.action[data-v-f930dc11]{flex-shrink:0;padding:6px}.image[data-v-f930dc11]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-f930dc11]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-f930dc11]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-f930dc11]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-f930dc11]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-f930dc11]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-f930dc11]{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-f930dc11]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-f930dc11]{width:320px;height:320px}}[data-v-f930dc11] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;width:100%;height:100%;object-fit:contain;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-f930dc11] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-f930dc11] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-5219619b]{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-5219619b]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-5219619b]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-5219619b]>.VPImage{margin-bottom:20px}.icon[data-v-5219619b]{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-5219619b]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-5219619b]{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-5219619b]{padding-top:8px}.link-text-value[data-v-5219619b]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-5219619b]{margin-left:6px}.VPFeatures[data-v-a6181336]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-a6181336]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-a6181336]{padding:0 64px}}.container[data-v-a6181336]{margin:0 auto;max-width:1152px}.items[data-v-a6181336]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-a6181336]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-a6181336],.item.grid-4[data-v-a6181336],.item.grid-6[data-v-a6181336]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-a6181336],.item.grid-4[data-v-a6181336]{width:50%}.item.grid-3[data-v-a6181336],.item.grid-6[data-v-a6181336]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-a6181336]{width:25%}}.container[data-v-8e2d4988]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-8e2d4988]{padding:0 48px}}@media (min-width: 960px){.container[data-v-8e2d4988]{width:100%;padding:0 64px}}.vp-doc[data-v-8e2d4988] .VPHomeSponsors,.vp-doc[data-v-8e2d4988] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-8e2d4988] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-8e2d4988] .VPHomeSponsors a,.vp-doc[data-v-8e2d4988] .VPTeamPage a{text-decoration:none}.VPHome[data-v-8b561e3d]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-8b561e3d]{margin-bottom:128px}}.VPContent[data-v-aff0b8d7]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-aff0b8d7]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-aff0b8d7]{margin:0}@media (min-width: 960px){.VPContent[data-v-aff0b8d7]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-aff0b8d7]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-aff0b8d7]{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-c3855bb3]{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-c3855bb3]{display:none}.VPFooter[data-v-c3855bb3] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-c3855bb3] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-c3855bb3]{padding:32px}}.container[data-v-c3855bb3]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-c3855bb3],.copyright[data-v-c3855bb3]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-5fabb9ca]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-5fabb9ca]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-5fabb9ca]{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-5fabb9ca]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-5fabb9ca]{color:var(--vp-c-text-1)}.icon[data-v-5fabb9ca]{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-5fabb9ca]{font-size:14px}.icon[data-v-5fabb9ca]{font-size:16px}}.open>.icon[data-v-5fabb9ca]{transform:rotate(90deg)}.items[data-v-5fabb9ca]{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-5fabb9ca]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-5fabb9ca]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-5fabb9ca]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-5fabb9ca]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-5fabb9ca]{transition:all .2s ease-out}.flyout-leave-active[data-v-5fabb9ca]{transition:all .15s ease-in}.flyout-enter-from[data-v-5fabb9ca],.flyout-leave-to[data-v-5fabb9ca]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-e30e5487]{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-e30e5487]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-e30e5487]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-e30e5487]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-e30e5487]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-e30e5487]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-e30e5487]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-e30e5487]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-e30e5487]{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-e30e5487]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-e30e5487]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-e30e5487]{display:none}}.menu-icon[data-v-e30e5487]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-e30e5487]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-e30e5487]{padding:12px 32px 11px}}.VPSwitch[data-v-1d5665e3]{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-1d5665e3]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-1d5665e3]{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-1d5665e3]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-1d5665e3] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-1d5665e3] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-5337faa4]{opacity:1}.moon[data-v-5337faa4],.dark .sun[data-v-5337faa4]{opacity:0}.dark .moon[data-v-5337faa4]{opacity:1}.dark .VPSwitchAppearance[data-v-5337faa4] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-6c893767]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-6c893767]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-35975db6]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-35975db6]{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-35975db6]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-35975db6]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-74489cb8]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-74489cb8]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-74489cb8]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-74489cb8]{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-c9afd7f1]{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-c9afd7f1] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-c9afd7f1] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-c9afd7f1] .group:last-child{padding-bottom:0}.VPMenu[data-v-c9afd7f1] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-c9afd7f1] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-c9afd7f1] .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-c9afd7f1] .action{padding-left:24px}.VPFlyout[data-v-3ab3deac]{position:relative}.VPFlyout[data-v-3ab3deac]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-3ab3deac]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-3ab3deac]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-3ab3deac]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-3ab3deac]{color:var(--vp-c-brand-2)}.button[aria-expanded=false]+.menu[data-v-3ab3deac]{opacity:0;visibility:hidden;transform:translateY(0)}.VPFlyout:hover .menu[data-v-3ab3deac],.button[aria-expanded=true]+.menu[data-v-3ab3deac]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-3ab3deac]{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-3ab3deac]{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-3ab3deac]{margin-right:0;font-size:16px}.text-icon[data-v-3ab3deac]{margin-left:4px;font-size:14px}.icon[data-v-3ab3deac]{font-size:20px;transition:fill .25s}.menu[data-v-3ab3deac]{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-bd121fe5]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-bd121fe5]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-bd121fe5]>svg,.VPSocialLink[data-v-bd121fe5]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-d474d15f]{display:flex;justify-content:center}.VPNavBarExtra[data-v-bb2aa2f0]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-bb2aa2f0]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-bb2aa2f0]{display:none}}.trans-title[data-v-bb2aa2f0]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-bb2aa2f0],.item.social-links[data-v-bb2aa2f0]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-bb2aa2f0]{min-width:176px}.appearance-action[data-v-bb2aa2f0]{margin-right:-2px}.social-links-list[data-v-bb2aa2f0]{margin:-4px -8px}.VPNavBarHamburger[data-v-e5dd9c1c]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-e5dd9c1c]{display:none}}.container[data-v-e5dd9c1c]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-e5dd9c1c]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-e5dd9c1c]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-e5dd9c1c]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-e5dd9c1c]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-e5dd9c1c]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-e5dd9c1c]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-e5dd9c1c],.VPNavBarHamburger.active:hover .middle[data-v-e5dd9c1c],.VPNavBarHamburger.active:hover .bottom[data-v-e5dd9c1c]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-e5dd9c1c],.middle[data-v-e5dd9c1c],.bottom[data-v-e5dd9c1c]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-e5dd9c1c]{top:0;left:0;transform:translate(0)}.middle[data-v-e5dd9c1c]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-e5dd9c1c]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-e56f3d57]{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-e56f3d57],.VPNavBarMenuLink[data-v-e56f3d57]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-39714824]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-39714824]{display:flex}}/*! @docsearch/css 3.9.0 | 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 #0304094d;--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:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;transition-duration:.1s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);width:20px}@media (prefers-reduced-motion){.DocSearch-Button-Key{transition:none}}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}@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;scroll-margin-top:40px}@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-Tree,.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] 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:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;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-0394ad82]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-0394ad82]{display:flex;align-items:center}}.title[data-v-1e38c6bc]{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-1e38c6bc]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-1e38c6bc]{border-bottom-color:var(--vp-c-divider)}}[data-v-1e38c6bc] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-88af2de4]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-88af2de4]{display:flex;align-items:center}}.title[data-v-88af2de4]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-0ae64501]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-0ae64501]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-0ae64501]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-0ae64501]:not(.home){background-color:transparent}.VPNavBar[data-v-0ae64501]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-0ae64501]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-0ae64501]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-0ae64501]{padding:0}}.container[data-v-0ae64501]{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-0ae64501],.container>.content[data-v-0ae64501]{pointer-events:none}.container[data-v-0ae64501] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-0ae64501]{max-width:100%}}.title[data-v-0ae64501]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-0ae64501]{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-0ae64501]{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-0ae64501]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-0ae64501]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-0ae64501]{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-0ae64501]{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-0ae64501]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-0ae64501]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-0ae64501]{column-gap:.5rem}}.menu+.translations[data-v-0ae64501]:before,.menu+.appearance[data-v-0ae64501]:before,.menu+.social-links[data-v-0ae64501]:before,.translations+.appearance[data-v-0ae64501]:before,.appearance+.social-links[data-v-0ae64501]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-0ae64501]:before,.translations+.appearance[data-v-0ae64501]:before{margin-right:16px}.appearance+.social-links[data-v-0ae64501]:before{margin-left:16px}.social-links[data-v-0ae64501]{margin-right:-8px}.divider[data-v-0ae64501]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-0ae64501]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-0ae64501]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-0ae64501]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-0ae64501]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-0ae64501]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-0ae64501]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-b44890b2]{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-b44890b2]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-df37e6dd]{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-df37e6dd]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-3e9c20e4]{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-3e9c20e4]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-4b7a798b]{display:block}.title[data-v-4b7a798b]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-956364f9]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-956364f9]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-956364f9]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-956364f9]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-956364f9]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-956364f9]{transform:rotate(45deg)}.button[data-v-956364f9]{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-956364f9]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-956364f9]{transition:transform .25s}.group[data-v-956364f9]:first-child{padding-top:0}.group+.group[data-v-956364f9],.group+.item[data-v-956364f9]{padding-top:4px}.VPNavScreenTranslations[data-v-858fe1a4]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-858fe1a4]{height:auto}.title[data-v-858fe1a4]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-858fe1a4]{font-size:16px}.icon.lang[data-v-858fe1a4]{margin-right:8px}.icon.chevron[data-v-858fe1a4]{margin-left:4px}.list[data-v-858fe1a4]{padding:4px 0 0 24px}.link[data-v-858fe1a4]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-f2779853]{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-f2779853],.VPNavScreen.fade-leave-active[data-v-f2779853]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-f2779853],.VPNavScreen.fade-leave-active .container[data-v-f2779853]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-f2779853],.VPNavScreen.fade-leave-to[data-v-f2779853]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-f2779853],.VPNavScreen.fade-leave-to .container[data-v-f2779853]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-f2779853]{display:none}}.container[data-v-f2779853]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-f2779853],.menu+.appearance[data-v-f2779853],.translations+.appearance[data-v-f2779853]{margin-top:24px}.menu+.social-links[data-v-f2779853]{margin-top:16px}.appearance+.social-links[data-v-f2779853]{margin-top:16px}.VPNav[data-v-ae24b3ad]{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-ae24b3ad]{position:fixed}}.VPSidebarItem.level-0[data-v-d81de50c]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-d81de50c]{padding-bottom:10px}.item[data-v-d81de50c]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-d81de50c]{cursor:pointer}.indicator[data-v-d81de50c]{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-d81de50c],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-d81de50c],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-d81de50c],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-d81de50c]{background-color:var(--vp-c-brand-1)}.link[data-v-d81de50c]{display:flex;align-items:center;flex-grow:1}.text[data-v-d81de50c]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-d81de50c]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-d81de50c],.VPSidebarItem.level-2 .text[data-v-d81de50c],.VPSidebarItem.level-3 .text[data-v-d81de50c],.VPSidebarItem.level-4 .text[data-v-d81de50c],.VPSidebarItem.level-5 .text[data-v-d81de50c]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-d81de50c],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-d81de50c],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-d81de50c],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-d81de50c],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-d81de50c],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-d81de50c]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-d81de50c],.VPSidebarItem.level-1.has-active>.item>.text[data-v-d81de50c],.VPSidebarItem.level-2.has-active>.item>.text[data-v-d81de50c],.VPSidebarItem.level-3.has-active>.item>.text[data-v-d81de50c],.VPSidebarItem.level-4.has-active>.item>.text[data-v-d81de50c],.VPSidebarItem.level-5.has-active>.item>.text[data-v-d81de50c],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-d81de50c],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-d81de50c],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-d81de50c],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-d81de50c],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-d81de50c],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-d81de50c]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-d81de50c],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-d81de50c],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-d81de50c],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-d81de50c],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-d81de50c],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-d81de50c]{color:var(--vp-c-brand-1)}.caret[data-v-d81de50c]{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-d81de50c]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-d81de50c]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-d81de50c]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-d81de50c]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-d81de50c],.VPSidebarItem.level-2 .items[data-v-d81de50c],.VPSidebarItem.level-3 .items[data-v-d81de50c],.VPSidebarItem.level-4 .items[data-v-d81de50c],.VPSidebarItem.level-5 .items[data-v-d81de50c]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-d81de50c]{display:none}.no-transition[data-v-8d50c081] .caret-icon{transition:none}.group+.group[data-v-8d50c081]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-8d50c081]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-cbecfdd4]{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-cbecfdd4]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-cbecfdd4]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-cbecfdd4]{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-cbecfdd4]{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-cbecfdd4]{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-cbecfdd4]{outline:0}.VPSkipLink[data-v-0b0ada53]{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-0b0ada53]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-0b0ada53]{top:14px;left:16px}}.Layout[data-v-5e06b97a]{display:flex;flex-direction:column;min-height:100vh}.vp-sponsor-grid-image{max-height:36px!important;max-width:1000px!important}.box[data-v-9e57994f]{display:flex;flex-wrap:wrap;max-width:100%}.ext-item[data-v-9e57994f]{margin:4px 8px}h2[data-v-9e57994f]{margin-bottom:8px}.command-preview[data-v-9e57994f]{position:relative;padding:1.2rem;background:var(--vp-c-divider);border-radius:8px;word-break:break-all;font-family:monospace;overflow-wrap:break-word}.command-content[data-v-9e57994f]{padding-right:80px}.copy-btn[data-v-9e57994f]{position:absolute;top:.5rem;right:.5rem;padding:.5rem 1rem;background:var(--vp-button-brand-bg);color:var(--vp-button-brand-text);border:none;border-radius:6px;cursor:pointer;font-size:.875rem;font-weight:500;transition:all .2s ease}.copy-btn[data-v-9e57994f]:hover{background:var(--vp-button-brand-hover-bg);transform:translateY(-1px)}.copy-btn.copied[data-v-9e57994f]{background:var(--vp-c-green-1);color:#fff}.pre[data-v-9e57994f]{white-space:pre-wrap;word-break:break-word;overflow-wrap:break-word}.option-line[data-v-9e57994f]{padding:4px 8px}.option-title[data-v-9e57994f]{margin:4px 8px 4px 4px;font-weight:700}select[data-v-9e57994f]{border-radius:4px;border:1px solid var(--vp-c-divider);padding:0 4px;width:300px}.my-btn[data-v-9e57994f]{color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg);border-radius:8px;padding:0 16px;line-height:32px;font-size:14px;display:inline-block;text-align:center;font-weight:600;margin-right:8px;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s;cursor:pointer;border:1px solid var(--vp-button-alt-border)}.my-btn[data-v-9e57994f]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.my-btn[data-v-9e57994f]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.textarea[data-v-9e57994f]{border:1px solid var(--vp-c-divider);border-radius:4px;width:calc(100% - 12px);padding:4px 8px}.input[data-v-9e57994f]{display:block;border:1px solid var(--vp-c-divider);border-radius:4px;width:100%;padding:4px 8px}.command-container[data-v-9e57994f]{margin-bottom:24px}.modal-button[data-v-9e57994f]{padding:4px 8px;border-radius:4px;border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.modal-button[data-v-9e57994f]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.modal-button[data-v-9e57994f]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}@media (max-width: 768px){.command-preview[data-v-9e57994f]{padding:1rem}.copy-btn[data-v-9e57994f]{position:static;margin-top:.5rem;width:100%}.command-content[data-v-9e57994f]{padding-right:0}.box[data-v-9e57994f]{flex-direction:column}.ext-item[data-v-9e57994f]{margin:2px 4px}}.searchinput{border:1px solid var(--vp-c-divider)} diff --git a/assets/style.DJGBIVuD.css b/assets/style.DJGBIVuD.css new file mode 100644 index 00000000..54706611 --- /dev/null +++ b/assets/style.DJGBIVuD.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: #3c3c43;--vp-c-text-2: #67676c;--vp-c-text-3: #929295}.dark{--vp-c-text-1: #dfdfd6;--vp-c-text-2: #98989f;--vp-c-text-3: #6a6a71}: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, 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-2);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-2);--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)}:lang(es),:lang(pt){--vp-code-copy-copied-text-content: "Copiado"}:lang(fa){--vp-code-copy-copied-text-content: "کپی شد"}:lang(ko){--vp-code-copy-copied-text-content: "복사됨"}:lang(ru){--vp-code-copy-copied-text-content: "Скопировано"}:lang(zh){--vp-code-copy-copied-text-content: "已复制"}: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' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M15 12H3m14 6H3M21 6H3'/%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' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 12h14m-7-7l7 7l-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' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m9 18l6-6l-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' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%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.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z'/%3E%3C/g%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 12h14m-7-7v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2m0 16v2M4.93 4.93l1.41 1.41m11.32 11.32l1.41 1.41M2 12h2m16 0h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/g%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M12 3a6 6 0 0 0 9 9a9 9 0 1 1-9-9'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%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/g%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m5 8l6 6m-7 0l6-6l2-3M2 5h12M7 2h1m14 20l-5-10l-5 10m2-4h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' 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 2c-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' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.6'%3E%3Cpath d='m21 21l-4.34-4.34'/%3E%3Ccircle cx='11' cy='11' r='8' stroke-width='1.4'/%3E%3C/g%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%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 4h7m-7 5h7m-7 6h7m-7 5h7'/%3E%3C/g%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M10 5a2 2 0 0 0-1.344.519l-6.328 5.74a1 1 0 0 0 0 1.481l6.328 5.741A2 2 0 0 0 10 19h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2zm2 4l6 6m0-6l-6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='black' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3Cpath d='m9 10l-5 5l5 5'/%3E%3C/g%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%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/g%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cg fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'%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 14l2 2l4-4'/%3E%3C/g%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 .shiki span{color:var(--shiki-dark, inherit)}html:not(.dark) .shiki 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{-moz-tab-size:4;-o-tab-size:4;tab-size:4}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto;text-align:left}.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;-webkit-user-select:none;user-select:none;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(:is(.no-icon,svg a,:has(img,svg))):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]):not(:is(.no-icon,svg a,:has(img,svg))):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-c79a1216]{position:fixed;inset:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-c79a1216],.VPBackdrop.fade-leave-to[data-v-c79a1216]{opacity:0}.VPBackdrop.fade-leave-active[data-v-c79a1216]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-c79a1216]{display:none}}.NotFound[data-v-829df670]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-829df670]{padding:96px 32px 168px}}.code[data-v-829df670]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-829df670]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-829df670]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-829df670]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-829df670]{padding-top:20px}.link[data-v-829df670]{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-829df670]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-2d0bdf9b]{position:relative;z-index:1}.nested[data-v-2d0bdf9b]{padding-right:16px;padding-left:16px}.outline-link[data-v-2d0bdf9b]{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-2d0bdf9b]:hover,.outline-link.active[data-v-2d0bdf9b]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-2d0bdf9b]{padding-left:13px}.VPDocAsideOutline[data-v-60d5052e]{display:none}.VPDocAsideOutline.has-outline[data-v-60d5052e]{display:block}.content[data-v-60d5052e]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-60d5052e]{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-60d5052e]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-3f215769]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-3f215769]{flex-grow:1}.VPDocAside[data-v-3f215769] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-3f215769] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-3f215769] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-e98dd255]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-e98dd255]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-e257564d]{margin-top:64px}.edit-info[data-v-e257564d]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-e257564d]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-e257564d]{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-e257564d]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-e257564d]{margin-right:8px}.prev-next[data-v-e257564d]{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-e257564d]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-e257564d]{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-e257564d]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-e257564d]{margin-left:auto;text-align:right}.desc[data-v-e257564d]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-e257564d]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-7011f0d8]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-7011f0d8]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-7011f0d8]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-7011f0d8]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-7011f0d8]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-7011f0d8]{display:flex;justify-content:center}.VPDoc .aside[data-v-7011f0d8]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-7011f0d8]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-7011f0d8]{max-width:1104px}}.container[data-v-7011f0d8]{margin:0 auto;width:100%}.aside[data-v-7011f0d8]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-7011f0d8]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-7011f0d8]{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-7011f0d8]::-webkit-scrollbar{display:none}.aside-curtain[data-v-7011f0d8]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%);pointer-events:none}.aside-content[data-v-7011f0d8]{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-7011f0d8]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-7011f0d8]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-7011f0d8]{order:1;margin:0;min-width:640px}}.content-container[data-v-7011f0d8]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-7011f0d8]{max-width:688px}.VPButton[data-v-01bff58b]{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-01bff58b]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-01bff58b]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-01bff58b]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-01bff58b]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-01bff58b]: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-01bff58b]: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-01bff58b]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-01bff58b]: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-01bff58b]: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-01bff58b]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-01bff58b]: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-01bff58b]: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-8426fc1a]{display:none}.dark .VPImage.light[data-v-8426fc1a]{display:none}.VPHero[data-v-1e96e9e8]{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-1e96e9e8]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-1e96e9e8]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-1e96e9e8]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-1e96e9e8]{flex-direction:row}}.main[data-v-1e96e9e8]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-1e96e9e8]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-1e96e9e8]{text-align:left}}@media (min-width: 960px){.main[data-v-1e96e9e8]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-1e96e9e8]{max-width:592px}}.heading[data-v-1e96e9e8]{display:flex;flex-direction:column}.name[data-v-1e96e9e8],.text[data-v-1e96e9e8]{width:fit-content;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-1e96e9e8],.VPHero.has-image .text[data-v-1e96e9e8]{margin:0 auto}.name[data-v-1e96e9e8]{color:var(--vp-home-hero-name-color)}.clip[data-v-1e96e9e8]{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-1e96e9e8],.text[data-v-1e96e9e8]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-1e96e9e8],.text[data-v-1e96e9e8]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-1e96e9e8],.VPHero.has-image .text[data-v-1e96e9e8]{margin:0}}.tagline[data-v-1e96e9e8]{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-1e96e9e8]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-1e96e9e8]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-1e96e9e8]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-1e96e9e8]{margin:0}}.actions[data-v-1e96e9e8]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-1e96e9e8]{justify-content:center}@media (min-width: 640px){.actions[data-v-1e96e9e8]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-1e96e9e8]{justify-content:flex-start}}.action[data-v-1e96e9e8]{flex-shrink:0;padding:6px}.image[data-v-1e96e9e8]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-1e96e9e8]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-1e96e9e8]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-1e96e9e8]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-1e96e9e8]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-1e96e9e8]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-1e96e9e8]{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-1e96e9e8]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-1e96e9e8]{width:320px;height:320px}}[data-v-1e96e9e8] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;width:100%;height:100%;object-fit:contain;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-1e96e9e8] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-1e96e9e8] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-5219619b]{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-5219619b]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-5219619b]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-5219619b]>.VPImage{margin-bottom:20px}.icon[data-v-5219619b]{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-5219619b]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-5219619b]{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-5219619b]{padding-top:8px}.link-text-value[data-v-5219619b]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-5219619b]{margin-left:6px}.VPFeatures[data-v-a6181336]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-a6181336]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-a6181336]{padding:0 64px}}.container[data-v-a6181336]{margin:0 auto;max-width:1152px}.items[data-v-a6181336]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-a6181336]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-a6181336],.item.grid-4[data-v-a6181336],.item.grid-6[data-v-a6181336]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-a6181336],.item.grid-4[data-v-a6181336]{width:50%}.item.grid-3[data-v-a6181336],.item.grid-6[data-v-a6181336]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-a6181336]{width:25%}}.container[data-v-8e2d4988]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-8e2d4988]{padding:0 48px}}@media (min-width: 960px){.container[data-v-8e2d4988]{width:100%;padding:0 64px}}.vp-doc[data-v-8e2d4988] .VPHomeSponsors,.vp-doc[data-v-8e2d4988] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-8e2d4988] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-8e2d4988] .VPHomeSponsors a,.vp-doc[data-v-8e2d4988] .VPTeamPage a{text-decoration:none}.VPHome[data-v-8b561e3d]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-8b561e3d]{margin-bottom:128px}}.VPContent[data-v-aff0b8d7]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-aff0b8d7]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-aff0b8d7]{margin:0}@media (min-width: 960px){.VPContent[data-v-aff0b8d7]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-aff0b8d7]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-aff0b8d7]{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-c3855bb3]{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-c3855bb3]{display:none}.VPFooter[data-v-c3855bb3] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-c3855bb3] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-c3855bb3]{padding:32px}}.container[data-v-c3855bb3]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-c3855bb3],.copyright[data-v-c3855bb3]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown button[data-v-0bf0e06f]{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-0bf0e06f]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-0bf0e06f]{color:var(--vp-c-text-1)}.icon[data-v-0bf0e06f]{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-0bf0e06f]{font-size:14px}.icon[data-v-0bf0e06f]{font-size:16px}}.open>.icon[data-v-0bf0e06f]{transform:rotate(90deg)}.items[data-v-0bf0e06f]{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-0bf0e06f]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-0bf0e06f]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-0bf0e06f]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-0bf0e06f]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-0bf0e06f]{transition:all .2s ease-out}.flyout-leave-active[data-v-0bf0e06f]{transition:all .15s ease-in}.flyout-enter-from[data-v-0bf0e06f],.flyout-leave-to[data-v-0bf0e06f]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-8acdfeb5]{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-8acdfeb5]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-8acdfeb5]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-8acdfeb5]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-8acdfeb5]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-8acdfeb5]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-8acdfeb5]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-8acdfeb5]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-8acdfeb5]{display:flex;align-items:center;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-8acdfeb5]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 960px){.menu[data-v-8acdfeb5]{display:none}}.menu-icon[data-v-8acdfeb5]{margin-right:8px;font-size:14px}.menu[data-v-8acdfeb5],[data-v-8acdfeb5] .VPLocalNavOutlineDropdown>button{padding:12px 24px 11px}@media (min-width: 768px){.menu[data-v-8acdfeb5],[data-v-8acdfeb5] .VPLocalNavOutlineDropdown>button{padding:12px 32px 11px}}.VPSwitch[data-v-1d5665e3]{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-1d5665e3]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-1d5665e3]{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-1d5665e3]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-1d5665e3] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-1d5665e3] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-5337faa4]{opacity:1}.moon[data-v-5337faa4],.dark .sun[data-v-5337faa4]{opacity:0}.dark .moon[data-v-5337faa4]{opacity:1}.dark .VPSwitchAppearance[data-v-5337faa4] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-6c893767]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-6c893767]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-cd834e02]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-cd834e02]{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-cd834e02]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-cd834e02]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-1963e1bb]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-1963e1bb]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-1963e1bb]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-1963e1bb]{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-25a6cce8]{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-25a6cce8] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-25a6cce8] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-25a6cce8] .group:last-child{padding-bottom:0}.VPMenu[data-v-25a6cce8] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-25a6cce8] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-25a6cce8] .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-25a6cce8] .action{padding-left:24px}.VPFlyout[data-v-42cb505d]{position:relative}.VPFlyout[data-v-42cb505d]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-42cb505d]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-42cb505d]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-42cb505d]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-42cb505d]{color:var(--vp-c-brand-2)}.button[aria-expanded=false]+.menu[data-v-42cb505d]{opacity:0;visibility:hidden;transform:translateY(0)}.VPFlyout:hover .menu[data-v-42cb505d],.button[aria-expanded=true]+.menu[data-v-42cb505d]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-42cb505d]{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-42cb505d]{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-42cb505d]{margin-right:0;font-size:16px}.text-icon[data-v-42cb505d]{margin-left:4px;font-size:14px}.icon[data-v-42cb505d]{font-size:20px;transition:fill .25s}.menu[data-v-42cb505d]{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-591a6b30]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-591a6b30]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-591a6b30]>svg,.VPSocialLink[data-v-591a6b30]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-d07f11e6]{display:flex;justify-content:center}.VPNavBarExtra[data-v-bb2aa2f0]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-bb2aa2f0]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-bb2aa2f0]{display:none}}.trans-title[data-v-bb2aa2f0]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-bb2aa2f0],.item.social-links[data-v-bb2aa2f0]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-bb2aa2f0]{min-width:176px}.appearance-action[data-v-bb2aa2f0]{margin-right:-2px}.social-links-list[data-v-bb2aa2f0]{margin:-4px -8px}.VPNavBarHamburger[data-v-e5dd9c1c]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-e5dd9c1c]{display:none}}.container[data-v-e5dd9c1c]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-e5dd9c1c]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-e5dd9c1c]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-e5dd9c1c]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-e5dd9c1c]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-e5dd9c1c]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-e5dd9c1c]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-e5dd9c1c],.VPNavBarHamburger.active:hover .middle[data-v-e5dd9c1c],.VPNavBarHamburger.active:hover .bottom[data-v-e5dd9c1c]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-e5dd9c1c],.middle[data-v-e5dd9c1c],.bottom[data-v-e5dd9c1c]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-e5dd9c1c]{top:0;left:0;transform:translate(0)}.middle[data-v-e5dd9c1c]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-e5dd9c1c]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-e56f3d57]{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-e56f3d57],.VPNavBarMenuLink[data-v-e56f3d57]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-39714824]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-39714824]{display:flex}}/*! @docsearch/css 4.0.0-beta.8 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#003dff;--docsearch-soft-primary-color:rgba(0,61,255,.1);--docsearch-subtle-color:#d6d6e7;--docsearch-text-color:#36395a;--docsearch-error-color:#ef5350;--docsearch-success-color:#e8f5e9;--docsearch-secondary-text-color:#5a5e9a;--docsearch-background-color:#f5f5fa;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-focus-color:#005fcc;--docsearch-highlight-color:#003dff;--docsearch-muted-color:#9698c3;--docsearch-muted-color-darker:rgba(120,122,165,.25);--docsearch-icon-color:#5a5e9a;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#003dff;--docsearch-border-radius:4px;--docsearch-modal-width:800px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:rgba(0,0,0,.2) 0px 12px 28px 0px,rgba(0,0,0,.1) 0px 2px 4px 0px,hsla(0,0%,100%,.05) 0px 0px 0px 1px inset;--docsearch-searchbox-height:56px;--docsearch-searchbox-initial-height:56px;--docsearch-searchbox-background:#ffffffa6;--docsearch-searchbox-focus-background:#ffffffa6;--docsearch-actions-width:99px;--docsearch-actions-height:44px;--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-highlight-color:rgba(0,61,255,.1);--docsearch-hit-background:#fff;--docsearch-key-background:#f5f5fa;--docsearch-key-color:#5a5e9a;--docsearch-key-pressed-shadow:inset 0 2px 4px rgba(120,122,165,.25);--docsearch-footer-height:52px;--docsearch-footer-background:#ffffffa6;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12);--fav-out-dur:.16s;--del-dur:.15s;--ease-smooth:cubic-bezier(.25,.8,.4,1);--ease-fast:cubic-bezier(.45,.15,.6,.9);--shadow-pop:0 4px 12px rgba(0,0,0,.06);--shimmer-bg:linear-gradient(90deg,#e0e3e8 0%,var(--docsearch-muted-color) 20%,var(--docsearch-muted-color) 60%,#e0e3e8 95%)}html.dark{--docsearch-text-color:#c4c7dc;--docsearch-secondary-text-color:#b6b7d5;--docsearch-subtle-color:#212139;--docsearch-error-color:#ef5350;--docsearch-success-color:rgba(67,160,71,.2);--docsearch-highlight-color:#457aff;--docsearch-focus-color:#9ac8ff;--docsearch-background-color:#36395a;--docsearch-icon-color:#b6b7d5;--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:#000000a6;--docsearch-searchbox-focus-background:#000000a6;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-background:#36395a;--docsearch-key-color:#b6b7d5;--docsearch-key-pressed-shadow:inset 0 2px 4px rgba(12,13,20,.4);--docsearch-footer-background:#000000a6;--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;--shimmer-bg:linear-gradient(90deg,#e0e3e8 0%,var(--docsearch-muted-color) 20%,var(--docsearch-muted-color) 60%,#e0e3e8 95%)}.DocSearch-Button{all:unset;align-items:center;background-color:var(--docsearch-searchbox-background);border:1px solid var(--docsearch-subtle-color);border-radius:4px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;height:36px;justify-content:space-between;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button-Container{align-items:center;display:flex;height:100%}.DocSearch-Button-Container svg{color:var(--docsearch-muted-color)}.DocSearch-Back-Icon,.DocSearch-Search-Icon{color:var(--docsearch-highlight-color);stroke-width:1.6}.DocSearch-Button-Placeholder{color:var(--docsearch-muted-color);display:inline-block;font-size:1rem;line-height:normal;padding:0 12px 0 8px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-background);border:0;border:1px solid color-mix(in srgb,var(--docsearch-subtle-color) 20%,transparent);border-radius:4px;box-shadow:none!important;color:var(--docsearch-key-color);display:flex;font-size:14px;height:24px;justify-content:center;position:relative;transition-duration:.1s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);width:24px}.DocSearch-Button-Key--ctrl{width:33px}.DocSearch-Button-Key:first-child{margin-right:.4em}@media (prefers-reduced-motion){.DocSearch-Button-Key{transition:none}}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow)!important;transform:translateY(1px)}@media (max-width:768px){.DocSearch-Button{width:auto}.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:400}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{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:4px;box-shadow:var(--docsearch-modal-shadow);display:flex;flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex}.DocSearch-SearchBar-Magnifier{color:var(--docsearch-highlight-color)}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-bottom:1px solid var(--docsearch-subtle-color);border-radius:4px 4px 0 0;display:flex;height:var( --docsearch-searchbox-height,var(--docsearch-searchbox-initial-height) );margin:0;min-height:var(--docsearch-searchbox-initial-height);padding-block:var(--docsearch-spacing);padding-inline:16px;position:relative;width:100%}.DocSearch-Input{appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;font-weight:300;height:100%;line-height:1.4;outline:none;overflow-y:hidden;padding-block-start:4px;padding-inline-start:8px;resize:none;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-Actions{align-items:center;display:flex;gap:16px;height:var(--docsearch-actions-height);justify-content:flex-end;padding:0 2px;width:var(--docsearch-actions-width)}.DocSearch-Divider{border-left:1px solid var(--docsearch-subtle-color);height:16px}.DocSearch-AskAi-Return,.DocSearch-Close,.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-StreamingIndicator{margin:0;padding:0}.DocSearch-AskAi-Return{cursor:pointer}.DocSearch-AskAi-Return,.DocSearch-Close,.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-StreamingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Close,.DocSearch-StreamingIndicator{animation: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-AskAi-Return,.DocSearch-Close,.DocSearch-StreamingIndicator{animation:fade-in .1s ease-in forwards;appearance:none;background:none;border:none;border-radius:var(--docsearch-border-radius);color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-AskAi-Return[hidden],.DocSearch-Close[hidden],.DocSearch-StreamingIndicator[hidden]{display:none}.DocSearch-AskAi-Return:hover,.DocSearch-Close:hover,.DocSearch-StreamingIndicator:hover{background:var(--docsearch-soft-primary-color);color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{color:var(--docsearch-icon-color);height:24px;width:24px}.DocSearch-Form:focus-within .DocSearch-MagnifierLabel svg{color:var(--docsearch-highlight-color)}.DocSearch-Clear{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;flex:none;font:inherit;font-size:.9em;font-weight:300;height:28px;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Clear:focus-visible,.DocSearch-Close:focus-visible{border-radius:4px;outline:2px solid var(--docsearch-focus-color);outline-offset:1px}.DocSearch-Dropdown{height:calc(var(--docsearch-modal-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-Container ul{list-style:none;margin:0;padding:0}.DocSearch-Label{color:var(--docsearch-secondary-text-color);font-size:.875em;font-weight:400;line-height:1.6em}.DocSearch-Help,.DocSearch-NoResults-Help{color:var(--docsearch-secondary-text-color);font-size:.8em;font-weight:300;line-height:1.5em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{color:var(--docsearch-text-color);font-size:1.1em;font-weight:300;line-height:.5em;vertical-align:middle}.DocSearch-Title strong{font-weight:500}.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;scroll-margin-top:40px}.DocSearch-Hit:first-of-type{margin-top:4px}@keyframes hit-exit{0%{max-height:4rem;opacity:1;transform:translateY(0)}60%{opacity:0;transform:translateY(-6px)}to{margin:0;max-height:0;opacity:0;transform:translateY(-6px)}}@media (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting,.DocSearch-Hit--favoriting{animation:none}}.DocSearch-Hit--favoriting{animation:favOut var(--fav-out-dur) var(--ease-smooth) forwards;transform-origin:center}@keyframes favOut{0%{box-shadow:none;opacity:1;transform:scale(1)}30%{box-shadow:var(--shadow-pop);transform:scale(1.01)}to{box-shadow:none;margin:0;max-height:0;opacity:0;transform:scale(.6)}}.DocSearch-Hit--deleting{animation:hitExit var(--del-dur) var(--ease-fast) forwards}@keyframes hitExit{0%{max-height:4rem;opacity:1;transform:translateY(0)}to{margin:0;max-height:0;opacity:0;transform:translateY(-6px)}}.DocSearch-Hit a,.DocSearch-Hit--AskAI{background:var(--docsearch-hit-background);border-radius:4px;cursor:pointer;display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-text-color);font-size:.9em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 4px;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] .DocSearch-Hit--AskAI,.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-hit-highlight-color)!important}.DocSearch-Hit mark{color:var(--docsearch-highlight-color);text-decoration:underline;text-underline-offset:.3em}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-text-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{color:var(--docsearch-secondary-text-color);height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;color:var(--docsearch-muted-color);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{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}.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:400;gap:4px;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-secondary-text-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title{color:var(--docsearch-text-color)}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-highlight-color)}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-AskAiScreen,.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{align-items:center;color:var(--docsearch-secondary-text-color);display:flex;flex-direction:column;font-size:1.25em;font-weight:400;justify-content:center;margin:0 auto;text-align:center;width:80%}.DocSearch-AskAiScreen,.DocSearch-ErrorScreen,.DocSearch-NoResults{max-height:80%}.DocSearch-StartScreen{height:100%}.DocSearch-NoResults{gap:.8em;margin-top:2em}.DocSearch-NoResults--withAskAi{justify-content:flex-start;margin-top:0}.DocSearch-AskAiScreen,.DocSearch-ErrorScreen,.DocSearch-StartScreen{gap:24px}.DocSearch-StartScreen-Icon{height:64px;width:64px;stroke:var(--docsearch-icon-color)}.DocSearch-Screen-Icon{color:var(--docsearch-icon-color)}.DocSearch-NoResults-Prefill-List{display:flex;flex-direction:column;gap:12px;text-align:center}.DocSearch-NoResults-Prefill-List-Items{display:flex;flex-direction:column;gap:2px}.DocSearch-NoResults-Prefill-List-Items p{align-items:center;display:flex;margin:0;text-align:left}.DocSearch-Prefill{align-items:center;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-flex;font-size:.8em;font-weight:300;gap:4px;height:40px;padding:0 4px}.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 4px 4px;border-top:1px solid var(--docsearch-subtle-color);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;gap:16px;list-style:none;margin:0;padding:0}.DocSearch-Commands li,.DocSearch-Commands-Key{align-items:center;display:flex}.DocSearch-Commands-Key{background-color:var(--docsearch-background-color);border:0;border-radius:2px;box-shadow:none!important;color:var(--docsearch-icon-color);height:24px;justify-content:center;margin-right:4px;width:24px}.DocSearch-Commands-Key:last-of-type{margin-right:8px}.DocSearch-Escape-Key{font-size:10px;font-weight:300;letter-spacing:normal;line-height:16px;text-align:center;text-transform:uppercase}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}.DocSearch-AskAi-Section{display:flex;flex-direction:column;gap:8px;padding:12px 0}.DocSearch-Hit-AskAIButton{align-items:center;color:var(--docsearch-text-color);display:flex;flex-direction:row}.DocSearch-Hit-AskAIButton-icon{color:var(--docsearch-icon-color);flex-shrink:0;margin-right:12px}.DocSearch-Hit-AskAIButton-title{color:var(--docsearch-hit-color);display:flex;flex:1 1 auto;font-weight:400;gap:4px;line-height:1.2em;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-AskAIButton-title-query{background:none;margin-left:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.DocSearch-AskAiScreen-Container{display:flex;flex-direction:column;gap:0;height:100%;justify-content:flex-start;padding:0;text-align:left;width:100%}.DocSearch-AskAiScreen-Disclaimer{align-self:flex-start;display:flex;font-size:.6em;font-weight:300;margin:0;padding:1.5em 0 .5em;text-align:left}.DocSearch-AskAiScreen-Body{gap:24px;width:100%}.DocSearch-AskAiScreen-Body,.DocSearch-AskAiScreen-Response,.DocSearch-AskAiScreen-Response-Container{display:flex;flex-direction:column}.DocSearch-AskAiScreen-Response{align-self:flex-start;background:var(--docsearch-hit-background);border-radius:4px;color:var(--docsearch-text-color);font-size:.8em;gap:16px;margin-bottom:8px;padding:24px;width:100%}.DocSearch-AskAiScreen-Query{font-size:1.5em;font-weight:600;line-break:anywhere;margin:0}.DocSearch-AskAiScreen-Answer{line-height:1.5}.DocSearch-AskAiScreen-Answer,.DocSearch-AskAiScreen-ThinkingDots{color:var(--docsearch-secondary-text-color);font-weight:400;margin:0}.DocSearch-AskAiScreen-ThinkingDots{font-size:.8em}.DocSearch-AskAiScreen-Answer-Footer{align-items:center;display:flex;flex-direction:row;gap:8px;justify-content:space-between}.DocSearch-AskAiScreen-Actions{align-items:center;display:flex;flex-direction:row;gap:12px;margin-left:auto}.DocSearch-AskAiScreen-ActionButton{align-items:center;background:none;border:none;border-radius:4px;cursor:pointer;display:flex;justify-content:center;margin:0;padding:4px;transition:background-color .2s ease;width:24px}.DocSearch-AskAiScreen-ActionButton:hover{background:var(--docsearch-hit-highlight-color)}.DocSearch-AskAiScreen-ActionButton svg{height:20px;width:20px;stroke-width:1.5;color:var(--docsearch-icon-color)}.DocSearch-AskAiScreen-CopyButton--copied{background-color:var(--docsearch-success-color);cursor:default}.DocSearch-AskAiScreen-Error{align-items:baseline;background-color:#ef53501a;border-radius:4px;color:var(--docsearch-error-color);display:flex;font-size:1em;font-weight:400;gap:8px;padding:1em}.DocSearch-AskAiScreen-Error svg{flex-shrink:0;height:16px;width:16px}.DocSearch-AskAiScreen-Error p{margin:0}.DocSearch-AskAiScreen-Error .DocSearch-Markdown-Content{color:var(--docsearch-error-color)}.DocSearch-AskAiScreen-FeedbackText{color:var(--docsearch-muted-color);font-size:.7em;font-weight:400;margin:0}.DocSearch-AskAiScreen-FeedbackText--visible{animation:fade-in .3s ease-in forwards}.DocSearch-AskAiScreen-RelatedSources{display:flex;flex-direction:column;gap:4px;width:100%}.DocSearch-AskAiScreen-RelatedSources-List{display:flex;flex-direction:row;flex-wrap:wrap;gap:12px;width:100%}.DocSearch-AskAiScreen-RelatedSources-Title{color:var(--docsearch-secondary-color);font-size:.7em;font-weight:400;margin:0;padding:6px 0}.DocSearch-AskAiScreen-RelatedSources-NoResults{color:var(--docsearch-text-color);font-size:.8rem;font-weight:400;margin:0}.DocSearch-AskAiScreen-RelatedSources-Error{color:var(--docsearch-error-color);font-size:.8rem;font-weight:400;margin:0}.DocSearch-AskAiScreen-RelatedSources-Item-Link{align-items:center;background:var(--docsearch-hit-background);border-radius:4px;color:var(--docsearch-text-color);display:flex;font-size:.75em;gap:6px;max-width:70%;padding:12px 8px;text-decoration:none;transition:background-color .2s ease}.DocSearch-AskAiScreen-RelatedSources-Item-Link svg{color:var(--docsearch-icon-color);flex-shrink:0;stroke-width:1.2}.DocSearch-AskAiScreen-RelatedSources-Item-Link span{flex:1 1 0;font-weight:500;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.DocSearch-AskAiScreen-ExchangesList{display:flex;flex-direction:column;gap:24px;margin:8px 0}.DocSearch-AskAiScreen-RelatedSources-Item-Link:hover{background:var(--docsearch-hit-highlight-color)}.DocSearch-Markdown-Content{color:var(--docsearch-text-color);font-size:1em;line-height:1.6;word-wrap:break-word}.DocSearch-Markdown-Content--streaming{animation:fade-in .3s ease-in-out both}.DocSearch-Markdown-Content p{margin:1.2em 0}.DocSearch-Markdown-Content p:last-child{margin-bottom:0}.DocSearch-Markdown-Content p:first-child{margin-top:0}.DocSearch-Markdown-Content code{border-radius:3px;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:.9em;letter-spacing:normal;margin:0;padding:.2em 0}.DocSearch-Markdown-Content code,.DocSearch-Markdown-Content pre{background-color:var(--docsearch-key-background);color:var(--docsearch-text-color)}.DocSearch-Markdown-Content pre{border-radius:6px;margin:1.5em 0;overflow-x:auto;padding:1.2em}.DocSearch-Markdown-Content pre code{background-color:transparent;border-radius:0;color:inherit;font-size:.8em;margin:0;padding:0;white-space:pre-wrap;word-wrap:break-word;line-height:1.5}.DocSearch-Markdown-Content h1,.DocSearch-Markdown-Content h2,.DocSearch-Markdown-Content h3,.DocSearch-Markdown-Content h4,.DocSearch-Markdown-Content h5,.DocSearch-Markdown-Content h6{color:var(--docsearch-text-color);font-weight:600;letter-spacing:-.02em;line-height:1.3;margin:1em 0}.DocSearch-Markdown-Content h1{font-size:1.5em}.DocSearch-Markdown-Content h2{font-size:1.2em}.DocSearch-Markdown-Content h3{font-size:1em}.DocSearch-Markdown-Content h4{font-size:.9em}.DocSearch-Markdown-Content h5,.DocSearch-Markdown-Content h6{font-size:.8em}.DocSearch-Markdown-Content ol,.DocSearch-Markdown-Content ul{color:var(--docsearch-text-color);margin:1.2em 0;padding-left:1.5em}.DocSearch-Markdown-Content ul{list-style-type:disc}.DocSearch-Markdown-Content ol{list-style-type:decimal}.DocSearch-Markdown-Content li{color:var(--docsearch-text-color);line-height:1.6;margin:.5em 0;padding-left:.3em}.DocSearch-Markdown-Content li>ol,.DocSearch-Markdown-Content li>ul{margin:.5em}.DocSearch-Markdown-Content li::marker{color:var(--docsearch-muted-color)}.DocSearch-Markdown-Content a{color:var(--docsearch-highlight-color);text-decoration:none;transition:all .2s ease}.DocSearch-Markdown-Content a:hover{opacity:.9;text-decoration:underline}.DocSearch-Markdown-Content blockquote{border-left:4px solid var(--docsearch-hit-highlight-color);color:var(--docsearch-secondary-text-color);font-style:italic;margin:1.5em 0;padding:.5em 0 .5em 1em}.DocSearch-Markdown-Content hr{border:none;border-top:1px solid var(--docsearch-subtle-color);margin:2em 0}.DocSearch-Markdown-Content table{border-collapse:collapse;margin:1.5em 0;width:100%}.DocSearch-Markdown-Content td,.DocSearch-Markdown-Content th{border:1px solid var(--docsearch-subtle-color);padding:.75em;text-align:left}.DocSearch-Markdown-Content th{background-color:var(--docsearch-hit-background);font-weight:600}.DocSearch-AskAiScreen-MessageContent-Reasoning{align-items:center;color:var(--docsearch-muted-color);display:flex;font-size:1em;gap:4px}.DocSearch-AskAiScreen-MessageContent-Tool{align-items:center;color:var(--docsearch-muted-color);display:flex;padding:1em 0;width:100%}.DocSearch-AskAiScreen-MessageContent-Tool.Tool--Result{padding-top:0}.DocSearch-AskAiScreen-MessageContent-Tool>svg{color:var(--docsearch-icon-color);margin-right:8px}.DocSearch-AskAiScreen-MessageContent-Tool-Query{color:var(--docsearch-muted-color);transition:box-shadow .2s ease}.DocSearch-AskAiScreen-MessageContent-Tool-Query svg{color:var(--docsearch-muted-color)}.DocSearch-AskAiScreen-MessageContent-Tool-Query:hover{box-shadow:0 1px 0 0 var(--docsearch-highlight-color);color:var(--docsearch-highlight-color);cursor:pointer}.DocSearch-AskAiScreen-MessageContent-Tool-Query:hover svg{color:var(--docsearch-highlight-color)}.DocSearch-AskAiScreen-SmallerLoadingIcon{height:16px;width:16px}.shimmer{background:var(--shimmer-bg);background-clip:text;-webkit-background-clip:text;background-size:200% auto;color:transparent;display:flex;-webkit-text-fill-color:transparent;animation:shimmerText 2.5s linear infinite;pointer-events:none}@keyframes shimmerText{0%{background-position:200% 0}to{background-position:-200% 0}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes pulse{0%,to{opacity:.3}50%{opacity:.6}}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:48px}.DocSearch-Input{font-size:1rem}.DocSearch-Hit-AskAIButton-icon{margin-right:8px}body:has(.DocSearch-Container){overflow:hidden;position:fixed}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:calc(var(--docsearch-vh, 1vh)*100);height:100dvh}.DocSearch-Footer{border-radius:0;bottom:0;position:static}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:calc(var(--docsearch-vh, 1vh)*100);height:100dvh;margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:none}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}.DocSearch-AskAiScreen-Response-Container{flex-direction:column}.DocSearch-AskAiScreen-RelatedSources,.DocSearch-AskAiScreen-Response{width:100%}}.DocSearch-CodeSnippet{position:relative}.DocSearch-CodeSnippet-CopyButton{align-items:center;background:var(--docsearch-key-background);border:none;border-radius:4px;color:var(--docsearch-text-color);cursor:pointer;display:flex;font-size:.75em;padding:.2em .6em;position:absolute;right:8px;top:8px;transition:opacity .2s ease}.DocSearch-CodeSnippet-CopyButton:hover{opacity:.8}.DocSearch-CodeSnippet-CopyButton:active{opacity:.6}.DocSearch-CodeSnippet-CopyButton svg{height:16px;margin-right:4px;width:16px}.DocSearch-CodeSnippet-CheckIcon,.DocSearch-CodeSnippet-CopyButton--copied .DocSearch-CodeSnippet-CopyIcon{display:none}.DocSearch-CodeSnippet-CopyButton--copied .DocSearch-CodeSnippet-CheckIcon{display:inline-block}.DocSearch-Markdown-Content--streaming .DocSearch-CodeSnippet-CopyButton{display:none}[class*=DocSearch]{--docsearch-actions-height: auto;--docsearch-actions-width: auto;--docsearch-background-color: var(--vp-c-bg-soft);--docsearch-container-background: var(--vp-backdrop-bg-color);--docsearch-focus-color: var(--vp-c-brand-1);--docsearch-footer-background: var(--vp-c-bg);--docsearch-highlight-color: var(--vp-c-brand-1);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-1);--docsearch-hit-highlight-color: var(--vp-c-brand-soft);--docsearch-icon-color: var(--vp-c-text-2);--docsearch-key-background: transparent;--docsearch-key-color: var(--vp-c-text-2);--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-searchbox-focus-background: transparent;--docsearch-secondary-text-color: var(--vp-c-text-2);--docsearch-soft-primary-color: var(--vp-c-brand-soft);--docsearch-subtle-color: var(--vp-c-divider);--docsearch-success-color: var(--vp-c-brand-soft);--docsearch-text-color: var(--vp-c-text-1)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none}.DocSearch-Clear{padding:0 8px}.DocSearch-Commands-Key{padding:4px;border:1px solid var(--docsearch-subtle-color);border-radius:4px}.DocSearch-Hit a:focus-visible{outline:2px solid var(--docsearch-focus-color)}.DocSearch-Logo [class^=cls-]{fill:currentColor}.DocSearch-SearchBar+.DocSearch-Footer{border-top-color:transparent}.DocSearch-Title{font-size:revert;line-height:revert}.DocSearch-Button{--docsearch-muted-color: var(--docsearch-text-color);--docsearch-searchbox-background: transparent;width:auto;padding:2px 12px;border:none;border-radius:8px}.DocSearch-Search-Icon{color:inherit!important;width:20px;height:20px}@media (min-width: 768px){.DocSearch-Button{--docsearch-muted-color: var(--docsearch-secondary-text-color);--docsearch-searchbox-background: var(--vp-c-bg-alt)}.DocSearch-Search-Icon{width:15px;height:15px}.DocSearch-Button-Placeholder{font-size:13px}}.DocSearch-Button-Keys{min-width:auto;margin:0;padding:4px 6px;background-color:var(--docsearch-key-background);border:1px solid var(--docsearch-subtle-color);border-radius:4px;font-size:12px;line-height:1;color:var(--docsearch-key-color)}.DocSearch-Button-Keys>*{display:none}.DocSearch-Button-Keys:after{direction:ltr;content:"Ctrl K"}.mac .DocSearch-Button-Keys:after{content:"⌘ K"}.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}}.VPNavBarSocialLinks[data-v-0394ad82]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-0394ad82]{display:flex;align-items:center}}.title[data-v-1e38c6bc]{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-1e38c6bc]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-1e38c6bc]{border-bottom-color:var(--vp-c-divider)}}[data-v-1e38c6bc] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-88af2de4]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-88af2de4]{display:flex;align-items:center}}.title[data-v-88af2de4]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-2a96a3d0]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-2a96a3d0]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-2a96a3d0]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-2a96a3d0]:not(.home){background-color:transparent}.VPNavBar[data-v-2a96a3d0]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-2a96a3d0]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-2a96a3d0]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-2a96a3d0]{padding:0}}.container[data-v-2a96a3d0]{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-2a96a3d0],.container>.content[data-v-2a96a3d0]{pointer-events:none}.container[data-v-2a96a3d0] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-2a96a3d0]{max-width:100%}}.title[data-v-2a96a3d0]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-2a96a3d0]{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-2a96a3d0]{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-2a96a3d0]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-2a96a3d0]{position:relative;z-index:1;padding-left:var(--vp-sidebar-width)}.VPNavBar.has-sidebar .content-body[data-v-2a96a3d0]{padding-right:32px}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-2a96a3d0]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}.VPNavBar.has-sidebar .content-body[data-v-2a96a3d0]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px)}}.content-body[data-v-2a96a3d0]{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-2a96a3d0]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-2a96a3d0]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-2a96a3d0]{column-gap:.5rem}}.menu+.translations[data-v-2a96a3d0]:before,.menu+.appearance[data-v-2a96a3d0]:before,.menu+.social-links[data-v-2a96a3d0]:before,.translations+.appearance[data-v-2a96a3d0]:before,.appearance+.social-links[data-v-2a96a3d0]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-2a96a3d0]:before,.translations+.appearance[data-v-2a96a3d0]:before{margin-right:16px}.appearance+.social-links[data-v-2a96a3d0]:before{margin-left:16px}.social-links[data-v-2a96a3d0]{margin-right:-8px}.divider[data-v-2a96a3d0]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-2a96a3d0]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-2a96a3d0]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-2a96a3d0]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-2a96a3d0]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-2a96a3d0]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-2a96a3d0]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-b44890b2]{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-b44890b2]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-83cc0379]{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-83cc0379]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-aa6008ea]{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-aa6008ea]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-4b7a798b]{display:block}.title[data-v-4b7a798b]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-956364f9]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-956364f9]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-956364f9]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-956364f9]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-956364f9]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-956364f9]{transform:rotate(45deg)}.button[data-v-956364f9]{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-956364f9]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-956364f9]{transition:transform .25s}.group[data-v-956364f9]:first-child{padding-top:0}.group+.group[data-v-956364f9],.group+.item[data-v-956364f9]{padding-top:4px}.VPNavScreenTranslations[data-v-858fe1a4]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-858fe1a4]{height:auto}.title[data-v-858fe1a4]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-858fe1a4]{font-size:16px}.icon.lang[data-v-858fe1a4]{margin-right:8px}.icon.chevron[data-v-858fe1a4]{margin-left:4px}.list[data-v-858fe1a4]{padding:4px 0 0 24px}.link[data-v-858fe1a4]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-f2779853]{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-f2779853],.VPNavScreen.fade-leave-active[data-v-f2779853]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-f2779853],.VPNavScreen.fade-leave-active .container[data-v-f2779853]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-f2779853],.VPNavScreen.fade-leave-to[data-v-f2779853]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-f2779853],.VPNavScreen.fade-leave-to .container[data-v-f2779853]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-f2779853]{display:none}}.container[data-v-f2779853]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-f2779853],.menu+.appearance[data-v-f2779853],.translations+.appearance[data-v-f2779853]{margin-top:24px}.menu+.social-links[data-v-f2779853]{margin-top:16px}.appearance+.social-links[data-v-f2779853]{margin-top:16px}.VPNav[data-v-9f75dce3]{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-9f75dce3]{position:fixed}}.VPSidebarItem.level-0[data-v-d81de50c]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-d81de50c]{padding-bottom:10px}.item[data-v-d81de50c]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-d81de50c]{cursor:pointer}.indicator[data-v-d81de50c]{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-d81de50c],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-d81de50c],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-d81de50c],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-d81de50c]{background-color:var(--vp-c-brand-1)}.link[data-v-d81de50c]{display:flex;align-items:center;flex-grow:1}.text[data-v-d81de50c]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-d81de50c]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-d81de50c],.VPSidebarItem.level-2 .text[data-v-d81de50c],.VPSidebarItem.level-3 .text[data-v-d81de50c],.VPSidebarItem.level-4 .text[data-v-d81de50c],.VPSidebarItem.level-5 .text[data-v-d81de50c]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-d81de50c],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-d81de50c],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-d81de50c],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-d81de50c],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-d81de50c],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-d81de50c]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-d81de50c],.VPSidebarItem.level-1.has-active>.item>.text[data-v-d81de50c],.VPSidebarItem.level-2.has-active>.item>.text[data-v-d81de50c],.VPSidebarItem.level-3.has-active>.item>.text[data-v-d81de50c],.VPSidebarItem.level-4.has-active>.item>.text[data-v-d81de50c],.VPSidebarItem.level-5.has-active>.item>.text[data-v-d81de50c],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-d81de50c],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-d81de50c],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-d81de50c],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-d81de50c],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-d81de50c],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-d81de50c]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-d81de50c],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-d81de50c],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-d81de50c],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-d81de50c],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-d81de50c],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-d81de50c]{color:var(--vp-c-brand-1)}.caret[data-v-d81de50c]{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-d81de50c]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-d81de50c]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-d81de50c]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-d81de50c]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-d81de50c],.VPSidebarItem.level-2 .items[data-v-d81de50c],.VPSidebarItem.level-3 .items[data-v-d81de50c],.VPSidebarItem.level-4 .items[data-v-d81de50c],.VPSidebarItem.level-5 .items[data-v-d81de50c]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-d81de50c]{display:none}.no-transition[data-v-8d50c081] .caret-icon{transition:none}.group+.group[data-v-8d50c081]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-8d50c081]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-e7c6e512]{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-e7c6e512]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-e7c6e512]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-e7c6e512]{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-e7c6e512]{padding-left:max(32px,calc((100vw - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100vw - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-e7c6e512]{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-e7c6e512]{outline:0}.VPSkipLink[data-v-0b0ada53]{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-0b0ada53]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-0b0ada53]{top:14px;left:16px}}.Layout[data-v-1df9f90f]{display:flex;flex-direction:column;min-height:100vh}.vp-sponsor-grid-image{max-height:36px!important;max-width:1000px!important}.box[data-v-9e57994f]{display:flex;flex-wrap:wrap;max-width:100%}.ext-item[data-v-9e57994f]{margin:4px 8px}h2[data-v-9e57994f]{margin-bottom:8px}.command-preview[data-v-9e57994f]{position:relative;padding:1.2rem;background:var(--vp-c-divider);border-radius:8px;word-break:break-all;font-family:monospace;overflow-wrap:break-word}.command-content[data-v-9e57994f]{padding-right:80px}.copy-btn[data-v-9e57994f]{position:absolute;top:.5rem;right:.5rem;padding:.5rem 1rem;background:var(--vp-button-brand-bg);color:var(--vp-button-brand-text);border:none;border-radius:6px;cursor:pointer;font-size:.875rem;font-weight:500;transition:all .2s ease}.copy-btn[data-v-9e57994f]:hover{background:var(--vp-button-brand-hover-bg);transform:translateY(-1px)}.copy-btn.copied[data-v-9e57994f]{background:var(--vp-c-green-1);color:#fff}.pre[data-v-9e57994f]{white-space:pre-wrap;word-break:break-word;overflow-wrap:break-word}.option-line[data-v-9e57994f]{padding:4px 8px}.option-title[data-v-9e57994f]{margin:4px 8px 4px 4px;font-weight:700}select[data-v-9e57994f]{border-radius:4px;border:1px solid var(--vp-c-divider);padding:0 4px;width:300px}.my-btn[data-v-9e57994f]{color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg);border-radius:8px;padding:0 16px;line-height:32px;font-size:14px;display:inline-block;text-align:center;font-weight:600;margin-right:8px;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s;cursor:pointer;border:1px solid var(--vp-button-alt-border)}.my-btn[data-v-9e57994f]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.my-btn[data-v-9e57994f]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.textarea[data-v-9e57994f]{border:1px solid var(--vp-c-divider);border-radius:4px;width:calc(100% - 12px);padding:4px 8px}.input[data-v-9e57994f]{display:block;border:1px solid var(--vp-c-divider);border-radius:4px;width:100%;padding:4px 8px}.command-container[data-v-9e57994f]{margin-bottom:24px}.modal-button[data-v-9e57994f]{padding:4px 8px;border-radius:4px;border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.modal-button[data-v-9e57994f]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.modal-button[data-v-9e57994f]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}@media (max-width: 768px){.command-preview[data-v-9e57994f]{padding:1rem}.copy-btn[data-v-9e57994f]{position:static;margin-top:.5rem;width:100%}.command-content[data-v-9e57994f]{padding-right:0}.box[data-v-9e57994f]{flex-direction:column}.ext-item[data-v-9e57994f]{margin:2px 4px}}.searchinput{border:1px solid var(--vp-c-divider)} diff --git a/assets/zh_contributing_index.md.22akXfoC.js b/assets/zh_contributing_index.md.22akXfoC.js deleted file mode 100644 index 2fab6013..00000000 --- a/assets/zh_contributing_index.md.22akXfoC.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as i,o as l,af as o}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"贡献指南","description":"","frontmatter":{},"headers":[],"relativePath":"zh/contributing/index.md","filePath":"zh/contributing/index.md"}'),r={name:"zh/contributing/index.md"};function n(t,e,c,d,s,h){return l(),i("div",null,e[0]||(e[0]=[o('

    贡献指南

    感谢你能够看到这里,本项目非常欢迎你的贡献!

    贡献方法

    如果你有代码或文档要贡献,以下是你需要首先了解的内容。

    1. 你要贡献什么类型的代码?(新扩展、修复 Bug、安全问题、项目框架优化、文档)
    2. 如果你贡献了新文件或新片段,你的代码是否经过 php-cs-fixerphpstan 的检查?
    3. 在贡献代码前是否充分阅读了 开发指南

    如果你能回答上述问题并对代码进行了修改,可以及时在项目 GitHub 仓库发起 Pull Request。 代码审查完成后,可以根据建议修改代码,或直接合并到主分支。

    贡献类型

    本项目的主要目的是编译静态链接的 PHP 二进制文件,命令行处理功能基于 symfony/console 编写。 在开发之前,如果你对它不够熟悉,请先查看 symfony/console 文档

    安全更新

    因为本项目基本上是一个本地运行的 PHP 项目,一般来说不会有远程攻击。 但如果你发现此类问题,请不要在 GitHub 仓库提交 PR 或 Issue, 你需要通过 邮件 联系项目维护者(crazywhalecc)。

    修复 Bug

    修复 Bug 一般不涉及项目结构和框架的修改,所以如果你能定位到错误代码并直接修复它,请直接提交 PR。

    新扩展

    对于添加新扩展,你需要了解项目的一些基本结构以及如何根据现有逻辑添加新扩展。 这将在本页的下一节中详细介绍。 总的来说,你需要:

    1. 评估扩展是否可以内联编译到 PHP 中。
    2. 评估扩展的依赖库(如果有)是否可以静态编译。
    3. 编写不同平台的库编译命令。
    4. 验证扩展及其依赖项与现有扩展和依赖项兼容。
    5. 验证扩展在 climicrofpmembed SAPIs 中正常工作。
    6. 编写文档并添加你的扩展。

    项目框架优化

    如果你已经熟悉 symfony/console 的工作原理,并同时要对项目的框架进行一些修改或优化,请先了解以下事情:

    1. 添加扩展不属于项目框架优化,但如果你在添加新扩展时发现必须优化框架,则需要先修改框架本身,然后再添加扩展。
    2. 对于一些大规模逻辑修改(例如涉及 LibraryBase、Extension 对象等的修改),建议先提交 Issue 或 Draft PR 进行讨论。
    3. 在项目早期,它是一个纯私有开发项目,代码中有一些中文注释。项目国际化后,你可以提交 PR 将这些注释翻译为英语。
    4. 请不要在代码中提交更多无用的代码片段,例如大量未使用的变量、方法、类以及多次重写的代码。
    ',18)]))}const f=a(r,[["render",n]]);export{m as __pageData,f as default}; diff --git a/assets/zh_contributing_index.md.22akXfoC.lean.js b/assets/zh_contributing_index.md.22akXfoC.lean.js deleted file mode 100644 index dd42eff0..00000000 --- a/assets/zh_contributing_index.md.22akXfoC.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as i,o as l,af as o}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"贡献指南","description":"","frontmatter":{},"headers":[],"relativePath":"zh/contributing/index.md","filePath":"zh/contributing/index.md"}'),r={name:"zh/contributing/index.md"};function n(t,e,c,d,s,h){return l(),i("div",null,e[0]||(e[0]=[o("",18)]))}const f=a(r,[["render",n]]);export{m as __pageData,f as default}; diff --git a/assets/zh_contributing_index.md.fiiKMXnj.js b/assets/zh_contributing_index.md.fiiKMXnj.js new file mode 100644 index 00000000..9309f471 --- /dev/null +++ b/assets/zh_contributing_index.md.fiiKMXnj.js @@ -0,0 +1 @@ +import{_ as a,c as i,o as l,ah as o}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"贡献指南","description":"","frontmatter":{},"headers":[],"relativePath":"zh/contributing/index.md","filePath":"zh/contributing/index.md"}'),r={name:"zh/contributing/index.md"};function n(t,e,c,d,s,h){return l(),i("div",null,[...e[0]||(e[0]=[o('

    贡献指南

    感谢你能够看到这里,本项目非常欢迎你的贡献!

    贡献方法

    如果你有代码或文档要贡献,以下是你需要首先了解的内容。

    1. 你要贡献什么类型的代码?(新扩展、修复 Bug、安全问题、项目框架优化、文档)
    2. 如果你贡献了新文件或新片段,你的代码是否经过 php-cs-fixerphpstan 的检查?
    3. 在贡献代码前是否充分阅读了 开发指南

    如果你能回答上述问题并对代码进行了修改,可以及时在项目 GitHub 仓库发起 Pull Request。 代码审查完成后,可以根据建议修改代码,或直接合并到主分支。

    贡献类型

    本项目的主要目的是编译静态链接的 PHP 二进制文件,命令行处理功能基于 symfony/console 编写。 在开发之前,如果你对它不够熟悉,请先查看 symfony/console 文档

    安全更新

    因为本项目基本上是一个本地运行的 PHP 项目,一般来说不会有远程攻击。 但如果你发现此类问题,请不要在 GitHub 仓库提交 PR 或 Issue, 你需要通过 邮件 联系项目维护者(crazywhalecc)。

    修复 Bug

    修复 Bug 一般不涉及项目结构和框架的修改,所以如果你能定位到错误代码并直接修复它,请直接提交 PR。

    新扩展

    对于添加新扩展,你需要了解项目的一些基本结构以及如何根据现有逻辑添加新扩展。 这将在本页的下一节中详细介绍。 总的来说,你需要:

    1. 评估扩展是否可以内联编译到 PHP 中。
    2. 评估扩展的依赖库(如果有)是否可以静态编译。
    3. 编写不同平台的库编译命令。
    4. 验证扩展及其依赖项与现有扩展和依赖项兼容。
    5. 验证扩展在 climicrofpmembed SAPIs 中正常工作。
    6. 编写文档并添加你的扩展。

    项目框架优化

    如果你已经熟悉 symfony/console 的工作原理,并同时要对项目的框架进行一些修改或优化,请先了解以下事情:

    1. 添加扩展不属于项目框架优化,但如果你在添加新扩展时发现必须优化框架,则需要先修改框架本身,然后再添加扩展。
    2. 对于一些大规模逻辑修改(例如涉及 LibraryBase、Extension 对象等的修改),建议先提交 Issue 或 Draft PR 进行讨论。
    3. 在项目早期,它是一个纯私有开发项目,代码中有一些中文注释。项目国际化后,你可以提交 PR 将这些注释翻译为英语。
    4. 请不要在代码中提交更多无用的代码片段,例如大量未使用的变量、方法、类以及多次重写的代码。
    ',18)])])}const f=a(r,[["render",n]]);export{m as __pageData,f as default}; diff --git a/assets/zh_contributing_index.md.fiiKMXnj.lean.js b/assets/zh_contributing_index.md.fiiKMXnj.lean.js new file mode 100644 index 00000000..81576c1f --- /dev/null +++ b/assets/zh_contributing_index.md.fiiKMXnj.lean.js @@ -0,0 +1 @@ +import{_ as a,c as i,o as l,ah as o}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"贡献指南","description":"","frontmatter":{},"headers":[],"relativePath":"zh/contributing/index.md","filePath":"zh/contributing/index.md"}'),r={name:"zh/contributing/index.md"};function n(t,e,c,d,s,h){return l(),i("div",null,[...e[0]||(e[0]=[o("",18)])])}const f=a(r,[["render",n]]);export{m as __pageData,f as default}; diff --git a/assets/zh_develop_craft-yml.md.Dfv1fXuq.js b/assets/zh_develop_craft-yml.md.CAUu6v38.js similarity index 93% rename from assets/zh_develop_craft-yml.md.Dfv1fXuq.js rename to assets/zh_develop_craft-yml.md.CAUu6v38.js index d2bb5967..f8e0dca8 100644 --- a/assets/zh_develop_craft-yml.md.Dfv1fXuq.js +++ b/assets/zh_develop_craft-yml.md.CAUu6v38.js @@ -1,4 +1,4 @@ -import{_ as i,c as a,o as n,af as l}from"./chunks/framework.PeLcR_tw.js";const c=JSON.parse('{"title":"craft.yml 配置","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"zh/develop/craft-yml.md","filePath":"zh/develop/craft-yml.md"}'),t={name:"zh/develop/craft-yml.md"};function p(e,s,h,k,r,d){return n(),a("div",null,s[0]||(s[0]=[l(`

    craft.yml 配置

    yaml
    # PHP version to build (default: 8.4)
    +import{_ as i,c as a,o as n,ah as l}from"./chunks/framework.Bhsyh9kO.js";const c=JSON.parse('{"title":"craft.yml 配置","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"zh/develop/craft-yml.md","filePath":"zh/develop/craft-yml.md"}'),t={name:"zh/develop/craft-yml.md"};function p(e,s,h,k,r,d){return n(),a("div",null,[...s[0]||(s[0]=[l(`

    craft.yml 配置

    yaml
    # PHP version to build (default: 8.4)
     php-version: 8.4
     # [REQUIRED] Static PHP extensions to build (list or comma-separated are both accepted)
     extensions: bcmath,fileinfo,phar,zlib,sodium,posix,pcntl
    @@ -65,4 +65,4 @@ import{_ as i,c as a,o as n,af as l}from"./chunks/framework.PeLcR_tw.js";const c
     # Extra environment variables
     extra-env:
       # e.g. Use github token to avoid rate limit
    -  GITHUB_TOKEN: your-github-token
    `,2)]))}const E=i(t,[["render",p]]);export{c as __pageData,E as default}; + GITHUB_TOKEN: your-github-token
    `,2)])])}const E=i(t,[["render",p]]);export{c as __pageData,E as default}; diff --git a/assets/zh_develop_craft-yml.md.CAUu6v38.lean.js b/assets/zh_develop_craft-yml.md.CAUu6v38.lean.js new file mode 100644 index 00000000..dca9034a --- /dev/null +++ b/assets/zh_develop_craft-yml.md.CAUu6v38.lean.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as n,ah as l}from"./chunks/framework.Bhsyh9kO.js";const c=JSON.parse('{"title":"craft.yml 配置","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"zh/develop/craft-yml.md","filePath":"zh/develop/craft-yml.md"}'),t={name:"zh/develop/craft-yml.md"};function p(e,s,h,k,r,d){return n(),a("div",null,[...s[0]||(s[0]=[l("",2)])])}const E=i(t,[["render",p]]);export{c as __pageData,E as default}; diff --git a/assets/zh_develop_craft-yml.md.Dfv1fXuq.lean.js b/assets/zh_develop_craft-yml.md.Dfv1fXuq.lean.js deleted file mode 100644 index 2cfcb955..00000000 --- a/assets/zh_develop_craft-yml.md.Dfv1fXuq.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as a,o as n,af as l}from"./chunks/framework.PeLcR_tw.js";const c=JSON.parse('{"title":"craft.yml 配置","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"zh/develop/craft-yml.md","filePath":"zh/develop/craft-yml.md"}'),t={name:"zh/develop/craft-yml.md"};function p(e,s,h,k,r,d){return n(),a("div",null,s[0]||(s[0]=[l("",2)]))}const E=i(t,[["render",p]]);export{c as __pageData,E as default}; diff --git a/assets/zh_develop_doctor-module.md.B8r2lbU8.js b/assets/zh_develop_doctor-module.md.1NRXIINs.js similarity index 87% rename from assets/zh_develop_doctor-module.md.B8r2lbU8.js rename to assets/zh_develop_doctor-module.md.1NRXIINs.js index a4c196a4..9445557c 100644 --- a/assets/zh_develop_doctor-module.md.B8r2lbU8.js +++ b/assets/zh_develop_doctor-module.md.1NRXIINs.js @@ -1,4 +1,4 @@ -import{_ as i,c as a,o as n,af as h}from"./chunks/framework.PeLcR_tw.js";const g=JSON.parse('{"title":"Doctor 模块","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/doctor-module.md","filePath":"zh/develop/doctor-module.md"}'),l={name:"zh/develop/doctor-module.md"};function k(t,s,p,e,d,E){return n(),a("div",null,s[0]||(s[0]=[h(`

    Doctor 模块

    Doctor 模块是一个较为独立的用于检查系统环境的模块,可使用命令 bin/spc doctor 进入,入口的命令类在 DoctorCommand.php 中。

    Doctor 模块是一个检查单,里面有一系列的检查项目和自动修复项目。这些项目都存放在 src/SPC/doctor/item/ 目录中, 并且使用了两种 Attribute 用作检查项标记和自动修复项目标记:#[AsCheckItem]#[AsFixItem]

    以现有的检查项 if necessary tools are installed,它是用于检查编译必需的包是否安装在 macOS 系统内,下面是它的源码:

    php
    use SPC\\doctor\\AsCheckItem;
    +import{_ as i,c as a,o as h,ah as n}from"./chunks/framework.Bhsyh9kO.js";const g=JSON.parse('{"title":"Doctor 模块","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/doctor-module.md","filePath":"zh/develop/doctor-module.md"}'),l={name:"zh/develop/doctor-module.md"};function k(t,s,p,e,d,E){return h(),a("div",null,[...s[0]||(s[0]=[n(`

    Doctor 模块

    Doctor 模块是一个较为独立的用于检查系统环境的模块,可使用命令 bin/spc doctor 进入,入口的命令类在 DoctorCommand.php 中。

    Doctor 模块是一个检查单,里面有一系列的检查项目和自动修复项目。这些项目都存放在 src/SPC/doctor/item/ 目录中, 并且使用了两种 Attribute 用作检查项标记和自动修复项目标记:#[AsCheckItem]#[AsFixItem]

    以现有的检查项 if necessary tools are installed,它是用于检查编译必需的包是否安装在 macOS 系统内,下面是它的源码:

    php
    use SPC\\doctor\\AsCheckItem;
     use SPC\\doctor\\AsFixItem;
     use SPC\\doctor\\CheckResult;
     
    @@ -26,4 +26,4 @@ import{_ as i,c as a,o as n,af as h}from"./chunks/framework.PeLcR_tw.js";const g
             }
         }
         return true;
    -}

    #[AsFixItem()] 属性传入的参数即修复项的名称,该方法必须返回 True 或 False。当返回 False 时,表明自动修复失败,需要手动处理。

    此处的代码中 shell()->exec() 是项目的执行命令的方法,用于替代 exec()system(),同时提供了 debug、获取执行状态、进入目录等特性。

    `,13)]))}const c=i(l,[["render",k]]);export{g as __pageData,c as default}; +}

    #[AsFixItem()] 属性传入的参数即修复项的名称,该方法必须返回 True 或 False。当返回 False 时,表明自动修复失败,需要手动处理。

    此处的代码中 shell()->exec() 是项目的执行命令的方法,用于替代 exec()system(),同时提供了 debug、获取执行状态、进入目录等特性。

    `,13)])])}const c=i(l,[["render",k]]);export{g as __pageData,c as default}; diff --git a/assets/zh_develop_doctor-module.md.1NRXIINs.lean.js b/assets/zh_develop_doctor-module.md.1NRXIINs.lean.js new file mode 100644 index 00000000..2b690c8b --- /dev/null +++ b/assets/zh_develop_doctor-module.md.1NRXIINs.lean.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as h,ah as n}from"./chunks/framework.Bhsyh9kO.js";const g=JSON.parse('{"title":"Doctor 模块","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/doctor-module.md","filePath":"zh/develop/doctor-module.md"}'),l={name:"zh/develop/doctor-module.md"};function k(t,s,p,e,d,E){return h(),a("div",null,[...s[0]||(s[0]=[n("",13)])])}const c=i(l,[["render",k]]);export{g as __pageData,c as default}; diff --git a/assets/zh_develop_doctor-module.md.B8r2lbU8.lean.js b/assets/zh_develop_doctor-module.md.B8r2lbU8.lean.js deleted file mode 100644 index 1c427d29..00000000 --- a/assets/zh_develop_doctor-module.md.B8r2lbU8.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as a,o as n,af as h}from"./chunks/framework.PeLcR_tw.js";const g=JSON.parse('{"title":"Doctor 模块","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/doctor-module.md","filePath":"zh/develop/doctor-module.md"}'),l={name:"zh/develop/doctor-module.md"};function k(t,s,p,e,d,E){return n(),a("div",null,s[0]||(s[0]=[h("",13)]))}const c=i(l,[["render",k]]);export{g as __pageData,c as default}; diff --git a/assets/zh_develop_index.md.CRxnJZDt.js b/assets/zh_develop_index.md.CRxnJZDt.js new file mode 100644 index 00000000..726284ae --- /dev/null +++ b/assets/zh_develop_index.md.CRxnJZDt.js @@ -0,0 +1 @@ +import{_ as a,c as i,o as t,ah as s}from"./chunks/framework.Bhsyh9kO.js";const P=JSON.parse('{"title":"开发简介","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/index.md","filePath":"zh/develop/index.md"}'),p={name:"zh/develop/index.md"};function o(r,e,l,n,c,d){return t(),i("div",null,[...e[0]||(e[0]=[s('

    开发简介

    开发本项目需要安装部署 PHP 环境,以及一些 PHP 项目常用的扩展和 Composer。

    项目的开发环境和运行环境几乎完全一致。你可以参照 手动构建 部分安装系统 PHP 或使用本项目预构建的静态 PHP 作为环境。这里不再赘述。

    抛开用途,本项目本身其实就是一个 php-cli 程序,你可以将它当作一个正常的 PHP 项目进行编辑和开发,同时你需要了解不同系统的 Shell 命令行。

    本项目目前的目的就是为了编译静态编译的独立 PHP,但主体部分也包含编译很多依赖库的静态版本,所以你可以复用这套编译逻辑,用于构建其他程序的独立二进制版本,例如 Nginx 等。

    环境准备

    开发本项目需要 PHP 环境。你可以使用系统自带的 PHP,也可以使用本项目构建的静态 PHP。

    无论是使用哪种 PHP,在开发环境,你需要安装这些扩展:

    curl,dom,filter,mbstring,openssl,pcntl,phar,posix,sodium,tokenizer,xml,xmlwriter

    static-php-cli 项目本身不需要这么多扩展,但在开发过程中,你会用到 Composer 和 PHPUnit 等工具,它们需要这些扩展。

    对于 static-php-cli 自身构建的 micro 自执行二进制,仅需要 pcntl,posix,mbstring,tokenizer,phar

    开始开发

    继续向下查看项目结构文档,你可以学习 static-php-cli 是如何工作的。

    ',13)])])}const m=a(p,[["render",o]]);export{P as __pageData,m as default}; diff --git a/assets/zh_develop_index.md.CRxnJZDt.lean.js b/assets/zh_develop_index.md.CRxnJZDt.lean.js new file mode 100644 index 00000000..af5132cb --- /dev/null +++ b/assets/zh_develop_index.md.CRxnJZDt.lean.js @@ -0,0 +1 @@ +import{_ as a,c as i,o as t,ah as s}from"./chunks/framework.Bhsyh9kO.js";const P=JSON.parse('{"title":"开发简介","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/index.md","filePath":"zh/develop/index.md"}'),p={name:"zh/develop/index.md"};function o(r,e,l,n,c,d){return t(),i("div",null,[...e[0]||(e[0]=[s("",13)])])}const m=a(p,[["render",o]]);export{P as __pageData,m as default}; diff --git a/assets/zh_develop_index.md.DecU9Y3b.js b/assets/zh_develop_index.md.DecU9Y3b.js deleted file mode 100644 index 89bbd8b7..00000000 --- a/assets/zh_develop_index.md.DecU9Y3b.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as i,o as t,af as s}from"./chunks/framework.PeLcR_tw.js";const P=JSON.parse('{"title":"开发简介","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/index.md","filePath":"zh/develop/index.md"}'),p={name:"zh/develop/index.md"};function o(r,e,l,n,c,d){return t(),i("div",null,e[0]||(e[0]=[s('

    开发简介

    开发本项目需要安装部署 PHP 环境,以及一些 PHP 项目常用的扩展和 Composer。

    项目的开发环境和运行环境几乎完全一致。你可以参照 手动构建 部分安装系统 PHP 或使用本项目预构建的静态 PHP 作为环境。这里不再赘述。

    抛开用途,本项目本身其实就是一个 php-cli 程序,你可以将它当作一个正常的 PHP 项目进行编辑和开发,同时你需要了解不同系统的 Shell 命令行。

    本项目目前的目的就是为了编译静态编译的独立 PHP,但主体部分也包含编译很多依赖库的静态版本,所以你可以复用这套编译逻辑,用于构建其他程序的独立二进制版本,例如 Nginx 等。

    环境准备

    开发本项目需要 PHP 环境。你可以使用系统自带的 PHP,也可以使用本项目构建的静态 PHP。

    无论是使用哪种 PHP,在开发环境,你需要安装这些扩展:

    curl,dom,filter,mbstring,openssl,pcntl,phar,posix,sodium,tokenizer,xml,xmlwriter

    static-php-cli 项目本身不需要这么多扩展,但在开发过程中,你会用到 Composer 和 PHPUnit 等工具,它们需要这些扩展。

    对于 static-php-cli 自身构建的 micro 自执行二进制,仅需要 pcntl,posix,mbstring,tokenizer,phar

    开始开发

    继续向下查看项目结构文档,你可以学习 static-php-cli 是如何工作的。

    ',13)]))}const m=a(p,[["render",o]]);export{P as __pageData,m as default}; diff --git a/assets/zh_develop_index.md.DecU9Y3b.lean.js b/assets/zh_develop_index.md.DecU9Y3b.lean.js deleted file mode 100644 index 2b226f68..00000000 --- a/assets/zh_develop_index.md.DecU9Y3b.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as i,o as t,af as s}from"./chunks/framework.PeLcR_tw.js";const P=JSON.parse('{"title":"开发简介","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/index.md","filePath":"zh/develop/index.md"}'),p={name:"zh/develop/index.md"};function o(r,e,l,n,c,d){return t(),i("div",null,e[0]||(e[0]=[s("",13)]))}const m=a(p,[["render",o]]);export{P as __pageData,m as default}; diff --git a/assets/zh_develop_php-src-changes.md.CkjaMIky.js b/assets/zh_develop_php-src-changes.md.CkjaMIky.js deleted file mode 100644 index b51edfb2..00000000 --- a/assets/zh_develop_php-src-changes.md.CkjaMIky.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as l,af as c}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"对 PHP 源码的修改","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/php-src-changes.md","filePath":"zh/develop/php-src-changes.md"}'),t={name:"zh/develop/php-src-changes.md"};function r(p,i,s,h,n,o){return l(),e("div",null,i[0]||(i[0]=[c('

    对 PHP 源码的修改

    由于 static-php-cli 在静态编译过程中为了实现良好的兼容性、性能和安全性,对 PHP 源码进行了一些修改。下面是目前对 PHP 源码修改的说明。

    micro 相关补丁

    基于 phpmicro 项目提供的补丁,static-php-cli 对 PHP 源码进行了一些修改,以适应静态编译的需求。补丁列表 包含:

    目前 static-php-cli 在编译时用到的补丁有:

    • static_opcache
    • static_extensions_win32
    • cli_checks
    • disable_huge_page
    • vcruntime140
    • win32
    • zend_stream
    • cli_static
    • macos_iconv
    • phar

    PHP <= 8.1 libxml 补丁

    因为 PHP 官方仅对 8.1 进行安全更新,旧版本停止更新,所以 static-php-cli 对 PHP 8.1 及以下版本应用了在新版本 PHP 中已经应用的 libxml 编译补丁。

    gd 扩展 Windows 补丁

    在 Windows 下编译 gd 扩展需要大幅改动 config.w32 文件,static-php-cli 对 gd 扩展进行了一些修改,使其在 Windows 下编译更加方便。

    yaml 扩展 Windows 补丁

    yaml 扩展在 Windows 下编译需要修改 config.w32 文件,static-php-cli 对 yaml 扩展进行了一些修改,使其在 Windows 下编译更加方便。

    static-php-cli 版本信息插入

    static-php-cli 在编译时会在 PHP 版本信息中插入 static-php-cli 的版本信息,以便于识别。

    加入硬编码 INI 的选项

    在使用 -I 参数硬编码 INI 到静态 PHP 的功能中,static-php-cli 会修改 PHP 源码以插入硬编码内容。

    Linux 系统修复补丁

    部分编译环境可能缺少一些头文件或库,static-php-cli 会在编译时自动修复这些问题,如:

    • HAVE_STRLCAT missing problem
    • HAVE_STRLCPY missing problem

    Windows 系统下 Fiber 问题修复补丁

    在 Windows 下编译 PHP 时,Fiber 扩展会出现一些问题,static-php-cli 会在编译时自动修复这些问题(修改 php-src 的 config.w32)。

    ',21)]))}const P=a(t,[["render",r]]);export{m as __pageData,P as default}; diff --git a/assets/zh_develop_php-src-changes.md.CkjaMIky.lean.js b/assets/zh_develop_php-src-changes.md.CkjaMIky.lean.js deleted file mode 100644 index d85e1864..00000000 --- a/assets/zh_develop_php-src-changes.md.CkjaMIky.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as l,af as c}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"对 PHP 源码的修改","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/php-src-changes.md","filePath":"zh/develop/php-src-changes.md"}'),t={name:"zh/develop/php-src-changes.md"};function r(p,i,s,h,n,o){return l(),e("div",null,i[0]||(i[0]=[c("",21)]))}const P=a(t,[["render",r]]);export{m as __pageData,P as default}; diff --git a/assets/zh_develop_php-src-changes.md.CwVUc0oE.js b/assets/zh_develop_php-src-changes.md.CwVUc0oE.js new file mode 100644 index 00000000..d93d9247 --- /dev/null +++ b/assets/zh_develop_php-src-changes.md.CwVUc0oE.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as l,ah as c}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"对 PHP 源码的修改","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/php-src-changes.md","filePath":"zh/develop/php-src-changes.md"}'),t={name:"zh/develop/php-src-changes.md"};function r(p,i,s,h,n,o){return l(),e("div",null,[...i[0]||(i[0]=[c('

    对 PHP 源码的修改

    由于 static-php-cli 在静态编译过程中为了实现良好的兼容性、性能和安全性,对 PHP 源码进行了一些修改。下面是目前对 PHP 源码修改的说明。

    micro 相关补丁

    基于 phpmicro 项目提供的补丁,static-php-cli 对 PHP 源码进行了一些修改,以适应静态编译的需求。补丁列表 包含:

    目前 static-php-cli 在编译时用到的补丁有:

    • static_opcache
    • static_extensions_win32
    • cli_checks
    • disable_huge_page
    • vcruntime140
    • win32
    • zend_stream
    • cli_static
    • macos_iconv
    • phar

    PHP <= 8.1 libxml 补丁

    因为 PHP 官方仅对 8.1 进行安全更新,旧版本停止更新,所以 static-php-cli 对 PHP 8.1 及以下版本应用了在新版本 PHP 中已经应用的 libxml 编译补丁。

    gd 扩展 Windows 补丁

    在 Windows 下编译 gd 扩展需要大幅改动 config.w32 文件,static-php-cli 对 gd 扩展进行了一些修改,使其在 Windows 下编译更加方便。

    yaml 扩展 Windows 补丁

    yaml 扩展在 Windows 下编译需要修改 config.w32 文件,static-php-cli 对 yaml 扩展进行了一些修改,使其在 Windows 下编译更加方便。

    static-php-cli 版本信息插入

    static-php-cli 在编译时会在 PHP 版本信息中插入 static-php-cli 的版本信息,以便于识别。

    加入硬编码 INI 的选项

    在使用 -I 参数硬编码 INI 到静态 PHP 的功能中,static-php-cli 会修改 PHP 源码以插入硬编码内容。

    Linux 系统修复补丁

    部分编译环境可能缺少一些头文件或库,static-php-cli 会在编译时自动修复这些问题,如:

    • HAVE_STRLCAT missing problem
    • HAVE_STRLCPY missing problem

    Windows 系统下 Fiber 问题修复补丁

    在 Windows 下编译 PHP 时,Fiber 扩展会出现一些问题,static-php-cli 会在编译时自动修复这些问题(修改 php-src 的 config.w32)。

    ',21)])])}const P=a(t,[["render",r]]);export{m as __pageData,P as default}; diff --git a/assets/zh_develop_php-src-changes.md.CwVUc0oE.lean.js b/assets/zh_develop_php-src-changes.md.CwVUc0oE.lean.js new file mode 100644 index 00000000..b11b43e0 --- /dev/null +++ b/assets/zh_develop_php-src-changes.md.CwVUc0oE.lean.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as l,ah as c}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"对 PHP 源码的修改","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/php-src-changes.md","filePath":"zh/develop/php-src-changes.md"}'),t={name:"zh/develop/php-src-changes.md"};function r(p,i,s,h,n,o){return l(),e("div",null,[...i[0]||(i[0]=[c("",21)])])}const P=a(t,[["render",r]]);export{m as __pageData,P as default}; diff --git a/assets/zh_develop_source-module.md.DoBnezP5.js b/assets/zh_develop_source-module.md.3iGbQTPs.js similarity index 95% rename from assets/zh_develop_source-module.md.DoBnezP5.js rename to assets/zh_develop_source-module.md.3iGbQTPs.js index 3139c041..cfe51294 100644 --- a/assets/zh_develop_source-module.md.DoBnezP5.js +++ b/assets/zh_develop_source-module.md.3iGbQTPs.js @@ -1,4 +1,4 @@ -import{_ as i,c as a,o as t,af as n}from"./chunks/framework.PeLcR_tw.js";const r=JSON.parse('{"title":"资源模块","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/source-module.md","filePath":"zh/develop/source-module.md"}'),l={name:"zh/develop/source-module.md"};function h(e,s,p,k,E,o){return t(),a("div",null,s[0]||(s[0]=[n(`

    资源模块

    static-php-cli 的下载资源模块是一个主要的功能,它包含了所依赖的库、外部扩展、PHP 源码的下载方式和资源解压方式。 下载的配置文件主要涉及 source.jsonpkg.json 文件,这个文件记录了所有可下载的资源的下载方式。

    下载功能主要涉及的命令有 bin/spc downloadbin/spc extract。其中 download 命令是一个下载器,它会根据配置文件下载资源; extract 命令是一个解压器,它会根据配置文件解压资源。

    一般来说,下载资源可能会比较慢,因为这些资源来源于各个官网、GitHub 等不同位置,同时它们也占用了较大空间,所以你可以在一次下载资源后,可重复使用。

    下载器的配置文件是 source.json,它包含了所有资源的下载方式,你可以在其中添加你需要的资源下载方式,也可以修改已有的资源下载方式。

    每个资源的下载配置结构如下,下面是 libevent 扩展对应的资源下载配置:

    json
    {
    +import{_ as i,c as a,o as t,ah as n}from"./chunks/framework.Bhsyh9kO.js";const r=JSON.parse('{"title":"资源模块","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/source-module.md","filePath":"zh/develop/source-module.md"}'),l={name:"zh/develop/source-module.md"};function h(e,s,p,k,E,o){return t(),a("div",null,[...s[0]||(s[0]=[n(`

    资源模块

    static-php-cli 的下载资源模块是一个主要的功能,它包含了所依赖的库、外部扩展、PHP 源码的下载方式和资源解压方式。 下载的配置文件主要涉及 source.jsonpkg.json 文件,这个文件记录了所有可下载的资源的下载方式。

    下载功能主要涉及的命令有 bin/spc downloadbin/spc extract。其中 download 命令是一个下载器,它会根据配置文件下载资源; extract 命令是一个解压器,它会根据配置文件解压资源。

    一般来说,下载资源可能会比较慢,因为这些资源来源于各个官网、GitHub 等不同位置,同时它们也占用了较大空间,所以你可以在一次下载资源后,可重复使用。

    下载器的配置文件是 source.json,它包含了所有资源的下载方式,你可以在其中添加你需要的资源下载方式,也可以修改已有的资源下载方式。

    每个资源的下载配置结构如下,下面是 libevent 扩展对应的资源下载配置:

    json
    {
       "libevent": {
         "type": "ghrel",
         "repo": "libevent/libevent",
    @@ -117,4 +117,4 @@ import{_ as i,c as a,o as t,af as n}from"./chunks/framework.PeLcR_tw.js";const r
           ]
         }
       }
    -}
    `,75)]))}const c=i(l,[["render",h]]);export{r as __pageData,c as default}; +}
    `,75)])])}const c=i(l,[["render",h]]);export{r as __pageData,c as default}; diff --git a/assets/zh_develop_source-module.md.3iGbQTPs.lean.js b/assets/zh_develop_source-module.md.3iGbQTPs.lean.js new file mode 100644 index 00000000..a4789290 --- /dev/null +++ b/assets/zh_develop_source-module.md.3iGbQTPs.lean.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as t,ah as n}from"./chunks/framework.Bhsyh9kO.js";const r=JSON.parse('{"title":"资源模块","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/source-module.md","filePath":"zh/develop/source-module.md"}'),l={name:"zh/develop/source-module.md"};function h(e,s,p,k,E,o){return t(),a("div",null,[...s[0]||(s[0]=[n("",75)])])}const c=i(l,[["render",h]]);export{r as __pageData,c as default}; diff --git a/assets/zh_develop_source-module.md.DoBnezP5.lean.js b/assets/zh_develop_source-module.md.DoBnezP5.lean.js deleted file mode 100644 index a2c5150a..00000000 --- a/assets/zh_develop_source-module.md.DoBnezP5.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as a,o as t,af as n}from"./chunks/framework.PeLcR_tw.js";const r=JSON.parse('{"title":"资源模块","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/source-module.md","filePath":"zh/develop/source-module.md"}'),l={name:"zh/develop/source-module.md"};function h(e,s,p,k,E,o){return t(),a("div",null,s[0]||(s[0]=[n("",75)]))}const c=i(l,[["render",h]]);export{r as __pageData,c as default}; diff --git a/assets/zh_develop_structure.md.CEd1RycZ.js b/assets/zh_develop_structure.md.CEd1RycZ.js new file mode 100644 index 00000000..36d17092 --- /dev/null +++ b/assets/zh_develop_structure.md.CEd1RycZ.js @@ -0,0 +1,10 @@ +import{_ as o,c as d,o as c,ah as a}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"项目结构简介","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/structure.md","filePath":"zh/develop/structure.md"}'),t={name:"zh/develop/structure.md"};function p(r,e,i,s,l,n){return c(),d("div",null,[...e[0]||(e[0]=[a(`

    项目结构简介

    static-php-cli 主要包含三种逻辑组件:资源、依赖库、扩展。这三种组件四个配置文件:source.jsonlib.jsonext.jsonpkg.json

    一个完整的构建静态 PHP 流程是:

    1. 使用资源下载模块 Downloader 下载指定或所有资源,这些资源包含 PHP 源码、依赖库源码、扩展源码。
    2. 使用资源解压模块 SourceExtractor 解压下载的资源到编译目录。
    3. 使用依赖工具计算出当前加入的扩展的依赖扩展、依赖库,然后对每个需要编译的依赖库进行编译,按照依赖顺序。
    4. 使用对应操作系统下的 Builder 构建每个依赖库后,将其安装到 buildroot 目录。
    5. 如果包含外部扩展(源码没有包含在 PHP 内的扩展),将外部扩展拷贝到 source/php-src/ext/ 目录。
    6. 使用 Builder 构建 PHP 源码,将其安装到 buildroot 目录。

    项目主要分为几个文件夹:

    • bin/: 用于存放程序入口文件,包含 bin/spcbin/spc-alpine-dockerbin/setup-runtime
    • config/: 包含了所有项目支持的扩展、依赖库以及这些资源下载的地址、下载方式等,:lib.jsonext.jsonsource.jsonpkg.jsonpre-built.json
    • src/SPC/: 项目的核心代码,包含了整个框架以及编译各种扩展和库的命令。
    • src/globals/: 项目的全局方法和常量、运行时需要的测试文件(例如:扩展的可用性检查代码)。
    • vendor/: Composer 依赖的目录,你无需对它做出任何修改。

    其中运行原理就是启动一个 symfony/consoleConsoleApplication,然后解析用户在终端输入的命令。

    基本命令行结构

    bin/spc 是一个 PHP 代码入口文件,包含了 Unix 通用的 #!/usr/bin/env php 用来让系统自动以系统安装好的 PHP 解释器执行。 在项目执行了 new ConsoleApplication() 后,框架会自动使用反射的方式,解析 src/SPC/command 目录下的所有类,并将其注册成为命令。

    项目并没有直接使用 Symfony 推荐的 Command 注册方式和命令执行方式,这里做出了一点小变动:

    1. 每个命令都使用 #[AsCommand()] Attribute 来注册名称和简介。
    2. execute() 抽象化,让所有命令基于 BaseCommand(它基于 Symfony\\Component\\Console\\Command\\Command),每个命令本身的执行代码写到了 handle() 方法中。
    3. BaseCommand 添加了变量 $no_motd,用于是否在该命令执行时显示 Figlet 欢迎词。
    4. BaseCommandInputInterfaceOutputInterface 保存为成员变量,你可以在命令的类内使用 $this->input$this->output

    基本源码结构

    项目的源码位于 src/SPC 目录,支持 PSR-4 标准的自动加载,包含以下子目录和类:

    • src/SPC/builder/: 用于不同操作系统下构建依赖库、PHP 及相关扩展的核心编译命令代码,还包含了一些编译的系统工具方法。
    • src/SPC/command/: 项目的所有命令都在这里。
    • src/SPC/doctor/: Doctor 模块,它是一个较为独立的用于检查系统环境的模块,可使用命令 bin/spc doctor 进入。
    • src/SPC/exception/: 异常类。
    • src/SPC/store/: 有关存储、文件和资源的类都在这里。
    • src/SPC/util/: 一些可以复用的工具方法都在这里。
    • src/SPC/ConsoleApplication.php: 命令行程序入口文件。

    如果你阅读过源码,你可能会发现还有一个 src/globals/ 目录,它是用于存放一些全局变量、全局方法、构建过程中依赖的非 PSR-4 标准的 PHP 源码,例如测试扩展代码等。

    Phar 应用目录问题

    和其他 php-cli 项目一样,spc 自身对路径有额外的考虑。 因为 spc 可以在 php-cli directlymicro SAPIphp-cli with Pharvendor with Phar 等多种模式下运行,各类根目录存在歧义。这里会进行一个完整的说明。 此问题一般常见于 PHP 项目中存取文件的基类路径选择问题,尤其是在配合 micro.sfx 使用时容易出现路径问题。

    注意,此处仅对你在开发 Phar 项目或 PHP 框架时可能有用。

    接下来我们都将 static-php-cli(也就是 spc)当作一个普通的 php 命令行程序来看,你可以将 spc 理解为你自己的任何 php-cli 应用以参考。

    下面主要有三个基本的常量理论值,我们建议你在编写 php 项目时引入这三种常量:

    • WORKING_DIR:执行 PHP 脚本时的工作目录
    • SOURCE_ROOT_DIRROOT_DIR:项目文件夹的根目录,一般为 composer.json 所在目录
    • FRAMEWORK_ROOT_DIR:使用框架的根目录,自行开发的框架可能会用到,一般框架目录为只读

    你可以在你的框架或者 cli 应用程序入口中定义这些常量,以方便在你的项目中使用路径。

    下面是 PHP 内置的常量值,在 PHP 解释器内部已被定义:

    • __DIR__:当前执行脚本的文件所在目录
    • __FILE__:当前执行脚本的文件路径

    Git 项目模式(source)

    Git 项目模式指的是一个框架或程序本身在当前文件夹以纯文本形式存放,运行通过 php path/to/entry.php 方式。

    假设你的项目存放在 /home/example/static-php-cli/ 目录下,或你的项目就是框架本身,里面包含 composer.json 等项目文件:

    composer.json
    +src/App/MyCommand.app
    +vendor/*
    +bin/entry.php

    我们假设从 src/App/MyCommand.php 中获取以上常量:

    ConstantValue
    WORKING_DIR/home/example/static-php-cli
    SOURCE_ROOT_DIR/home/example/static-php-cli
    FRAMEWORK_ROOT_DIR/home/example/static-php-cli
    __DIR__/home/example/static-php-cli/src/App
    __FILE__/home/example/static-php-cli/src/App/MyCommand.php

    这种情况下,WORKING_DIRSOURCE_ROOT_DIRFRAMEWORK_ROOT_DIR 的值是完全一致的:/home/example/static-php-cli。 框架的源码和应用的源码都在当前路径下。

    Vendor 库模式(vendor)

    Vendor 库模式一般是指你的项目为框架类或者被其他应用作为 composer 依赖项安装到项目中,存放位置在 vendor/author/XXX 目录。

    假设你的项目是 crazywhalecc/static-php-cli,你或其他人在另一个项目使用 composer require 安装了这个项目。

    我们假设 static-php-cli 中包含同 Git 模式 的除 vendor 目录外的所有文件,并从 src/App/MyCommand 中获取常量值, 目录常量应该是:

    ConstantValue
    WORKING_DIR/home/example/another-app
    SOURCE_ROOT_DIR/home/example/another-app
    FRAMEWORK_ROOT_DIR/home/example/another-app/vendor/crazywhalecc/static-php-cli
    __DIR__/home/example/another-app/vendor/crazywhalecc/static-php-cli/src/App
    __FILE__/home/example/another-app/vendor/crazywhalecc/static-php-cli/src/App/MyCommand.php

    这里的 SOURCE_ROOT_DIR 就指的是使用 static-php-cli 的项目的根目录。

    Git 项目 Phar 模式(source-phar)

    Git 项目 Phar 模式指的是将 Git 项目模式的项目目录打包为一个 phar 文件的模式。我们假设 /home/example/static-php-cli 将打包为一个 Phar 文件,目录有以下文件:

    composer.json
    +src/App/MyCommand.app
    +vendor/*
    +bin/entry.php

    打包为 app.phar 并存放到 /home/example/static-php-cli 目录下时,此时执行 app.phar,假设执行了 src/App/MyCommand 代码,常量在该文件内获取:

    ConstantValue
    WORKING_DIR/home/example/static-php-cli
    SOURCE_ROOT_DIRphar:///home/example/static-php-cli/app.phar/
    FRAMEWORK_ROOT_DIRphar:///home/example/static-php-cli/app.phar/
    __DIR__phar:///home/example/static-php-cli/app.phar/src/App
    __FILE__phar:///home/example/static-php-cli/app.phar/src/App/MyCommand.php

    因为在 phar 内读取自身 phar 的文件需要 phar:// 协议进行,所以项目根目录和框架目录将会和 WORKING_DIR 不同。

    Vendor 库 Phar 模式(vendor-phar)

    Vendor 库 Phar 模式指的是你的项目作为框架安装在其他项目内,存储于 vendor 目录下。

    我们假设你的项目目录结构如下:

    composer.json # 当前项目的 Composer 配置文件
    +box.json # 打包 Phar 的配置文件
    +another-app.php # 另一个项目的入口文件
    +vendor/crazywhalecc/static-php-cli/* # 你的项目被作为依赖库

    将该目录 /home/example/another-app/ 下的这些文件打包为 app.phar 时,对于你的项目而言,下面常量的值应为:

    ConstantValue
    WORKING_DIR/home/example/another-app
    SOURCE_ROOT_DIRphar:///home/example/another-app/app.phar/
    FRAMEWORK_ROOT_DIRphar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli
    __DIR__phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App
    __FILE__phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App/MyCommand.php
    `,49)])])}const _=o(t,[["render",p]]);export{m as __pageData,_ as default}; diff --git a/assets/zh_develop_structure.md.CEd1RycZ.lean.js b/assets/zh_develop_structure.md.CEd1RycZ.lean.js new file mode 100644 index 00000000..8cdf8780 --- /dev/null +++ b/assets/zh_develop_structure.md.CEd1RycZ.lean.js @@ -0,0 +1 @@ +import{_ as o,c as d,o as c,ah as a}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"项目结构简介","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/structure.md","filePath":"zh/develop/structure.md"}'),t={name:"zh/develop/structure.md"};function p(r,e,i,s,l,n){return c(),d("div",null,[...e[0]||(e[0]=[a("",49)])])}const _=o(t,[["render",p]]);export{m as __pageData,_ as default}; diff --git a/assets/zh_develop_structure.md.DStJTsYD.js b/assets/zh_develop_structure.md.DStJTsYD.js deleted file mode 100644 index 8ed0c71a..00000000 --- a/assets/zh_develop_structure.md.DStJTsYD.js +++ /dev/null @@ -1,10 +0,0 @@ -import{_ as o,c as d,o as c,af as a}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"项目结构简介","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/structure.md","filePath":"zh/develop/structure.md"}'),t={name:"zh/develop/structure.md"};function p(r,e,i,s,l,n){return c(),d("div",null,e[0]||(e[0]=[a(`

    项目结构简介

    static-php-cli 主要包含三种逻辑组件:资源、依赖库、扩展。这三种组件四个配置文件:source.jsonlib.jsonext.jsonpkg.json

    一个完整的构建静态 PHP 流程是:

    1. 使用资源下载模块 Downloader 下载指定或所有资源,这些资源包含 PHP 源码、依赖库源码、扩展源码。
    2. 使用资源解压模块 SourceExtractor 解压下载的资源到编译目录。
    3. 使用依赖工具计算出当前加入的扩展的依赖扩展、依赖库,然后对每个需要编译的依赖库进行编译,按照依赖顺序。
    4. 使用对应操作系统下的 Builder 构建每个依赖库后,将其安装到 buildroot 目录。
    5. 如果包含外部扩展(源码没有包含在 PHP 内的扩展),将外部扩展拷贝到 source/php-src/ext/ 目录。
    6. 使用 Builder 构建 PHP 源码,将其安装到 buildroot 目录。

    项目主要分为几个文件夹:

    • bin/: 用于存放程序入口文件,包含 bin/spcbin/spc-alpine-dockerbin/setup-runtime
    • config/: 包含了所有项目支持的扩展、依赖库以及这些资源下载的地址、下载方式等,:lib.jsonext.jsonsource.jsonpkg.jsonpre-built.json
    • src/SPC/: 项目的核心代码,包含了整个框架以及编译各种扩展和库的命令。
    • src/globals/: 项目的全局方法和常量、运行时需要的测试文件(例如:扩展的可用性检查代码)。
    • vendor/: Composer 依赖的目录,你无需对它做出任何修改。

    其中运行原理就是启动一个 symfony/consoleConsoleApplication,然后解析用户在终端输入的命令。

    基本命令行结构

    bin/spc 是一个 PHP 代码入口文件,包含了 Unix 通用的 #!/usr/bin/env php 用来让系统自动以系统安装好的 PHP 解释器执行。 在项目执行了 new ConsoleApplication() 后,框架会自动使用反射的方式,解析 src/SPC/command 目录下的所有类,并将其注册成为命令。

    项目并没有直接使用 Symfony 推荐的 Command 注册方式和命令执行方式,这里做出了一点小变动:

    1. 每个命令都使用 #[AsCommand()] Attribute 来注册名称和简介。
    2. execute() 抽象化,让所有命令基于 BaseCommand(它基于 Symfony\\Component\\Console\\Command\\Command),每个命令本身的执行代码写到了 handle() 方法中。
    3. BaseCommand 添加了变量 $no_motd,用于是否在该命令执行时显示 Figlet 欢迎词。
    4. BaseCommandInputInterfaceOutputInterface 保存为成员变量,你可以在命令的类内使用 $this->input$this->output

    基本源码结构

    项目的源码位于 src/SPC 目录,支持 PSR-4 标准的自动加载,包含以下子目录和类:

    • src/SPC/builder/: 用于不同操作系统下构建依赖库、PHP 及相关扩展的核心编译命令代码,还包含了一些编译的系统工具方法。
    • src/SPC/command/: 项目的所有命令都在这里。
    • src/SPC/doctor/: Doctor 模块,它是一个较为独立的用于检查系统环境的模块,可使用命令 bin/spc doctor 进入。
    • src/SPC/exception/: 异常类。
    • src/SPC/store/: 有关存储、文件和资源的类都在这里。
    • src/SPC/util/: 一些可以复用的工具方法都在这里。
    • src/SPC/ConsoleApplication.php: 命令行程序入口文件。

    如果你阅读过源码,你可能会发现还有一个 src/globals/ 目录,它是用于存放一些全局变量、全局方法、构建过程中依赖的非 PSR-4 标准的 PHP 源码,例如测试扩展代码等。

    Phar 应用目录问题

    和其他 php-cli 项目一样,spc 自身对路径有额外的考虑。 因为 spc 可以在 php-cli directlymicro SAPIphp-cli with Pharvendor with Phar 等多种模式下运行,各类根目录存在歧义。这里会进行一个完整的说明。 此问题一般常见于 PHP 项目中存取文件的基类路径选择问题,尤其是在配合 micro.sfx 使用时容易出现路径问题。

    注意,此处仅对你在开发 Phar 项目或 PHP 框架时可能有用。

    接下来我们都将 static-php-cli(也就是 spc)当作一个普通的 php 命令行程序来看,你可以将 spc 理解为你自己的任何 php-cli 应用以参考。

    下面主要有三个基本的常量理论值,我们建议你在编写 php 项目时引入这三种常量:

    • WORKING_DIR:执行 PHP 脚本时的工作目录
    • SOURCE_ROOT_DIRROOT_DIR:项目文件夹的根目录,一般为 composer.json 所在目录
    • FRAMEWORK_ROOT_DIR:使用框架的根目录,自行开发的框架可能会用到,一般框架目录为只读

    你可以在你的框架或者 cli 应用程序入口中定义这些常量,以方便在你的项目中使用路径。

    下面是 PHP 内置的常量值,在 PHP 解释器内部已被定义:

    • __DIR__:当前执行脚本的文件所在目录
    • __FILE__:当前执行脚本的文件路径

    Git 项目模式(source)

    Git 项目模式指的是一个框架或程序本身在当前文件夹以纯文本形式存放,运行通过 php path/to/entry.php 方式。

    假设你的项目存放在 /home/example/static-php-cli/ 目录下,或你的项目就是框架本身,里面包含 composer.json 等项目文件:

    composer.json
    -src/App/MyCommand.app
    -vendor/*
    -bin/entry.php

    我们假设从 src/App/MyCommand.php 中获取以上常量:

    ConstantValue
    WORKING_DIR/home/example/static-php-cli
    SOURCE_ROOT_DIR/home/example/static-php-cli
    FRAMEWORK_ROOT_DIR/home/example/static-php-cli
    __DIR__/home/example/static-php-cli/src/App
    __FILE__/home/example/static-php-cli/src/App/MyCommand.php

    这种情况下,WORKING_DIRSOURCE_ROOT_DIRFRAMEWORK_ROOT_DIR 的值是完全一致的:/home/example/static-php-cli。 框架的源码和应用的源码都在当前路径下。

    Vendor 库模式(vendor)

    Vendor 库模式一般是指你的项目为框架类或者被其他应用作为 composer 依赖项安装到项目中,存放位置在 vendor/author/XXX 目录。

    假设你的项目是 crazywhalecc/static-php-cli,你或其他人在另一个项目使用 composer require 安装了这个项目。

    我们假设 static-php-cli 中包含同 Git 模式 的除 vendor 目录外的所有文件,并从 src/App/MyCommand 中获取常量值, 目录常量应该是:

    ConstantValue
    WORKING_DIR/home/example/another-app
    SOURCE_ROOT_DIR/home/example/another-app
    FRAMEWORK_ROOT_DIR/home/example/another-app/vendor/crazywhalecc/static-php-cli
    __DIR__/home/example/another-app/vendor/crazywhalecc/static-php-cli/src/App
    __FILE__/home/example/another-app/vendor/crazywhalecc/static-php-cli/src/App/MyCommand.php

    这里的 SOURCE_ROOT_DIR 就指的是使用 static-php-cli 的项目的根目录。

    Git 项目 Phar 模式(source-phar)

    Git 项目 Phar 模式指的是将 Git 项目模式的项目目录打包为一个 phar 文件的模式。我们假设 /home/example/static-php-cli 将打包为一个 Phar 文件,目录有以下文件:

    composer.json
    -src/App/MyCommand.app
    -vendor/*
    -bin/entry.php

    打包为 app.phar 并存放到 /home/example/static-php-cli 目录下时,此时执行 app.phar,假设执行了 src/App/MyCommand 代码,常量在该文件内获取:

    ConstantValue
    WORKING_DIR/home/example/static-php-cli
    SOURCE_ROOT_DIRphar:///home/example/static-php-cli/app.phar/
    FRAMEWORK_ROOT_DIRphar:///home/example/static-php-cli/app.phar/
    __DIR__phar:///home/example/static-php-cli/app.phar/src/App
    __FILE__phar:///home/example/static-php-cli/app.phar/src/App/MyCommand.php

    因为在 phar 内读取自身 phar 的文件需要 phar:// 协议进行,所以项目根目录和框架目录将会和 WORKING_DIR 不同。

    Vendor 库 Phar 模式(vendor-phar)

    Vendor 库 Phar 模式指的是你的项目作为框架安装在其他项目内,存储于 vendor 目录下。

    我们假设你的项目目录结构如下:

    composer.json # 当前项目的 Composer 配置文件
    -box.json # 打包 Phar 的配置文件
    -another-app.php # 另一个项目的入口文件
    -vendor/crazywhalecc/static-php-cli/* # 你的项目被作为依赖库

    将该目录 /home/example/another-app/ 下的这些文件打包为 app.phar 时,对于你的项目而言,下面常量的值应为:

    ConstantValue
    WORKING_DIR/home/example/another-app
    SOURCE_ROOT_DIRphar:///home/example/another-app/app.phar/
    FRAMEWORK_ROOT_DIRphar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli
    __DIR__phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App
    __FILE__phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App/MyCommand.php
    `,49)]))}const _=o(t,[["render",p]]);export{m as __pageData,_ as default}; diff --git a/assets/zh_develop_structure.md.DStJTsYD.lean.js b/assets/zh_develop_structure.md.DStJTsYD.lean.js deleted file mode 100644 index 1d26063d..00000000 --- a/assets/zh_develop_structure.md.DStJTsYD.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as o,c as d,o as c,af as a}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"项目结构简介","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/structure.md","filePath":"zh/develop/structure.md"}'),t={name:"zh/develop/structure.md"};function p(r,e,i,s,l,n){return c(),d("div",null,e[0]||(e[0]=[a("",49)]))}const _=o(t,[["render",p]]);export{m as __pageData,_ as default}; diff --git a/assets/zh_develop_system-build-tools.md.CxPkPV_h.js b/assets/zh_develop_system-build-tools.md.CQ4BvPVa.js similarity index 70% rename from assets/zh_develop_system-build-tools.md.CxPkPV_h.js rename to assets/zh_develop_system-build-tools.md.CQ4BvPVa.js index cc2c3643..dea5cc89 100644 --- a/assets/zh_develop_system-build-tools.md.CxPkPV_h.js +++ b/assets/zh_develop_system-build-tools.md.CQ4BvPVa.js @@ -1,4 +1,4 @@ -import{_ as i,c as a,o as l,af as n}from"./chunks/framework.PeLcR_tw.js";const o=JSON.parse('{"title":"系统编译工具","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/system-build-tools.md","filePath":"zh/develop/system-build-tools.md"}'),p={name:"zh/develop/system-build-tools.md"};function e(h,s,k,t,c,d){return l(),a("div",null,s[0]||(s[0]=[n(`

    系统编译工具

    static-php-cli 在构建静态 PHP 时使用了许多系统编译工具,这些工具主要包括:

    • autoconf: 用于生成 configure 脚本。
    • make: 用于执行 Makefile
    • cmake: 用于执行 CMakeLists.txt
    • pkg-config: 用于查找依赖库的安装路径。
    • gcc: 用于在 Linux 下编译 C/C++ 语言代码。
    • clang: 用于在 macOS 下编译 C/C++ 语言代码。

    对于 Linux 和 macOS 操作系统,这些工具通常可以通过包管理安装,这部分在 doctor 模块中编写了。 理论上我们也可以通过编译和手动下载这些工具,但这样会增加编译的复杂度,所以我们不推荐这样做。

    Linux 环境编译工具

    对于 Linux 系统来说,不同发行版的编译工具安装方式不同。而且对于静态编译来说,某些发行版的包管理无法安装用于纯静态编译的库和工具, 所以对于 Linux 平台及其不同发行版,我们目前提供了多种编译环境的部署措施。

    glibc 环境

    glibc 环境指的是系统底层的 libc 库(即所有 C 语言编写的程序动态链接的 C 标准库)使用的是 glibc,这是大多数发行版的默认环境。 例如:Ubuntu、Debian、CentOS、RHEL、openSUSE、Arch Linux 等。

    而 glibc 环境下,我们使用的包管理、编译器都是默认指向 glibc 的,glibc 不能被良好地静态链接。它不能被静态链接的原因之一是它的网络库 nss 无法静态编译。

    对于 glibc 环境,在 2.0 RC8 及以后的 static-php-cli 及 spc 中,你可以选择两种方式来构建静态 PHP:

    1. 使用 Docker 构建,这是最简单的方式,你可以使用 bin/spc-alpine-docker 来构建,它会在 Alpine Linux 环境下构建。
    2. 使用 bin/spc doctor 安装 musl-wrapper 和 musl-cross-make 套件,然后直接正常构建。(相关源码

    一般来说,这两种构建方式的构建结果是一致的,你可以根据实际需求选择。

    在 doctor 模块中,static-php-cli 会先检测当前的 Linux 发行版。如果当前发行版是 glibc 环境,会提示需要安装 musl-wrapper 和 musl-cross-make 套件。

    在 glibc 环境下安装 musl-wrapper 的过程如下:

    1. 从 musl 官网下载特定版本的 musl-wrapper 源码
    2. 使用从包管理安装的 gcc 编译 musl-wrapper 源码,生成 musl-libc 等库:./configure --disable-gcc-wrapper && make -j && sudo make install
    3. musl-wrapper 相关库将被安装在 /usr/local/musl 目录。

    在 glibc 环境下安装 musl-cross-make 的过程如下:

    1. 从 dl.static-php.dev 下载预编译好的 musl-cross-make 压缩包。
    2. 解压到 /usr/local/musl 目录。

    TIP

    在 glibc 环境下,静态编译可以通过直接安装 musl-wrapper 来实现,但是 musl-wrapper 仅包含了 musl-gcc,而没有 musl-g++,这也就意味着无法编译 C++ 代码。 所以我们需要 musl-cross-make 来提供 musl-g++

    而 musl-cross-make 套件无法在本地直接编译的原因是它的编译环境要求比较高(需要 36GB 以上内存,Alpine Linux 下编译),所以我们提供了预编译好的二进制包,可用于所有 Linux 发行版。

    同时,部分发行版的包管理提供了 musl-wrapper,但 musl-cross-make 需要匹配对应的 musl-wrapper 版本,所以我们不使用包管理安装 musl-wrapper。

    对于如何编译 musl-cross-make,将在本章节内的 编译 musl-cross-make 小节中介绍。

    musl 环境

    musl 环境指的是系统底层的 libc 库使用的是 musl,这是一种轻量级的 C 标准库,它的特点是可以被良好地静态链接。

    对于目前流行的 Linux 发行版,Alpine Linux 使用的就是 musl 环境,所以 static-php-cli 在 Alpine Linux 下可以直接构建静态 PHP,仅需直接从包管理安装基础编译工具(如 gcc、cmake 等)即可。

    对于其他发行版,如果你的发行版使用的是 musl 环境,那么你也可以在安装必要的编译工具后直接使用 static-php-cli 构建静态 PHP。

    TIP

    在 musl 环境下,static-php-cli 会自动跳过 musl-wrapper 和 musl-cross-make 的安装。

    Docker 环境

    Docker 环境指的是使用 Docker 容器来构建静态 PHP,你可以使用 bin/spc-alpine-docker 来构建。 执行这个命令前需要先安装 Docker,然后在项目根目录执行 bin/spc-alpine-docker 即可。

    在执行 bin/spc-alpine-docker 后,static-php-cli 会自动下载 Alpine Linux 镜像,然后构建一个 cwcc-spc-x86_64cwcc-spc-aarch64 的镜像。 然后一切的构建都在这个镜像内进行,相当于在 Alpine Linux 内编译。总的来说,Docker 环境就是 musl 环境。

    musl-cross-make 工具链编译

    在 Linux 中,尽管你不需要手动编译 musl-cross-make 工具,但是如果你想了解它的编译过程,可以参考这里。 还有一个重要的原因就是,这个可能无法使用 CI、Actions 等自动化工具编译,因为现有的 CI 服务编译环境不满足 musl-cross-make 的编译要求,满足要求的配置价格太高。

    musl-cross-make 的编译过程如下:

    准备一个 Alpine Linux 环境(直接安装或使用 Docker 均可),编译的过程需要 36GB 以上内存,所以你需要在内存较大的机器上编译。如果没有这么多内存,可能会导致编译失败。

    然后将以下内容写入 config.mak 文件内:

    makefile
    STAT = -static --static
    +import{_ as i,c as a,o as l,ah as n}from"./chunks/framework.Bhsyh9kO.js";const o=JSON.parse('{"title":"系统编译工具","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/system-build-tools.md","filePath":"zh/develop/system-build-tools.md"}'),p={name:"zh/develop/system-build-tools.md"};function e(h,s,k,t,c,d){return l(),a("div",null,[...s[0]||(s[0]=[n(`

    系统编译工具

    static-php-cli 在构建静态 PHP 时使用了许多系统编译工具,这些工具主要包括:

    • autoconf: 用于生成 configure 脚本。
    • make: 用于执行 Makefile
    • cmake: 用于执行 CMakeLists.txt
    • pkg-config: 用于查找依赖库的安装路径。
    • gcc: 用于在 Linux 下编译 C/C++ 语言代码。
    • clang: 用于在 macOS 下编译 C/C++ 语言代码。

    对于 Linux 和 macOS 操作系统,这些工具通常可以通过包管理安装,这部分在 doctor 模块中编写了。 理论上我们也可以通过编译和手动下载这些工具,但这样会增加编译的复杂度,所以我们不推荐这样做。

    Linux 环境编译工具

    对于 Linux 系统来说,不同发行版的编译工具安装方式不同。而且对于静态编译来说,某些发行版的包管理无法安装用于纯静态编译的库和工具, 所以对于 Linux 平台及其不同发行版,我们目前提供了多种编译环境的部署措施。

    glibc 环境

    glibc 环境指的是系统底层的 libc 库(即所有 C 语言编写的程序动态链接的 C 标准库)使用的是 glibc,这是大多数发行版的默认环境。 例如:Ubuntu、Debian、CentOS、RHEL、openSUSE、Arch Linux 等。

    而 glibc 环境下,我们使用的包管理、编译器都是默认指向 glibc 的,glibc 不能被良好地静态链接。它不能被静态链接的原因之一是它的网络库 nss 无法静态编译。

    对于 glibc 环境,在 2.0 RC8 及以后的 static-php-cli 及 spc 中,你可以选择两种方式来构建静态 PHP:

    1. 使用 Docker 构建,这是最简单的方式,你可以使用 bin/spc-alpine-docker 来构建,它会在 Alpine Linux 环境下构建。
    2. 使用 bin/spc doctor 安装 musl-wrapper 和 musl-cross-make 套件,然后直接正常构建。(相关源码

    一般来说,这两种构建方式的构建结果是一致的,你可以根据实际需求选择。

    在 doctor 模块中,static-php-cli 会先检测当前的 Linux 发行版。如果当前发行版是 glibc 环境,会提示需要安装 musl-wrapper 和 musl-cross-make 套件。

    在 glibc 环境下安装 musl-wrapper 的过程如下:

    1. 从 musl 官网下载特定版本的 musl-wrapper 源码
    2. 使用从包管理安装的 gcc 编译 musl-wrapper 源码,生成 musl-libc 等库:./configure --disable-gcc-wrapper && make -j && sudo make install
    3. musl-wrapper 相关库将被安装在 /usr/local/musl 目录。

    在 glibc 环境下安装 musl-cross-make 的过程如下:

    1. 从 dl.static-php.dev 下载预编译好的 musl-cross-make 压缩包。
    2. 解压到 /usr/local/musl 目录。

    TIP

    在 glibc 环境下,静态编译可以通过直接安装 musl-wrapper 来实现,但是 musl-wrapper 仅包含了 musl-gcc,而没有 musl-g++,这也就意味着无法编译 C++ 代码。 所以我们需要 musl-cross-make 来提供 musl-g++

    而 musl-cross-make 套件无法在本地直接编译的原因是它的编译环境要求比较高(需要 36GB 以上内存,Alpine Linux 下编译),所以我们提供了预编译好的二进制包,可用于所有 Linux 发行版。

    同时,部分发行版的包管理提供了 musl-wrapper,但 musl-cross-make 需要匹配对应的 musl-wrapper 版本,所以我们不使用包管理安装 musl-wrapper。

    对于如何编译 musl-cross-make,将在本章节内的 编译 musl-cross-make 小节中介绍。

    musl 环境

    musl 环境指的是系统底层的 libc 库使用的是 musl,这是一种轻量级的 C 标准库,它的特点是可以被良好地静态链接。

    对于目前流行的 Linux 发行版,Alpine Linux 使用的就是 musl 环境,所以 static-php-cli 在 Alpine Linux 下可以直接构建静态 PHP,仅需直接从包管理安装基础编译工具(如 gcc、cmake 等)即可。

    对于其他发行版,如果你的发行版使用的是 musl 环境,那么你也可以在安装必要的编译工具后直接使用 static-php-cli 构建静态 PHP。

    TIP

    在 musl 环境下,static-php-cli 会自动跳过 musl-wrapper 和 musl-cross-make 的安装。

    Docker 环境

    Docker 环境指的是使用 Docker 容器来构建静态 PHP,你可以使用 bin/spc-alpine-docker 来构建。 执行这个命令前需要先安装 Docker,然后在项目根目录执行 bin/spc-alpine-docker 即可。

    在执行 bin/spc-alpine-docker 后,static-php-cli 会自动下载 Alpine Linux 镜像,然后构建一个 cwcc-spc-x86_64cwcc-spc-aarch64 的镜像。 然后一切的构建都在这个镜像内进行,相当于在 Alpine Linux 内编译。总的来说,Docker 环境就是 musl 环境。

    musl-cross-make 工具链编译

    在 Linux 中,尽管你不需要手动编译 musl-cross-make 工具,但是如果你想了解它的编译过程,可以参考这里。 还有一个重要的原因就是,这个可能无法使用 CI、Actions 等自动化工具编译,因为现有的 CI 服务编译环境不满足 musl-cross-make 的编译要求,满足要求的配置价格太高。

    musl-cross-make 的编译过程如下:

    准备一个 Alpine Linux 环境(直接安装或使用 Docker 均可),编译的过程需要 36GB 以上内存,所以你需要在内存较大的机器上编译。如果没有这么多内存,可能会导致编译失败。

    然后将以下内容写入 config.mak 文件内:

    makefile
    STAT = -static --static
     FLAG = -g0 -Os -Wno-error
     
     ifneq ($(NATIVE),)
    @@ -64,4 +64,4 @@ import{_ as i,c as a,o as l,af as n}from"./chunks/framework.PeLcR_tw.js";const o
     sed -i 's/poison calloc/poison/g' ./gcc-13.2.0/gcc/system.h
     make TARGET=x86_64-linux-musl -j
     make TARGET=x86_64-linux-musl install -j
    -tar cvzf x86_64-musl-toolchain.tgz output/*

    TIP

    以上所有脚本都适用于 x86_64 架构的 Linux。如果你需要构建 ARM 环境的 musl-cross-make,只需要将上方所有 x86_64 替换为 aarch64 即可。

    这个编译过程可能会因为内存不足、网络问题等原因导致编译失败,你可以多尝试几次,或者使用更大内存的机器来编译。 如果遇到了问题,或者你有更好的改进方案,可以在 讨论 中提出。

    macOS 环境编译工具

    对于 macOS 系统来说,我们使用的编译工具主要是 clang,它是 macOS 系统默认的编译器,同时也是 Xcode 的编译器。

    在 macOS 下编译,主要依赖于 Xcode 或 Xcode Command Line Tools,你可以在 App Store 下载 Xcode,或者在终端执行 xcode-select --install 来安装 Xcode Command Line Tools。

    此外,在 doctor 环境检查模块中,static-php-cli 会检查 macOS 系统是否安装了 Homebrew、编译工具等,如果没有,会提示你安装,这里不再赘述。

    FreeBSD 环境编译工具

    FreeBSD 也是 Unix 系统,它的编译工具和 macOS 类似,你可以直接使用包管理 pkg 安装 clang 等编译工具,通过 doctor 命令。

    pkg-config 编译

    如果你在使用 static-php-cli 构建静态 PHP 时仔细观察编译的日志,你会发现无论编译什么,都会先编译 pkg-config,这是因为 pkg-config 是一个用于查找依赖库的工具。 在早期的 static-php-cli 版本中,我们直接使用了包管理安装的 pkg-config 工具,但是这样会导致一些问题,例如:

    • 即使指定了 PKG_CONFIG_PATHpkg-config 也会尝试从系统路径中查找依赖包。
    • 由于 pkg-config 会从系统路径中查找依赖包,所以如果系统中存在同名的依赖包,可能会导致编译失败。

    为了避免以上问题,我们将 pkg-config 编译到用户态的 buildroot/bin 内并使用,使用了 --without-sysroot 等参数来避免从系统路径中查找依赖包。

    `,50)]))}const E=i(p,[["render",e]]);export{o as __pageData,E as default}; +tar cvzf x86_64-musl-toolchain.tgz output/*

    TIP

    以上所有脚本都适用于 x86_64 架构的 Linux。如果你需要构建 ARM 环境的 musl-cross-make,只需要将上方所有 x86_64 替换为 aarch64 即可。

    这个编译过程可能会因为内存不足、网络问题等原因导致编译失败,你可以多尝试几次,或者使用更大内存的机器来编译。 如果遇到了问题,或者你有更好的改进方案,可以在 讨论 中提出。

    macOS 环境编译工具

    对于 macOS 系统来说,我们使用的编译工具主要是 clang,它是 macOS 系统默认的编译器,同时也是 Xcode 的编译器。

    在 macOS 下编译,主要依赖于 Xcode 或 Xcode Command Line Tools,你可以在 App Store 下载 Xcode,或者在终端执行 xcode-select --install 来安装 Xcode Command Line Tools。

    此外,在 doctor 环境检查模块中,static-php-cli 会检查 macOS 系统是否安装了 Homebrew、编译工具等,如果没有,会提示你安装,这里不再赘述。

    FreeBSD 环境编译工具

    FreeBSD 也是 Unix 系统,它的编译工具和 macOS 类似,你可以直接使用包管理 pkg 安装 clang 等编译工具,通过 doctor 命令。

    pkg-config 编译

    如果你在使用 static-php-cli 构建静态 PHP 时仔细观察编译的日志,你会发现无论编译什么,都会先编译 pkg-config,这是因为 pkg-config 是一个用于查找依赖库的工具。 在早期的 static-php-cli 版本中,我们直接使用了包管理安装的 pkg-config 工具,但是这样会导致一些问题,例如:

    • 即使指定了 PKG_CONFIG_PATHpkg-config 也会尝试从系统路径中查找依赖包。
    • 由于 pkg-config 会从系统路径中查找依赖包,所以如果系统中存在同名的依赖包,可能会导致编译失败。

    为了避免以上问题,我们将 pkg-config 编译到用户态的 buildroot/bin 内并使用,使用了 --without-sysroot 等参数来避免从系统路径中查找依赖包。

    `,50)])])}const E=i(p,[["render",e]]);export{o as __pageData,E as default}; diff --git a/assets/zh_develop_system-build-tools.md.CQ4BvPVa.lean.js b/assets/zh_develop_system-build-tools.md.CQ4BvPVa.lean.js new file mode 100644 index 00000000..be3be439 --- /dev/null +++ b/assets/zh_develop_system-build-tools.md.CQ4BvPVa.lean.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as l,ah as n}from"./chunks/framework.Bhsyh9kO.js";const o=JSON.parse('{"title":"系统编译工具","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/system-build-tools.md","filePath":"zh/develop/system-build-tools.md"}'),p={name:"zh/develop/system-build-tools.md"};function e(h,s,k,t,c,d){return l(),a("div",null,[...s[0]||(s[0]=[n("",50)])])}const E=i(p,[["render",e]]);export{o as __pageData,E as default}; diff --git a/assets/zh_develop_system-build-tools.md.CxPkPV_h.lean.js b/assets/zh_develop_system-build-tools.md.CxPkPV_h.lean.js deleted file mode 100644 index d1397476..00000000 --- a/assets/zh_develop_system-build-tools.md.CxPkPV_h.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as a,o as l,af as n}from"./chunks/framework.PeLcR_tw.js";const o=JSON.parse('{"title":"系统编译工具","description":"","frontmatter":{},"headers":[],"relativePath":"zh/develop/system-build-tools.md","filePath":"zh/develop/system-build-tools.md"}'),p={name:"zh/develop/system-build-tools.md"};function e(h,s,k,t,c,d){return l(),a("div",null,s[0]||(s[0]=[n("",50)]))}const E=i(p,[["render",e]]);export{o as __pageData,E as default}; diff --git a/assets/zh_faq_index.md.nE1d0aPt.js b/assets/zh_faq_index.md.BihV7puH.js similarity index 64% rename from assets/zh_faq_index.md.nE1d0aPt.js rename to assets/zh_faq_index.md.BihV7puH.js index 27107cad..b932a6ff 100644 --- a/assets/zh_faq_index.md.nE1d0aPt.js +++ b/assets/zh_faq_index.md.BihV7puH.js @@ -1,4 +1,4 @@ -import{_ as i,c as a,o as s,af as o}from"./chunks/framework.PeLcR_tw.js";const b=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"zh/faq/index.md","filePath":"zh/faq/index.md"}'),c={name:"zh/faq/index.md"};function p(d,e,l,n,r,h){return s(),a("div",null,e[0]||(e[0]=[o(`

    常见问题

    这里将会编写一些你容易遇到的问题。目前有很多,但是我需要花时间来整理一下。

    php.ini 的路径是什么?

    在 Linux、macOS 和 FreeBSD 上,php.ini 的路径是 /usr/local/etc/php/php.ini。 在 Windows 中,路径是 C:\\windows\\php.iniphp.exe 所在的当前目录。 可以在 *nix 系统中使用手动构建选项 --with-config-file-path 来更改查找 php.ini 的目录。

    此外,在 Linux、macOS 和 FreeBSD 上,/usr/local/etc/php/conf.d 目录中的 .ini 文件也会被加载。 在 Windows 中,该路径默认为空。 可以使用手动构建选项 --with-config-file-scan-dir 更改该目录。

    PHP 默认也会从 其他标准位置 中搜索 php.ini

    静态编译的 PHP 可以安装扩展吗?

    因为传统架构下的 PHP 安装扩展的原理是使用 .so 类型的动态链接的库方式安装新扩展,而使用本项目编译的静态链接的 PHP。但是静态链接在不同操作系统有不同的定义。

    首先,对于 Linux 系统,静态链接的二进制文件不会链接系统的动态链接库。纯静态链接的二进制文件(-all-static)无法加载动态库,因此无法添加新扩展。 同时,在纯静态模式下,你也不能使用 ffi 等扩展来加载外部 .so 模块。

    你可以使用命令 ldd buildroot/bin/php 来检查你在 Linux 下构建的二进制文件是否为纯静态链接。

    如果你 构建基于 GNU libc 的 PHP,你可以使用 ffi 扩展来加载外部 .so 模块,并加载具有相同 ABI 的 .so 扩展。

    例如,你可以使用以下命令构建一个与 glibc 动态链接的静态 PHP 二进制文件,支持 FFI 扩展并加载相同 PHP 版本和相同 TS 类型的 xdebug.so 扩展:

    bash
    bin/spc-gnu-docker download --for-extensions=ffi,xml --with-php=8.4
    +import{_ as i,c as a,o as s,ah as o}from"./chunks/framework.Bhsyh9kO.js";const b=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"zh/faq/index.md","filePath":"zh/faq/index.md"}'),c={name:"zh/faq/index.md"};function p(d,e,l,n,r,h){return s(),a("div",null,[...e[0]||(e[0]=[o(`

    常见问题

    这里将会编写一些你容易遇到的问题。目前有很多,但是我需要花时间来整理一下。

    php.ini 的路径是什么?

    在 Linux、macOS 和 FreeBSD 上,php.ini 的路径是 /usr/local/etc/php/php.ini。 在 Windows 中,路径是 C:\\windows\\php.iniphp.exe 所在的当前目录。 可以在 *nix 系统中使用手动构建选项 --with-config-file-path 来更改查找 php.ini 的目录。

    此外,在 Linux、macOS 和 FreeBSD 上,/usr/local/etc/php/conf.d 目录中的 .ini 文件也会被加载。 在 Windows 中,该路径默认为空。 可以使用手动构建选项 --with-config-file-scan-dir 更改该目录。

    PHP 默认也会从 其他标准位置 中搜索 php.ini

    静态编译的 PHP 可以安装扩展吗?

    因为传统架构下的 PHP 安装扩展的原理是使用 .so 类型的动态链接的库方式安装新扩展,而使用本项目编译的静态链接的 PHP。但是静态链接在不同操作系统有不同的定义。

    首先,对于 Linux 系统,静态链接的二进制文件不会链接系统的动态链接库。纯静态链接的二进制文件(-all-static)无法加载动态库,因此无法添加新扩展。 同时,在纯静态模式下,你也不能使用 ffi 等扩展来加载外部 .so 模块。

    你可以使用命令 ldd buildroot/bin/php 来检查你在 Linux 下构建的二进制文件是否为纯静态链接。

    如果你 构建基于 GNU libc 的 PHP,你可以使用 ffi 扩展来加载外部 .so 模块,并加载具有相同 ABI 的 .so 扩展。

    例如,你可以使用以下命令构建一个与 glibc 动态链接的静态 PHP 二进制文件,支持 FFI 扩展并加载相同 PHP 版本和相同 TS 类型的 xdebug.so 扩展:

    bash
    bin/spc-gnu-docker download --for-extensions=ffi,xml --with-php=8.4
     bin/spc-gnu-docker build ffi,xml --build-cli --debug
     
    -buildroot/bin/php -d "zend_extension=/path/to/php{PHP_VER}-{ts/nts}/xdebug.so" --ri xdebug

    对于 macOS 平台,macOS 下的几乎所有二进制文件都无法真正纯静态链接,几乎所有二进制文件都会链接 macOS 系统库:/usr/lib/libresolv.9.dylib/usr/lib/libSystem.B.dylib。 因此,在 macOS 上,你可以直接使用 SPC 构建具有动态链接扩展的静态编译 PHP 二进制文件:

    1. 使用 --build-shared=XXX 选项构建共享扩展 xxx.so。例如:bin/spc build bcmath,zlib --build-shared=xdebug --build-cli
    2. 你将获得 buildroot/modules/xdebug.sobuildroot/bin/php
    3. xdebug.so 文件可用于版本和线程安全相同的 php。

    可以支持 Oracle 数据库扩展吗?

    部分依赖库闭源的扩展,如 oci8sourceguardian 等,它们没有提供纯静态编译的依赖库文件(.a),仅提供了动态依赖库文件(.so), 这些扩展无法使用源码的形式编译到 static-php-cli 中,所以本项目可能永远也不会支持这些扩展。不过,理论上你可以根据上面的问题在 macOS 和 Linux 下接入和使用这类扩展。

    如果你对此类扩展有需求,或者大部分人都对这些闭源扩展使用有需求, 可以看看有关 standalone-php-cli 的讨论。欢迎留言。

    支持 Windows 吗?

    该项目目前支持 Windows,但支持的扩展数量较少。Windows 支持并不完美。主要有以下问题:

    1. Windows 的编译过程与 *nix 不同,使用的工具链也不同。用于编译每个扩展依赖库的编译工具也几乎完全不同。
    2. Windows 版本的需求也会根据所有使用本项目的人的需求推进。如果很多人需要,我会尽快支持相关扩展。

    我可以使用 micro 保护我的源代码吗?

    不可以。micro.sfx 本质上是将 php 和 php 代码合并为一个文件,没有编译或加密 PHP 代码的过程。

    首先,php-src 是 PHP 代码的官方解释器,市场上没有与主流分支兼容的 PHP 编译器。 我在网上看到一个名为 BPC(Binary PHP Compiler?)的项目可以将 PHP 编译为二进制,但有很多限制。

    加密和保护代码的方向与编译不同。编译后,也可以通过逆向工程等方法获得代码。真正的保护仍然通过打包和加密代码等手段进行。

    因此,本项目(static-php-cli)和相关项目(lwmbs、swoole-cli)都提供了 php-src 源代码的便捷编译工具。 本项目和相关项目引用的 phpmicro 只是 PHP 的 sapi 接口封装,而不是 PHP 代码的编译工具。 PHP 代码的编译器是一个完全不同的项目,因此不考虑额外的情况。 如果你对加密感兴趣,可以考虑使用现有的加密技术,如 Swoole Compiler、Source Guardian 等。

    无法使用 ssl

    更新:该问题已在最新版本的 static-php-cli 中修复,现在默认读取系统的证书文件。如果你仍然遇到问题,请尝试下面的解决方案。

    使用 curl、pgsql 等请求 HTTPS 网站或建立 SSL 连接时,可能会出现 error:80000002:system library::No such file or directory 错误。 此错误是由于静态编译的 PHP 未通过 php.ini 指定 openssl.cafile 导致的。

    你可以通过在使用 PHP 前指定 php.ini 并在 INI 中添加 openssl.cafile=/path/to/your-cert.pem 来解决此问题。

    对于 Linux 系统,你可以从 curl 官方网站下载 cacert.pem 文件,也可以使用系统自带的证书文件。 有关不同发行版的证书位置,请参考 Golang 文档

    INI 配置 openssl.cafile 不能使用 ini_set() 函数动态设置,因为 openssl.cafilePHP_INI_SYSTEM 类型的配置,只能在 php.ini 文件中设置。

    为什么不支持旧版本的 PHP?

    因为旧版本的 PHP 有很多问题,如安全问题、性能问题和功能问题。此外,许多旧版本的 PHP 与最新的依赖库不兼容,这也是不支持旧版本 PHP 的原因之一。

    你可以使用 static-php-cli 早期编译的旧版本,如 PHP 8.0,但不会明确支持早期版本。

    `,35)]))}const k=i(c,[["render",p]]);export{b as __pageData,k as default}; +buildroot/bin/php -d "zend_extension=/path/to/php{PHP_VER}-{ts/nts}/xdebug.so" --ri xdebug

    对于 macOS 平台,macOS 下的几乎所有二进制文件都无法真正纯静态链接,几乎所有二进制文件都会链接 macOS 系统库:/usr/lib/libresolv.9.dylib/usr/lib/libSystem.B.dylib。 因此,在 macOS 上,你可以直接使用 SPC 构建具有动态链接扩展的静态编译 PHP 二进制文件:

    1. 使用 --build-shared=XXX 选项构建共享扩展 xxx.so。例如:bin/spc build bcmath,zlib --build-shared=xdebug --build-cli
    2. 你将获得 buildroot/modules/xdebug.sobuildroot/bin/php
    3. xdebug.so 文件可用于版本和线程安全相同的 php。

    可以支持 Oracle 数据库扩展吗?

    部分依赖库闭源的扩展,如 oci8sourceguardian 等,它们没有提供纯静态编译的依赖库文件(.a),仅提供了动态依赖库文件(.so), 这些扩展无法使用源码的形式编译到 static-php-cli 中,所以本项目可能永远也不会支持这些扩展。不过,理论上你可以根据上面的问题在 macOS 和 Linux 下接入和使用这类扩展。

    如果你对此类扩展有需求,或者大部分人都对这些闭源扩展使用有需求, 可以看看有关 standalone-php-cli 的讨论。欢迎留言。

    支持 Windows 吗?

    该项目目前支持 Windows,但支持的扩展数量较少。Windows 支持并不完美。主要有以下问题:

    1. Windows 的编译过程与 *nix 不同,使用的工具链也不同。用于编译每个扩展依赖库的编译工具也几乎完全不同。
    2. Windows 版本的需求也会根据所有使用本项目的人的需求推进。如果很多人需要,我会尽快支持相关扩展。

    我可以使用 micro 保护我的源代码吗?

    不可以。micro.sfx 本质上是将 php 和 php 代码合并为一个文件,没有编译或加密 PHP 代码的过程。

    首先,php-src 是 PHP 代码的官方解释器,市场上没有与主流分支兼容的 PHP 编译器。 我在网上看到一个名为 BPC(Binary PHP Compiler?)的项目可以将 PHP 编译为二进制,但有很多限制。

    加密和保护代码的方向与编译不同。编译后,也可以通过逆向工程等方法获得代码。真正的保护仍然通过打包和加密代码等手段进行。

    因此,本项目(static-php-cli)和相关项目(lwmbs、swoole-cli)都提供了 php-src 源代码的便捷编译工具。 本项目和相关项目引用的 phpmicro 只是 PHP 的 sapi 接口封装,而不是 PHP 代码的编译工具。 PHP 代码的编译器是一个完全不同的项目,因此不考虑额外的情况。 如果你对加密感兴趣,可以考虑使用现有的加密技术,如 Swoole Compiler、Source Guardian 等。

    无法使用 ssl

    更新:该问题已在最新版本的 static-php-cli 中修复,现在默认读取系统的证书文件。如果你仍然遇到问题,请尝试下面的解决方案。

    使用 curl、pgsql 等请求 HTTPS 网站或建立 SSL 连接时,可能会出现 error:80000002:system library::No such file or directory 错误。 此错误是由于静态编译的 PHP 未通过 php.ini 指定 openssl.cafile 导致的。

    你可以通过在使用 PHP 前指定 php.ini 并在 INI 中添加 openssl.cafile=/path/to/your-cert.pem 来解决此问题。

    对于 Linux 系统,你可以从 curl 官方网站下载 cacert.pem 文件,也可以使用系统自带的证书文件。 有关不同发行版的证书位置,请参考 Golang 文档

    INI 配置 openssl.cafile 不能使用 ini_set() 函数动态设置,因为 openssl.cafilePHP_INI_SYSTEM 类型的配置,只能在 php.ini 文件中设置。

    为什么不支持旧版本的 PHP?

    因为旧版本的 PHP 有很多问题,如安全问题、性能问题和功能问题。此外,许多旧版本的 PHP 与最新的依赖库不兼容,这也是不支持旧版本 PHP 的原因之一。

    你可以使用 static-php-cli 早期编译的旧版本,如 PHP 8.0,但不会明确支持早期版本。

    `,35)])])}const k=i(c,[["render",p]]);export{b as __pageData,k as default}; diff --git a/assets/zh_faq_index.md.BihV7puH.lean.js b/assets/zh_faq_index.md.BihV7puH.lean.js new file mode 100644 index 00000000..4797cefa --- /dev/null +++ b/assets/zh_faq_index.md.BihV7puH.lean.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as s,ah as o}from"./chunks/framework.Bhsyh9kO.js";const b=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"zh/faq/index.md","filePath":"zh/faq/index.md"}'),c={name:"zh/faq/index.md"};function p(d,e,l,n,r,h){return s(),a("div",null,[...e[0]||(e[0]=[o("",35)])])}const k=i(c,[["render",p]]);export{b as __pageData,k as default}; diff --git a/assets/zh_faq_index.md.nE1d0aPt.lean.js b/assets/zh_faq_index.md.nE1d0aPt.lean.js deleted file mode 100644 index b02b0c9f..00000000 --- a/assets/zh_faq_index.md.nE1d0aPt.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as a,o as s,af as o}from"./chunks/framework.PeLcR_tw.js";const b=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"zh/faq/index.md","filePath":"zh/faq/index.md"}'),c={name:"zh/faq/index.md"};function p(d,e,l,n,r,h){return s(),a("div",null,e[0]||(e[0]=[o("",35)]))}const k=i(c,[["render",p]]);export{b as __pageData,k as default}; diff --git a/assets/zh_guide_action-build.md.CQ3Vf3i9.js b/assets/zh_guide_action-build.md.CQ3Vf3i9.js new file mode 100644 index 00000000..cfa8b17c --- /dev/null +++ b/assets/zh_guide_action-build.md.CQ3Vf3i9.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as i,ah as o}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"Action 构建","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/action-build.md","filePath":"zh/guide/action-build.md"}'),r={name:"zh/guide/action-build.md"};function l(c,e,n,s,d,p){return i(),a("div",null,[...e[0]||(e[0]=[o('

    Action 构建

    Action 构建指的是直接使用 GitHub Action 进行编译。

    如果你不想自行编译,可以从本项目现有的 Action 下载 Artifact,也可以从自托管的服务器下载:进入

    自托管的二进制也是由 Action 构建而来,项目仓库地址。 包含的扩展有:bcmath,bz2,calendar,ctype,curl,dom,exif,fileinfo,filter,ftp,gd,gmp,iconv,xml,mbstring,mbregex,mysqlnd,openssl,pcntl,pdo,pdo_mysql,pdo_sqlite,phar,posix,redis,session,simplexml,soap,sockets,sqlite3,tokenizer,xmlwriter,xmlreader,zlib,zip

    构建方法

    使用 GitHub Action 可以方便地构建一个静态编译的 PHP 和 phpmicro,同时可以自行定义要编译的扩展。

    1. Fork 本项目。
    2. 进入项目的 Actions,选择 CI 开头的 Workflow(根据你需要的操作系统选择)。
    3. 选择 Run workflow,填入你要编译的 PHP 版本、目标类型、扩展列表。(扩展列表使用英文逗号分割,例如 bcmath,curl,mbstring
    4. 等待大约一段时间后,进入对应的任务中,获取 Artifacts

    如果你选择了 debug,则会在构建时输出所有日志,包括编译的日志,以供排查错误。

    如果你需要在其他环境构建,可以使用 手动构建

    扩展选择

    你可以到 扩展列表 中查看目前你需要的扩展是否均支持, 然后到 在线命令生成 中选择你需要编译的扩展,复制扩展字符串到 Action 的 extensions 中,编译即可。

    ',11)])])}const b=t(r,[["render",l]]);export{m as __pageData,b as default}; diff --git a/assets/zh_guide_action-build.md.CQ3Vf3i9.lean.js b/assets/zh_guide_action-build.md.CQ3Vf3i9.lean.js new file mode 100644 index 00000000..346378d5 --- /dev/null +++ b/assets/zh_guide_action-build.md.CQ3Vf3i9.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as i,ah as o}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"Action 构建","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/action-build.md","filePath":"zh/guide/action-build.md"}'),r={name:"zh/guide/action-build.md"};function l(c,e,n,s,d,p){return i(),a("div",null,[...e[0]||(e[0]=[o("",11)])])}const b=t(r,[["render",l]]);export{m as __pageData,b as default}; diff --git a/assets/zh_guide_action-build.md.CYeVjGhJ.js b/assets/zh_guide_action-build.md.CYeVjGhJ.js deleted file mode 100644 index 89d02a95..00000000 --- a/assets/zh_guide_action-build.md.CYeVjGhJ.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,c as a,o as i,af as o}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"Action 构建","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/action-build.md","filePath":"zh/guide/action-build.md"}'),r={name:"zh/guide/action-build.md"};function l(c,e,n,s,d,p){return i(),a("div",null,e[0]||(e[0]=[o('

    Action 构建

    Action 构建指的是直接使用 GitHub Action 进行编译。

    如果你不想自行编译,可以从本项目现有的 Action 下载 Artifact,也可以从自托管的服务器下载:进入

    自托管的二进制也是由 Action 构建而来,项目仓库地址。 包含的扩展有:bcmath,bz2,calendar,ctype,curl,dom,exif,fileinfo,filter,ftp,gd,gmp,iconv,xml,mbstring,mbregex,mysqlnd,openssl,pcntl,pdo,pdo_mysql,pdo_sqlite,phar,posix,redis,session,simplexml,soap,sockets,sqlite3,tokenizer,xmlwriter,xmlreader,zlib,zip

    构建方法

    使用 GitHub Action 可以方便地构建一个静态编译的 PHP 和 phpmicro,同时可以自行定义要编译的扩展。

    1. Fork 本项目。
    2. 进入项目的 Actions,选择 CI 开头的 Workflow(根据你需要的操作系统选择)。
    3. 选择 Run workflow,填入你要编译的 PHP 版本、目标类型、扩展列表。(扩展列表使用英文逗号分割,例如 bcmath,curl,mbstring
    4. 等待大约一段时间后,进入对应的任务中,获取 Artifacts

    如果你选择了 debug,则会在构建时输出所有日志,包括编译的日志,以供排查错误。

    如果你需要在其他环境构建,可以使用 手动构建

    扩展选择

    你可以到 扩展列表 中查看目前你需要的扩展是否均支持, 然后到 在线命令生成 中选择你需要编译的扩展,复制扩展字符串到 Action 的 extensions 中,编译即可。

    ',11)]))}const f=t(r,[["render",l]]);export{m as __pageData,f as default}; diff --git a/assets/zh_guide_action-build.md.CYeVjGhJ.lean.js b/assets/zh_guide_action-build.md.CYeVjGhJ.lean.js deleted file mode 100644 index 10d5fd02..00000000 --- a/assets/zh_guide_action-build.md.CYeVjGhJ.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,c as a,o as i,af as o}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"Action 构建","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/action-build.md","filePath":"zh/guide/action-build.md"}'),r={name:"zh/guide/action-build.md"};function l(c,e,n,s,d,p){return i(),a("div",null,e[0]||(e[0]=[o("",11)]))}const f=t(r,[["render",l]]);export{m as __pageData,f as default}; diff --git a/assets/zh_guide_build-on-windows.md.6JBREABQ.lean.js b/assets/zh_guide_build-on-windows.md.6JBREABQ.lean.js deleted file mode 100644 index 8b250802..00000000 --- a/assets/zh_guide_build-on-windows.md.6JBREABQ.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as a,o as e,af as l}from"./chunks/framework.PeLcR_tw.js";const k=JSON.parse('{"title":"在 Windows 上构建","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/build-on-windows.md","filePath":"zh/guide/build-on-windows.md"}'),t={name:"zh/guide/build-on-windows.md"};function h(n,i,p,o,d,c){return e(),a("div",null,i[0]||(i[0]=[l("",64)]))}const b=s(t,[["render",h]]);export{k as __pageData,b as default}; diff --git a/assets/zh_guide_build-on-windows.md.6JBREABQ.js b/assets/zh_guide_build-on-windows.md.oogWrPn_.js similarity index 81% rename from assets/zh_guide_build-on-windows.md.6JBREABQ.js rename to assets/zh_guide_build-on-windows.md.oogWrPn_.js index 99027b00..7ca06b03 100644 --- a/assets/zh_guide_build-on-windows.md.6JBREABQ.js +++ b/assets/zh_guide_build-on-windows.md.oogWrPn_.js @@ -1,4 +1,4 @@ -import{_ as s,c as a,o as e,af as l}from"./chunks/framework.PeLcR_tw.js";const k=JSON.parse('{"title":"在 Windows 上构建","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/build-on-windows.md","filePath":"zh/guide/build-on-windows.md"}'),t={name:"zh/guide/build-on-windows.md"};function h(n,i,p,o,d,c){return e(),a("div",null,i[0]||(i[0]=[l(`

    在 Windows 上构建

    因为 Windows 系统是 NT 内核,与类 Unix 的操作系统使用的编译工具及操作系统接口几乎完全不同,所以在 Windows 上的构建流程会与 Unix 系统有些许不同。

    GitHub Actions 构建

    现在已支持从 Actions 构建 Windows 版本的 static-php 了。 和 Linux、macOS 一样,你需要先 Fork static-php-cli 仓库到你的 GitHub 账户中,然后你可以进入 扩展列表 选择要编译的扩展,然后进入自己仓库的 CI on Windows 选择 PHP 版本、填入扩展列表(逗号分割),点击 Run 即可。

    如果你要在本地开发或构建,请继续向下阅读。

    环境准备

    在 Windows 上构建静态 PHP 所需要的工具与 PHP 官方的 Windows 构建工具是相同的。你可以阅读 官方文档

    总结下来,你需要以下环境及工具:

    • Windows 10(需要 build 17063 或以后的更新)
    • Visual Studio 2019/2022(推荐 2022)
    • Visual Studio 的 C++ 桌面开发
    • Git for Windows
    • static-php-cli 仓库
    • PHP 和 Composer(static-php-cli 需要它们,可使用 bin/setup-runtime 自动安装)
    • php-sdk-binary-tools(可使用 doctor 自动安装)
    • strawberry-perl(可使用 doctor 自动安装)
    • nasm(可使用 doctor 自动安装)

    TIP

    static-php-cli 在 Windows 上的构建指的是使用 MSVC 构建 PHP,不基于 MinGW、Cygwin、WSL 等环境。

    如果你更倾向使用 WSL,请参考在 Linux 上构建的章节。

    在安装 Visual Studio 后,选择 C++ 桌面开发的工作负荷后,可能会下载 8GB 左右的编译工具,下载速度取决于你的网络状况。

    安装 Git

    Git for Windows 可以从 这里 下载并安装 Standalone Installer 64-bit 版本,安装在默认位置(C:\\Program Files\\Git\\)。 如果不想手动下载和安装,你也可以使用 Visual Studio Installer,在单个组件的选择列表中,勾选 Git。

    准备 static-php-cli

    static-php-cli 项目的下载方式很简单,只需要使用 git clone 即可。推荐将项目放在 C:\\spc-build\\ 或类似目录,路径最好不要有空格。

    shell
    mkdir "C:\\spc-build"
    +import{_ as s,c as a,o as e,ah as l}from"./chunks/framework.Bhsyh9kO.js";const k=JSON.parse('{"title":"在 Windows 上构建","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/build-on-windows.md","filePath":"zh/guide/build-on-windows.md"}'),t={name:"zh/guide/build-on-windows.md"};function h(n,i,p,o,d,c){return e(),a("div",null,[...i[0]||(i[0]=[l(`

    在 Windows 上构建

    因为 Windows 系统是 NT 内核,与类 Unix 的操作系统使用的编译工具及操作系统接口几乎完全不同,所以在 Windows 上的构建流程会与 Unix 系统有些许不同。

    GitHub Actions 构建

    现在已支持从 Actions 构建 Windows 版本的 static-php 了。 和 Linux、macOS 一样,你需要先 Fork static-php-cli 仓库到你的 GitHub 账户中,然后你可以进入 扩展列表 选择要编译的扩展,然后进入自己仓库的 CI on Windows 选择 PHP 版本、填入扩展列表(逗号分割),点击 Run 即可。

    如果你要在本地开发或构建,请继续向下阅读。

    环境准备

    在 Windows 上构建静态 PHP 所需要的工具与 PHP 官方的 Windows 构建工具是相同的。你可以阅读 官方文档

    总结下来,你需要以下环境及工具:

    • Windows 10(需要 build 17063 或以后的更新)
    • Visual Studio 2019/2022(推荐 2022)
    • Visual Studio 的 C++ 桌面开发
    • Git for Windows
    • static-php-cli 仓库
    • PHP 和 Composer(static-php-cli 需要它们,可使用 bin/setup-runtime 自动安装)
    • php-sdk-binary-tools(可使用 doctor 自动安装)
    • strawberry-perl(可使用 doctor 自动安装)
    • nasm(可使用 doctor 自动安装)

    TIP

    static-php-cli 在 Windows 上的构建指的是使用 MSVC 构建 PHP,不基于 MinGW、Cygwin、WSL 等环境。

    如果你更倾向使用 WSL,请参考在 Linux 上构建的章节。

    在安装 Visual Studio 后,选择 C++ 桌面开发的工作负荷后,可能会下载 8GB 左右的编译工具,下载速度取决于你的网络状况。

    安装 Git

    Git for Windows 可以从 这里 下载并安装 Standalone Installer 64-bit 版本,安装在默认位置(C:\\Program Files\\Git\\)。 如果不想手动下载和安装,你也可以使用 Visual Studio Installer,在单个组件的选择列表中,勾选 Git。

    准备 static-php-cli

    static-php-cli 项目的下载方式很简单,只需要使用 git clone 即可。推荐将项目放在 C:\\spc-build\\ 或类似目录,路径最好不要有空格。

    shell
    mkdir "C:\\spc-build"
     cd C:\\spc-build
     git clone https://github.com/crazywhalecc/static-php-cli.git
     cd static-php-cli

    static-php-cli 自身需要 PHP 环境,是有点奇怪,但现在可以通过脚本快速安装 PHP 环境。 一般你的电脑不会安装 Windows 版本的 PHP,所以我们建议你在下载 static-php-cli 后,直接使用 bin/setup-runtime,在当前目录安装 PHP 和 Composer。

    shell
    # 安装 PHP 和 Composer 到 ./runtime/ 目录
    @@ -19,4 +19,4 @@ import{_ as s,c as a,o as e,af as l}from"./chunks/framework.PeLcR_tw.js";const k
     my-app.exe

    使用 php.exe

    php.exe 编译后位于 buildroot\\bin\\ 目录,你可以将其拷贝到任意位置使用。

    shell
    .\\php -v

    使用 micro

    phpmicro 是一个提供自执行二进制 PHP 的项目,本项目依赖 phpmicro 进行编译自执行二进制。详见 dixyes/phpmicro

    最后编译结果会输出一个 ./micro.sfx 的文件,此文件需要配合你的 PHP 源码使用。 该文件编译后会存放在 buildroot/bin/ 目录中。

    使用时应准备好你的项目源码文件,可以是单个 PHP 文件,也可以是 Phar 文件。

    如果要结合 phar 文件,编译时必须包含 phar 扩展!

    shell
    # code.php "<?php echo 'Hello world' . PHP_EOL;"
     bin/spc micro:combine code.php -O my-app.exe
     # Run it!!! Copy it to another computer!!!
    -./my-app.exe

    如果打包 PHAR 文件,仅需把 code.php 更换为 phar 文件路径即可。 你可以使用 box-project/box 将你的 CLI 项目打包为 Phar, 然后将它与 phpmicro 结合,生成独立可执行的二进制文件。

    有关 micro:combine 命令的更多细节,请参考 Unix 系统上的 命令

    `,64)]))}const b=s(t,[["render",h]]);export{k as __pageData,b as default}; +./my-app.exe

    如果打包 PHAR 文件,仅需把 code.php 更换为 phar 文件路径即可。 你可以使用 box-project/box 将你的 CLI 项目打包为 Phar, 然后将它与 phpmicro 结合,生成独立可执行的二进制文件。

    有关 micro:combine 命令的更多细节,请参考 Unix 系统上的 命令

    `,64)])])}const b=s(t,[["render",h]]);export{k as __pageData,b as default}; diff --git a/assets/zh_guide_build-on-windows.md.oogWrPn_.lean.js b/assets/zh_guide_build-on-windows.md.oogWrPn_.lean.js new file mode 100644 index 00000000..fcf8c104 --- /dev/null +++ b/assets/zh_guide_build-on-windows.md.oogWrPn_.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as e,ah as l}from"./chunks/framework.Bhsyh9kO.js";const k=JSON.parse('{"title":"在 Windows 上构建","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/build-on-windows.md","filePath":"zh/guide/build-on-windows.md"}'),t={name:"zh/guide/build-on-windows.md"};function h(n,i,p,o,d,c){return e(),a("div",null,[...i[0]||(i[0]=[l("",64)])])}const b=s(t,[["render",h]]);export{k as __pageData,b as default}; diff --git a/assets/zh_guide_build-with-glibc.md.CGbU937o.js b/assets/zh_guide_build-with-glibc.md.CGbU937o.js deleted file mode 100644 index 478da109..00000000 --- a/assets/zh_guide_build-with-glibc.md.CGbU937o.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as l,c as e,o as s,af as a}from"./chunks/framework.PeLcR_tw.js";const o=JSON.parse('{"title":"构建 glibc 兼容的 Linux 二进制","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/build-with-glibc.md","filePath":"zh/guide/build-with-glibc.md"}'),c={name:"zh/guide/build-with-glibc.md"};function n(t,i,p,b,h,d){return s(),e("div",null,i[0]||(i[0]=[a('

    构建 glibc 兼容的 Linux 二进制

    为什么要构建 glibc 兼容的二进制

    目前,static-php-cli 在默认条件下在 Linux 系统构建的二进制都是基于 musl-libc(静态链接)的。 musl-libc 是一个轻量级的 libc 实现,它的目标是与 glibc 兼容,并且提供良好的纯静态链接支持。 这意味着,编译出来的静态 PHP 可执行文件在几乎任何 Linux 发行版都可以使用,而不需要考虑 libc、libstdc++ 等库的版本问题。

    但是,Linux 系统的纯静态链接 musl-libc 二进制文件存在以下问题:

    • 无法使用 PHP 的 dl() 函数加载动态链接库和外部 PHP 扩展。
    • 无法使用 PHP 的 FFI 扩展。
    • 部分极端情况下,可能会出现性能问题,参见 musl-libc 的性能问题

    对于不同的 Linux 发行版,它们使用的默认 libc 可能不同,比如 Alpine Linux 使用 musl libc,而大多数 Linux 发行版使用 glibc。 但即便如此,我们也不能直接使用任意的发行版和 glibc 构建便携的静态二进制文件,因为 glibc 有一些问题:

    • 基于新版本的发行版在使用 gcc 等工具构建的二进制,无法在旧版本的发行版上运行。
    • glibc 不推荐被静态链接,因为它的一些特性需要动态链接库的支持。

    但是,我们可以使用 Docker 容器来解决这个问题,最终输出的结果是一个动态链接 glibc 和一些必要库的二进制,但它静态链接所有其他依赖。

    1. 使用一个旧版本的 Linux 发行版(如 CentOS 7.x),它的 glibc 版本比较旧,但是可以在大多数现代 Linux 发行版上运行。
    2. 在这个容器中构建 PHP 的静态二进制文件,这样就可以在大多数现代 Linux 发行版上运行了。

    使用 glibc 的静态二进制文件,可以在大多数现代 Linux 发行版上运行,但是不能在 musl libc 的发行版上运行,如 CentOS 6、Alpine Linux 等。

    构建 glibc 兼容的 Linux 二进制

    最新版的 static-php-cli 内置了 bin/spc-gnu-docker 脚本,可以一键创建一个 CentOS 7.x (glibc-2.17) 的 Docker 容器,并在容器中构建 glibc 兼容的 PHP 静态二进制文件。

    然后,先运行一次以下命令。首次运行时时间较长,因为需要下载 CentOS 7.x 的镜像和一些编译工具。

    bash
    bin/spc-gnu-docker

    构建镜像完成后,你将看到和 bin/spc 一样的命令帮助菜单,这时说明容器已经准备好了。

    在容器准备好后,你可以参考 本地构建 章节的内容,构建你的 PHP 静态二进制文件。仅需要把 bin/spc./spc 替换为 bin/spc-gnu-docker 即可。

    bash
    bin/spc-gnu-docker build bcmath,ctype,openssl,pdo,phar,posix,session,tokenizer,xml,zip --build-cli --debug

    注意事项

    极少数情况下,基于 glibc 的静态 PHP 可能会出现 segment fault 等错误,但目前例子较少,如果遇到问题请提交 issue。

    glibc 构建为扩展的特性,不属于默认 static-php 的支持范围。如果有相关问题或需求,请在提交 Issue 时注明你是基于 glibc 构建的。

    如果你需要不使用 Docker 构建基于 glibc 的二进制,请参考 bin/spc-gnu-docker 脚本,手动构建一个类似的环境。

    请注意,我们仅支持使用 bin/spc-gnu-docker 构建的 glibc 版本。已在 RHEL 9 和 10 上进行了编译测试并验证其稳定性,但如果您遇到问题,我们可能不会进行修复。

    ',22)]))}const g=l(c,[["render",n]]);export{o as __pageData,g as default}; diff --git a/assets/zh_guide_build-with-glibc.md.CGbU937o.lean.js b/assets/zh_guide_build-with-glibc.md.CGbU937o.lean.js deleted file mode 100644 index a6417177..00000000 --- a/assets/zh_guide_build-with-glibc.md.CGbU937o.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as l,c as e,o as s,af as a}from"./chunks/framework.PeLcR_tw.js";const o=JSON.parse('{"title":"构建 glibc 兼容的 Linux 二进制","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/build-with-glibc.md","filePath":"zh/guide/build-with-glibc.md"}'),c={name:"zh/guide/build-with-glibc.md"};function n(t,i,p,b,h,d){return s(),e("div",null,i[0]||(i[0]=[a("",22)]))}const g=l(c,[["render",n]]);export{o as __pageData,g as default}; diff --git a/assets/zh_guide_build-with-glibc.md.CHXyK61r.js b/assets/zh_guide_build-with-glibc.md.CHXyK61r.js new file mode 100644 index 00000000..fc8d3024 --- /dev/null +++ b/assets/zh_guide_build-with-glibc.md.CHXyK61r.js @@ -0,0 +1 @@ +import{_ as l,c as e,o as s,ah as a}from"./chunks/framework.Bhsyh9kO.js";const o=JSON.parse('{"title":"构建 glibc 兼容的 Linux 二进制","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/build-with-glibc.md","filePath":"zh/guide/build-with-glibc.md"}'),c={name:"zh/guide/build-with-glibc.md"};function n(t,i,p,b,h,d){return s(),e("div",null,[...i[0]||(i[0]=[a('

    构建 glibc 兼容的 Linux 二进制

    为什么要构建 glibc 兼容的二进制

    目前,static-php-cli 在默认条件下在 Linux 系统构建的二进制都是基于 musl-libc(静态链接)的。 musl-libc 是一个轻量级的 libc 实现,它的目标是与 glibc 兼容,并且提供良好的纯静态链接支持。 这意味着,编译出来的静态 PHP 可执行文件在几乎任何 Linux 发行版都可以使用,而不需要考虑 libc、libstdc++ 等库的版本问题。

    但是,Linux 系统的纯静态链接 musl-libc 二进制文件存在以下问题:

    • 无法使用 PHP 的 dl() 函数加载动态链接库和外部 PHP 扩展。
    • 无法使用 PHP 的 FFI 扩展。
    • 部分极端情况下,可能会出现性能问题,参见 musl-libc 的性能问题

    对于不同的 Linux 发行版,它们使用的默认 libc 可能不同,比如 Alpine Linux 使用 musl libc,而大多数 Linux 发行版使用 glibc。 但即便如此,我们也不能直接使用任意的发行版和 glibc 构建便携的静态二进制文件,因为 glibc 有一些问题:

    • 基于新版本的发行版在使用 gcc 等工具构建的二进制,无法在旧版本的发行版上运行。
    • glibc 不推荐被静态链接,因为它的一些特性需要动态链接库的支持。

    但是,我们可以使用 Docker 容器来解决这个问题,最终输出的结果是一个动态链接 glibc 和一些必要库的二进制,但它静态链接所有其他依赖。

    1. 使用一个旧版本的 Linux 发行版(如 CentOS 7.x),它的 glibc 版本比较旧,但是可以在大多数现代 Linux 发行版上运行。
    2. 在这个容器中构建 PHP 的静态二进制文件,这样就可以在大多数现代 Linux 发行版上运行了。

    使用 glibc 的静态二进制文件,可以在大多数现代 Linux 发行版上运行,但是不能在 musl libc 的发行版上运行,如 CentOS 6、Alpine Linux 等。

    构建 glibc 兼容的 Linux 二进制

    最新版的 static-php-cli 内置了 bin/spc-gnu-docker 脚本,可以一键创建一个 CentOS 7.x (glibc-2.17) 的 Docker 容器,并在容器中构建 glibc 兼容的 PHP 静态二进制文件。

    然后,先运行一次以下命令。首次运行时时间较长,因为需要下载 CentOS 7.x 的镜像和一些编译工具。

    bash
    bin/spc-gnu-docker

    构建镜像完成后,你将看到和 bin/spc 一样的命令帮助菜单,这时说明容器已经准备好了。

    在容器准备好后,你可以参考 本地构建 章节的内容,构建你的 PHP 静态二进制文件。仅需要把 bin/spc./spc 替换为 bin/spc-gnu-docker 即可。

    bash
    bin/spc-gnu-docker build bcmath,ctype,openssl,pdo,phar,posix,session,tokenizer,xml,zip --build-cli --debug

    注意事项

    极少数情况下,基于 glibc 的静态 PHP 可能会出现 segment fault 等错误,但目前例子较少,如果遇到问题请提交 issue。

    glibc 构建为扩展的特性,不属于默认 static-php 的支持范围。如果有相关问题或需求,请在提交 Issue 时注明你是基于 glibc 构建的。

    如果你需要不使用 Docker 构建基于 glibc 的二进制,请参考 bin/spc-gnu-docker 脚本,手动构建一个类似的环境。

    请注意,我们仅支持使用 bin/spc-gnu-docker 构建的 glibc 版本。已在 RHEL 9 和 10 上进行了编译测试并验证其稳定性,但如果您遇到问题,我们可能不会进行修复。

    ',22)])])}const g=l(c,[["render",n]]);export{o as __pageData,g as default}; diff --git a/assets/zh_guide_build-with-glibc.md.CHXyK61r.lean.js b/assets/zh_guide_build-with-glibc.md.CHXyK61r.lean.js new file mode 100644 index 00000000..2569bbd5 --- /dev/null +++ b/assets/zh_guide_build-with-glibc.md.CHXyK61r.lean.js @@ -0,0 +1 @@ +import{_ as l,c as e,o as s,ah as a}from"./chunks/framework.Bhsyh9kO.js";const o=JSON.parse('{"title":"构建 glibc 兼容的 Linux 二进制","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/build-with-glibc.md","filePath":"zh/guide/build-with-glibc.md"}'),c={name:"zh/guide/build-with-glibc.md"};function n(t,i,p,b,h,d){return s(),e("div",null,[...i[0]||(i[0]=[a("",22)])])}const g=l(c,[["render",n]]);export{o as __pageData,g as default}; diff --git a/assets/zh_guide_cli-generator.md.DVBBaW5t.js b/assets/zh_guide_cli-generator.md.BoINN2LK.js similarity index 86% rename from assets/zh_guide_cli-generator.md.DVBBaW5t.js rename to assets/zh_guide_cli-generator.md.BoINN2LK.js index a08ee744..83bf0053 100644 --- a/assets/zh_guide_cli-generator.md.DVBBaW5t.js +++ b/assets/zh_guide_cli-generator.md.BoINN2LK.js @@ -1 +1 @@ -import{C as a}from"./chunks/CliGenerator.u1Ew-M_q.js";import{d as t,c as r,o,af as i,J as l}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"CLI 编译命令生成器","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"zh/guide/cli-generator.md","filePath":"zh/guide/cli-generator.md"}'),s={name:"zh/guide/cli-generator.md"},p=t({...s,setup(c){return(n,e)=>(o(),r("div",null,[e[0]||(e[0]=i('

    CLI 编译命令生成器

    TIP

    下面选择扩展可能包含所选操作系统不支持的扩展,这可能导致编译失败。请先查阅 支持的扩展

    ',2)),l(a,{lang:"zh"})]))}});export{m as __pageData,p as default}; +import{C as a}from"./chunks/CliGenerator.CXyXM4cX.js";import{d as t,c as r,o,ah as i,J as l}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"CLI 编译命令生成器","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"zh/guide/cli-generator.md","filePath":"zh/guide/cli-generator.md"}'),s={name:"zh/guide/cli-generator.md"},p=t({...s,setup(c){return(n,e)=>(o(),r("div",null,[e[0]||(e[0]=i('

    CLI 编译命令生成器

    TIP

    下面选择扩展可能包含所选操作系统不支持的扩展,这可能导致编译失败。请先查阅 支持的扩展

    ',2)),l(a,{lang:"zh"})]))}});export{m as __pageData,p as default}; diff --git a/assets/zh_guide_cli-generator.md.DVBBaW5t.lean.js b/assets/zh_guide_cli-generator.md.BoINN2LK.lean.js similarity index 74% rename from assets/zh_guide_cli-generator.md.DVBBaW5t.lean.js rename to assets/zh_guide_cli-generator.md.BoINN2LK.lean.js index 8fb014a2..a505603c 100644 --- a/assets/zh_guide_cli-generator.md.DVBBaW5t.lean.js +++ b/assets/zh_guide_cli-generator.md.BoINN2LK.lean.js @@ -1 +1 @@ -import{C as a}from"./chunks/CliGenerator.u1Ew-M_q.js";import{d as t,c as r,o,af as i,J as l}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"CLI 编译命令生成器","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"zh/guide/cli-generator.md","filePath":"zh/guide/cli-generator.md"}'),s={name:"zh/guide/cli-generator.md"},p=t({...s,setup(c){return(n,e)=>(o(),r("div",null,[e[0]||(e[0]=i("",2)),l(a,{lang:"zh"})]))}});export{m as __pageData,p as default}; +import{C as a}from"./chunks/CliGenerator.CXyXM4cX.js";import{d as t,c as r,o,ah as i,J as l}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"CLI 编译命令生成器","description":"","frontmatter":{"aside":false},"headers":[],"relativePath":"zh/guide/cli-generator.md","filePath":"zh/guide/cli-generator.md"}'),s={name:"zh/guide/cli-generator.md"},p=t({...s,setup(c){return(n,e)=>(o(),r("div",null,[e[0]||(e[0]=i("",2)),l(a,{lang:"zh"})]))}});export{m as __pageData,p as default}; diff --git a/assets/zh_guide_deps-map.md.BK_n00u9.js b/assets/zh_guide_deps-map.md.BK_n00u9.js deleted file mode 100644 index 0dce13c7..00000000 --- a/assets/zh_guide_deps-map.md.BK_n00u9.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as d,c as b,o as r,af as l}from"./chunks/framework.PeLcR_tw.js";const h=JSON.parse('{"title":"依赖关系图表","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"zh/guide/deps-map.md","filePath":"zh/guide/deps-map.md"}'),i={name:"zh/guide/deps-map.md"};function s(e,t,o,a,p,n){return r(),b("div",null,t[0]||(t[0]=[l('

    依赖关系图表

    在编译 PHP 时,每个扩展、库都有依赖关系,这些依赖关系可能是必需的,也可能是可选的。在编译 PHP 时,可以选择是否包含这些可选的依赖关系。

    例如,在 Linux 下编译 gd 扩展时,会强制编译 zlib,libpng 库和 zlib 扩展,而 libavif,libwebp,libjpeg,freetype 库都是可选的库,默认不会编译,除非通过 --with-libs=avif,webp,jpeg,freetype 选项指定。

    • 对于可选扩展(扩展的可选特性),需手动在编译时指定,例如启用 Redis 的 igbinary 支持:bin/spc build redis,igbinary
    • 对于可选库,需通过 --with-libs=XXX 选项编译指定。
    • 如果想启用所有的可选扩展,可以使用 bin/spc build redis --with-suggested-exts 参数。
    • 如果想启用所有的可选库,可以使用 --with-suggested-libs 参数。

    扩展的依赖图

    Linux

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvpcntlunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    liburing
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    macOS

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    glfwglfw
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    Windows

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqpopenssllibrabbitmq
    brotlibrotli
    bz2bzip2
    curlzlib
    openssl
    curl
    dbaqdbm
    domxmllibxml2
    zlib
    evsockets
    ffilibffi-win
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gmsslgmssl
    iconvlibiconv-win
    igbinarysession
    apcu
    intlicu-static-win
    libxmlxml
    mbregexmbstringonig
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    parallelpthreads4w
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    pdo_pgsqlpdo
    pgsql
    postgresql-win
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql-win
    pharzlib
    redissession
    igbinary
    msgpack
    simplexmlxmllibxml2
    soapxmllibxml2
    sodiumlibsodium
    sqlite3sqlite
    ssh2openssl
    zlib
    libssh2
    swowopenssl
    curl
    openssl
    curl
    xlswriterzlib
    zip
    openssl
    xmliconvlibxml2
    xmlreaderxml
    dom
    libxml2
    xmlwriterxmllibxml2
    xzxz
    yamllibyaml
    zipzlib
    bz2
    libzip
    zlib
    bzip2
    xz
    zlibzlib

    FreeBSD

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    evsockets
    ftpopenssl
    mbregexmbstringonig
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    pdo_mysqlpdo
    mysqlnd
    pharzlib
    xzxz
    zlibzlib

    库的依赖表

    Linux

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libaclattr
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    macOS

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    Windows

    Library NameRequired LibrariesSuggested Libraries
    curlzlib
    libssh2
    nghttp2
    brotli
    zstd
    freetypezliblibpng
    bzip2
    brotli
    libjpegzlib
    libpngzlib
    librabbitmqopenssl
    libssh2openssl
    libxml2libiconv-winzlib
    libzipzlib
    bzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib

    FreeBSD

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    opensslzlib
    ',22)]))}const c=d(i,[["render",s]]);export{h as __pageData,c as default}; diff --git a/assets/zh_guide_deps-map.md.BK_n00u9.lean.js b/assets/zh_guide_deps-map.md.BK_n00u9.lean.js deleted file mode 100644 index 68b86a46..00000000 --- a/assets/zh_guide_deps-map.md.BK_n00u9.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as d,c as b,o as r,af as l}from"./chunks/framework.PeLcR_tw.js";const h=JSON.parse('{"title":"依赖关系图表","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"zh/guide/deps-map.md","filePath":"zh/guide/deps-map.md"}'),i={name:"zh/guide/deps-map.md"};function s(e,t,o,a,p,n){return r(),b("div",null,t[0]||(t[0]=[l("",22)]))}const c=d(i,[["render",s]]);export{h as __pageData,c as default}; diff --git a/assets/zh_guide_deps-map.md.Cu7XhPTT.js b/assets/zh_guide_deps-map.md.Cu7XhPTT.js new file mode 100644 index 00000000..e46e311d --- /dev/null +++ b/assets/zh_guide_deps-map.md.Cu7XhPTT.js @@ -0,0 +1 @@ +import{_ as d,c as b,o as r,ah as l}from"./chunks/framework.Bhsyh9kO.js";const h=JSON.parse('{"title":"依赖关系图表","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"zh/guide/deps-map.md","filePath":"zh/guide/deps-map.md"}'),i={name:"zh/guide/deps-map.md"};function s(e,t,o,a,p,n){return r(),b("div",null,[...t[0]||(t[0]=[l('

    依赖关系图表

    在编译 PHP 时,每个扩展、库都有依赖关系,这些依赖关系可能是必需的,也可能是可选的。在编译 PHP 时,可以选择是否包含这些可选的依赖关系。

    例如,在 Linux 下编译 gd 扩展时,会强制编译 zlib,libpng 库和 zlib 扩展,而 libavif,libwebp,libjpeg,freetype 库都是可选的库,默认不会编译,除非通过 --with-libs=avif,webp,jpeg,freetype 选项指定。

    • 对于可选扩展(扩展的可选特性),需手动在编译时指定,例如启用 Redis 的 igbinary 支持:bin/spc build redis,igbinary
    • 对于可选库,需通过 --with-libs=XXX 选项编译指定。
    • 如果想启用所有的可选扩展,可以使用 bin/spc build redis --with-suggested-exts 参数。
    • 如果想启用所有的可选库,可以使用 --with-suggested-libs 参数。

    扩展的依赖图

    Linux

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvpcntlunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    liburing
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    macOS

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    glfwglfw
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    Windows

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqpopenssllibrabbitmq
    brotlibrotli
    bz2bzip2
    curlzlib
    openssl
    curl
    dbaqdbm
    domxmllibxml2
    zlib
    evsockets
    ffilibffi-win
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gmsslgmssl
    iconvlibiconv-win
    igbinarysession
    apcu
    intlicu-static-win
    libxmlxml
    mbregexmbstringonig
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    parallelpthreads4w
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    pdo_pgsqlpdo
    pgsql
    postgresql-win
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql-win
    pharzlib
    redissession
    igbinary
    msgpack
    simplexmlxmllibxml2
    soapxmllibxml2
    sodiumlibsodium
    sqlite3sqlite
    ssh2openssl
    zlib
    libssh2
    swowopenssl
    curl
    openssl
    curl
    xlswriterzlib
    zip
    openssl
    xmliconvlibxml2
    xmlreaderxml
    dom
    libxml2
    xmlwriterxmllibxml2
    xzxz
    yamllibyaml
    zipzlib
    bz2
    libzip
    zlib
    bzip2
    xz
    zlibzlib

    FreeBSD

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    evsockets
    ftpopenssl
    mbregexmbstringonig
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    pdo_mysqlpdo
    mysqlnd
    pharzlib
    xzxz
    zlibzlib

    库的依赖表

    Linux

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libaclattr
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    macOS

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    Windows

    Library NameRequired LibrariesSuggested Libraries
    curlzlib
    libssh2
    nghttp2
    brotli
    zstd
    freetypezliblibpng
    bzip2
    brotli
    libjpegzlib
    libpngzlib
    librabbitmqopenssl
    libssh2openssl
    libxml2libiconv-winzlib
    libzipzlib
    bzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib

    FreeBSD

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    opensslzlib
    ',22)])])}const c=d(i,[["render",s]]);export{h as __pageData,c as default}; diff --git a/assets/zh_guide_deps-map.md.Cu7XhPTT.lean.js b/assets/zh_guide_deps-map.md.Cu7XhPTT.lean.js new file mode 100644 index 00000000..4cbaad1c --- /dev/null +++ b/assets/zh_guide_deps-map.md.Cu7XhPTT.lean.js @@ -0,0 +1 @@ +import{_ as d,c as b,o as r,ah as l}from"./chunks/framework.Bhsyh9kO.js";const h=JSON.parse('{"title":"依赖关系图表","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"zh/guide/deps-map.md","filePath":"zh/guide/deps-map.md"}'),i={name:"zh/guide/deps-map.md"};function s(e,t,o,a,p,n){return r(),b("div",null,[...t[0]||(t[0]=[l("",22)])])}const c=d(i,[["render",s]]);export{h as __pageData,c as default}; diff --git a/assets/zh_guide_env-vars.md.DqYHbUfS.js b/assets/zh_guide_env-vars.md.CtNlqGk4.js similarity index 72% rename from assets/zh_guide_env-vars.md.DqYHbUfS.js rename to assets/zh_guide_env-vars.md.CtNlqGk4.js index fc92d517..3f4a377c 100644 --- a/assets/zh_guide_env-vars.md.DqYHbUfS.js +++ b/assets/zh_guide_env-vars.md.CtNlqGk4.js @@ -1,4 +1,4 @@ -import{_ as t,c as s,o as e,af as a}from"./chunks/framework.PeLcR_tw.js";const k=JSON.parse('{"title":"环境变量","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/env-vars.md","filePath":"zh/guide/env-vars.md"}'),n={name:"zh/guide/env-vars.md"};function l(d,i,c,p,h,o){return e(),s("div",null,i[0]||(i[0]=[a(`

    环境变量

    本页面的环境变量列表中所提到的所有环境变量都具有默认值,除非另有说明。你可以通过设置这些环境变量来覆盖默认值。

    环境变量列表

    在 2.3.5 版本之后,我们将环境变量集中到了 config/env.ini 文件中,你可以通过修改这个文件来设置环境变量。

    我们将 static-php-cli 支持的环境变量分为三种:

    • 全局内部环境变量:在 static-php-cli 启动后即声明,你可以在 static-php-cli 的内部使用 getenv() 来获取他们,也可以在启动 static-php-cli 前覆盖。
    • 固定环境变量:在 static-php-cli 启动后声明,你仅可使用 getenv() 获取,但无法通过 shell 脚本对其覆盖。
    • 配置文件环境变量:在 static-php-cli 构建前声明,你可以通过修改 config/env.ini 文件或通过 shell 脚本来设置这些环境变量。

    你可以阅读 config/env.ini 中每项参数的注释来了解其作用(仅限英文版)。

    自定义环境变量

    一般情况下,你不需要修改任何以下环境变量,因为它们已经被设置为最佳值。 但是,如果你有特殊需求,你可以通过设置这些环境变量来满足你的需求(比如你需要调试不同编译参数下的 PHP 性能表现)。

    如需使用自定义环境变量,你可以在终端中使用 export 命令或者在命令前直接设置环境变量,例如:

    shell
    # export 方式
    +import{_ as t,c as s,o as e,ah as a}from"./chunks/framework.Bhsyh9kO.js";const k=JSON.parse('{"title":"环境变量","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/env-vars.md","filePath":"zh/guide/env-vars.md"}'),n={name:"zh/guide/env-vars.md"};function l(d,i,c,p,h,o){return e(),s("div",null,[...i[0]||(i[0]=[a(`

    环境变量

    本页面的环境变量列表中所提到的所有环境变量都具有默认值,除非另有说明。你可以通过设置这些环境变量来覆盖默认值。

    环境变量列表

    在 2.3.5 版本之后,我们将环境变量集中到了 config/env.ini 文件中,你可以通过修改这个文件来设置环境变量。

    我们将 static-php-cli 支持的环境变量分为三种:

    • 全局内部环境变量:在 static-php-cli 启动后即声明,你可以在 static-php-cli 的内部使用 getenv() 来获取他们,也可以在启动 static-php-cli 前覆盖。
    • 固定环境变量:在 static-php-cli 启动后声明,你仅可使用 getenv() 获取,但无法通过 shell 脚本对其覆盖。
    • 配置文件环境变量:在 static-php-cli 构建前声明,你可以通过修改 config/env.ini 文件或通过 shell 脚本来设置这些环境变量。

    你可以阅读 config/env.ini 中每项参数的注释来了解其作用(仅限英文版)。

    自定义环境变量

    一般情况下,你不需要修改任何以下环境变量,因为它们已经被设置为最佳值。 但是,如果你有特殊需求,你可以通过设置这些环境变量来满足你的需求(比如你需要调试不同编译参数下的 PHP 性能表现)。

    如需使用自定义环境变量,你可以在终端中使用 export 命令或者在命令前直接设置环境变量,例如:

    shell
    # export 方式
     export SPC_CONCURRENCY=4
     bin/spc build mbstring,pcntl --build-cli
     
    @@ -9,4 +9,4 @@ import{_ as t,c as s,o as e,af as a}from"./chunks/framework.PeLcR_tw.js";const k
     SPC_CONCURRENCY=4
     
     [linux]
    -SPC_DEFAULT_C_FLAGS="-O3"

    编译依赖库的环境变量(仅限 Unix 系统)

    从 2.2.0 开始,static-php-cli 对所有 macOS、Linux、FreeBSD 等 Unix 系统的编译依赖库的命令均支持自定义环境变量。

    这样你就可以随时通过环境变量来调整编译依赖库的行为。例如你可以通过 xxx_CFLAGS=-O0 来设置编译 xxx 库的优化参数。

    当然,不是每个依赖库都支持注入环境变量,我们目前提供了三个通配的环境变量,后缀分别为:

    • _CFLAGS: C 编译器的参数
    • _LDFLAGS: 链接器的参数
    • _LIBS: 额外的链接库

    前缀为依赖库的名称,具体依赖库的名称以 lib.json 为准。其中,带有 - 的依赖库名称需要将 - 替换为 _

    下面是一个替换 openssl 库编译的优化选项示例:

    shell
    openssl_CFLAGS="-O0"

    库名称使用同 lib.json 中列举的名称,区分大小写。

    TIP

    当未指定相关环境变量时,除以下变量外,其余值均默认为空:

    var namevar default value
    pkg_config_CFLAGSmacOS: $SPC_DEFAULT_C_FLAGS -Wimplicit-function-declaration -Wno-int-conversion, Other: empty
    pkg_config_LDFLAGSLinux: --static, Other: empty
    imagemagick_LDFLAGSLinux: -static, Other: empty
    imagemagick_LIBSmacOS: -liconv, Other: empty
    ldap_LDFLAGS-L$BUILD_LIB_PATH
    openssl_CFLAGSLinux: $SPC_DEFAULT_C_FLAGS, Other: empty
    others...empty

    下表是支持自定义以上三种变量的依赖库名称列表:

    lib name
    brotli
    bzip
    curl
    freetype
    gettext
    gmp
    imagemagick
    ldap
    libargon2
    libavif
    libcares
    libevent
    openssl

    TIP

    因为给每个库适配自定义环境变量是一项特别繁琐的工作,且大部分情况下你都不需要这些库的自定义环境变量,所以我们目前只支持了部分库的自定义环境变量。

    如果你需要自定义环境变量的库不在上方列表,可以通过 GitHub Issue 来提出需求。

    `,29)]))}const g=t(n,[["render",l]]);export{k as __pageData,g as default}; +SPC_DEFAULT_C_FLAGS="-O3"

    编译依赖库的环境变量(仅限 Unix 系统)

    从 2.2.0 开始,static-php-cli 对所有 macOS、Linux、FreeBSD 等 Unix 系统的编译依赖库的命令均支持自定义环境变量。

    这样你就可以随时通过环境变量来调整编译依赖库的行为。例如你可以通过 xxx_CFLAGS=-O0 来设置编译 xxx 库的优化参数。

    当然,不是每个依赖库都支持注入环境变量,我们目前提供了三个通配的环境变量,后缀分别为:

    • _CFLAGS: C 编译器的参数
    • _LDFLAGS: 链接器的参数
    • _LIBS: 额外的链接库

    前缀为依赖库的名称,具体依赖库的名称以 lib.json 为准。其中,带有 - 的依赖库名称需要将 - 替换为 _

    下面是一个替换 openssl 库编译的优化选项示例:

    shell
    openssl_CFLAGS="-O0"

    库名称使用同 lib.json 中列举的名称,区分大小写。

    TIP

    当未指定相关环境变量时,除以下变量外,其余值均默认为空:

    var namevar default value
    pkg_config_CFLAGSmacOS: $SPC_DEFAULT_C_FLAGS -Wimplicit-function-declaration -Wno-int-conversion, Other: empty
    pkg_config_LDFLAGSLinux: --static, Other: empty
    imagemagick_LDFLAGSLinux: -static, Other: empty
    imagemagick_LIBSmacOS: -liconv, Other: empty
    ldap_LDFLAGS-L$BUILD_LIB_PATH
    openssl_CFLAGSLinux: $SPC_DEFAULT_C_FLAGS, Other: empty
    others...empty

    下表是支持自定义以上三种变量的依赖库名称列表:

    lib name
    brotli
    bzip
    curl
    freetype
    gettext
    gmp
    imagemagick
    ldap
    libargon2
    libavif
    libcares
    libevent
    openssl

    TIP

    因为给每个库适配自定义环境变量是一项特别繁琐的工作,且大部分情况下你都不需要这些库的自定义环境变量,所以我们目前只支持了部分库的自定义环境变量。

    如果你需要自定义环境变量的库不在上方列表,可以通过 GitHub Issue 来提出需求。

    `,29)])])}const g=t(n,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/zh_guide_env-vars.md.CtNlqGk4.lean.js b/assets/zh_guide_env-vars.md.CtNlqGk4.lean.js new file mode 100644 index 00000000..4d5c0fbc --- /dev/null +++ b/assets/zh_guide_env-vars.md.CtNlqGk4.lean.js @@ -0,0 +1 @@ +import{_ as t,c as s,o as e,ah as a}from"./chunks/framework.Bhsyh9kO.js";const k=JSON.parse('{"title":"环境变量","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/env-vars.md","filePath":"zh/guide/env-vars.md"}'),n={name:"zh/guide/env-vars.md"};function l(d,i,c,p,h,o){return e(),s("div",null,[...i[0]||(i[0]=[a("",29)])])}const g=t(n,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/zh_guide_env-vars.md.DqYHbUfS.lean.js b/assets/zh_guide_env-vars.md.DqYHbUfS.lean.js deleted file mode 100644 index 10fd54a9..00000000 --- a/assets/zh_guide_env-vars.md.DqYHbUfS.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,c as s,o as e,af as a}from"./chunks/framework.PeLcR_tw.js";const k=JSON.parse('{"title":"环境变量","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/env-vars.md","filePath":"zh/guide/env-vars.md"}'),n={name:"zh/guide/env-vars.md"};function l(d,i,c,p,h,o){return e(),s("div",null,i[0]||(i[0]=[a("",29)]))}const g=t(n,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/zh_guide_extension-notes.md.BCwDjBZH.js b/assets/zh_guide_extension-notes.md.BCwDjBZH.js new file mode 100644 index 00000000..b78dee9d --- /dev/null +++ b/assets/zh_guide_extension-notes.md.BCwDjBZH.js @@ -0,0 +1 @@ +import{_ as o,c as l,o as a,ah as i}from"./chunks/framework.Bhsyh9kO.js";const b=JSON.parse('{"title":"扩展注意事项","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/extension-notes.md","filePath":"zh/guide/extension-notes.md"}'),s={name:"zh/guide/extension-notes.md"};function r(d,e,c,h,t,p){return a(),l("div",null,[...e[0]||(e[0]=[i('

    扩展注意事项

    因为是静态编译,扩展不会 100% 完美编译,而且不同扩展对 PHP、环境都有不同的要求,这里将一一列举。

    curl

    HTTP3 支持默认未启用,需在编译时添加 --with-libs="nghttp2,nghttp3,ngtcp2" 以启用 PHP 8.4 及以上版本的 HTTP3 支持。

    使用 curl 请求 HTTPS 时,可能存在 error:80000002:system library::No such file or directory 错误, 解决办法详见 FAQ - 无法使用 ssl

    phpmicro

    1. phpmicro SAPI 仅支持 PHP >= 8.0 版本。

    swoole

    1. swoole >= 5.0 版本仅支持 PHP >= 8.0 版本。
    2. swoole 目前不支持 PHP 8.0 版本 curl 的 hook(后续有可能会修复)。
    3. 编译时只包含 swoole 扩展时不会完整开启支持的 Swoole 数据库协程 hook,如需使用请加入对应的 swoole-hook-xxx 扩展。
    4. swoole 在部分扩展组合下可能出现 zend_mm_heap corrupted 问题,暂未找到是什么原因导致的。

    swoole-hook-pgsql

    swoole-hook-pgsql 不是一个扩展,而是 Swoole 的 Hook 特性。 如果你在编译时添加了 swoole,swoole-hook-pgsql,你将启用 Swoole 的 PostgreSQL 客户端和 pdo_pgsql 扩展的协程模式。

    swoole-hook-pgsql 与 pdo_pgsql 扩展冲突。如需使用 Swoole 和 pdo_pgsql,请删除 pdo_pgsql 扩展,启用 swooleswoole-hook-pgsql 即可。 该扩展包含了 pdo_pgsql 的协程环境的实现。

    在 macOS 系统,pdo_pgsql 可能无法正常连接到 postgresql 服务器,请谨慎使用。

    swoole-hook-mysql

    swoole-hook-mysql 不是一个扩展,而是 Swoole 的 Hook 特性。 如果你在编译时添加了 swoole,swoole-hook-mysql,你将启用 Swoole 的 mysqlndpdo_mysql 的协程模式。

    swoole-hook-sqlite

    swoole-hook-sqlite 不是一个扩展,而是 Swoole 的 Hook 特性。 如果你在编译时添加了 swoole,swoole-hook-sqlite,你将启用 Swoole 的 pdo_sqlite 的协程模式(Swoole 必须为 5.1 以上)。

    swoole-hook-sqlite 与 pdo_sqlite 扩展冲突。如需使用 Swoole 和 pdo_sqlite,请删除 pdo_sqlite 扩展,启用 swooleswoole-hook-sqlite 即可。 该扩展包含了 pdo_sqlite 的协程环境的实现。

    swoole-hook-odbc

    swoole-hook-odbc 不是一个扩展,而是 Swoole 的 Hook 特性。 如果你在编译时添加了 swoole,swoole-hook-odbc,你将启用 Swoole 的 odbc 扩展的协程模式。

    swoole-hook-odbc 与 pdo_odbc 扩展冲突。如需使用 Swoole 和 pdo_odbc,请删除 pdo_odbc 扩展,启用 swooleswoole-hook-odbc 即可。 该扩展包含了 pdo_odbc 的协程环境的实现。

    swow

    1. swow 仅支持 PHP 8.0+ 版本。

    imagick

    1. OpenMP 支持已被禁用,这是维护者推荐的做法,系统软件包也是如此配置。

    imap

    1. 该扩展目前不支持 Kerberos。
    2. 由于底层的 c-client、ext-imap 不是线程安全的。 无法在 --enable-zts 构建中使用它。
    3. 该扩展已在 PHP 8.4 中被移除,因此我们建议您寻找替代实现,例如 Webklex/php-imap

    gd

    1. gd 扩展依赖了较多的额外图形库,默认情况下,直接使用 bin/spc build gd 不会引入和支持部分图形库,例如 libjpeglibavif 等, 需要使用 --with-libs 参数补全。目前支持 freetype,libjpeg,libavif,libwebp 四个库的支持,所以这里可以使用以下命令来让 gd 库引入它们:
    bash
    bin/spc build gd --with-libs=freetype,libjpeg,libavif,libwebp --build-cli

    mcrypt

    1. 目前未支持,未来也不计划支持此扩展。#32

    oci8

    1. oci8 是 Oracle 数据库的扩展,因为 Oracle 提供的扩展所依赖的库未提供静态编译版本(.a)或源代码,无法使用静态链接的方式将此扩展编译到 php 内,故无法支持。

    xdebug

    1. Xdebug 只能作为共享扩展进行构建。您需要使用除了 musl-static 外的其他 SPC_TARGET 构建目标。
    2. 使用 Linux/glibc 或 macOS 时,您可以使用 --build-shared=xdebug 将 Xdebug 编译为共享扩展。 编译后的 ./php 二进制文件可以通过指定 INI 文件进行配置和运行,例如 ./php -d 'zend_extension=/path/to/xdebug.so' your-code.php

    xml

    1. xml包括 xmlreader、xmlwriter、dom、simplexml 等,添加 xml 扩展时最好同时启用这些扩展。
    2. libxml 包含在 xml 扩展中。 启用 xml 相当于启用 libxml。

    glfw

    1. glfw 扩展依赖 OpenGL,在 Linux 平台还依赖 X11 等环境,这些库都无法被轻易地动态链接。
    2. 在 macOS 系统下,我们可以动态链接系统的 OpenGL 和一些相关的库。

    rar

    1. rar 扩展目前在 macOS x86_64 环境下与 common 扩展集合编译 phpmicro 存在问题。

    pgsql

    pgsql ssl 连接与 openssl 3.2.0 不兼容。相关链接:

    pgsql 16.2 修复了这个 Bug,现在正常工作了。

    在 pgsql 使用 SSL 连接时,可能存在 error:80000002:system library::No such file or directory 错误, 解决办法详见 FAQ - 无法使用 ssl

    openssl

    使用基于 openssl 的扩展(如 curl、pgsql 等网络库)时,可能存在 error:80000002:system library::No such file or directory 错误, 解决办法详见 FAQ - 无法使用 ssl

    password-argon2

    1. password-argon2不是一个标准的扩展。password_hash 函数的 PASSWORD_ARGON2ID 算法需要 libsodium 或 libargon2 才能工作。
    2. 使用 password-argon2 可以为此启用多线程支持。

    ffi

    1. 由于 musl libc 静态链接的限制,无法加载动态库,因此无法使用 ffi。 如果您需要使用 ffi 扩展,请参阅 使用 GNU libc 编译 PHP
    2. macOS 支持 ffi 扩展,但某些内核不包含调试符号时会出现错误。
    3. Windows x64 支持 ffi 扩展。

    xhprof

    xhprof 扩展包含三部分:xhprof_extensionxhprof_htmlxhprof_libs。编译的二进制中只包含 xhprof_extension。 如果需要使用 xhprof,请到 pecl.php.net/package/xhprof 下载源码,指定 xhprof_libsxhprof_html 路径来使用。

    event

    event 扩展在 macOS 系统下编译后暂无法使用 openpty 特性。相关 Issue:

    parallel

    parallel 扩展只支持 PHP 8.0 及以上版本,并只支持 ZTS 构建(--enable-zts)。

    spx

    1. SPX 目前不支持 Windows,且官方仓库也不支持静态编译,static-php-cli 使用了 修改版本

    mimalloc

    1. 从技术上讲,这不是扩展,而是一个库。
    2. 在 Linux 或 macOS 上使用 --with-libs="mimalloc" 进行构建将覆盖默认分配器。
    3. 目前,这还处于实验阶段,但建议在线程环境中使用。
    ',64)])])}const m=o(s,[["render",r]]);export{b as __pageData,m as default}; diff --git a/assets/zh_guide_extension-notes.md.BCwDjBZH.lean.js b/assets/zh_guide_extension-notes.md.BCwDjBZH.lean.js new file mode 100644 index 00000000..82b5676a --- /dev/null +++ b/assets/zh_guide_extension-notes.md.BCwDjBZH.lean.js @@ -0,0 +1 @@ +import{_ as o,c as l,o as a,ah as i}from"./chunks/framework.Bhsyh9kO.js";const b=JSON.parse('{"title":"扩展注意事项","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/extension-notes.md","filePath":"zh/guide/extension-notes.md"}'),s={name:"zh/guide/extension-notes.md"};function r(d,e,c,h,t,p){return a(),l("div",null,[...e[0]||(e[0]=[i("",64)])])}const m=o(s,[["render",r]]);export{b as __pageData,m as default}; diff --git a/assets/zh_guide_extension-notes.md.D1f-13YX.js b/assets/zh_guide_extension-notes.md.D1f-13YX.js deleted file mode 100644 index 4f690a18..00000000 --- a/assets/zh_guide_extension-notes.md.D1f-13YX.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as o,c as l,o as a,af as i}from"./chunks/framework.PeLcR_tw.js";const b=JSON.parse('{"title":"扩展注意事项","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/extension-notes.md","filePath":"zh/guide/extension-notes.md"}'),s={name:"zh/guide/extension-notes.md"};function r(d,e,c,h,t,p){return a(),l("div",null,e[0]||(e[0]=[i('

    扩展注意事项

    因为是静态编译,扩展不会 100% 完美编译,而且不同扩展对 PHP、环境都有不同的要求,这里将一一列举。

    curl

    HTTP3 支持默认未启用,需在编译时添加 --with-libs="nghttp2,nghttp3,ngtcp2" 以启用 PHP 8.4 及以上版本的 HTTP3 支持。

    使用 curl 请求 HTTPS 时,可能存在 error:80000002:system library::No such file or directory 错误, 解决办法详见 FAQ - 无法使用 ssl

    phpmicro

    1. phpmicro SAPI 仅支持 PHP >= 8.0 版本。

    swoole

    1. swoole >= 5.0 版本仅支持 PHP >= 8.0 版本。
    2. swoole 目前不支持 PHP 8.0 版本 curl 的 hook(后续有可能会修复)。
    3. 编译时只包含 swoole 扩展时不会完整开启支持的 Swoole 数据库协程 hook,如需使用请加入对应的 swoole-hook-xxx 扩展。
    4. swoole 在部分扩展组合下可能出现 zend_mm_heap corrupted 问题,暂未找到是什么原因导致的。

    swoole-hook-pgsql

    swoole-hook-pgsql 不是一个扩展,而是 Swoole 的 Hook 特性。 如果你在编译时添加了 swoole,swoole-hook-pgsql,你将启用 Swoole 的 PostgreSQL 客户端和 pdo_pgsql 扩展的协程模式。

    swoole-hook-pgsql 与 pdo_pgsql 扩展冲突。如需使用 Swoole 和 pdo_pgsql,请删除 pdo_pgsql 扩展,启用 swooleswoole-hook-pgsql 即可。 该扩展包含了 pdo_pgsql 的协程环境的实现。

    在 macOS 系统,pdo_pgsql 可能无法正常连接到 postgresql 服务器,请谨慎使用。

    swoole-hook-mysql

    swoole-hook-mysql 不是一个扩展,而是 Swoole 的 Hook 特性。 如果你在编译时添加了 swoole,swoole-hook-mysql,你将启用 Swoole 的 mysqlndpdo_mysql 的协程模式。

    swoole-hook-sqlite

    swoole-hook-sqlite 不是一个扩展,而是 Swoole 的 Hook 特性。 如果你在编译时添加了 swoole,swoole-hook-sqlite,你将启用 Swoole 的 pdo_sqlite 的协程模式(Swoole 必须为 5.1 以上)。

    swoole-hook-sqlite 与 pdo_sqlite 扩展冲突。如需使用 Swoole 和 pdo_sqlite,请删除 pdo_sqlite 扩展,启用 swooleswoole-hook-sqlite 即可。 该扩展包含了 pdo_sqlite 的协程环境的实现。

    swoole-hook-odbc

    swoole-hook-odbc 不是一个扩展,而是 Swoole 的 Hook 特性。 如果你在编译时添加了 swoole,swoole-hook-odbc,你将启用 Swoole 的 odbc 扩展的协程模式。

    swoole-hook-odbc 与 pdo_odbc 扩展冲突。如需使用 Swoole 和 pdo_odbc,请删除 pdo_odbc 扩展,启用 swooleswoole-hook-odbc 即可。 该扩展包含了 pdo_odbc 的协程环境的实现。

    swow

    1. swow 仅支持 PHP 8.0+ 版本。

    imagick

    1. OpenMP 支持已被禁用,这是维护者推荐的做法,系统软件包也是如此配置。

    imap

    1. 该扩展目前不支持 Kerberos。
    2. 由于底层的 c-client、ext-imap 不是线程安全的。 无法在 --enable-zts 构建中使用它。
    3. 该扩展已在 PHP 8.4 中被移除,因此我们建议您寻找替代实现,例如 Webklex/php-imap

    gd

    1. gd 扩展依赖了较多的额外图形库,默认情况下,直接使用 bin/spc build gd 不会引入和支持部分图形库,例如 libjpeglibavif 等, 需要使用 --with-libs 参数补全。目前支持 freetype,libjpeg,libavif,libwebp 四个库的支持,所以这里可以使用以下命令来让 gd 库引入它们:
    bash
    bin/spc build gd --with-libs=freetype,libjpeg,libavif,libwebp --build-cli

    mcrypt

    1. 目前未支持,未来也不计划支持此扩展。#32

    oci8

    1. oci8 是 Oracle 数据库的扩展,因为 Oracle 提供的扩展所依赖的库未提供静态编译版本(.a)或源代码,无法使用静态链接的方式将此扩展编译到 php 内,故无法支持。

    xdebug

    1. Xdebug 只能作为共享扩展进行构建。您需要使用除了 musl-static 外的其他 SPC_TARGET 构建目标。
    2. 使用 Linux/glibc 或 macOS 时,您可以使用 --build-shared=xdebug 将 Xdebug 编译为共享扩展。 编译后的 ./php 二进制文件可以通过指定 INI 文件进行配置和运行,例如 ./php -d 'zend_extension=/path/to/xdebug.so' your-code.php

    xml

    1. xml包括 xmlreader、xmlwriter、dom、simplexml 等,添加 xml 扩展时最好同时启用这些扩展。
    2. libxml 包含在 xml 扩展中。 启用 xml 相当于启用 libxml。

    glfw

    1. glfw 扩展依赖 OpenGL,在 Linux 平台还依赖 X11 等环境,这些库都无法被轻易地动态链接。
    2. 在 macOS 系统下,我们可以动态链接系统的 OpenGL 和一些相关的库。

    rar

    1. rar 扩展目前在 macOS x86_64 环境下与 common 扩展集合编译 phpmicro 存在问题。

    pgsql

    pgsql ssl 连接与 openssl 3.2.0 不兼容。相关链接:

    pgsql 16.2 修复了这个 Bug,现在正常工作了。

    在 pgsql 使用 SSL 连接时,可能存在 error:80000002:system library::No such file or directory 错误, 解决办法详见 FAQ - 无法使用 ssl

    openssl

    使用基于 openssl 的扩展(如 curl、pgsql 等网络库)时,可能存在 error:80000002:system library::No such file or directory 错误, 解决办法详见 FAQ - 无法使用 ssl

    password-argon2

    1. password-argon2不是一个标准的扩展。password_hash 函数的 PASSWORD_ARGON2ID 算法需要 libsodium 或 libargon2 才能工作。
    2. 使用 password-argon2 可以为此启用多线程支持。

    ffi

    1. 由于 musl libc 静态链接的限制,无法加载动态库,因此无法使用 ffi。 如果您需要使用 ffi 扩展,请参阅 使用 GNU libc 编译 PHP
    2. macOS 支持 ffi 扩展,但某些内核不包含调试符号时会出现错误。
    3. Windows x64 支持 ffi 扩展。

    xhprof

    xhprof 扩展包含三部分:xhprof_extensionxhprof_htmlxhprof_libs。编译的二进制中只包含 xhprof_extension。 如果需要使用 xhprof,请到 pecl.php.net/package/xhprof 下载源码,指定 xhprof_libsxhprof_html 路径来使用。

    event

    event 扩展在 macOS 系统下编译后暂无法使用 openpty 特性。相关 Issue:

    parallel

    parallel 扩展只支持 PHP 8.0 及以上版本,并只支持 ZTS 构建(--enable-zts)。

    spx

    1. SPX 目前不支持 Windows,且官方仓库也不支持静态编译,static-php-cli 使用了 修改版本

    mimalloc

    1. 从技术上讲,这不是扩展,而是一个库。
    2. 在 Linux 或 macOS 上使用 --with-libs="mimalloc" 进行构建将覆盖默认分配器。
    3. 目前,这还处于实验阶段,但建议在线程环境中使用。
    ',64)]))}const m=o(s,[["render",r]]);export{b as __pageData,m as default}; diff --git a/assets/zh_guide_extension-notes.md.D1f-13YX.lean.js b/assets/zh_guide_extension-notes.md.D1f-13YX.lean.js deleted file mode 100644 index 70e929a0..00000000 --- a/assets/zh_guide_extension-notes.md.D1f-13YX.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as o,c as l,o as a,af as i}from"./chunks/framework.PeLcR_tw.js";const b=JSON.parse('{"title":"扩展注意事项","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/extension-notes.md","filePath":"zh/guide/extension-notes.md"}'),s={name:"zh/guide/extension-notes.md"};function r(d,e,c,h,t,p){return a(),l("div",null,e[0]||(e[0]=[i("",64)]))}const m=o(s,[["render",r]]);export{b as __pageData,m as default}; diff --git a/assets/zh_guide_extensions.md.CRNxXzeG.js b/assets/zh_guide_extensions.md.DEhoyCES.js similarity index 92% rename from assets/zh_guide_extensions.md.CRNxXzeG.js rename to assets/zh_guide_extensions.md.DEhoyCES.js index 148a2fe5..42f80f72 100644 --- a/assets/zh_guide_extensions.md.CRNxXzeG.js +++ b/assets/zh_guide_extensions.md.DEhoyCES.js @@ -1 +1 @@ -import{_ as i}from"./chunks/SearchTable.Cw3TiMBP.js";import{c as a,o as l,af as t,J as s}from"./chunks/framework.PeLcR_tw.js";const n=JSON.parse('{"title":"扩展列表","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/extensions.md","filePath":"zh/guide/extensions.md"}'),o={name:"zh/guide/extensions.md"},p=Object.assign(o,{setup(c){return(r,e)=>(l(),a("div",null,[e[0]||(e[0]=t('

    扩展列表

    • yes: 已支持
    • 空白: 目前还不支持,或正在支持中
    • no with issue link: 确定不支持或无法支持
    • partial with issue link: 已支持,但是无法完美工作
    ',2)),s(i),e[1]||(e[1]=t('

    TIP

    如果缺少您需要的扩展,您可以创建 功能请求

    有些扩展或扩展依赖的库会有一些可选的特性,例如 gd 库可选支持 libwebp、freetype 等。 如果你只使用 bin/spc build gd --build-cli 是不会包含它们(static-php-cli 默认为最小依赖原则)。

    有关编译可选库,请参考 扩展、库的依赖关系图表。对于可选的库,你也可以从 编译命令生成器 中选择扩展后展开选择可选库。

    ',1))]))}});export{n as __pageData,p as default}; +import{_ as i}from"./chunks/SearchTable.Dddvtmwz.js";import{c as a,o as l,ah as t,J as s}from"./chunks/framework.Bhsyh9kO.js";const n=JSON.parse('{"title":"扩展列表","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/extensions.md","filePath":"zh/guide/extensions.md"}'),o={name:"zh/guide/extensions.md"},p=Object.assign(o,{setup(c){return(r,e)=>(l(),a("div",null,[e[0]||(e[0]=t('

    扩展列表

    • yes: 已支持
    • 空白: 目前还不支持,或正在支持中
    • no with issue link: 确定不支持或无法支持
    • partial with issue link: 已支持,但是无法完美工作
    ',2)),s(i),e[1]||(e[1]=t('

    TIP

    如果缺少您需要的扩展,您可以创建 功能请求

    有些扩展或扩展依赖的库会有一些可选的特性,例如 gd 库可选支持 libwebp、freetype 等。 如果你只使用 bin/spc build gd --build-cli 是不会包含它们(static-php-cli 默认为最小依赖原则)。

    有关编译可选库,请参考 扩展、库的依赖关系图表。对于可选的库,你也可以从 编译命令生成器 中选择扩展后展开选择可选库。

    ',1))]))}});export{n as __pageData,p as default}; diff --git a/assets/zh_guide_extensions.md.CRNxXzeG.lean.js b/assets/zh_guide_extensions.md.DEhoyCES.lean.js similarity index 73% rename from assets/zh_guide_extensions.md.CRNxXzeG.lean.js rename to assets/zh_guide_extensions.md.DEhoyCES.lean.js index 563b2360..e6729d5e 100644 --- a/assets/zh_guide_extensions.md.CRNxXzeG.lean.js +++ b/assets/zh_guide_extensions.md.DEhoyCES.lean.js @@ -1 +1 @@ -import{_ as i}from"./chunks/SearchTable.Cw3TiMBP.js";import{c as a,o as l,af as t,J as s}from"./chunks/framework.PeLcR_tw.js";const n=JSON.parse('{"title":"扩展列表","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/extensions.md","filePath":"zh/guide/extensions.md"}'),o={name:"zh/guide/extensions.md"},p=Object.assign(o,{setup(c){return(r,e)=>(l(),a("div",null,[e[0]||(e[0]=t("",2)),s(i),e[1]||(e[1]=t("",1))]))}});export{n as __pageData,p as default}; +import{_ as i}from"./chunks/SearchTable.Dddvtmwz.js";import{c as a,o as l,ah as t,J as s}from"./chunks/framework.Bhsyh9kO.js";const n=JSON.parse('{"title":"扩展列表","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/extensions.md","filePath":"zh/guide/extensions.md"}'),o={name:"zh/guide/extensions.md"},p=Object.assign(o,{setup(c){return(r,e)=>(l(),a("div",null,[e[0]||(e[0]=t("",2)),s(i),e[1]||(e[1]=t("",1))]))}});export{n as __pageData,p as default}; diff --git a/assets/zh_guide_index.md.C3GV6eqU.js b/assets/zh_guide_index.md.C3GV6eqU.js new file mode 100644 index 00000000..b106021f --- /dev/null +++ b/assets/zh_guide_index.md.C3GV6eqU.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as d,ah as i}from"./chunks/framework.Bhsyh9kO.js";const _=JSON.parse('{"title":"指南","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/index.md","filePath":"zh/guide/index.md"}'),r={name:"zh/guide/index.md"};function n(h,t,l,p,c,o){return d(),e("div",null,[...t[0]||(t[0]=[i('

    指南

    static-php-cli 是一个用于构建静态编译的 PHP 二进制的工具,目前支持 Linux 和 macOS 系统。

    在指南章节中,你将了解到如何使用 static-php-cli 构建独立的 php 程序。

    编译环境

    下面是架构支持情况,⚙️ 代表支持 GitHub Action 构建,💻 代表支持本地构建,空 代表暂不支持。

    x86_64aarch64
    macOS⚙️ 💻⚙️ 💻
    Linux⚙️ 💻⚙️ 💻
    Windows⚙️ 💻
    FreeBSD💻💻

    其中,Linux 目前仅在 Ubuntu、Debian、Alpine 发行版测试通过,其他发行版未进行测试,不能保证编译成功。 对于未经过测试的发行版,可以使用 Docker 等方式本地编译,避免环境导致的问题。

    macOS 下支持 x86_64 和 Arm 两种架构,但在其中一个架构上编译的二进制无法直接在另一个架构上使用。 Rosetta 2 不能保证 Arm 架构编译的程序可以完全运行在 x86_64 环境下。

    Windows 目前只支持 x86_64 架构,不支持 32 位 x86、不支持 arm64 架构。

    PHP 支持版本

    目前,static-php-cli 对 PHP 8.1 ~ 8.5 版本是支持的,对于 PHP 8.0 及更早版本理论上支持,只需下载时选择早期版本即可。 但由于部分扩展和特殊组件已对早期版本的 PHP 停止了支持,所以 static-php-cli 不会明确支持早期版本。 我们推荐你编译尽可能新的 PHP 版本,以获得更好的体验。

    ',12)])])}const m=a(r,[["render",n]]);export{_ as __pageData,m as default}; diff --git a/assets/zh_guide_index.md.C3GV6eqU.lean.js b/assets/zh_guide_index.md.C3GV6eqU.lean.js new file mode 100644 index 00000000..30b9a405 --- /dev/null +++ b/assets/zh_guide_index.md.C3GV6eqU.lean.js @@ -0,0 +1 @@ +import{_ as a,c as e,o as d,ah as i}from"./chunks/framework.Bhsyh9kO.js";const _=JSON.parse('{"title":"指南","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/index.md","filePath":"zh/guide/index.md"}'),r={name:"zh/guide/index.md"};function n(h,t,l,p,c,o){return d(),e("div",null,[...t[0]||(t[0]=[i("",12)])])}const m=a(r,[["render",n]]);export{_ as __pageData,m as default}; diff --git a/assets/zh_guide_index.md.DWAO4_zO.js b/assets/zh_guide_index.md.DWAO4_zO.js deleted file mode 100644 index 79686ceb..00000000 --- a/assets/zh_guide_index.md.DWAO4_zO.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as d,af as i}from"./chunks/framework.PeLcR_tw.js";const _=JSON.parse('{"title":"指南","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/index.md","filePath":"zh/guide/index.md"}'),r={name:"zh/guide/index.md"};function n(h,t,l,p,c,o){return d(),e("div",null,t[0]||(t[0]=[i('

    指南

    static-php-cli 是一个用于构建静态编译的 PHP 二进制的工具,目前支持 Linux 和 macOS 系统。

    在指南章节中,你将了解到如何使用 static-php-cli 构建独立的 php 程序。

    编译环境

    下面是架构支持情况,⚙️ 代表支持 GitHub Action 构建,💻 代表支持本地构建,空 代表暂不支持。

    x86_64aarch64
    macOS⚙️ 💻⚙️ 💻
    Linux⚙️ 💻⚙️ 💻
    Windows⚙️ 💻
    FreeBSD💻💻

    其中,Linux 目前仅在 Ubuntu、Debian、Alpine 发行版测试通过,其他发行版未进行测试,不能保证编译成功。 对于未经过测试的发行版,可以使用 Docker 等方式本地编译,避免环境导致的问题。

    macOS 下支持 x86_64 和 Arm 两种架构,但在其中一个架构上编译的二进制无法直接在另一个架构上使用。 Rosetta 2 不能保证 Arm 架构编译的程序可以完全运行在 x86_64 环境下。

    Windows 目前只支持 x86_64 架构,不支持 32 位 x86、不支持 arm64 架构。

    PHP 支持版本

    目前,static-php-cli 对 PHP 8.1 ~ 8.5 版本是支持的,对于 PHP 8.0 及更早版本理论上支持,只需下载时选择早期版本即可。 但由于部分扩展和特殊组件已对早期版本的 PHP 停止了支持,所以 static-php-cli 不会明确支持早期版本。 我们推荐你编译尽可能新的 PHP 版本,以获得更好的体验。

    ',12)]))}const m=a(r,[["render",n]]);export{_ as __pageData,m as default}; diff --git a/assets/zh_guide_index.md.DWAO4_zO.lean.js b/assets/zh_guide_index.md.DWAO4_zO.lean.js deleted file mode 100644 index 13545547..00000000 --- a/assets/zh_guide_index.md.DWAO4_zO.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,c as e,o as d,af as i}from"./chunks/framework.PeLcR_tw.js";const _=JSON.parse('{"title":"指南","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/index.md","filePath":"zh/guide/index.md"}'),r={name:"zh/guide/index.md"};function n(h,t,l,p,c,o){return d(),e("div",null,t[0]||(t[0]=[i("",12)]))}const m=a(r,[["render",n]]);export{_ as __pageData,m as default}; diff --git a/assets/zh_guide_manual-build.md.DAnA1dt8.lean.js b/assets/zh_guide_manual-build.md.DAnA1dt8.lean.js deleted file mode 100644 index 0413b1cf..00000000 --- a/assets/zh_guide_manual-build.md.DAnA1dt8.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,c as a,o as n,af as l}from"./chunks/framework.PeLcR_tw.js";const o=JSON.parse('{"title":"本地构建(Linux、macOS、FreeBSD)","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"zh/guide/manual-build.md","filePath":"zh/guide/manual-build.md"}'),e={name:"zh/guide/manual-build.md"};function p(h,s,t,k,d,c){return n(),a("div",null,s[0]||(s[0]=[l("",135)]))}const g=i(e,[["render",p]]);export{o as __pageData,g as default}; diff --git a/assets/zh_guide_manual-build.md.DAnA1dt8.js b/assets/zh_guide_manual-build.md.DVCjR4yy.js similarity index 97% rename from assets/zh_guide_manual-build.md.DAnA1dt8.js rename to assets/zh_guide_manual-build.md.DVCjR4yy.js index 7691fd48..93867017 100644 --- a/assets/zh_guide_manual-build.md.DAnA1dt8.js +++ b/assets/zh_guide_manual-build.md.DVCjR4yy.js @@ -1,4 +1,4 @@ -import{_ as i,c as a,o as n,af as l}from"./chunks/framework.PeLcR_tw.js";const o=JSON.parse('{"title":"本地构建(Linux、macOS、FreeBSD)","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"zh/guide/manual-build.md","filePath":"zh/guide/manual-build.md"}'),e={name:"zh/guide/manual-build.md"};function p(h,s,t,k,d,c){return n(),a("div",null,s[0]||(s[0]=[l(`

    本地构建(Linux、macOS、FreeBSD)

    本章节为 Linux、macOS、FreeBSD 的构建过程,如果你要在 Windows 上构建,请到 在 Windows 上构建

    手动构建(使用 SPC 二进制)(推荐)

    本项目提供了一个 static-php-cli 的二进制文件,你可以直接下载对应平台的二进制文件,然后使用它来构建静态的 PHP。目前 spc 二进制支持的平台有 Linux 和 macOS。

    使用以下命令从自托管服务器下载:

    bash
    # Download from self-hosted nightly builds (sync with main branch)
    +import{_ as i,c as a,o as n,ah as l}from"./chunks/framework.Bhsyh9kO.js";const o=JSON.parse('{"title":"本地构建(Linux、macOS、FreeBSD)","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"zh/guide/manual-build.md","filePath":"zh/guide/manual-build.md"}'),e={name:"zh/guide/manual-build.md"};function p(h,s,t,k,d,c){return n(),a("div",null,[...s[0]||(s[0]=[l(`

    本地构建(Linux、macOS、FreeBSD)

    本章节为 Linux、macOS、FreeBSD 的构建过程,如果你要在 Windows 上构建,请到 在 Windows 上构建

    手动构建(使用 SPC 二进制)(推荐)

    本项目提供了一个 static-php-cli 的二进制文件,你可以直接下载对应平台的二进制文件,然后使用它来构建静态的 PHP。目前 spc 二进制支持的平台有 Linux 和 macOS。

    使用以下命令从自托管服务器下载:

    bash
    # Download from self-hosted nightly builds (sync with main branch)
     # For Linux x86_64
     curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-x86_64
     # For Linux aarch64
    @@ -188,4 +188,4 @@ import{_ as i,c as a,o as n,af as l}from"./chunks/framework.PeLcR_tw.js";const o
     clang embed.c $(bin/spc spc-config bcmath,zlib) -o embed
     
     ./embed
    -# out: Hello world!
    `,135)]))}const g=i(e,[["render",p]]);export{o as __pageData,g as default}; +# out: Hello world!
    `,135)])])}const g=i(e,[["render",p]]);export{o as __pageData,g as default}; diff --git a/assets/zh_guide_manual-build.md.DVCjR4yy.lean.js b/assets/zh_guide_manual-build.md.DVCjR4yy.lean.js new file mode 100644 index 00000000..68d1e489 --- /dev/null +++ b/assets/zh_guide_manual-build.md.DVCjR4yy.lean.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as n,ah as l}from"./chunks/framework.Bhsyh9kO.js";const o=JSON.parse('{"title":"本地构建(Linux、macOS、FreeBSD)","description":"","frontmatter":{"outline":"deep"},"headers":[],"relativePath":"zh/guide/manual-build.md","filePath":"zh/guide/manual-build.md"}'),e={name:"zh/guide/manual-build.md"};function p(h,s,t,k,d,c){return n(),a("div",null,[...s[0]||(s[0]=[l("",135)])])}const g=i(e,[["render",p]]);export{o as __pageData,g as default}; diff --git a/assets/zh_guide_troubleshooting.md.BRQLW2WP.js b/assets/zh_guide_troubleshooting.md.BRQLW2WP.js new file mode 100644 index 00000000..056be1ef --- /dev/null +++ b/assets/zh_guide_troubleshooting.md.BRQLW2WP.js @@ -0,0 +1 @@ +import{_ as o,c as t,o as a,ah as r}from"./chunks/framework.Bhsyh9kO.js";const u=JSON.parse('{"title":"故障排除","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/troubleshooting.md","filePath":"zh/guide/troubleshooting.md"}'),s={name:"zh/guide/troubleshooting.md"};function c(d,e,i,n,l,p){return a(),t("div",null,[...e[0]||(e[0]=[r('

    故障排除

    使用 static-php-cli 过程中可能会碰到各种各样的故障,这里将讲述如何自行查看错误并反馈 Issue。

    下载失败问题

    下载资源问题是 spc 最常见的问题之一。主要是由于 spc 下载资源使用的地址一般均为对应项目的官方网站或 GitHub 等,而这些网站可能偶尔会宕机、屏蔽 IP 地址。 在遇到下载失败后,可以多次尝试调用下载命令。

    当下载资源时,你可能最终会看到类似 curl: (56) The requested URL returned error: 403 的错误,这通常是由于 GitHub 限制导致的。 你可以通过在命令中添加 --debug 来验证,会看到类似 [DEBU] Running command (no output) : curl -sfSL "https://api.github.com/repos/openssl/openssl/releases" 的输出。

    要解决这个问题,可以在 GitHub 上 创建 一个个人访问令牌,并将其设置为环境变量 GITHUB_TOKEN=<XXX>

    如果确认地址确实无法正常访问,可以提交 Issue 或 PR 更新地址或下载类型。

    Doctor 无法修复某些问题

    在绝大部分情况下,doctor 模块都可以对缺失的系统环境进行自动修复和安装,但也存在特殊的环境无法正常使用自动修复功能。

    由于系统限制(例如,Windows 下无法自动安装 Visual Studio 等软件),自动修复功能无法用于某些项目。 在遇到无法自动修复功能时,如果遇到 Some check items can not be fixed 字样,则表明无法自动修复。 请根据终端显示的方法提交 Issue 或自行修复环境。

    编译错误

    遇到编译错误时,如果没有开启 --debug 日志,请先开启调试日志,然后确定报错的命令。 报错的终端输出对于修复编译错误非常重要。 在提交 Issue 时,请上传终端日志的最后报错片段(或整个终端日志输出),并且包含使用的 spc 命令和参数。

    如果你是重复构建,请参考 本地构建 - 多次构建 章节。

    ',13)])])}const _=o(s,[["render",c]]);export{u as __pageData,_ as default}; diff --git a/assets/zh_guide_troubleshooting.md.BRQLW2WP.lean.js b/assets/zh_guide_troubleshooting.md.BRQLW2WP.lean.js new file mode 100644 index 00000000..31045229 --- /dev/null +++ b/assets/zh_guide_troubleshooting.md.BRQLW2WP.lean.js @@ -0,0 +1 @@ +import{_ as o,c as t,o as a,ah as r}from"./chunks/framework.Bhsyh9kO.js";const u=JSON.parse('{"title":"故障排除","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/troubleshooting.md","filePath":"zh/guide/troubleshooting.md"}'),s={name:"zh/guide/troubleshooting.md"};function c(d,e,i,n,l,p){return a(),t("div",null,[...e[0]||(e[0]=[r("",13)])])}const _=o(s,[["render",c]]);export{u as __pageData,_ as default}; diff --git a/assets/zh_guide_troubleshooting.md.DSUIb51x.js b/assets/zh_guide_troubleshooting.md.DSUIb51x.js deleted file mode 100644 index b26205c6..00000000 --- a/assets/zh_guide_troubleshooting.md.DSUIb51x.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as o,c as t,o as a,af as r}from"./chunks/framework.PeLcR_tw.js";const u=JSON.parse('{"title":"故障排除","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/troubleshooting.md","filePath":"zh/guide/troubleshooting.md"}'),s={name:"zh/guide/troubleshooting.md"};function c(d,e,i,n,l,p){return a(),t("div",null,e[0]||(e[0]=[r('

    故障排除

    使用 static-php-cli 过程中可能会碰到各种各样的故障,这里将讲述如何自行查看错误并反馈 Issue。

    下载失败问题

    下载资源问题是 spc 最常见的问题之一。主要是由于 spc 下载资源使用的地址一般均为对应项目的官方网站或 GitHub 等,而这些网站可能偶尔会宕机、屏蔽 IP 地址。 在遇到下载失败后,可以多次尝试调用下载命令。

    当下载资源时,你可能最终会看到类似 curl: (56) The requested URL returned error: 403 的错误,这通常是由于 GitHub 限制导致的。 你可以通过在命令中添加 --debug 来验证,会看到类似 [DEBU] Running command (no output) : curl -sfSL "https://api.github.com/repos/openssl/openssl/releases" 的输出。

    要解决这个问题,可以在 GitHub 上 创建 一个个人访问令牌,并将其设置为环境变量 GITHUB_TOKEN=<XXX>

    如果确认地址确实无法正常访问,可以提交 Issue 或 PR 更新地址或下载类型。

    Doctor 无法修复某些问题

    在绝大部分情况下,doctor 模块都可以对缺失的系统环境进行自动修复和安装,但也存在特殊的环境无法正常使用自动修复功能。

    由于系统限制(例如,Windows 下无法自动安装 Visual Studio 等软件),自动修复功能无法用于某些项目。 在遇到无法自动修复功能时,如果遇到 Some check items can not be fixed 字样,则表明无法自动修复。 请根据终端显示的方法提交 Issue 或自行修复环境。

    编译错误

    遇到编译错误时,如果没有开启 --debug 日志,请先开启调试日志,然后确定报错的命令。 报错的终端输出对于修复编译错误非常重要。 在提交 Issue 时,请上传终端日志的最后报错片段(或整个终端日志输出),并且包含使用的 spc 命令和参数。

    如果你是重复构建,请参考 本地构建 - 多次构建 章节。

    ',13)]))}const _=o(s,[["render",c]]);export{u as __pageData,_ as default}; diff --git a/assets/zh_guide_troubleshooting.md.DSUIb51x.lean.js b/assets/zh_guide_troubleshooting.md.DSUIb51x.lean.js deleted file mode 100644 index f93d25c9..00000000 --- a/assets/zh_guide_troubleshooting.md.DSUIb51x.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as o,c as t,o as a,af as r}from"./chunks/framework.PeLcR_tw.js";const u=JSON.parse('{"title":"故障排除","description":"","frontmatter":{},"headers":[],"relativePath":"zh/guide/troubleshooting.md","filePath":"zh/guide/troubleshooting.md"}'),s={name:"zh/guide/troubleshooting.md"};function c(d,e,i,n,l,p){return a(),t("div",null,e[0]||(e[0]=[r("",13)]))}const _=o(s,[["render",c]]);export{u as __pageData,_ as default}; diff --git a/assets/zh_index.md.DcikGFee.js b/assets/zh_index.md.Dv99zA_s.js similarity index 94% rename from assets/zh_index.md.DcikGFee.js rename to assets/zh_index.md.Dv99zA_s.js index 0fb884f8..6583eb12 100644 --- a/assets/zh_index.md.DcikGFee.js +++ b/assets/zh_index.md.Dv99zA_s.js @@ -1 +1 @@ -import{_ as e,c as t,o as i}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"static-php-cli","tagline":"在 Linux、macOS、FreeBSD、Windows 上与 PHP 项目一起构建独立的 PHP 二进制文件,并包含流行的扩展。","actions":[{"theme":"brand","text":"指南","link":"./guide/"}]},"features":[{"title":"静态二进制","details":"您可以轻松地编译一个独立的 PHP 二进制文件以供嵌入程序使用。包括 cli、fpm、micro。"},{"title":"phpmicro 自执行二进制","details":"您可以使用 micro SAPI 编译一个自解压的可执行文件,并将 PHP 代码与二进制文件打包为一个文件。"},{"title":"依赖管理","details":"static-php-cli 附带依赖项管理,支持安装不同类型的 PHP 扩展和不同的依赖库。"}]},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md"}'),a={name:"zh/index.md"};function n(c,o,r,s,d,l){return i(),t("div")}const h=e(a,[["render",n]]);export{m as __pageData,h as default}; +import{_ as e,c as t,o as i}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"static-php-cli","tagline":"在 Linux、macOS、FreeBSD、Windows 上与 PHP 项目一起构建独立的 PHP 二进制文件,并包含流行的扩展。","actions":[{"theme":"brand","text":"指南","link":"./guide/"}]},"features":[{"title":"静态二进制","details":"您可以轻松地编译一个独立的 PHP 二进制文件以供嵌入程序使用。包括 cli、fpm、micro。"},{"title":"phpmicro 自执行二进制","details":"您可以使用 micro SAPI 编译一个自解压的可执行文件,并将 PHP 代码与二进制文件打包为一个文件。"},{"title":"依赖管理","details":"static-php-cli 附带依赖项管理,支持安装不同类型的 PHP 扩展和不同的依赖库。"}]},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md"}'),a={name:"zh/index.md"};function n(c,o,r,s,d,l){return i(),t("div")}const h=e(a,[["render",n]]);export{m as __pageData,h as default}; diff --git a/assets/zh_index.md.DcikGFee.lean.js b/assets/zh_index.md.Dv99zA_s.lean.js similarity index 94% rename from assets/zh_index.md.DcikGFee.lean.js rename to assets/zh_index.md.Dv99zA_s.lean.js index 0fb884f8..6583eb12 100644 --- a/assets/zh_index.md.DcikGFee.lean.js +++ b/assets/zh_index.md.Dv99zA_s.lean.js @@ -1 +1 @@ -import{_ as e,c as t,o as i}from"./chunks/framework.PeLcR_tw.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"static-php-cli","tagline":"在 Linux、macOS、FreeBSD、Windows 上与 PHP 项目一起构建独立的 PHP 二进制文件,并包含流行的扩展。","actions":[{"theme":"brand","text":"指南","link":"./guide/"}]},"features":[{"title":"静态二进制","details":"您可以轻松地编译一个独立的 PHP 二进制文件以供嵌入程序使用。包括 cli、fpm、micro。"},{"title":"phpmicro 自执行二进制","details":"您可以使用 micro SAPI 编译一个自解压的可执行文件,并将 PHP 代码与二进制文件打包为一个文件。"},{"title":"依赖管理","details":"static-php-cli 附带依赖项管理,支持安装不同类型的 PHP 扩展和不同的依赖库。"}]},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md"}'),a={name:"zh/index.md"};function n(c,o,r,s,d,l){return i(),t("div")}const h=e(a,[["render",n]]);export{m as __pageData,h as default}; +import{_ as e,c as t,o as i}from"./chunks/framework.Bhsyh9kO.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"static-php-cli","tagline":"在 Linux、macOS、FreeBSD、Windows 上与 PHP 项目一起构建独立的 PHP 二进制文件,并包含流行的扩展。","actions":[{"theme":"brand","text":"指南","link":"./guide/"}]},"features":[{"title":"静态二进制","details":"您可以轻松地编译一个独立的 PHP 二进制文件以供嵌入程序使用。包括 cli、fpm、micro。"},{"title":"phpmicro 自执行二进制","details":"您可以使用 micro SAPI 编译一个自解压的可执行文件,并将 PHP 代码与二进制文件打包为一个文件。"},{"title":"依赖管理","details":"static-php-cli 附带依赖项管理,支持安装不同类型的 PHP 扩展和不同的依赖库。"}]},"headers":[],"relativePath":"zh/index.md","filePath":"zh/index.md"}'),a={name:"zh/index.md"};function n(c,o,r,s,d,l){return i(),t("div")}const h=e(a,[["render",n]]);export{m as __pageData,h as default}; diff --git a/deps-craft-yml.html b/deps-craft-yml.html index b6ed8189..5069d354 100644 --- a/deps-craft-yml.html +++ b/deps-craft-yml.html @@ -5,20 +5,20 @@ static-php-cli - - + + - + - - - + + + -
    Skip to content
    yaml
    # PHP version to build (default: 8.4)
    +    
    Skip to content
    yaml
    # PHP version to build (default: 8.4)
     php-version: 8.4
     # [REQUIRED] Static PHP extensions to build (list or comma-separated are both accepted)
     extensions: bcmath,fileinfo,phar,zlib,sodium,posix,pcntl
    @@ -85,8 +85,8 @@
     # Extra environment variables
     extra-env:
       # e.g. Use github token to avoid rate limit
    -  GITHUB_TOKEN: your-github-token

    Released under the MIT License.

    - + GITHUB_TOKEN: your-github-token

    Released under the MIT License.

    + \ No newline at end of file diff --git a/deps-map-ext.html b/deps-map-ext.html index dcf25c1e..c290dc49 100644 --- a/deps-map-ext.html +++ b/deps-map-ext.html @@ -5,21 +5,21 @@ static-php-cli - - + + - + - - - + + + -
    Skip to content

    Linux

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvpcntlunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    liburing
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    macOS

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    glfwglfw
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    Windows

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqpopenssllibrabbitmq
    brotlibrotli
    bz2bzip2
    curlzlib
    openssl
    curl
    dbaqdbm
    domxmllibxml2
    zlib
    evsockets
    ffilibffi-win
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gmsslgmssl
    iconvlibiconv-win
    igbinarysession
    apcu
    intlicu-static-win
    libxmlxml
    mbregexmbstringonig
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    parallelpthreads4w
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    pdo_pgsqlpdo
    pgsql
    postgresql-win
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql-win
    pharzlib
    redissession
    igbinary
    msgpack
    simplexmlxmllibxml2
    soapxmllibxml2
    sodiumlibsodium
    sqlite3sqlite
    ssh2openssl
    zlib
    libssh2
    swowopenssl
    curl
    openssl
    curl
    xlswriterzlib
    zip
    openssl
    xmliconvlibxml2
    xmlreaderxml
    dom
    libxml2
    xmlwriterxmllibxml2
    xzxz
    yamllibyaml
    zipzlib
    bz2
    libzip
    zlib
    bzip2
    xz
    zlibzlib

    FreeBSD

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    evsockets
    ftpopenssl
    mbregexmbstringonig
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    pdo_mysqlpdo
    mysqlnd
    pharzlib
    xzxz
    zlibzlib

    Released under the MIT License.

    - +
    Skip to content

    Linux

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvpcntlunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    liburing
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    macOS

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    glfwglfw
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    Windows

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqpopenssllibrabbitmq
    brotlibrotli
    bz2bzip2
    curlzlib
    openssl
    curl
    dbaqdbm
    domxmllibxml2
    zlib
    evsockets
    ffilibffi-win
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gmsslgmssl
    iconvlibiconv-win
    igbinarysession
    apcu
    intlicu-static-win
    libxmlxml
    mbregexmbstringonig
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    parallelpthreads4w
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    pdo_pgsqlpdo
    pgsql
    postgresql-win
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql-win
    pharzlib
    redissession
    igbinary
    msgpack
    simplexmlxmllibxml2
    soapxmllibxml2
    sodiumlibsodium
    sqlite3sqlite
    ssh2openssl
    zlib
    libssh2
    swowopenssl
    curl
    openssl
    curl
    xlswriterzlib
    zip
    openssl
    xmliconvlibxml2
    xmlreaderxml
    dom
    libxml2
    xmlwriterxmllibxml2
    xzxz
    yamllibyaml
    zipzlib
    bz2
    libzip
    zlib
    bzip2
    xz
    zlibzlib

    FreeBSD

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    evsockets
    ftpopenssl
    mbregexmbstringonig
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    pdo_mysqlpdo
    mysqlnd
    pharzlib
    xzxz
    zlibzlib

    Released under the MIT License.

    + \ No newline at end of file diff --git a/deps-map-lib.html b/deps-map-lib.html index 74a87c17..4cda4407 100644 --- a/deps-map-lib.html +++ b/deps-map-lib.html @@ -5,21 +5,21 @@ static-php-cli - - + + - + - - - + + + -
    Skip to content

    Linux

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libaclattr
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    macOS

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    Windows

    Library NameRequired LibrariesSuggested Libraries
    curlzlib
    libssh2
    nghttp2
    brotli
    zstd
    freetypezliblibpng
    bzip2
    brotli
    libjpegzlib
    libpngzlib
    librabbitmqopenssl
    libssh2openssl
    libxml2libiconv-winzlib
    libzipzlib
    bzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib

    FreeBSD

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    opensslzlib

    Released under the MIT License.

    - +
    Skip to content

    Linux

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libaclattr
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    macOS

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    Windows

    Library NameRequired LibrariesSuggested Libraries
    curlzlib
    libssh2
    nghttp2
    brotli
    zstd
    freetypezliblibpng
    bzip2
    brotli
    libjpegzlib
    libpngzlib
    librabbitmqopenssl
    libssh2openssl
    libxml2libiconv-winzlib
    libzipzlib
    bzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib

    FreeBSD

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    opensslzlib

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/contributing/index.html b/en/contributing/index.html index f7a5511b..a29573d5 100644 --- a/en/contributing/index.html +++ b/en/contributing/index.html @@ -5,21 +5,21 @@ Contributing | static-php-cli - - + + - + - - - + + + -
    Skip to content

    Contributing

    Thank you for being here, this project welcomes your contributions!

    Contribution Guide

    If you have code or documentation to contribute, here's what you need to know first.

    1. What type of code are you contributing? (new extensions, bug fixes, security issues, project framework optimizations, documentation)
    2. If you contribute new files or new snippets, is your code checked by php-cs-fixer and phpstan?
    3. Have you fully read the Developer Guide before contributing code?

    If you can answer the above questions and have made changes to the code, you can initiate a Pull Request in the project GitHub repository in time. After the code review is completed, the code can be modified according to the suggestion, or directly merged into the main branch.

    Contribution Type

    The main purpose of this project is to compile statically linked PHP binaries, and the command line processing function is written based on symfony/console. Before development, if you are not familiar with it, Check out the symfony/console documentation first.

    Security Update

    Because this project is basically a PHP project running locally, generally speaking, there will be no remote attacks. But if you find such a problem, please **DO NOT submit a PR or Issue in the GitHub repository, You need to contact the project maintainer (crazywhalecc) via mail.

    Fix Bugs

    Fixing bugs generally does not involve modification of the project structure and framework, so if you can locate the wrong code and fix it directly, please submit a PR directly.

    New Extensions

    For adding a new extension, you need to understand some basic structure of the project and how to add a new extension according to the existing logic. It will be covered in detail in the next section on this page. In general, you will need:

    1. Evaluate whether the extension can be compiled inline into PHP.
    2. Evaluate whether the extension's dependent libraries (if any) can be compiled statically.
    3. Write library compile commands on different platforms.
    4. Verify that the extension and its dependencies are compatible with existing extensions and dependencies.
    5. Verify that the extension works normally in cli, micro, fpm, embed SAPIs.
    6. Write documentation and add your extension.

    Project Framework Optimization

    If you are already familiar with the working principle of symfony/console, and at the same time want to make some modifications or optimizations to the framework of the project, please understand the following things first:

    1. Adding extensions does not belong to project framework optimization, but if you find that you have to optimize the framework when adding new extensions, you need to modify the framework itself before adding extensions.
    2. For some large-scale logical modifications (such as those involving LibraryBase, Extension objects, etc.), it is recommended to submit an Issue or Draft PR for discussion first.
    3. In the early stage of the project, it was a pure private development project, and there were some Chinese comments in the code. After internationalizing your project you can submit a PR to translate these comments into English.
    4. Please do not submit more useless code fragments in the code, such as a large number of unused variables, methods, classes, and code that has been rewritten many times.

    Released under the MIT License.

    - +
    Skip to content

    Contributing

    Thank you for being here, this project welcomes your contributions!

    Contribution Guide

    If you have code or documentation to contribute, here's what you need to know first.

    1. What type of code are you contributing? (new extensions, bug fixes, security issues, project framework optimizations, documentation)
    2. If you contribute new files or new snippets, is your code checked by php-cs-fixer and phpstan?
    3. Have you fully read the Developer Guide before contributing code?

    If you can answer the above questions and have made changes to the code, you can initiate a Pull Request in the project GitHub repository in time. After the code review is completed, the code can be modified according to the suggestion, or directly merged into the main branch.

    Contribution Type

    The main purpose of this project is to compile statically linked PHP binaries, and the command line processing function is written based on symfony/console. Before development, if you are not familiar with it, Check out the symfony/console documentation first.

    Security Update

    Because this project is basically a PHP project running locally, generally speaking, there will be no remote attacks. But if you find such a problem, please **DO NOT submit a PR or Issue in the GitHub repository, You need to contact the project maintainer (crazywhalecc) via mail.

    Fix Bugs

    Fixing bugs generally does not involve modification of the project structure and framework, so if you can locate the wrong code and fix it directly, please submit a PR directly.

    New Extensions

    For adding a new extension, you need to understand some basic structure of the project and how to add a new extension according to the existing logic. It will be covered in detail in the next section on this page. In general, you will need:

    1. Evaluate whether the extension can be compiled inline into PHP.
    2. Evaluate whether the extension's dependent libraries (if any) can be compiled statically.
    3. Write library compile commands on different platforms.
    4. Verify that the extension and its dependencies are compatible with existing extensions and dependencies.
    5. Verify that the extension works normally in cli, micro, fpm, embed SAPIs.
    6. Write documentation and add your extension.

    Project Framework Optimization

    If you are already familiar with the working principle of symfony/console, and at the same time want to make some modifications or optimizations to the framework of the project, please understand the following things first:

    1. Adding extensions does not belong to project framework optimization, but if you find that you have to optimize the framework when adding new extensions, you need to modify the framework itself before adding extensions.
    2. For some large-scale logical modifications (such as those involving LibraryBase, Extension objects, etc.), it is recommended to submit an Issue or Draft PR for discussion first.
    3. In the early stage of the project, it was a pure private development project, and there were some Chinese comments in the code. After internationalizing your project you can submit a PR to translate these comments into English.
    4. Please do not submit more useless code fragments in the code, such as a large number of unused variables, methods, classes, and code that has been rewritten many times.

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/develop/craft-yml.html b/en/develop/craft-yml.html index 37c3ebd2..b287a9df 100644 --- a/en/develop/craft-yml.html +++ b/en/develop/craft-yml.html @@ -5,20 +5,20 @@ craft.yml Configuration | static-php-cli - - + + - + - - - + + + -
    Skip to content

    craft.yml Configuration

    yaml
    # PHP version to build (default: 8.4)
    +    
    Skip to content

    craft.yml Configuration

    yaml
    # PHP version to build (default: 8.4)
     php-version: 8.4
     # [REQUIRED] Static PHP extensions to build (list or comma-separated are both accepted)
     extensions: bcmath,fileinfo,phar,zlib,sodium,posix,pcntl
    @@ -85,8 +85,8 @@
     # Extra environment variables
     extra-env:
       # e.g. Use github token to avoid rate limit
    -  GITHUB_TOKEN: your-github-token

    Released under the MIT License.

    - + GITHUB_TOKEN: your-github-token

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/develop/doctor-module.html b/en/develop/doctor-module.html index eaa8e5ab..ed7e8c91 100644 --- a/en/develop/doctor-module.html +++ b/en/develop/doctor-module.html @@ -5,20 +5,20 @@ Doctor module | static-php-cli - - + + - + - - - + + + -
    Skip to content

    Doctor module

    The Doctor module is a relatively independent module used to check the system environment, which can be entered with the command bin/spc doctor, and the entry command class is in DoctorCommand.php.

    The Doctor module is a checklist with a series of check items and automatic repair items. These items are stored in the src/SPC/doctor/item/ directory, And two Attributes are used as check item tags and auto-fix item tags: #[AsCheckItem] and #[AsFixItem].

    Take the existing check item if necessary tools are installed, which is used to check whether the packages necessary for compilation are installed in the macOS system. The following is its source code:

    php
    use SPC\doctor\AsCheckItem;
    +    
    Skip to content

    Doctor module

    The Doctor module is a relatively independent module used to check the system environment, which can be entered with the command bin/spc doctor, and the entry command class is in DoctorCommand.php.

    The Doctor module is a checklist with a series of check items and automatic repair items. These items are stored in the src/SPC/doctor/item/ directory, And two Attributes are used as check item tags and auto-fix item tags: #[AsCheckItem] and #[AsFixItem].

    Take the existing check item if necessary tools are installed, which is used to check whether the packages necessary for compilation are installed in the macOS system. The following is its source code:

    php
    use SPC\doctor\AsCheckItem;
     use SPC\doctor\AsFixItem;
     use SPC\doctor\CheckResult;
     
    @@ -46,8 +46,8 @@
             }
         }
         return true;
    -}

    #[AsFixItem()] first parameter is the name of the fix item, and this method must return True or False. When False is returned, the automatic repair failed and manual handling is required.

    In the code here, shell()->exec() is the method of executing commands of the project, which is used to replace exec() and system(), and also provides debugging, obtaining execution status, entering directories, etc. characteristic.

    Released under the MIT License.

    - +}

    #[AsFixItem()] first parameter is the name of the fix item, and this method must return True or False. When False is returned, the automatic repair failed and manual handling is required.

    In the code here, shell()->exec() is the method of executing commands of the project, which is used to replace exec() and system(), and also provides debugging, obtaining execution status, entering directories, etc. characteristic.

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/develop/index.html b/en/develop/index.html index ff1f079f..2ede7e0a 100644 --- a/en/develop/index.html +++ b/en/develop/index.html @@ -5,21 +5,21 @@ Start Developing | static-php-cli - - + + - + - - - + + + -
    Skip to content

    Start Developing

    Developing this project requires the installation and deployment of a PHP environment, as well as some extensions and Composer commonly used in PHP projects.

    The development environment and running environment of the project are almost exactly the same. You can refer to the Manual Build section to install system PHP or use the pre-built static PHP of this project as the environment. I will not go into details here.

    Regardless of its purpose, this project itself is actually a php-cli program. You can edit and develop it as a normal PHP project. At the same time, you need to understand the Shell languages of different systems.

    The current purpose of this project is to compile statically compiled independent PHP, but the main part also includes compiling static versions of many dependent libraries, so you can reuse this set of compilation logic to build independent binary versions of other programs, such as Nginx, etc.

    Environment preparation

    A PHP environment is required to develop this project. You can use the PHP that comes with the system, or you can use the static PHP built by this project.

    Regardless of which PHP you use, in your development environment you need to install these extensions:

    curl,dom,filter,mbstring,openssl,pcntl,phar,posix,sodium,tokenizer,xml,xmlwriter

    The static-php-cli project itself does not require so many extensions, but during the development process, you will use tools such as Composer and PHPUnit, which require these extensions.

    For micro self-executing binaries built by static-php-cli itself, only pcntl,posix,mbstring,tokenizer,phar is required.

    Start development

    Continuing down to see the project structure documentation, you can learn how static-php-cli works.

    Released under the MIT License.

    - +
    Skip to content

    Start Developing

    Developing this project requires the installation and deployment of a PHP environment, as well as some extensions and Composer commonly used in PHP projects.

    The development environment and running environment of the project are almost exactly the same. You can refer to the Manual Build section to install system PHP or use the pre-built static PHP of this project as the environment. I will not go into details here.

    Regardless of its purpose, this project itself is actually a php-cli program. You can edit and develop it as a normal PHP project. At the same time, you need to understand the Shell languages of different systems.

    The current purpose of this project is to compile statically compiled independent PHP, but the main part also includes compiling static versions of many dependent libraries, so you can reuse this set of compilation logic to build independent binary versions of other programs, such as Nginx, etc.

    Environment preparation

    A PHP environment is required to develop this project. You can use the PHP that comes with the system, or you can use the static PHP built by this project.

    Regardless of which PHP you use, in your development environment you need to install these extensions:

    curl,dom,filter,mbstring,openssl,pcntl,phar,posix,sodium,tokenizer,xml,xmlwriter

    The static-php-cli project itself does not require so many extensions, but during the development process, you will use tools such as Composer and PHPUnit, which require these extensions.

    For micro self-executing binaries built by static-php-cli itself, only pcntl,posix,mbstring,tokenizer,phar is required.

    Start development

    Continuing down to see the project structure documentation, you can learn how static-php-cli works.

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/develop/php-src-changes.html b/en/develop/php-src-changes.html index 487dc160..0b03ac98 100644 --- a/en/develop/php-src-changes.html +++ b/en/develop/php-src-changes.html @@ -5,21 +5,21 @@ Modifications to PHP source code | static-php-cli - - + + - + - - - + + + -
    Skip to content

    Modifications to PHP source code

    During the static compilation process, static-php-cli made some modifications to the PHP source code in order to achieve good compatibility, performance, and security. The following is a description of the current modifications to the PHP source code.

    Based on the patches provided by the phpmicro project, static-php-cli has made some modifications to the PHP source code to meet the needs of static compilation. The patches currently used by static-php-cli during compilation in the patch list are:

    • static_opcache
    • static_extensions_win32
    • cli_checks
    • disable_huge_page
    • vcruntime140
    • win32
    • zend_stream
    • cli_static
    • macos_iconv
    • phar

    PHP <= 8.1 libxml patch

    Because PHP only provides security updates for 8.1 and stops updating older versions, static-php-cli applies the libxml compilation patch that has been applied in newer versions of PHP to PHP 8.1 and below.

    gd extension Windows patch

    Compiling the gd extension under Windows requires major changes to the config.w32 file. static-php-cli has made some changes to the gd extension to make it easier to compile under Windows.

    YAML extension Windows patch

    YAML extension needs to modify the config.w32 file to compile under Windows. static-php-cli has made some modifications to the YAML extension to make it easier to compile under Windows.

    static-php-cli version information insertion

    When compiling, static-php-cli will insert the static-php-cli version information into the PHP version information for easy identification.

    Add option to hardcode INI

    When using the -I parameter to hardcode INI into static PHP functionality, static-php-cli will modify the PHP source code to insert the hardcoded content.

    Linux system repair patch

    Some compilation environments may lack some system header files or libraries. static-php-cli will automatically fix these problems during compilation, such as:

    • HAVE_STRLCAT missing problem
    • HAVE_STRLCPY missing problem

    Fiber issue fix patch for Windows

    When compiling PHP on Windows, there will be some issues with the Fiber extension. static-php-cli will automatically fix these issues during compilation (modify config.w32 in php-src).

    Released under the MIT License.

    - +
    Skip to content

    Modifications to PHP source code

    During the static compilation process, static-php-cli made some modifications to the PHP source code in order to achieve good compatibility, performance, and security. The following is a description of the current modifications to the PHP source code.

    Based on the patches provided by the phpmicro project, static-php-cli has made some modifications to the PHP source code to meet the needs of static compilation. The patches currently used by static-php-cli during compilation in the patch list are:

    • static_opcache
    • static_extensions_win32
    • cli_checks
    • disable_huge_page
    • vcruntime140
    • win32
    • zend_stream
    • cli_static
    • macos_iconv
    • phar

    PHP <= 8.1 libxml patch

    Because PHP only provides security updates for 8.1 and stops updating older versions, static-php-cli applies the libxml compilation patch that has been applied in newer versions of PHP to PHP 8.1 and below.

    gd extension Windows patch

    Compiling the gd extension under Windows requires major changes to the config.w32 file. static-php-cli has made some changes to the gd extension to make it easier to compile under Windows.

    YAML extension Windows patch

    YAML extension needs to modify the config.w32 file to compile under Windows. static-php-cli has made some modifications to the YAML extension to make it easier to compile under Windows.

    static-php-cli version information insertion

    When compiling, static-php-cli will insert the static-php-cli version information into the PHP version information for easy identification.

    Add option to hardcode INI

    When using the -I parameter to hardcode INI into static PHP functionality, static-php-cli will modify the PHP source code to insert the hardcoded content.

    Linux system repair patch

    Some compilation environments may lack some system header files or libraries. static-php-cli will automatically fix these problems during compilation, such as:

    • HAVE_STRLCAT missing problem
    • HAVE_STRLCPY missing problem

    Fiber issue fix patch for Windows

    When compiling PHP on Windows, there will be some issues with the Fiber extension. static-php-cli will automatically fix these issues during compilation (modify config.w32 in php-src).

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/develop/source-module.html b/en/develop/source-module.html index a6eee35e..d1fdcb23 100644 --- a/en/develop/source-module.html +++ b/en/develop/source-module.html @@ -5,20 +5,20 @@ Source module | static-php-cli - - + + - + - - - + + + -
    Skip to content

    Source module

    The download source module of static-php-cli is a major module. It includes dependent libraries, external extensions, PHP source code download methods and file decompression methods. The download configuration file mainly involves the source.json and pkg.json file, which records the download method of all downloadable sources.

    The main commands involved in the download function are bin/spc download and bin/spc extract. The download command is a downloader that downloads sources according to the configuration file, and the extract command is an extractor that extract sources from downloaded files.

    Generally speaking, downloading sources may be slow because these sources come from various official websites, GitHub, and other different locations. At the same time, they also occupy a large space, so you can download the sources once and reuse them.

    The configuration file of the downloader is source.json, which contains the download methods of all sources. You can add the source download methods you need, or modify the existing source download methods.

    The download configuration structure of each source is as follows. The following is the source download configuration corresponding to the libevent extension:

    json
    {
    +    
    Skip to content

    Source module

    The download source module of static-php-cli is a major module. It includes dependent libraries, external extensions, PHP source code download methods and file decompression methods. The download configuration file mainly involves the source.json and pkg.json file, which records the download method of all downloadable sources.

    The main commands involved in the download function are bin/spc download and bin/spc extract. The download command is a downloader that downloads sources according to the configuration file, and the extract command is an extractor that extract sources from downloaded files.

    Generally speaking, downloading sources may be slow because these sources come from various official websites, GitHub, and other different locations. At the same time, they also occupy a large space, so you can download the sources once and reuse them.

    The configuration file of the downloader is source.json, which contains the download methods of all sources. You can add the source download methods you need, or modify the existing source download methods.

    The download configuration structure of each source is as follows. The following is the source download configuration corresponding to the libevent extension:

    json
    {
       "libevent": {
         "type": "ghrel",
         "repo": "libevent/libevent",
    @@ -137,8 +137,8 @@
           ]
         }
       }
    -}

    Released under the MIT License.

    - +}

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/develop/structure.html b/en/develop/structure.html index b894d158..75c2dcbf 100644 --- a/en/develop/structure.html +++ b/en/develop/structure.html @@ -5,20 +5,20 @@ Introduction to project structure | static-php-cli - - + + - + - - - + + + -
    Skip to content

    Introduction to project structure

    static-php-cli mainly contains three logical components: sources, dependent libraries, and extensions. These components contains 4 configuration files: source.json, pkg.json, lib.json, and ext.json.

    A complete process for building standalone static PHP is:

    1. Use the source download module Downloader to download specified or all source codes. These sources include PHP source code, dependent library source code, and extension source code.
    2. Use the source decompression module SourceExtractor to decompress the downloaded sources to the compilation directory.
    3. Use the dependency tool to calculate the dependent extensions and dependent libraries of the currently added extension, and then compile each library that needs to be compiled in the order of dependencies.
    4. After building each dependent library using Builder under the corresponding operating system, install it to the buildroot directory.
    5. If external extensions are included (the source code does not contain extensions within PHP), copy the external extensions to the source/php-src/ext/ directory.
    6. Use Builder to build the PHP source code and build target to the buildroot directory.

    The project is mainly divided into several folders:

    • bin/: used to store program entry files, including bin/spc, bin/spc-alpine-docker, bin/setup-runtime.
    • config/: Contains all the extensions and dependent libraries supported by the project, as well as the download link and download methods of these sources. It is divided into files: lib.json, ext.json, source.json, pkg.json, pre-built.json .
    • src/: The core code of the project, including the entire framework and commands for compiling various extensions and libraries.
    • vendor/: The directory that Composer depends on, you do not need to make any modifications to it.

    The operating principle is to start a ConsoleApplication of symfony/console, and then parse the commands entered by the user in the terminal.

    Basic command line structure

    bin/spc is an entry file, including the Unix common #!/usr/bin/env php, which is used to allow the system to automatically execute with the PHP interpreter installed on the system. After the project executes new ConsoleApplication(), the framework will automatically register them as commands.

    The project does not directly use the Command registration method and command execution method recommended by Symfony. Here are small changes:

    1. Each command uses the #[AsCommand()] Attribute to register the name and description.
    2. Abstract execute() so that all commands are based on BaseCommand (which is based on Symfony\Component\Console\Command\Command), and the execution code of each command itself is written in the handle() method .
    3. Added variable $no_motd to BaseCommand, which is used to display the Figlet greeting when the command is executed.
    4. BaseCommand saves InputInterface and OutputInterface as member variables. You can use $this->input and $this->output within the command class.

    Basic source code structure

    The source code of the project is located in the src/SPC directory, supports automatic loading of the PSR-4 standard, and contains the following subdirectories and classes:

    • src/SPC/builder/: The core compilation command code used to build libraries, PHP and related extensions under different operating systems, and also includes some compilation system tool methods.
    • src/SPC/command/: All commands of the project are here.
    • src/SPC/doctor/: Doctor module, which is a relatively independent module used to check the system environment. It can be entered using the command bin/spc doctor.
    • src/SPC/exception/: exception class.
    • src/SPC/store/: Classes related to storage, files and sources are all here.
    • src/SPC/util/: Some reusable tool methods are here.
    • src/SPC/ConsoleApplication.php: command line program entry file.

    If you have read the source code, you may find that there is also a src/globals/ directory, which is used to store some global variables, global methods, and non-PSR-4 standard PHP source code that is relied upon during the build process, such as extension sanity check code etc.

    Phar application directory issue

    Like other php-cli projects, spc itself has additional considerations for paths. Because spc can run in multiple modes such as php-cli directly, micro SAPI, php-cli with Phar, vendor with Phar, etc., there are ambiguities in various root directories. A complete explanation is given here. This problem is generally common in the base class path selection problem of accessing files in PHP projects, especially when used with micro.sfx.

    Note that this may only be useful for you when developing Phar projects or PHP frameworks.

    Next, we will treat static-php-cli (that is, spc) as a normal php command line program. You can understand spc as any of your own php-cli applications for reference.

    There are three basic constant theoretical values below. We recommend that you introduce these three constants when writing PHP projects:

    • WORKING_DIR: the working directory when executing PHP scripts

    • SOURCE_ROOT_DIR or ROOT_DIR: the root directory of the project folder, generally the directory where composer.json is located

    • FRAMEWORK_ROOT_DIR: the root directory of the framework used, which may be used by self-developed frameworks. Generally, the framework directory is read-only

    You can define these constants in your framework entry or cli applications to facilitate the use of paths in your project.

    The following are PHP built-in constant values, which have been defined inside the PHP interpreter:

    • __DIR__: the directory where the file of the currently executed script is located

    • __FILE__: the file path of the currently executed script

    Git project mode (source)

    Git project mode refers to a framework or program itself stored in plain text in the current folder, and running through php path/to/entry.php.

    Assume that your project is stored in the /home/example/static-php-cli/ directory, or your project is the framework itself, which contains project files such as composer.json:

    composer.json
    +    
    Skip to content

    Introduction to project structure

    static-php-cli mainly contains three logical components: sources, dependent libraries, and extensions. These components contains 4 configuration files: source.json, pkg.json, lib.json, and ext.json.

    A complete process for building standalone static PHP is:

    1. Use the source download module Downloader to download specified or all source codes. These sources include PHP source code, dependent library source code, and extension source code.
    2. Use the source decompression module SourceExtractor to decompress the downloaded sources to the compilation directory.
    3. Use the dependency tool to calculate the dependent extensions and dependent libraries of the currently added extension, and then compile each library that needs to be compiled in the order of dependencies.
    4. After building each dependent library using Builder under the corresponding operating system, install it to the buildroot directory.
    5. If external extensions are included (the source code does not contain extensions within PHP), copy the external extensions to the source/php-src/ext/ directory.
    6. Use Builder to build the PHP source code and build target to the buildroot directory.

    The project is mainly divided into several folders:

    • bin/: used to store program entry files, including bin/spc, bin/spc-alpine-docker, bin/setup-runtime.
    • config/: Contains all the extensions and dependent libraries supported by the project, as well as the download link and download methods of these sources. It is divided into files: lib.json, ext.json, source.json, pkg.json, pre-built.json .
    • src/: The core code of the project, including the entire framework and commands for compiling various extensions and libraries.
    • vendor/: The directory that Composer depends on, you do not need to make any modifications to it.

    The operating principle is to start a ConsoleApplication of symfony/console, and then parse the commands entered by the user in the terminal.

    Basic command line structure

    bin/spc is an entry file, including the Unix common #!/usr/bin/env php, which is used to allow the system to automatically execute with the PHP interpreter installed on the system. After the project executes new ConsoleApplication(), the framework will automatically register them as commands.

    The project does not directly use the Command registration method and command execution method recommended by Symfony. Here are small changes:

    1. Each command uses the #[AsCommand()] Attribute to register the name and description.
    2. Abstract execute() so that all commands are based on BaseCommand (which is based on Symfony\Component\Console\Command\Command), and the execution code of each command itself is written in the handle() method .
    3. Added variable $no_motd to BaseCommand, which is used to display the Figlet greeting when the command is executed.
    4. BaseCommand saves InputInterface and OutputInterface as member variables. You can use $this->input and $this->output within the command class.

    Basic source code structure

    The source code of the project is located in the src/SPC directory, supports automatic loading of the PSR-4 standard, and contains the following subdirectories and classes:

    • src/SPC/builder/: The core compilation command code used to build libraries, PHP and related extensions under different operating systems, and also includes some compilation system tool methods.
    • src/SPC/command/: All commands of the project are here.
    • src/SPC/doctor/: Doctor module, which is a relatively independent module used to check the system environment. It can be entered using the command bin/spc doctor.
    • src/SPC/exception/: exception class.
    • src/SPC/store/: Classes related to storage, files and sources are all here.
    • src/SPC/util/: Some reusable tool methods are here.
    • src/SPC/ConsoleApplication.php: command line program entry file.

    If you have read the source code, you may find that there is also a src/globals/ directory, which is used to store some global variables, global methods, and non-PSR-4 standard PHP source code that is relied upon during the build process, such as extension sanity check code etc.

    Phar application directory issue

    Like other php-cli projects, spc itself has additional considerations for paths. Because spc can run in multiple modes such as php-cli directly, micro SAPI, php-cli with Phar, vendor with Phar, etc., there are ambiguities in various root directories. A complete explanation is given here. This problem is generally common in the base class path selection problem of accessing files in PHP projects, especially when used with micro.sfx.

    Note that this may only be useful for you when developing Phar projects or PHP frameworks.

    Next, we will treat static-php-cli (that is, spc) as a normal php command line program. You can understand spc as any of your own php-cli applications for reference.

    There are three basic constant theoretical values below. We recommend that you introduce these three constants when writing PHP projects:

    • WORKING_DIR: the working directory when executing PHP scripts

    • SOURCE_ROOT_DIR or ROOT_DIR: the root directory of the project folder, generally the directory where composer.json is located

    • FRAMEWORK_ROOT_DIR: the root directory of the framework used, which may be used by self-developed frameworks. Generally, the framework directory is read-only

    You can define these constants in your framework entry or cli applications to facilitate the use of paths in your project.

    The following are PHP built-in constant values, which have been defined inside the PHP interpreter:

    • __DIR__: the directory where the file of the currently executed script is located

    • __FILE__: the file path of the currently executed script

    Git project mode (source)

    Git project mode refers to a framework or program itself stored in plain text in the current folder, and running through php path/to/entry.php.

    Assume that your project is stored in the /home/example/static-php-cli/ directory, or your project is the framework itself, which contains project files such as composer.json:

    composer.json
     src/App/MyCommand.app
     vendor/*
     bin/entry.php

    We assume that the above constants are obtained from src/App/MyCommand.php:

    ConstantValue
    WORKING_DIR/home/example/static-php-cli
    SOURCE_ROOT_DIR/home/example/static-php-cli
    FRAMEWORK_ROOT_DIR/home/example/static-php-cli
    __DIR__/home/example/static-php-cli/src/App
    __FILE__/home/example/static-php-cli/src/App/MyCommand.php

    In this case, the values of WORKING_DIR, SOURCE_ROOT_DIR, and FRAMEWORK_ROOT_DIR are exactly the same: /home/example/static-php-cli.

    The source code of the framework and the source code of the application are both in the current path.

    Vendor library mode (vendor)

    The vendor library mode generally means that your project is a framework or is installed into the project as a composer dependency by other applications, and the storage location is in the vendor/author/XXX directory.

    Suppose your project is crazywhalecc/static-php-cli, and you or others install this project in another project using composer require.

    We assume that static-php-cli contains all files except the vendor directory with the same Git mode, and get the constant value from src/App/MyCommand, Directory constant should be:

    ConstantValue
    WORKING_DIR/home/example/another-app
    SOURCE_ROOT_DIR/home/example/another-app
    FRAMEWORK_ROOT_DIR/home/example/another-app/vendor/crazywhalecc/static-php-cli
    __DIR__/home/example/another-app/vendor/crazywhalecc/static-php-cli/src/App
    __FILE__/home/example/another-app/vendor/crazywhalecc/static-php-cli/src/App/MyCommand.php

    Here SOURCE_ROOT_DIR refers to the root directory of the project using static-php-cli.

    Git project Phar mode (source-phar)

    Git project Phar mode refers to the mode of packaging the project directory of the Git project mode into a phar file. We assume that /home/example/static-php-cli will be packaged into a Phar file, and the directory has the following files:

    composer.json
    @@ -27,8 +27,8 @@
     bin/entry.php

    When packaged into app.phar and stored in the /home/example/static-php-cli directory, app.phar is executed at this time. Assuming that the src/App/MyCommand code is executed, the constant is obtained in the file:

    ConstantValue
    WORKING_DIR/home/example/static-php-cli
    SOURCE_ROOT_DIRphar:///home/example/static-php-cli/app.phar/
    FRAMEWORK_ROOT_DIRphar:///home/example/static-php-cli/app.phar/
    __DIR__phar:///home/example/static-php-cli/app.phar/src/App
    __FILE__phar:///home/example/static-php-cli/app.phar/src/App/MyCommand.php

    Because the phar:// protocol is required to read files in the phar itself, the project root directory and the framework directory will be different from WORKING_DIR.

    Vendor Library Phar Mode (vendor-phar)

    Vendor Library Phar Mode means that your project is installed as a framework in other projects and stored in the vendor directory.

    We assume that your project directory structure is as follows:

    composer.json                           # Composer configuration file of the current project
     box.json                                # Configuration file for packaging Phar
     another-app.php                         # Entry file of another project
    -vendor/crazywhalecc/static-php-cli/*    # Your project is used as a dependent library

    When packaging these files under the directory /home/example/another-app/ into app.phar, the value of the following constant for your project should be:

    ConstantValue
    WORKING_DIR/home/example/another-app
    SOURCE_ROOT_DIRphar:///home/example/another-app/app.phar/
    FRAMEWORK_ROOT_DIRphar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli
    __DIR__phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App
    __FILE__phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App/MyCommand.php

    Released under the MIT License.

    - +vendor/crazywhalecc/static-php-cli/* # Your project is used as a dependent library

    When packaging these files under the directory /home/example/another-app/ into app.phar, the value of the following constant for your project should be:

    ConstantValue
    WORKING_DIR/home/example/another-app
    SOURCE_ROOT_DIRphar:///home/example/another-app/app.phar/
    FRAMEWORK_ROOT_DIRphar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli
    __DIR__phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App
    __FILE__phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App/MyCommand.php

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/develop/system-build-tools.html b/en/develop/system-build-tools.html index 28788c76..aa105c9a 100644 --- a/en/develop/system-build-tools.html +++ b/en/develop/system-build-tools.html @@ -5,20 +5,20 @@ Compilation Tools | static-php-cli - - + + - + - - - + + + -
    Skip to content

    Compilation Tools

    static-php-cli uses many system compilation tools when building static PHP. These tools mainly include:

    • autoconf: used to generate configure scripts.
    • make: used to execute Makefile.
    • cmake: used to execute CMakeLists.txt.
    • pkg-config: Used to find the installation path of dependent libraries.
    • gcc: used to compile C/C++ projects under Linux.
    • clang: used to compile C/C++ projects under macOS.

    For Linux and macOS operating systems, these tools can usually be installed through the package manager, which is written in the doctor module. Theoretically we can also compile and download these tools manually, but this will increase the complexity of compilation, so we do not recommend this.

    Linux Compilation Tools

    For Linux systems, different distributions have different installation methods for compilation tools. And for static compilation, the package management of some distributions cannot install libraries and tools for pure static compilation. Therefore, for the Linux platform and its different distributions, we currently provide a variety of compilation environment preparations.

    Glibc Environment

    The glibc environment refers to the underlying libc library of the system (that is, the C standard library that all programs written in C language are dynamically linked to) uses glibc, which is the default environment for most distributions. For example: Ubuntu, Debian, CentOS, RHEL, openSUSE, Arch Linux, etc.

    In the glibc environment, the package management and compiler we use point to glibc by default, and glibc cannot be statically linked well. One of the reasons it cannot be statically linked is that its network library nss cannot be compiled statically.

    For the glibc environment, in static-php-cli and spc in 2.0-RC8 and later, you can choose two ways to build static PHP:

    1. Use Docker to build, you can use bin/spc-alpine-docker to build, it will build an Alpine Linux docker image.
    2. Use bin/spc doctor --auto-fix to install the musl-wrapper and musl-cross-make packages, and then build directly. (Related source code)

    Generally speaking, the build results in these two environments are consistent, and you can choose according to actual needs.

    In the doctor module, static-php-cli will first detect the current Linux distribution. If the current distribution is a glibc environment, you will be prompted to install the musl-wrapper and musl-cross-make packages.

    The process of installing musl-wrapper in the glibc environment is as follows:

    1. Download the specific version of musl-wrapper source code from the musl official website.
    2. Use gcc installed from the package management to compile the musl-wrapper source code and generate musl-libc and other libraries: ./configure --disable-gcc-wrapper && make -j && sudo make install.
    3. The musl-wrapper related libraries will be installed in the /usr/local/musl directory.

    The process of installing musl-cross-make in the glibc environment is as follows:

    1. Download the precompiled musl-cross-make compressed package from dl.static-php.dev .
    2. Unzip to the /usr/local/musl directory.

    TIP

    In the glibc environment, static compilation can be achieved by directly installing musl-wrapper, but musl-wrapper only contains musl-gcc and not musl-g++, which means that C++ code cannot be compiled. So we need musl-cross-make to provide musl-g++.

    The reason why the musl-cross-make package cannot be compiled directly locally is that its compilation environment requirements are relatively high (requires more than 36GB of memory, compiled under Alpine Linux), so we provide precompiled binary packages that can be used for all Linux distributions.

    At the same time, the package management of some distributions provides musl-wrapper, but musl-cross-make needs to match the corresponding musl-wrapper version, so we do not use package management to install musl-wrapper.

    Compiling musl-cross-make will be introduced in the musl-cross-make Toolchain Compilation section of this chapter.

    Musl Environment

    The musl environment refers to the system's underlying libc library that uses musl, which is a lightweight C standard library that can be well statically linked.

    For the currently popular Linux distributions, Alpine Linux uses the musl environment, so static-php-cli can directly build static PHP under Alpine Linux. You only need to install basic compilation tools (such as gcc, cmake, etc.) directly from the package management.

    For other distributions, if your distribution uses the musl environment, you can also use static-php-cli to build static PHP directly after installing the necessary compilation tools.

    TIP

    In the musl environment, static-php-cli will automatically skip the installation of musl-wrapper and musl-cross-make.

    Docker Environment

    The Docker environment refers to using Docker containers to build static PHP. You can use bin/spc-alpine-docker to build. Before executing this command, you need to install Docker first, and then execute bin/spc-alpine-docker in the project root directory.

    After executing bin/spc-alpine-docker, static-php-cli will automatically download the Alpine Linux image and then build a cwcc-spc-x86_64 or cwcc-spc-aarch64 image. Then all build process is performed within this image, which is equivalent to compiling in Alpine Linux.

    musl-cross-make Toolchain Compilation

    In Linux, although you do not need to manually compile the musl-cross-make tool, if you want to understand its compilation process, you can refer here. Another important reason is that this may not be compiled using automated tools such as CI and Actions, because the existing CI service compilation environment does not meet the compilation requirements of musl-cross-make, and the configuration that meets the requirements is too expensive.

    The compilation process of musl-cross-make is as follows:

    Prepare an Alpine Linux environment (either directly installed or using Docker). The compilation process requires more than 36GB of memory, so you need to compile on a machine with larger memory. Without this much memory, compilation may fail.

    Then write the following content into the config.mak file:

    makefile
    STAT = -static --static
    +    
    Skip to content

    Compilation Tools

    static-php-cli uses many system compilation tools when building static PHP. These tools mainly include:

    • autoconf: used to generate configure scripts.
    • make: used to execute Makefile.
    • cmake: used to execute CMakeLists.txt.
    • pkg-config: Used to find the installation path of dependent libraries.
    • gcc: used to compile C/C++ projects under Linux.
    • clang: used to compile C/C++ projects under macOS.

    For Linux and macOS operating systems, these tools can usually be installed through the package manager, which is written in the doctor module. Theoretically we can also compile and download these tools manually, but this will increase the complexity of compilation, so we do not recommend this.

    Linux Compilation Tools

    For Linux systems, different distributions have different installation methods for compilation tools. And for static compilation, the package management of some distributions cannot install libraries and tools for pure static compilation. Therefore, for the Linux platform and its different distributions, we currently provide a variety of compilation environment preparations.

    Glibc Environment

    The glibc environment refers to the underlying libc library of the system (that is, the C standard library that all programs written in C language are dynamically linked to) uses glibc, which is the default environment for most distributions. For example: Ubuntu, Debian, CentOS, RHEL, openSUSE, Arch Linux, etc.

    In the glibc environment, the package management and compiler we use point to glibc by default, and glibc cannot be statically linked well. One of the reasons it cannot be statically linked is that its network library nss cannot be compiled statically.

    For the glibc environment, in static-php-cli and spc in 2.0-RC8 and later, you can choose two ways to build static PHP:

    1. Use Docker to build, you can use bin/spc-alpine-docker to build, it will build an Alpine Linux docker image.
    2. Use bin/spc doctor --auto-fix to install the musl-wrapper and musl-cross-make packages, and then build directly. (Related source code)

    Generally speaking, the build results in these two environments are consistent, and you can choose according to actual needs.

    In the doctor module, static-php-cli will first detect the current Linux distribution. If the current distribution is a glibc environment, you will be prompted to install the musl-wrapper and musl-cross-make packages.

    The process of installing musl-wrapper in the glibc environment is as follows:

    1. Download the specific version of musl-wrapper source code from the musl official website.
    2. Use gcc installed from the package management to compile the musl-wrapper source code and generate musl-libc and other libraries: ./configure --disable-gcc-wrapper && make -j && sudo make install.
    3. The musl-wrapper related libraries will be installed in the /usr/local/musl directory.

    The process of installing musl-cross-make in the glibc environment is as follows:

    1. Download the precompiled musl-cross-make compressed package from dl.static-php.dev .
    2. Unzip to the /usr/local/musl directory.

    TIP

    In the glibc environment, static compilation can be achieved by directly installing musl-wrapper, but musl-wrapper only contains musl-gcc and not musl-g++, which means that C++ code cannot be compiled. So we need musl-cross-make to provide musl-g++.

    The reason why the musl-cross-make package cannot be compiled directly locally is that its compilation environment requirements are relatively high (requires more than 36GB of memory, compiled under Alpine Linux), so we provide precompiled binary packages that can be used for all Linux distributions.

    At the same time, the package management of some distributions provides musl-wrapper, but musl-cross-make needs to match the corresponding musl-wrapper version, so we do not use package management to install musl-wrapper.

    Compiling musl-cross-make will be introduced in the musl-cross-make Toolchain Compilation section of this chapter.

    Musl Environment

    The musl environment refers to the system's underlying libc library that uses musl, which is a lightweight C standard library that can be well statically linked.

    For the currently popular Linux distributions, Alpine Linux uses the musl environment, so static-php-cli can directly build static PHP under Alpine Linux. You only need to install basic compilation tools (such as gcc, cmake, etc.) directly from the package management.

    For other distributions, if your distribution uses the musl environment, you can also use static-php-cli to build static PHP directly after installing the necessary compilation tools.

    TIP

    In the musl environment, static-php-cli will automatically skip the installation of musl-wrapper and musl-cross-make.

    Docker Environment

    The Docker environment refers to using Docker containers to build static PHP. You can use bin/spc-alpine-docker to build. Before executing this command, you need to install Docker first, and then execute bin/spc-alpine-docker in the project root directory.

    After executing bin/spc-alpine-docker, static-php-cli will automatically download the Alpine Linux image and then build a cwcc-spc-x86_64 or cwcc-spc-aarch64 image. Then all build process is performed within this image, which is equivalent to compiling in Alpine Linux.

    musl-cross-make Toolchain Compilation

    In Linux, although you do not need to manually compile the musl-cross-make tool, if you want to understand its compilation process, you can refer here. Another important reason is that this may not be compiled using automated tools such as CI and Actions, because the existing CI service compilation environment does not meet the compilation requirements of musl-cross-make, and the configuration that meets the requirements is too expensive.

    The compilation process of musl-cross-make is as follows:

    Prepare an Alpine Linux environment (either directly installed or using Docker). The compilation process requires more than 36GB of memory, so you need to compile on a machine with larger memory. Without this much memory, compilation may fail.

    Then write the following content into the config.mak file:

    makefile
    STAT = -static --static
     FLAG = -g0 -Os -Wno-error
     
     ifneq ($(NATIVE),)
    @@ -85,8 +85,8 @@
     sed -i 's/poison calloc/poison/g' ./gcc-13.2.0/gcc/system.h
     make TARGET=x86_64-linux-musl -j
     make TARGET=x86_64-linux-musl install -j
    -tar cvzf x86_64-musl-toolchain.tgz output/*

    TIP

    All the above scripts are suitable for x86_64 architecture Linux. If you need to build musl-cross-make for the ARM environment, just replace all x86_64 above with aarch64.

    This compilation process may fail due to insufficient memory, network problems, etc. You can try a few more times, or use a machine with larger memory to compile. If you encounter problems or you have better improvement solutions, go to Discussion.

    macOS Environment

    For macOS systems, the main compilation tool we use is clang, which is the default compiler for macOS systems and is also the compiler of Xcode.

    Compiling under macOS mainly relies on Xcode or Xcode Command Line Tools. You can download Xcode from the App Store, or execute xcode-select --install in the terminal to install Xcode Command Line Tools.

    In addition, in the doctor environment check module, static-php-cli will check whether Homebrew, compilation tools, etc. are installed on the macOS system. If not, you will be prompted to install them. I will not go into details here.

    FreeBSD Environment

    FreeBSD is also a Unix system, and its compilation tools are similar to macOS. You can directly use the package management pkg to install clang and other compilation tools through the doctor command.

    pkg-config Compilation (*nix only)

    If you observe the compilation log when using static-php-cli to build static PHP, you will find that no matter what is compiled, pkg-config will be compiled first. This is because pkg-config is a library used to find dependencies. In earlier versions of static-php-cli, we directly used the pkg-config tool installed by package management, but this would cause some problems, such as:

    • Even if PKG_CONFIG_PATH is specified, pkg-config will try to find dependent packages from the system path.
    • Since pkg-config will look for dependent packages from the system path, if a dependent package with the same name exists in the system, compilation may fail.

    In order to avoid the above problems, we compile pkg-config into buildroot/bin in user mode and use it. We use parameters such as --without-sysroot to avoid looking for dependent packages from the system path.

    Released under the MIT License.

    - +tar cvzf x86_64-musl-toolchain.tgz output/*

    TIP

    All the above scripts are suitable for x86_64 architecture Linux. If you need to build musl-cross-make for the ARM environment, just replace all x86_64 above with aarch64.

    This compilation process may fail due to insufficient memory, network problems, etc. You can try a few more times, or use a machine with larger memory to compile. If you encounter problems or you have better improvement solutions, go to Discussion.

    macOS Environment

    For macOS systems, the main compilation tool we use is clang, which is the default compiler for macOS systems and is also the compiler of Xcode.

    Compiling under macOS mainly relies on Xcode or Xcode Command Line Tools. You can download Xcode from the App Store, or execute xcode-select --install in the terminal to install Xcode Command Line Tools.

    In addition, in the doctor environment check module, static-php-cli will check whether Homebrew, compilation tools, etc. are installed on the macOS system. If not, you will be prompted to install them. I will not go into details here.

    FreeBSD Environment

    FreeBSD is also a Unix system, and its compilation tools are similar to macOS. You can directly use the package management pkg to install clang and other compilation tools through the doctor command.

    pkg-config Compilation (*nix only)

    If you observe the compilation log when using static-php-cli to build static PHP, you will find that no matter what is compiled, pkg-config will be compiled first. This is because pkg-config is a library used to find dependencies. In earlier versions of static-php-cli, we directly used the pkg-config tool installed by package management, but this would cause some problems, such as:

    • Even if PKG_CONFIG_PATH is specified, pkg-config will try to find dependent packages from the system path.
    • Since pkg-config will look for dependent packages from the system path, if a dependent package with the same name exists in the system, compilation may fail.

    In order to avoid the above problems, we compile pkg-config into buildroot/bin in user mode and use it. We use parameters such as --without-sysroot to avoid looking for dependent packages from the system path.

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/faq/index.html b/en/faq/index.html index 9161f7a7..5bd2f2c7 100644 --- a/en/faq/index.html +++ b/en/faq/index.html @@ -5,24 +5,24 @@ FAQ | static-php-cli - - + + - + - - - + + + -
    Skip to content

    FAQ

    Here will be some questions that you may encounter easily. There are currently many, but I need to take time to organize them.

    What is the path of php.ini ?

    On Linux, macOS and FreeBSD, the path of php.ini is /usr/local/etc/php/php.ini. On Windows, the path is C:\windows\php.ini or the current directory of php.exe. The directory where to look for php.ini can be changed on *nix using the manual build option --with-config-file-path.

    In addition, on Linux, macOS and FreeBSD, .ini files present in the /usr/local/etc/php/conf.d directory will also be loaded. On Windows, this path is empty by default. The directory can be changed using the manual build option --with-config-file-scan-dir.

    php.ini will also be searched for in the other standard locations.

    Can statically-compiled PHP install extensions?

    Because the principle of installing PHP extensions under the normal mode is to use .so type dynamic link library to install new extensions, and we use the static link PHP compiled by this project. However, static linking has different definitions in different operating systems.

    First of all, for Linux systems, statically linked binaries will not link the system's dynamic link library. Purely statically linked binaries (build with -all-static) cannot load dynamic libraries, so new extensions cannot be added. At the same time, in pure static mode, you cannot use extensions such as ffi to load external .so modules.

    You can use the command ldd buildroot/bin/php to check whether the binary you built under Linux is purely statically linked.

    If you build GNU libc based PHP, you can use the ffi extension to load external .so modules and load .so extensions with the same ABI.

    For example, you can use the following command to build a static PHP binary dynamically linked with glibc, supporting FFI extensions and loading the xdebug.so extension of the same PHP version and the same TS type:

    bash
    bin/spc-gnu-docker download --for-extensions=ffi,xml --with-php=8.4
    +    
    Skip to content

    FAQ

    Here will be some questions that you may encounter easily. There are currently many, but I need to take time to organize them.

    What is the path of php.ini ?

    On Linux, macOS and FreeBSD, the path of php.ini is /usr/local/etc/php/php.ini. On Windows, the path is C:\windows\php.ini or the current directory of php.exe. The directory where to look for php.ini can be changed on *nix using the manual build option --with-config-file-path.

    In addition, on Linux, macOS and FreeBSD, .ini files present in the /usr/local/etc/php/conf.d directory will also be loaded. On Windows, this path is empty by default. The directory can be changed using the manual build option --with-config-file-scan-dir.

    php.ini will also be searched for in the other standard locations.

    Can statically-compiled PHP install extensions?

    Because the principle of installing PHP extensions under the normal mode is to use .so type dynamic link library to install new extensions, and we use the static link PHP compiled by this project. However, static linking has different definitions in different operating systems.

    First of all, for Linux systems, statically linked binaries will not link the system's dynamic link library. Purely statically linked binaries (build with -all-static) cannot load dynamic libraries, so new extensions cannot be added. At the same time, in pure static mode, you cannot use extensions such as ffi to load external .so modules.

    You can use the command ldd buildroot/bin/php to check whether the binary you built under Linux is purely statically linked.

    If you build GNU libc based PHP, you can use the ffi extension to load external .so modules and load .so extensions with the same ABI.

    For example, you can use the following command to build a static PHP binary dynamically linked with glibc, supporting FFI extensions and loading the xdebug.so extension of the same PHP version and the same TS type:

    bash
    bin/spc-gnu-docker download --for-extensions=ffi,xml --with-php=8.4
     bin/spc-gnu-docker build ffi,xml --build-cli --debug
     
    -buildroot/bin/php -d "zend_extension=/path/to/php{PHP_VER}-{ts/nts}/xdebug.so" --ri xdebug

    For macOS platform, almost all binaries under macOS cannot be truly purely statically linked, and almost all binaries will link macOS system libraries: /usr/lib/libresolv.9.dylib and /usr/lib/libSystem.B.dylib. So on macOS, you can directly use SPC to build statically compiled PHP binaries with dynamically linked extensions:

    1. Build shared extension xxx.so using: --build-shared=XXX option. e.g. bin/spc build bcmath,zlib --build-shared=xdebug --build-cli
    2. You will get buildroot/modules/xdebug.so and buildroot/bin/php.
    3. The xdebug.so file could be used for php that version and thread-safe are the same.

    Can it support Oracle database extension?

    Some extensions that rely on closed source libraries, such as oci8, sourceguardian, etc., they do not provide purely statically compiled dependent library files (.a), only dynamic dependent library files (.so). These extensions cannot be compiled into static-php-cli using source code, so this project may never support these extensions. However, in theory you can access and use such extensions under macOS and Linux according to the above questions.

    If you have a need for such extensions, or most people have needs for these closed-source extensions, see the discussion on standalone-php-cli. Welcome to leave a message.

    Does it support Windows?

    The project currently supports Windows, but the number of supported extensions is small. Windows support is not perfect. There are mainly the following problems:

    1. The compilation process of Windows is different from that of *nix, and the toolchain used is also different. The compilation tools used to compile the dependent libraries of each extension are almost completely different.
    2. The demand for the Windows version will also be advanced based on the needs of all people who use this project. If many people need it, I will support related extensions as soon as possible.

    Can I protect my source code with micro?

    You can't. micro.sfx is essentially combining php and php code into one file, there is no process of compiling or encrypting the PHP code.

    First of all, php-src is the official interpreter of PHP code, and there is no PHP compiler compatible with mainstream branches on the market. I saw on the Internet that there is a project called BPC (Binary PHP Compiler?) that can compile PHP into binary, but there are many restrictions.

    The direction of encrypting and protecting the code is not the same as compiling. After compiling, the code can also be obtained through reverse engineering and other methods. The real protection is still carried out by means of packing and encrypting the code.

    Therefore, this project (static-php-cli) and related projects (lwmbs, swoole-cli) all provide a convenient compilation tool for php-src source code. The phpmicro referenced by this project and related projects is only a package of PHP's sapi interface, not a compilation tool for PHP code. The compiler for PHP code is a completely different project, so the extra cases are not taken into account. If you are interested in encryption, you can consider using existing encryption technologies, such as Swoole Compiler, Source Guardian, etc.

    Unable to use ssl

    Update: This issue has been fixed in the latest version of static-php-cli, which now reads the system's certificate file by default. If you still have problems, try the solution below.

    When using curl, pgsql, etc. to request an HTTPS website or establish an SSL connection, there may be an error:80000002:system library::No such file or directory error. This error is caused by statically compiled PHP without specifying openssl.cafile via php.ini.

    You can solve this problem by specifying php.ini before using PHP and adding openssl.cafile=/path/to/your-cert.pem in the INI.

    For Linux systems, you can download the cacert.pem file from the curl official website, or you can use the certificate file that comes with the system. For the certificate locations of different distros, please refer to Golang docs.

    INI configuration openssl.cafile cannot be set dynamically using the ini_set() function, because openssl.cafile is a PHP_INI_SYSTEM type configuration and can only be set in the php.ini file.

    Why don't we support older versions of PHP?

    Because older versions of PHP have many problems, such as security issues, performance issues, and functional issues. In addition, many older versions of PHP are not compatible with the latest dependency libraries, which is one of the reasons why older versions of PHP are not supported.

    You can use older versions compiled earlier by static-php-cli, such as PHP 8.0, but earlier versions will not be explicitly supported.

    Released under the MIT License.

    - +buildroot/bin/php -d "zend_extension=/path/to/php{PHP_VER}-{ts/nts}/xdebug.so" --ri xdebug

    For macOS platform, almost all binaries under macOS cannot be truly purely statically linked, and almost all binaries will link macOS system libraries: /usr/lib/libresolv.9.dylib and /usr/lib/libSystem.B.dylib. So on macOS, you can directly use SPC to build statically compiled PHP binaries with dynamically linked extensions:

    1. Build shared extension xxx.so using: --build-shared=XXX option. e.g. bin/spc build bcmath,zlib --build-shared=xdebug --build-cli
    2. You will get buildroot/modules/xdebug.so and buildroot/bin/php.
    3. The xdebug.so file could be used for php that version and thread-safe are the same.

    Can it support Oracle database extension?

    Some extensions that rely on closed source libraries, such as oci8, sourceguardian, etc., they do not provide purely statically compiled dependent library files (.a), only dynamic dependent library files (.so). These extensions cannot be compiled into static-php-cli using source code, so this project may never support these extensions. However, in theory you can access and use such extensions under macOS and Linux according to the above questions.

    If you have a need for such extensions, or most people have needs for these closed-source extensions, see the discussion on standalone-php-cli. Welcome to leave a message.

    Does it support Windows?

    The project currently supports Windows, but the number of supported extensions is small. Windows support is not perfect. There are mainly the following problems:

    1. The compilation process of Windows is different from that of *nix, and the toolchain used is also different. The compilation tools used to compile the dependent libraries of each extension are almost completely different.
    2. The demand for the Windows version will also be advanced based on the needs of all people who use this project. If many people need it, I will support related extensions as soon as possible.

    Can I protect my source code with micro?

    You can't. micro.sfx is essentially combining php and php code into one file, there is no process of compiling or encrypting the PHP code.

    First of all, php-src is the official interpreter of PHP code, and there is no PHP compiler compatible with mainstream branches on the market. I saw on the Internet that there is a project called BPC (Binary PHP Compiler?) that can compile PHP into binary, but there are many restrictions.

    The direction of encrypting and protecting the code is not the same as compiling. After compiling, the code can also be obtained through reverse engineering and other methods. The real protection is still carried out by means of packing and encrypting the code.

    Therefore, this project (static-php-cli) and related projects (lwmbs, swoole-cli) all provide a convenient compilation tool for php-src source code. The phpmicro referenced by this project and related projects is only a package of PHP's sapi interface, not a compilation tool for PHP code. The compiler for PHP code is a completely different project, so the extra cases are not taken into account. If you are interested in encryption, you can consider using existing encryption technologies, such as Swoole Compiler, Source Guardian, etc.

    Unable to use ssl

    Update: This issue has been fixed in the latest version of static-php-cli, which now reads the system's certificate file by default. If you still have problems, try the solution below.

    When using curl, pgsql, etc. to request an HTTPS website or establish an SSL connection, there may be an error:80000002:system library::No such file or directory error. This error is caused by statically compiled PHP without specifying openssl.cafile via php.ini.

    You can solve this problem by specifying php.ini before using PHP and adding openssl.cafile=/path/to/your-cert.pem in the INI.

    For Linux systems, you can download the cacert.pem file from the curl official website, or you can use the certificate file that comes with the system. For the certificate locations of different distros, please refer to Golang docs.

    INI configuration openssl.cafile cannot be set dynamically using the ini_set() function, because openssl.cafile is a PHP_INI_SYSTEM type configuration and can only be set in the php.ini file.

    Why don't we support older versions of PHP?

    Because older versions of PHP have many problems, such as security issues, performance issues, and functional issues. In addition, many older versions of PHP are not compatible with the latest dependency libraries, which is one of the reasons why older versions of PHP are not supported.

    You can use older versions compiled earlier by static-php-cli, such as PHP 8.0, but earlier versions will not be explicitly supported.

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/guide/action-build.html b/en/guide/action-build.html index 70c67675..54ce9bbf 100644 --- a/en/guide/action-build.html +++ b/en/guide/action-build.html @@ -5,21 +5,21 @@ GitHub Action Build | static-php-cli - - + + - + - - - + + + -
    Skip to content

    GitHub Action Build

    Action Build refers to compiling directly using GitHub Action.

    If you don't want to compile it yourself, you can download the artifact from the existing Action in this project, or you can download it from a self-hosted server:Enter.

    Self-hosted binaries are also built from Actions: repo. The extensions included are: bcmath,bz2,calendar,ctype,curl,dom,exif,fileinfo,filter,ftp,gd,gmp,iconv,xml,mbstring,mbregex,mysqlnd,openssl, pcntl,pdo,pdo_mysql,pdo_sqlite,phar,posix,redis,session,simplexml,soap,sockets,sqlite3,tokenizer,xmlwriter,xmlreader,zlib,zip

    Build Guide

    Using GitHub Action makes it easy to build a statically compiled PHP and phpmicro, while also defining the extensions to compile.

    1. Fork project.
    2. Go to the Actions of the project and select CI.
    3. Select Run workflow, fill in the PHP version you want to compile, the target type, and the list of extensions. (extensions comma separated, e.g. bcmath,curl,mbstring)
    4. After waiting for about a period of time, enter the corresponding task and get Artifacts.

    If you enable debug, all logs will be output at build time, including compiled logs, for troubleshooting.

    If you need to build in other environments, you can use manual build.

    Extensions

    You can go to extensions check here to see if all the extensions you need currently support. and then go to command generator select the extension you need to compile, copy the extensions string to extensions option.

    Released under the MIT License.

    - +
    Skip to content

    GitHub Action Build

    Action Build refers to compiling directly using GitHub Action.

    If you don't want to compile it yourself, you can download the artifact from the existing Action in this project, or you can download it from a self-hosted server:Enter.

    Self-hosted binaries are also built from Actions: repo. The extensions included are: bcmath,bz2,calendar,ctype,curl,dom,exif,fileinfo,filter,ftp,gd,gmp,iconv,xml,mbstring,mbregex,mysqlnd,openssl, pcntl,pdo,pdo_mysql,pdo_sqlite,phar,posix,redis,session,simplexml,soap,sockets,sqlite3,tokenizer,xmlwriter,xmlreader,zlib,zip

    Build Guide

    Using GitHub Action makes it easy to build a statically compiled PHP and phpmicro, while also defining the extensions to compile.

    1. Fork project.
    2. Go to the Actions of the project and select CI.
    3. Select Run workflow, fill in the PHP version you want to compile, the target type, and the list of extensions. (extensions comma separated, e.g. bcmath,curl,mbstring)
    4. After waiting for about a period of time, enter the corresponding task and get Artifacts.

    If you enable debug, all logs will be output at build time, including compiled logs, for troubleshooting.

    If you need to build in other environments, you can use manual build.

    Extensions

    You can go to extensions check here to see if all the extensions you need currently support. and then go to command generator select the extension you need to compile, copy the extensions string to extensions option.

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/guide/build-on-windows.html b/en/guide/build-on-windows.html index 4d8e0d21..93d29f38 100644 --- a/en/guide/build-on-windows.html +++ b/en/guide/build-on-windows.html @@ -5,20 +5,20 @@ Build on Windows | static-php-cli - - + + - + - - - + + + -
    Skip to content

    Build on Windows

    Because the Windows system is an NT kernel, the compilation tools and operating system interfaces used by Unix-like operating systems are almost completely different, so the build process on Windows will be slightly different from that of Unix systems.

    GitHub Actions Build

    Building the Windows version of static-php from Actions is now supported. Like Linux and macOS, you need to Fork the static-php-cli repository to your GitHub account first, then you can enter Extension List to select the extension to be compiled, and then go to your own CI on Windows select the PHP version, fill in the extension list (comma separated), and click Run.

    If you're going to develop or build locally, please read on.

    Requirements

    The tools required to build static PHP on Windows are the same as PHP's official Windows build tools. You can read Official Documentation.

    To sum up, you need the following environment and tools:

    • Windows 10/11 (requires build 17063 or later)
    • Visual Studio 2019/2022 (recommended 2022)
    • C++ desktop development for Visual Studio
    • Git for Windows
    • php-sdk-binary-tools (can be installed automatically using doctor)
    • strawberry-perl (can be installed automatically using doctor)
    • nasm (can be installed automatically using doctor)

    TIP

    The construction of static-php-cli on Windows refers to using MSVC to build PHP and is not based on MinGW, Cygwin, WSL and other environments.

    If you prefer to use WSL, please refer to the chapter on Building on Linux.

    After installing Visual Studio and selecting the C++ desktop development workload, you may download about 8GB of compilation tools, and the download speed depends on your network conditions.

    Install Git

    Git for Windows can be downloaded and installed from here Standalone Installer 64-bit version, installed in the default location (C:\Program Files\Git\). If you don't want to download and install manually, you can also use Visual Studio Installer and check Git in the Individual component tab.

    Prepare static-php-cli

    Downloading the static-php-cli project is very simple, just use git clone. It is recommended to place the project in C:\spc-build\ or a similar directory. It is best not to have spaces in the path.

    shell
    mkdir "C:\spc-build"
    +    
    Skip to content

    Build on Windows

    Because the Windows system is an NT kernel, the compilation tools and operating system interfaces used by Unix-like operating systems are almost completely different, so the build process on Windows will be slightly different from that of Unix systems.

    GitHub Actions Build

    Building the Windows version of static-php from Actions is now supported. Like Linux and macOS, you need to Fork the static-php-cli repository to your GitHub account first, then you can enter Extension List to select the extension to be compiled, and then go to your own CI on Windows select the PHP version, fill in the extension list (comma separated), and click Run.

    If you're going to develop or build locally, please read on.

    Requirements

    The tools required to build static PHP on Windows are the same as PHP's official Windows build tools. You can read Official Documentation.

    To sum up, you need the following environment and tools:

    • Windows 10/11 (requires build 17063 or later)
    • Visual Studio 2019/2022 (recommended 2022)
    • C++ desktop development for Visual Studio
    • Git for Windows
    • php-sdk-binary-tools (can be installed automatically using doctor)
    • strawberry-perl (can be installed automatically using doctor)
    • nasm (can be installed automatically using doctor)

    TIP

    The construction of static-php-cli on Windows refers to using MSVC to build PHP and is not based on MinGW, Cygwin, WSL and other environments.

    If you prefer to use WSL, please refer to the chapter on Building on Linux.

    After installing Visual Studio and selecting the C++ desktop development workload, you may download about 8GB of compilation tools, and the download speed depends on your network conditions.

    Install Git

    Git for Windows can be downloaded and installed from here Standalone Installer 64-bit version, installed in the default location (C:\Program Files\Git\). If you don't want to download and install manually, you can also use Visual Studio Installer and check Git in the Individual component tab.

    Prepare static-php-cli

    Downloading the static-php-cli project is very simple, just use git clone. It is recommended to place the project in C:\spc-build\ or a similar directory. It is best not to have spaces in the path.

    shell
    mkdir "C:\spc-build"
     cd C:\spc-build
     git clone https://github.com/crazywhalecc/static-php-cli.git
     cd static-php-cli

    It is a bit strange that static-php-cli itself requires a PHP environment, but now you can quickly install the PHP environment through a script. Generally, your computer will not have the Windows version of PHP installed, so we recommend that you use bin/setup-runtime directly after downloading static-php-cli to install PHP and Composer in the current directory.

    shell
    # Install PHP and Composer to the ./runtime/ directory
    @@ -40,8 +40,8 @@
     my-app.exe

    Use php.exe

    After php.exe is compiled, it is located in the buildroot\bin\ directory. You can copy it to any location for use.

    shell
    .\php -v

    Use micro.sfx

    phpmicro is a SelF-extracted eXecutable SAPI module, provided by phpmicro project. But this project is using a fork of phpmicro, because we need to add some features to it. It can put php runtime and your source code together.

    The final compilation result will output a file named ./micro.sfx, which needs to be used with your PHP source code like code.php. This file will be located in the path buildroot/bin/micro.sfx.

    Prepare your project source code, which can be a single PHP file or a Phar file, for use.

    If you want to combine phar files, you must add phar extension when compiling!

    shell
    # code.php "<?php echo 'Hello world' . PHP_EOL;"
     bin/spc micro:combine code.php -O my-app.exe
     # Run it!!! Copy it to another computer!!!
    -./my-app.exe

    If you package a PHAR file, just replace code.php with the phar file path. You can use box-project/box to package your CLI project as Phar, It is then combined with phpmicro to produce a standalone executable binary.

    For more details on the micro:combine command, refer to command on Unix systems.

    Released under the MIT License.

    - +./my-app.exe

    If you package a PHAR file, just replace code.php with the phar file path. You can use box-project/box to package your CLI project as Phar, It is then combined with phpmicro to produce a standalone executable binary.

    For more details on the micro:combine command, refer to command on Unix systems.

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/guide/build-with-glibc.html b/en/guide/build-with-glibc.html index b81719a2..41309890 100644 --- a/en/guide/build-with-glibc.html +++ b/en/guide/build-with-glibc.html @@ -5,21 +5,21 @@ Build glibc Compatible Linux Binary | static-php-cli - - + + - + - - - + + + -
    Skip to content

    Build glibc Compatible Linux Binary

    Why Build glibc Compatible Binary

    Currently, the binaries built by static-php-cli on Linux by default are based on musl-libc (statically linked). musl-libc is a lightweight libc implementation that aims to be compatible with glibc and provides good support for pure static linking. This means that the compiled static PHP executable can be used on almost any Linux distribution without worrying about the versions of libc, libstdc++, etc.

    However, there are some issues with pure static linking of musl-libc binaries on Linux:

    • The dl() function in PHP cannot be used to load dynamic libraries and external PHP extensions.
    • The FFI extension in PHP cannot be used.
    • In some extreme cases, performance issues may occur. See musl-libc performance issues.

    Different Linux distributions use different default libc. For example, Alpine Linux uses musl libc, while most Linux distributions use glibc. However, even so, we cannot directly use any distribution using glibc to build portable static binaries because glibc has some issues:

    • Binaries built with gcc and other tools on newer versions of distributions cannot run on older versions of distributions.
    • glibc is not recommended to be statically linked because some of its features require the support of dynamic libraries.

    However, we can use Docker to solve this problem. The final output is a binary dynamically linked with glibc and some necessary libraries, but statically linked with all other dependencies.

    1. Use an older version of a Linux distribution (such as CentOS 7.x), which has an older version of glibc but can run on most modern Linux distributions.
    2. Build the static binary of PHP in this container so that it can run on most modern Linux distributions.

    Using glibc static binaries can run on most modern Linux distributions but cannot run on musl libc distributions, such as CentOS 6, Alpine Linux, etc.

    Build glibc Compatible Linux Binary

    The latest version of static-php-cli includes the bin/spc-gnu-docker script, which can create a CentOS 7.x (glibc-2.17) Docker container with one click and build a glibc compatible PHP static binary in the container.

    Then, run the following command once. The first run will take a long time because it needs to download the CentOS 7.x image and some build tools.

    bash
    bin/spc-gnu-docker

    After the image is built, you will see the same command help menu as bin/spc, which means the container is ready.

    After the container is ready, you can refer to the local build section to build your PHP static binary. Just replace bin/spc or ./spc with bin/spc-gnu-docker.

    bash
    bin/spc-gnu-docker build bcmath,ctype,openssl,pdo,phar,posix,session,tokenizer,xml,zip --build-cli --debug

    Notes

    In rare cases, glibc-based static PHP may encounter segment faults and other errors, but there are currently few examples. If you encounter any issues, please submit an issue.

    glibc build is an extended feature and is not part of the default static-php support. If you have related issues or requirements, please indicate that you are building based on glibc when submitting an issue.

    If you need to build glibc-based binaries without using Docker, please refer to the bin/spc-gnu-docker script to manually create a similar environment.

    Please keep in mind that we only support glibc build with bin/spc-gnu-docker. Compilation on RHEL 9 & 10 has been tested and is stable, but if you run into issues, we may choose not to fix them.

    Released under the MIT License.

    - +
    Skip to content

    Build glibc Compatible Linux Binary

    Why Build glibc Compatible Binary

    Currently, the binaries built by static-php-cli on Linux by default are based on musl-libc (statically linked). musl-libc is a lightweight libc implementation that aims to be compatible with glibc and provides good support for pure static linking. This means that the compiled static PHP executable can be used on almost any Linux distribution without worrying about the versions of libc, libstdc++, etc.

    However, there are some issues with pure static linking of musl-libc binaries on Linux:

    • The dl() function in PHP cannot be used to load dynamic libraries and external PHP extensions.
    • The FFI extension in PHP cannot be used.
    • In some extreme cases, performance issues may occur. See musl-libc performance issues.

    Different Linux distributions use different default libc. For example, Alpine Linux uses musl libc, while most Linux distributions use glibc. However, even so, we cannot directly use any distribution using glibc to build portable static binaries because glibc has some issues:

    • Binaries built with gcc and other tools on newer versions of distributions cannot run on older versions of distributions.
    • glibc is not recommended to be statically linked because some of its features require the support of dynamic libraries.

    However, we can use Docker to solve this problem. The final output is a binary dynamically linked with glibc and some necessary libraries, but statically linked with all other dependencies.

    1. Use an older version of a Linux distribution (such as CentOS 7.x), which has an older version of glibc but can run on most modern Linux distributions.
    2. Build the static binary of PHP in this container so that it can run on most modern Linux distributions.

    Using glibc static binaries can run on most modern Linux distributions but cannot run on musl libc distributions, such as CentOS 6, Alpine Linux, etc.

    Build glibc Compatible Linux Binary

    The latest version of static-php-cli includes the bin/spc-gnu-docker script, which can create a CentOS 7.x (glibc-2.17) Docker container with one click and build a glibc compatible PHP static binary in the container.

    Then, run the following command once. The first run will take a long time because it needs to download the CentOS 7.x image and some build tools.

    bash
    bin/spc-gnu-docker

    After the image is built, you will see the same command help menu as bin/spc, which means the container is ready.

    After the container is ready, you can refer to the local build section to build your PHP static binary. Just replace bin/spc or ./spc with bin/spc-gnu-docker.

    bash
    bin/spc-gnu-docker build bcmath,ctype,openssl,pdo,phar,posix,session,tokenizer,xml,zip --build-cli --debug

    Notes

    In rare cases, glibc-based static PHP may encounter segment faults and other errors, but there are currently few examples. If you encounter any issues, please submit an issue.

    glibc build is an extended feature and is not part of the default static-php support. If you have related issues or requirements, please indicate that you are building based on glibc when submitting an issue.

    If you need to build glibc-based binaries without using Docker, please refer to the bin/spc-gnu-docker script to manually create a similar environment.

    Please keep in mind that we only support glibc build with bin/spc-gnu-docker. Compilation on RHEL 9 & 10 has been tested and is stable, but if you run into issues, we may choose not to fix them.

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/guide/cli-generator.html b/en/guide/cli-generator.html index 63852d44..8a5408f4 100644 --- a/en/guide/cli-generator.html +++ b/en/guide/cli-generator.html @@ -5,27 +5,27 @@ CLI Build Command Generator | static-php-cli - - + + - + - - - - + + + + -
    Skip to content

    CLI Build Command Generator

    TIP

    The extensions selected below may contain extensions that are not supported by the selected operating system, which may cause compilation to fail. Please check Supported Extensions first.

    Select Build OS

    Select Extensions


    Select common extensions
    Select all
    Unselect all
    Select Dependencies

    TIP

    After selecting the extensions, the unselectable items are essential dependencies. In the compiled dependencies list, optional dependencies consist of existing extensions and optional dependencies of libraries. Optional dependencies will be added in --with-libs parameter.

    It is not possible to build all extensions at the same time, as some extensions conflict with each other. Please select the extensions you need.

    Build Target

    Build Options

    Build Environment
    Download PHP version
    Enable debug message
    Enable ZTS
    Download with corresponding extension dependencies
    Download pre-built dependencies if possible (reduce compile time)
    Enable UPX compression (reduce binary size)

    Hardcoded INI options

    Result

    Download spc binary command
    curl -fsSL -o spc.tgz https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-x86_64.tar.gz && tar -zxvf spc.tgz && rm spc.tgz
    Download sources by extensions command
    ./spc download --with-php=8.4 --for-extensions "" --prefer-pre-built
    Auto-check and prepare build environment command
    ./spc doctor --auto-fix
    Compile command
    ./spc build --build-cli ""
    craft.yml
    php-version: 8.4 +
    Skip to content

    CLI Build Command Generator

    TIP

    The extensions selected below may contain extensions that are not supported by the selected operating system, which may cause compilation to fail. Please check Supported Extensions first.

    Select Build OS

    Select Extensions


    Select common extensions
    Select all
    Unselect all
    Select Dependencies

    TIP

    After selecting the extensions, the unselectable items are essential dependencies. In the compiled dependencies list, optional dependencies consist of existing extensions and optional dependencies of libraries. Optional dependencies will be added in --with-libs parameter.

    It is not possible to build all extensions at the same time, as some extensions conflict with each other. Please select the extensions you need.

    Build Target

    Build Options

    Build Environment
    Download PHP version
    Enable debug message
    Enable ZTS
    Download with corresponding extension dependencies
    Download pre-built dependencies if possible (reduce compile time)
    Enable UPX compression (reduce binary size)

    Hardcoded INI options

    Result

    Download spc binary command
    curl -fsSL -o spc.tgz https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-x86_64.tar.gz && tar -zxvf spc.tgz && rm spc.tgz
    Download sources by extensions command
    ./spc download --with-php=8.4 --for-extensions "" --prefer-pre-built
    Auto-check and prepare build environment command
    ./spc doctor --auto-fix
    Compile command
    ./spc build --build-cli ""
    craft.yml
    php-version: 8.4 extensions: "" sapi: cli build-options: prefer-pre-built: true -

    Released under the MIT License.

    - +

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/guide/deps-map.html b/en/guide/deps-map.html index b9364b9b..e5f744f3 100644 --- a/en/guide/deps-map.html +++ b/en/guide/deps-map.html @@ -5,21 +5,21 @@ Dependency Table | static-php-cli - - + + - + - - - + + + -
    Skip to content

    Dependency Table

    When compiling PHP, each extension and library has dependencies, which may be required or optional. You can choose whether to include these optional dependencies.

    For example, when compiling the gd extension under Linux, the zlib,libpng libraries and the zlib extension are forced to be compiled, while the libavif,libwebp,libjpeg,freetype libraries are optional libraries and will not be compiled by default unless specified by the --with-libs=avif,webp,jpeg,freetype option.

    • For optional extensions (optional features of extensions), you need to specify them manually at compile time, for example, to enable igbinary support for Redis: bin/spc build redis,igbinary.
    • For optional libraries, you need to compile and specify them through the --with-libs=XXX option.
    • If you want to enable all optional extensions, you can use bin/spc build redis --with-suggested-exts.
    • If you want to enable all optional libraries, you can use --with-suggested-libs.

    Extension Dependency Table

    Linux

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvpcntlunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    liburing
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    macOS

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    glfwglfw
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    Windows

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqpopenssllibrabbitmq
    brotlibrotli
    bz2bzip2
    curlzlib
    openssl
    curl
    dbaqdbm
    domxmllibxml2
    zlib
    evsockets
    ffilibffi-win
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gmsslgmssl
    iconvlibiconv-win
    igbinarysession
    apcu
    intlicu-static-win
    libxmlxml
    mbregexmbstringonig
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    parallelpthreads4w
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    pdo_pgsqlpdo
    pgsql
    postgresql-win
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql-win
    pharzlib
    redissession
    igbinary
    msgpack
    simplexmlxmllibxml2
    soapxmllibxml2
    sodiumlibsodium
    sqlite3sqlite
    ssh2openssl
    zlib
    libssh2
    swowopenssl
    curl
    openssl
    curl
    xlswriterzlib
    zip
    openssl
    xmliconvlibxml2
    xmlreaderxml
    dom
    libxml2
    xmlwriterxmllibxml2
    xzxz
    yamllibyaml
    zipzlib
    bz2
    libzip
    zlib
    bzip2
    xz
    zlibzlib

    FreeBSD

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    evsockets
    ftpopenssl
    mbregexmbstringonig
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    pdo_mysqlpdo
    mysqlnd
    pharzlib
    xzxz
    zlibzlib

    Library Dependency Table

    Linux

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libaclattr
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    macOS

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    Windows

    Library NameRequired LibrariesSuggested Libraries
    curlzlib
    libssh2
    nghttp2
    brotli
    zstd
    freetypezliblibpng
    bzip2
    brotli
    libjpegzlib
    libpngzlib
    librabbitmqopenssl
    libssh2openssl
    libxml2libiconv-winzlib
    libzipzlib
    bzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib

    FreeBSD

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    opensslzlib

    Released under the MIT License.

    - +
    Skip to content

    Dependency Table

    When compiling PHP, each extension and library has dependencies, which may be required or optional. You can choose whether to include these optional dependencies.

    For example, when compiling the gd extension under Linux, the zlib,libpng libraries and the zlib extension are forced to be compiled, while the libavif,libwebp,libjpeg,freetype libraries are optional libraries and will not be compiled by default unless specified by the --with-libs=avif,webp,jpeg,freetype option.

    • For optional extensions (optional features of extensions), you need to specify them manually at compile time, for example, to enable igbinary support for Redis: bin/spc build redis,igbinary.
    • For optional libraries, you need to compile and specify them through the --with-libs=XXX option.
    • If you want to enable all optional extensions, you can use bin/spc build redis --with-suggested-exts.
    • If you want to enable all optional libraries, you can use --with-suggested-libs.

    Extension Dependency Table

    Linux

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvpcntlunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    liburing
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    macOS

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    glfwglfw
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    Windows

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqpopenssllibrabbitmq
    brotlibrotli
    bz2bzip2
    curlzlib
    openssl
    curl
    dbaqdbm
    domxmllibxml2
    zlib
    evsockets
    ffilibffi-win
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gmsslgmssl
    iconvlibiconv-win
    igbinarysession
    apcu
    intlicu-static-win
    libxmlxml
    mbregexmbstringonig
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    parallelpthreads4w
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    pdo_pgsqlpdo
    pgsql
    postgresql-win
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql-win
    pharzlib
    redissession
    igbinary
    msgpack
    simplexmlxmllibxml2
    soapxmllibxml2
    sodiumlibsodium
    sqlite3sqlite
    ssh2openssl
    zlib
    libssh2
    swowopenssl
    curl
    openssl
    curl
    xlswriterzlib
    zip
    openssl
    xmliconvlibxml2
    xmlreaderxml
    dom
    libxml2
    xmlwriterxmllibxml2
    xzxz
    yamllibyaml
    zipzlib
    bz2
    libzip
    zlib
    bzip2
    xz
    zlibzlib

    FreeBSD

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    evsockets
    ftpopenssl
    mbregexmbstringonig
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    pdo_mysqlpdo
    mysqlnd
    pharzlib
    xzxz
    zlibzlib

    Library Dependency Table

    Linux

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libaclattr
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    macOS

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    Windows

    Library NameRequired LibrariesSuggested Libraries
    curlzlib
    libssh2
    nghttp2
    brotli
    zstd
    freetypezliblibpng
    bzip2
    brotli
    libjpegzlib
    libpngzlib
    librabbitmqopenssl
    libssh2openssl
    libxml2libiconv-winzlib
    libzipzlib
    bzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib

    FreeBSD

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    opensslzlib

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/guide/env-vars.html b/en/guide/env-vars.html index 871b5266..37d4b039 100644 --- a/en/guide/env-vars.html +++ b/en/guide/env-vars.html @@ -5,20 +5,20 @@ Environment variables | static-php-cli - - + + - + - - - + + + -
    Skip to content

    Environment variables

    All environment variables mentioned in the list on this page have default values unless otherwise noted. You can override the default values by setting these environment variables.

    Environment variables list

    Starting from version 2.3.5, we have centralized the environment variables in the config/env.ini file. You can set environment variables by modifying this file.

    We divide the environment variables supported by static-php-cli into three types:

    • Global internal environment variables: declared after static-php-cli starts, you can use getenv() to get them internally in static-php-cli, and you can override them before starting static-php-cli.
    • Fixed environment variables: declared after static-php-cli starts, you can only use getenv() to get them, but you cannot override them through shell scripts.
    • Config file environment variables: declared before static-php-cli build, you can set these environment variables by modifying the config/env.ini file or through shell scripts.

    You can read the comments for each parameter in config/env.ini to understand its purpose.

    Custom environment variables

    Generally, you don't need to modify any of the following environment variables as they are already set to optimal values. However, if you have special needs, you can set these environment variables to meet your needs (for example, you need to debug PHP performance under different compilation parameters).

    If you want to use custom environment variables, you can use the export command in the terminal or set the environment variables directly before the command, for example:

    shell
    # export first
    +    
    Skip to content

    Environment variables

    All environment variables mentioned in the list on this page have default values unless otherwise noted. You can override the default values by setting these environment variables.

    Environment variables list

    Starting from version 2.3.5, we have centralized the environment variables in the config/env.ini file. You can set environment variables by modifying this file.

    We divide the environment variables supported by static-php-cli into three types:

    • Global internal environment variables: declared after static-php-cli starts, you can use getenv() to get them internally in static-php-cli, and you can override them before starting static-php-cli.
    • Fixed environment variables: declared after static-php-cli starts, you can only use getenv() to get them, but you cannot override them through shell scripts.
    • Config file environment variables: declared before static-php-cli build, you can set these environment variables by modifying the config/env.ini file or through shell scripts.

    You can read the comments for each parameter in config/env.ini to understand its purpose.

    Custom environment variables

    Generally, you don't need to modify any of the following environment variables as they are already set to optimal values. However, if you have special needs, you can set these environment variables to meet your needs (for example, you need to debug PHP performance under different compilation parameters).

    If you want to use custom environment variables, you can use the export command in the terminal or set the environment variables directly before the command, for example:

    shell
    # export first
     export SPC_CONCURRENCY=4
     bin/spc build mbstring,pcntl --build-cli
     
    @@ -29,8 +29,8 @@
     SPC_CONCURRENCY=4
     
     [linux]
    -SPC_DEFAULT_C_FLAGS="-O3"

    Library environment variables (Unix only)

    Starting from 2.2.0, static-php-cli supports custom environment variables for all compilation dependent library commands of macOS, Linux, FreeBSD and other Unix systems.

    In this way, you can adjust the behavior of compiling dependent libraries through environment variables at any time. For example, you can set the optimization parameters for compiling the xxx library through xxx_CFLAGS=-O0.

    Of course, not every library supports the injection of environment variables. We currently provide three wildcard environment variables with the suffixes:

    • _CFLAGS: CFLAGS for the compiler
    • _LDFLAGS: LDFLAGS for the linker
    • _LIBS: LIBS for the linker

    The prefix is the name of the dependent library, and the specific name of the library is subject to lib.json. Among them, the library name with - needs to replace - with _.

    Here is an example of an optimization option that replaces the openssl library compilation:

    shell
    openssl_CFLAGS="-O0"

    The library name uses the same name listed in lib.json and is case-sensitive.

    TIP

    When no relevant environment variables are specified, except for the following variables, the remaining values are empty by default:

    var namevar default value
    pkg_config_CFLAGSmacOS: $SPC_DEFAULT_C_FLAGS -Wimplicit-function-declaration -Wno-int-conversion, Other: empty
    pkg_config_LDFLAGSLinux: --static, Other: empty
    imagemagick_LDFLAGSLinux: -static, Other: empty
    imagemagick_LIBSmacOS: -liconv, Other: empty
    ldap_LDFLAGS-L$BUILD_LIB_PATH
    openssl_CFLAGSLinux: $SPC_DEFAULT_C_FLAGS, Other: empty
    others...empty

    The following table is a list of library names that support customizing the above three variables:

    lib name
    brotli
    bzip
    curl
    freetype
    gettext
    gmp
    imagemagick
    ldap
    libargon2
    libavif
    libcares
    libevent
    openssl

    TIP

    Because adapting custom environment variables to each library is a particularly tedious task, and in most cases you do not need custom environment variables for these libraries, so we currently only support custom environment variables for some libraries.

    If the library you need to customize environment variables is not listed above, you can submit your request through GitHub Issue.

    Released under the MIT License.

    - +SPC_DEFAULT_C_FLAGS="-O3"

    Library environment variables (Unix only)

    Starting from 2.2.0, static-php-cli supports custom environment variables for all compilation dependent library commands of macOS, Linux, FreeBSD and other Unix systems.

    In this way, you can adjust the behavior of compiling dependent libraries through environment variables at any time. For example, you can set the optimization parameters for compiling the xxx library through xxx_CFLAGS=-O0.

    Of course, not every library supports the injection of environment variables. We currently provide three wildcard environment variables with the suffixes:

    • _CFLAGS: CFLAGS for the compiler
    • _LDFLAGS: LDFLAGS for the linker
    • _LIBS: LIBS for the linker

    The prefix is the name of the dependent library, and the specific name of the library is subject to lib.json. Among them, the library name with - needs to replace - with _.

    Here is an example of an optimization option that replaces the openssl library compilation:

    shell
    openssl_CFLAGS="-O0"

    The library name uses the same name listed in lib.json and is case-sensitive.

    TIP

    When no relevant environment variables are specified, except for the following variables, the remaining values are empty by default:

    var namevar default value
    pkg_config_CFLAGSmacOS: $SPC_DEFAULT_C_FLAGS -Wimplicit-function-declaration -Wno-int-conversion, Other: empty
    pkg_config_LDFLAGSLinux: --static, Other: empty
    imagemagick_LDFLAGSLinux: -static, Other: empty
    imagemagick_LIBSmacOS: -liconv, Other: empty
    ldap_LDFLAGS-L$BUILD_LIB_PATH
    openssl_CFLAGSLinux: $SPC_DEFAULT_C_FLAGS, Other: empty
    others...empty

    The following table is a list of library names that support customizing the above three variables:

    lib name
    brotli
    bzip
    curl
    freetype
    gettext
    gmp
    imagemagick
    ldap
    libargon2
    libavif
    libcares
    libevent
    openssl

    TIP

    Because adapting custom environment variables to each library is a particularly tedious task, and in most cases you do not need custom environment variables for these libraries, so we currently only support custom environment variables for some libraries.

    If the library you need to customize environment variables is not listed above, you can submit your request through GitHub Issue.

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/guide/extension-notes.html b/en/guide/extension-notes.html index 0523d782..bb409469 100644 --- a/en/guide/extension-notes.html +++ b/en/guide/extension-notes.html @@ -5,21 +5,21 @@ Extension Notes | static-php-cli - - + + - + - - - + + + -
    Skip to content

    Extension Notes

    Because it is a static compilation, extensions will not compile 100% perfectly, and different extensions have different requirements for PHP and the environment, which will be listed one by one here.

    curl

    HTTP3 support is not enabled by default, compile with --with-libs="nghttp2,nghttp3,ngtcp2" to enable HTTP3 support for PHP >= 8.4.

    When using curl to request HTTPS, there may be an error:80000002:system library::No such file or directory error. For details on the solution, see FAQ - Unable to use ssl.

    phpmicro

    1. Only PHP >= 8.0 is supported.

    swoole

    1. swoole >= 5.0 Only PHP >= 8.0 is supported.
    2. swoole Currently, curl hooks are not supported for PHP 8.0.x (which may be fixed in the future).
    3. When compiling, if only swoole extension is included, the supported Swoole database coroutine hook will not be fully enabled. If you need to use it, please add the corresponding swoole-hook-xxx extension.
    4. The zend_mm_heap corrupted problem may occur in swoole under some extension combinations. The cause has not yet been found.

    swoole-hook-pgsql

    swoole-hook-pgsql is not an extension, it's a Hook feature of Swoole. If you use swoole,swoole-hook-pgsql, you will enable Swoole's PostgreSQL client and the coroutine mode of the pdo_pgsql extension.

    swoole-hook-pgsql conflicts with the pdo_pgsql extension. If you want to use Swoole and pdo_pgsql, please delete the pdo_pgsql extension and enable swoole and swoole-hook-pgsql. This extension contains an implementation of the coroutine environment for pdo_pgsql.

    On macOS systems, pdo_pgsql may not be able to connect to the postgresql server normally, please use it with caution.

    swoole-hook-mysql

    swoole-hook-mysql is not an extension, it's a Hook feature of Swoole. If you use swoole,swoole-hook-mysql, you will enable the coroutine mode of Swoole's mysqlnd and pdo_mysql.

    swoole-hook-sqlite

    swoole-hook-sqlite is not an extension, it's a Hook feature of Swoole. If you use swoole,swoole-hook-sqlite, you will enable the coroutine mode of Swoole's pdo_sqlite (Swoole must be 5.1 or above).

    swoole-hook-sqlite conflicts with the pdo_sqlite extension. If you want to use Swoole and pdo_sqlite, please delete the pdo_sqlite extension and enable swoole and swoole-hook-sqlite. This extension contains an implementation of the coroutine environment for pdo_sqlite.

    swoole-hook-odbc

    swoole-hook-odbc is not an extension, it's a Hook feature of Swoole. If you use swoole,swoole-hook-odbc, you will enable the coroutine mode of Swoole's odbc extension.

    swoole-hook-odbc conflicts with the pdo_odbc extension. If you want to use Swoole and pdo_odbc, please delete the pdo_odbc extension and enable swoole and swoole-hook-odbc. This extension contains an implementation of the coroutine environment for pdo_odbc.

    swow

    1. Only PHP 8.0+ is supported.

    imagick

    1. OpenMP support is disabled, this is recommended by the maintainers and also the case system packages.

    imap

    1. Kerberos is not supported
    2. ext-imap is not thread safe due to the underlying c-client. It's not possible to use it in --enable-zts builds.
    3. The extension was dropped from php 8.4, we recommend you look for an alternative implementation, such as Webklex/php-imap

    gd

    1. gd Extension relies on more additional Graphics library. By default, using bin/spc build gd directly will not support some Graphics library, such as libjpeg, libavif, etc. Currently, it supports four libraries: freetype,libjpeg,libavif,libwebp. Therefore, the following command can be used to introduce them into the gd library:
    bash
    bin/spc build gd --with-libs=freetype,libjpeg,libavif,libwebp --build-cli

    mcrypt

    1. Currently not supported, and this extension will not be supported in the future. #32

    oci8

    1. oci8 is an extension of the Oracle database, because the library on which the extension provided by Oracle does not provide a statically compiled version (.a) or source code, and this extension cannot be compiled into php by static linking, so it cannot be supported.

    xdebug

    1. Xdebug is only buildable as a shared extension. On Linux, you'll need to use a SPC_TARGET like native-native -dynamic or native-native-gnu.
    2. When using Linux/glibc or macOS, you can compile Xdebug as a shared extension using --build-shared="xdebug". The compiled ./php binary can be configured and run by specifying the INI, eg ./php -d 'zend_extension=/path/to/xdebug.so' your-code.php.

    xml

    1. xml includes xml, xmlreader, xmlwriter, xsl, dom, simplexml, etc. When adding xml extensions, it is best to enable these extensions at the same time.
    2. libxml is included in xml extension. Enabling xml is equivalent to enabling libxml.

    glfw

    1. glfw depends on OpenGL, and linux environment also needs X11, which cannot be linked statically.
    2. macOS platform, we can compile and link system builtin OpenGL and related libraries dynamically.

    rar

    1. The rar extension currently has a problem when compiling phpmicro with the common extension collection in the macOS x86_64 environment.

    pgsql

    pgsql ssl connection is not compatible with openssl 3.2.0. See:

    pgsql 16.2 has fixed this bug, now it's working.

    When pgsql uses SSL connection, there may be error:80000002:system library::No such file or directory error, For details on the solution, see FAQ - Unable to use ssl.

    openssl

    When using openssl-based extensions (such as curl, pgsql and other network libraries), there may be an error:80000002:system library::No such file or directory error. For details on the solution, see FAQ - Unable to use ssl.

    password-argon2

    1. password-argon2 is not a standard extension. The algorithm PASSWORD_ARGON2ID for the password_hash function needs libsodium or libargon2 to work.
    2. using password-argon2 enables multithread support for this.

    ffi

    1. Due to the limitation of musl libc's static linkage, you cannot use ffi because dynamic libraries cannot be loaded. If you need to use the ffi extension, see Compile PHP with GNU libc.
    2. macOS supports the ffi extension, but errors will occur when some kernels do not contain debugging symbols.
    3. Windows x64 supports the ffi extension.

    xhprof

    The xhprof extension consists of three parts: xhprof_extension, xhprof_html, xhprof_libs. Only xhprof_extension is included in the compiled binary. If you need to use xhprof, please download the source code from pecl.php.net/package/xhprof and specify the xhprof_libs and xhprof_html paths for use.

    event

    If you enable event extension on macOS, the openpty will be disabled due to issue:

    parallel

    Parallel is only supported on PHP 8.0 ZTS and above.

    spx

    1. SPX does not support Windows, and the official repository does not support static compilation. static-php-cli uses a modified version.

    mimalloc

    1. This is not technically an extension, but a library.
    2. Building with --with-libs="mimalloc" on Linux or macOS will override the default allocator.
    3. This is experimental for now, but is recommended in threaded environments.

    Released under the MIT License.

    - +
    Skip to content

    Extension Notes

    Because it is a static compilation, extensions will not compile 100% perfectly, and different extensions have different requirements for PHP and the environment, which will be listed one by one here.

    curl

    HTTP3 support is not enabled by default, compile with --with-libs="nghttp2,nghttp3,ngtcp2" to enable HTTP3 support for PHP >= 8.4.

    When using curl to request HTTPS, there may be an error:80000002:system library::No such file or directory error. For details on the solution, see FAQ - Unable to use ssl.

    phpmicro

    1. Only PHP >= 8.0 is supported.

    swoole

    1. swoole >= 5.0 Only PHP >= 8.0 is supported.
    2. swoole Currently, curl hooks are not supported for PHP 8.0.x (which may be fixed in the future).
    3. When compiling, if only swoole extension is included, the supported Swoole database coroutine hook will not be fully enabled. If you need to use it, please add the corresponding swoole-hook-xxx extension.
    4. The zend_mm_heap corrupted problem may occur in swoole under some extension combinations. The cause has not yet been found.

    swoole-hook-pgsql

    swoole-hook-pgsql is not an extension, it's a Hook feature of Swoole. If you use swoole,swoole-hook-pgsql, you will enable Swoole's PostgreSQL client and the coroutine mode of the pdo_pgsql extension.

    swoole-hook-pgsql conflicts with the pdo_pgsql extension. If you want to use Swoole and pdo_pgsql, please delete the pdo_pgsql extension and enable swoole and swoole-hook-pgsql. This extension contains an implementation of the coroutine environment for pdo_pgsql.

    On macOS systems, pdo_pgsql may not be able to connect to the postgresql server normally, please use it with caution.

    swoole-hook-mysql

    swoole-hook-mysql is not an extension, it's a Hook feature of Swoole. If you use swoole,swoole-hook-mysql, you will enable the coroutine mode of Swoole's mysqlnd and pdo_mysql.

    swoole-hook-sqlite

    swoole-hook-sqlite is not an extension, it's a Hook feature of Swoole. If you use swoole,swoole-hook-sqlite, you will enable the coroutine mode of Swoole's pdo_sqlite (Swoole must be 5.1 or above).

    swoole-hook-sqlite conflicts with the pdo_sqlite extension. If you want to use Swoole and pdo_sqlite, please delete the pdo_sqlite extension and enable swoole and swoole-hook-sqlite. This extension contains an implementation of the coroutine environment for pdo_sqlite.

    swoole-hook-odbc

    swoole-hook-odbc is not an extension, it's a Hook feature of Swoole. If you use swoole,swoole-hook-odbc, you will enable the coroutine mode of Swoole's odbc extension.

    swoole-hook-odbc conflicts with the pdo_odbc extension. If you want to use Swoole and pdo_odbc, please delete the pdo_odbc extension and enable swoole and swoole-hook-odbc. This extension contains an implementation of the coroutine environment for pdo_odbc.

    swow

    1. Only PHP 8.0+ is supported.

    imagick

    1. OpenMP support is disabled, this is recommended by the maintainers and also the case system packages.

    imap

    1. Kerberos is not supported
    2. ext-imap is not thread safe due to the underlying c-client. It's not possible to use it in --enable-zts builds.
    3. The extension was dropped from php 8.4, we recommend you look for an alternative implementation, such as Webklex/php-imap

    gd

    1. gd Extension relies on more additional Graphics library. By default, using bin/spc build gd directly will not support some Graphics library, such as libjpeg, libavif, etc. Currently, it supports four libraries: freetype,libjpeg,libavif,libwebp. Therefore, the following command can be used to introduce them into the gd library:
    bash
    bin/spc build gd --with-libs=freetype,libjpeg,libavif,libwebp --build-cli

    mcrypt

    1. Currently not supported, and this extension will not be supported in the future. #32

    oci8

    1. oci8 is an extension of the Oracle database, because the library on which the extension provided by Oracle does not provide a statically compiled version (.a) or source code, and this extension cannot be compiled into php by static linking, so it cannot be supported.

    xdebug

    1. Xdebug is only buildable as a shared extension. On Linux, you'll need to use a SPC_TARGET like native-native -dynamic or native-native-gnu.
    2. When using Linux/glibc or macOS, you can compile Xdebug as a shared extension using --build-shared="xdebug". The compiled ./php binary can be configured and run by specifying the INI, eg ./php -d 'zend_extension=/path/to/xdebug.so' your-code.php.

    xml

    1. xml includes xml, xmlreader, xmlwriter, xsl, dom, simplexml, etc. When adding xml extensions, it is best to enable these extensions at the same time.
    2. libxml is included in xml extension. Enabling xml is equivalent to enabling libxml.

    glfw

    1. glfw depends on OpenGL, and linux environment also needs X11, which cannot be linked statically.
    2. macOS platform, we can compile and link system builtin OpenGL and related libraries dynamically.

    rar

    1. The rar extension currently has a problem when compiling phpmicro with the common extension collection in the macOS x86_64 environment.

    pgsql

    pgsql ssl connection is not compatible with openssl 3.2.0. See:

    pgsql 16.2 has fixed this bug, now it's working.

    When pgsql uses SSL connection, there may be error:80000002:system library::No such file or directory error, For details on the solution, see FAQ - Unable to use ssl.

    openssl

    When using openssl-based extensions (such as curl, pgsql and other network libraries), there may be an error:80000002:system library::No such file or directory error. For details on the solution, see FAQ - Unable to use ssl.

    password-argon2

    1. password-argon2 is not a standard extension. The algorithm PASSWORD_ARGON2ID for the password_hash function needs libsodium or libargon2 to work.
    2. using password-argon2 enables multithread support for this.

    ffi

    1. Due to the limitation of musl libc's static linkage, you cannot use ffi because dynamic libraries cannot be loaded. If you need to use the ffi extension, see Compile PHP with GNU libc.
    2. macOS supports the ffi extension, but errors will occur when some kernels do not contain debugging symbols.
    3. Windows x64 supports the ffi extension.

    xhprof

    The xhprof extension consists of three parts: xhprof_extension, xhprof_html, xhprof_libs. Only xhprof_extension is included in the compiled binary. If you need to use xhprof, please download the source code from pecl.php.net/package/xhprof and specify the xhprof_libs and xhprof_html paths for use.

    event

    If you enable event extension on macOS, the openpty will be disabled due to issue:

    parallel

    Parallel is only supported on PHP 8.0 ZTS and above.

    spx

    1. SPX does not support Windows, and the official repository does not support static compilation. static-php-cli uses a modified version.

    mimalloc

    1. This is not technically an extension, but a library.
    2. Building with --with-libs="mimalloc" on Linux or macOS will override the default allocator.
    3. This is experimental for now, but is recommended in threaded environments.

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/guide/extensions.html b/en/guide/extensions.html index d2ff7033..970c6836 100644 --- a/en/guide/extensions.html +++ b/en/guide/extensions.html @@ -5,22 +5,22 @@ Extensions | static-php-cli - - + + - + - - - - + + + + -
    Skip to content

    Extensions

    • yes: supported
    • blank: not supported yet, or WIP
    • no with issue link: confirmed to be unavailable due to issue
    • partial with issue link: supported but not perfect due to issue
    Extension NameLinuxmacOSFreeBSDWindows
    amqpyesyesyes
    apcuyesyesyesyes
    astyesyesyesyes
    bcmathyesyesyesyes
    brotliyesyesyesyes
    bz2yesyesyesyes
    calendaryesyesyesyes
    ctypeyesyesyesyes
    curlyesyesyesyes
    dbayesyesyesyes
    dioyesyesyes
    domyesyesyes
    dsyesyesyesyes
    enchant
    evyesyesyesyes
    eventyesyes
    exifyesyesyesyes
    ffipartialyesyes
    fileinfoyesyesyesyes
    filteryesyesyesyes
    ftpyesyesyesyes
    gdyesyesyes
    gettextyesyes
    glfwnoyesno
    gmpyesyes
    gmsslyesyesyes
    grpcyesyes
    iconvyesyesyes
    igbinaryyesyesyes
    imagickyesyes
    imapyesyes
    inotifyyesnono
    intlyesyesyes
    ldapyesyes
    libxmlyesyesyes
    lz4yesyes
    mbregexyesyesyesyes
    mbstringyesyesyesyes
    mcryptnononono
    memcacheyesyes
    memcachedyesyes
    mongodbyesyes
    msgpackyesyesyes
    mysqliyesyesyesyes
    mysqlndyesyesyesyes
    oci8nonono
    odbcyesyes
    opcacheyesyesyesyes
    opensslyesyesyesyes
    opentelemetryyesyesyes
    parallelyesyesyes
    password-argon2yesyes
    pcntlyesyesyesno
    pdoyesyesyesyes
    pdo_mysqlyesyesyesyes
    pdo_odbcyesyesyes
    pdo_pgsqlyesyesyes
    pdo_sqliteyesyesyes
    pdo_sqlsrvyesyesyes
    pgsqlyesyesyes
    pharyesyesyesyes
    posixyesyesyesno
    protobufyesyes
    raryespartialyes
    rdkafkayesyes
    readlineyesyes
    redisyesyesyes
    sessionyesyesyesyes
    shmopyesyesyesyes
    simdjsonyesyesyesyes
    simplexmlyesyesyes
    snappyyesyes
    soapyesyesyes
    socketsyesyesyesyes
    sodiumyesyesyes
    spxyesyesno
    sqlite3yesyesyes
    sqlsrvyesyesyes
    ssh2yesyesyes
    swooleyesyesno
    swoole-hook-mysqlyesyesno
    swoole-hook-pgsqlyespartialno
    swoole-hook-sqliteyesyesno
    swoole-hook-odbcyesyesno
    swowyesyesyes
    sysvmsgyesyesno
    sysvsemyesyesno
    sysvshmyesyesyes
    tidyyesyes
    tokenizeryesyesyesyes
    uuidyesyes
    uvyesyes
    xdebugpartialpartialno
    xhprofyesyes
    xlswriteryesyesyes
    xmlyesyesyes
    xmlreaderyesyesyes
    xmlwriteryesyesyes
    xslyesyes
    xzyesyesyesyes
    yacyesyesyes
    yamlyesyesyes
    zipyesyesyes
    zlibyesyesyesyes
    zstdyesyes

    TIP

    If an extension you need is missing, you can create a Feature Request.

    Some extensions or libraries that the extension depends on will have some optional features. For example, the gd library optionally supports libwebp, freetype, etc. If you only use bin/spc build gd --build-cli they will not be included (static-php-cli defaults to the minimum dependency principle).

    For more information about optional libraries, see Extensions, Library Dependency Map. For optional libraries, you can also select an extension from the Command Generator and then select optional libraries.

    Released under the MIT License.

    - +
    Skip to content

    Extensions

    • yes: supported
    • blank: not supported yet, or WIP
    • no with issue link: confirmed to be unavailable due to issue
    • partial with issue link: supported but not perfect due to issue
    Extension NameLinuxmacOSFreeBSDWindows
    amqpyesyesyes
    apcuyesyesyesyes
    astyesyesyesyes
    bcmathyesyesyesyes
    brotliyesyesyesyes
    bz2yesyesyesyes
    calendaryesyesyesyes
    ctypeyesyesyesyes
    curlyesyesyesyes
    dbayesyesyesyes
    dioyesyesyes
    domyesyesyes
    dsyesyesyesyes
    enchant
    evyesyesyesyes
    eventyesyes
    exifyesyesyesyes
    ffipartialyesyes
    fileinfoyesyesyesyes
    filteryesyesyesyes
    ftpyesyesyesyes
    gdyesyesyes
    gettextyesyes
    glfwnoyesno
    gmpyesyes
    gmsslyesyesyes
    grpcyesyes
    iconvyesyesyes
    igbinaryyesyesyes
    imagickyesyes
    imapyesyes
    inotifyyesnono
    intlyesyesyes
    ldapyesyes
    libxmlyesyesyes
    lz4yesyes
    mbregexyesyesyesyes
    mbstringyesyesyesyes
    mcryptnononono
    memcacheyesyes
    memcachedyesyes
    mongodbyesyes
    msgpackyesyesyes
    mysqliyesyesyesyes
    mysqlndyesyesyesyes
    oci8nonono
    odbcyesyes
    opcacheyesyesyesyes
    opensslyesyesyesyes
    opentelemetryyesyesyes
    parallelyesyesyes
    password-argon2yesyes
    pcntlyesyesyesno
    pdoyesyesyesyes
    pdo_mysqlyesyesyesyes
    pdo_odbcyesyesyes
    pdo_pgsqlyesyesyes
    pdo_sqliteyesyesyes
    pdo_sqlsrvyesyesyes
    pgsqlyesyesyes
    pharyesyesyesyes
    posixyesyesyesno
    protobufyesyes
    raryespartialyes
    rdkafkayesyes
    readlineyesyes
    redisyesyesyes
    sessionyesyesyesyes
    shmopyesyesyesyes
    simdjsonyesyesyesyes
    simplexmlyesyesyes
    snappyyesyes
    soapyesyesyes
    socketsyesyesyesyes
    sodiumyesyesyes
    spxyesyesno
    sqlite3yesyesyes
    sqlsrvyesyesyes
    ssh2yesyesyes
    swooleyesyesno
    swoole-hook-mysqlyesyesno
    swoole-hook-pgsqlyespartialno
    swoole-hook-sqliteyesyesno
    swoole-hook-odbcyesyesno
    swowyesyesyes
    sysvmsgyesyesno
    sysvsemyesyesno
    sysvshmyesyesyes
    tidyyesyes
    tokenizeryesyesyesyes
    uuidyesyes
    uvyesyes
    xdebugpartialpartialno
    xhprofyesyes
    xlswriteryesyesyes
    xmlyesyesyes
    xmlreaderyesyesyes
    xmlwriteryesyesyes
    xslyesyes
    xzyesyesyesyes
    yacyesyesyes
    yamlyesyesyes
    zipyesyesyes
    zlibyesyesyesyes
    zstdyesyes

    TIP

    If an extension you need is missing, you can create a Feature Request.

    Some extensions or libraries that the extension depends on will have some optional features. For example, the gd library optionally supports libwebp, freetype, etc. If you only use bin/spc build gd --build-cli they will not be included (static-php-cli defaults to the minimum dependency principle).

    For more information about optional libraries, see Extensions, Library Dependency Map. For optional libraries, you can also select an extension from the Command Generator and then select optional libraries.

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/guide/index.html b/en/guide/index.html index baef7e5b..0531ac8b 100644 --- a/en/guide/index.html +++ b/en/guide/index.html @@ -5,21 +5,21 @@ Guide | static-php-cli - - + + - + - - - + + + -
    Skip to content

    Guide

    Static php cli is a tool used to build statically compiled PHP binaries, currently supporting Linux and macOS systems.

    In the guide section, you will learn how to use static php cli to build standalone PHP programs.

    Compilation Environment

    The following is the architecture support situation, where ⚙️ represents support for GitHub Action build, 💻 represents support for local manual build, and empty represents temporarily not supported.

    x86_64aarch64
    macOS⚙️ 💻⚙️ 💻
    Linux⚙️ 💻⚙️ 💻
    Windows⚙️ 💻
    FreeBSD💻💻

    Among them, Linux is currently only tested on Ubuntu, Debian, and Alpine distributions, and other distributions have not been tested, which cannot guarantee successful compilation. For untested distributions, local compilation can be done using methods such as Docker to avoid environmental issues.

    There are two architectures for macOS: x86_64 and Arm, but binaries compiled on one architecture cannot be directly used on the other architecture. Rosetta 2 cannot guarantee that programs compiled with Arm architecture can fully run on x86_64 environment.

    Windows currently only supports the x86_64 architecture, and does not support 32-bit x86 or arm64 architecture.

    Supported PHP Version

    Currently, static php cli supports PHP versions 8.1 to 8.5, and theoretically supports PHP 8.0 and earlier versions. Simply select the earlier version when downloading. However, due to some extensions and special components that have stopped supporting earlier versions of PHP, static-php-cli will not explicitly support earlier versions. We recommend that you compile the latest PHP version possible for a better experience.

    Released under the MIT License.

    - +
    Skip to content

    Guide

    Static php cli is a tool used to build statically compiled PHP binaries, currently supporting Linux and macOS systems.

    In the guide section, you will learn how to use static php cli to build standalone PHP programs.

    Compilation Environment

    The following is the architecture support situation, where ⚙️ represents support for GitHub Action build, 💻 represents support for local manual build, and empty represents temporarily not supported.

    x86_64aarch64
    macOS⚙️ 💻⚙️ 💻
    Linux⚙️ 💻⚙️ 💻
    Windows⚙️ 💻
    FreeBSD💻💻

    Among them, Linux is currently only tested on Ubuntu, Debian, and Alpine distributions, and other distributions have not been tested, which cannot guarantee successful compilation. For untested distributions, local compilation can be done using methods such as Docker to avoid environmental issues.

    There are two architectures for macOS: x86_64 and Arm, but binaries compiled on one architecture cannot be directly used on the other architecture. Rosetta 2 cannot guarantee that programs compiled with Arm architecture can fully run on x86_64 environment.

    Windows currently only supports the x86_64 architecture, and does not support 32-bit x86 or arm64 architecture.

    Supported PHP Version

    Currently, static php cli supports PHP versions 8.1 to 8.5, and theoretically supports PHP 8.0 and earlier versions. Simply select the earlier version when downloading. However, due to some extensions and special components that have stopped supporting earlier versions of PHP, static-php-cli will not explicitly support earlier versions. We recommend that you compile the latest PHP version possible for a better experience.

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/guide/manual-build.html b/en/guide/manual-build.html index 2aaae885..6170f392 100644 --- a/en/guide/manual-build.html +++ b/en/guide/manual-build.html @@ -5,20 +5,20 @@ Build (Linux, macOS, FreeBSD) | static-php-cli - - + + - + - - - + + + -
    Skip to content

    Build (Linux, macOS, FreeBSD)

    This section covers the build process for Linux, macOS, and FreeBSD. If you want to build on Windows, also need to read Build on Windows.

    This project provides a binary file of static-php-cli. You can directly download the binary file of the corresponding platform and then use it to build static PHP. Currently, the platforms supported by spc binary are Linux and macOS.

    Here's how to download from self-hosted server:

    bash
    # Download from self-hosted nightly builds (sync with main branch)
    +    
    Skip to content

    Build (Linux, macOS, FreeBSD)

    This section covers the build process for Linux, macOS, and FreeBSD. If you want to build on Windows, also need to read Build on Windows.

    This project provides a binary file of static-php-cli. You can directly download the binary file of the corresponding platform and then use it to build static PHP. Currently, the platforms supported by spc binary are Linux and macOS.

    Here's how to download from self-hosted server:

    bash
    # Download from self-hosted nightly builds (sync with main branch)
     # For Linux x86_64
     curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-x86_64
     # For Linux aarch64
    @@ -217,8 +217,8 @@
     clang embed.c $(bin/spc spc-config bcmath,zlib) -o embed
     
     ./embed
    -# out: Hello world!

    Released under the MIT License.

    - +# out: Hello world!

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/guide/troubleshooting.html b/en/guide/troubleshooting.html index 6ec69612..04da8476 100644 --- a/en/guide/troubleshooting.html +++ b/en/guide/troubleshooting.html @@ -5,21 +5,21 @@ Troubleshooting | static-php-cli - - + + - + - - - + + + -
    Skip to content

    Troubleshooting

    Various failures may be encountered in the process of using static-php-cli, here will describe how to check the errors by yourself and report Issue.

    Download Failure

    Problems with downloading resources are one of the most common problems with spc. The main reason is that the addresses used for SPC download resources are generally the official website of the corresponding project or GitHub, etc., and these websites may occasionally go down and block IP addresses. After encountering a download failure, you can try to call the download command multiple times.

    When downloading extensions, you may eventually see errors like curl: (56) The requested URL returned error: 403 which are often caused by github rate limiting. You can verify this by adding --debug to the command and will see something like [DEBU] Running command (no output) : curl -sfSL "https://api.github.com/repos/openssl/openssl/releases".

    To fix this, create a personal access token on GitHub and set it as an environment variable GITHUB_TOKEN=<XXX>.

    If you confirm that the address is indeed inaccessible, you can submit an Issue or PR to update the url or download type.

    Doctor Can't Fix Something

    In most cases, the doctor module can automatically repair and install missing system environments, but there are also special circumstances where the automatic repair function cannot be used normally.

    Due to system limitations (for example, software such as Visual Studio cannot be automatically installed under Windows), the automatic repair function cannot be used for some projects. When encountering a function that cannot be automatically repaired, if you encounter the words Some check items can not be fixed, it means that it cannot be automatically repaired. Please submit an issue according to the method displayed on the terminal or repair the environment yourself.

    Compile Error

    When you encounter a compilation error, if the --debug log is not enabled, please enable the debug log first, and then determine the command that reported the error. The error terminal output is very important for fixing compilation errors. When submitting an issue, please upload the last error fragment of the terminal log (or the entire terminal log output), and include the spc command and parameters used.

    If you are rebuilding, please refer to the Local Build - Multiple Builds section.

    Released under the MIT License.

    - +
    Skip to content

    Troubleshooting

    Various failures may be encountered in the process of using static-php-cli, here will describe how to check the errors by yourself and report Issue.

    Download Failure

    Problems with downloading resources are one of the most common problems with spc. The main reason is that the addresses used for SPC download resources are generally the official website of the corresponding project or GitHub, etc., and these websites may occasionally go down and block IP addresses. After encountering a download failure, you can try to call the download command multiple times.

    When downloading extensions, you may eventually see errors like curl: (56) The requested URL returned error: 403 which are often caused by github rate limiting. You can verify this by adding --debug to the command and will see something like [DEBU] Running command (no output) : curl -sfSL "https://api.github.com/repos/openssl/openssl/releases".

    To fix this, create a personal access token on GitHub and set it as an environment variable GITHUB_TOKEN=<XXX>.

    If you confirm that the address is indeed inaccessible, you can submit an Issue or PR to update the url or download type.

    Doctor Can't Fix Something

    In most cases, the doctor module can automatically repair and install missing system environments, but there are also special circumstances where the automatic repair function cannot be used normally.

    Due to system limitations (for example, software such as Visual Studio cannot be automatically installed under Windows), the automatic repair function cannot be used for some projects. When encountering a function that cannot be automatically repaired, if you encounter the words Some check items can not be fixed, it means that it cannot be automatically repaired. Please submit an issue according to the method displayed on the terminal or repair the environment yourself.

    Compile Error

    When you encounter a compilation error, if the --debug log is not enabled, please enable the debug log first, and then determine the command that reported the error. The error terminal output is very important for fixing compilation errors. When submitting an issue, please upload the last error fragment of the terminal log (or the entire terminal log output), and include the spc command and parameters used.

    If you are rebuilding, please refer to the Local Build - Multiple Builds section.

    Released under the MIT License.

    + \ No newline at end of file diff --git a/en/index.html b/en/index.html index 72370b81..214333ce 100644 --- a/en/index.html +++ b/en/index.html @@ -5,21 +5,21 @@ static-php-cli - - + + - + - - - + + + -
    Skip to content

    static-php-cli

    Build standalone PHP binary on Linux, macOS, FreeBSD, Windows, with PHP project together, with popular extensions included.

    Released under the MIT License.

    - +
    Skip to content

    static-php-cli

    Build standalone PHP binary on Linux, macOS, FreeBSD, Windows, with PHP project together, with popular extensions included.

    Released under the MIT License.

    + \ No newline at end of file diff --git a/extension-notes.html b/extension-notes.html index 9223c2bf..eef321ff 100644 --- a/extension-notes.html +++ b/extension-notes.html @@ -5,21 +5,21 @@ static-php-cli - - + + - + - - - + + + -
    Skip to content

    Released under the MIT License.

    - +
    Skip to content

    Released under the MIT License.

    + \ No newline at end of file diff --git a/extensions.html b/extensions.html index f1f2429d..23bc0a1a 100644 --- a/extensions.html +++ b/extensions.html @@ -5,21 +5,21 @@ static-php-cli - - + + - + - - - + + + -
    Skip to content
    Extension NameLinuxmacOSFreeBSDWindows
    amqpyesyesyes
    apcuyesyesyesyes
    astyesyesyesyes
    bcmathyesyesyesyes
    brotliyesyesyesyes
    bz2yesyesyesyes
    calendaryesyesyesyes
    ctypeyesyesyesyes
    curlyesyesyesyes
    dbayesyesyesyes
    dioyesyesyes
    domyesyesyes
    dsyesyesyesyes
    enchant
    evyesyesyesyes
    eventyesyes
    exifyesyesyesyes
    ffipartialyesyes
    fileinfoyesyesyesyes
    filteryesyesyesyes
    ftpyesyesyesyes
    gdyesyesyes
    gettextyesyes
    glfwnoyesno
    gmpyesyes
    gmsslyesyesyes
    grpcyesyes
    iconvyesyesyes
    igbinaryyesyesyes
    imagickyesyes
    imapyesyes
    inotifyyesnono
    intlyesyesyes
    ldapyesyes
    libxmlyesyesyes
    lz4yesyes
    mbregexyesyesyesyes
    mbstringyesyesyesyes
    mcryptnononono
    memcacheyesyes
    memcachedyesyes
    mongodbyesyes
    msgpackyesyesyes
    mysqliyesyesyesyes
    mysqlndyesyesyesyes
    oci8nonono
    odbcyesyes
    opcacheyesyesyesyes
    opensslyesyesyesyes
    opentelemetryyesyesyes
    parallelyesyesyes
    password-argon2yesyes
    pcntlyesyesyesno
    pdoyesyesyesyes
    pdo_mysqlyesyesyesyes
    pdo_odbcyesyesyes
    pdo_pgsqlyesyesyes
    pdo_sqliteyesyesyes
    pdo_sqlsrvyesyesyes
    pgsqlyesyesyes
    pharyesyesyesyes
    posixyesyesyesno
    protobufyesyes
    raryespartialyes
    rdkafkayesyes
    readlineyesyes
    redisyesyesyes
    sessionyesyesyesyes
    shmopyesyesyesyes
    simdjsonyesyesyesyes
    simplexmlyesyesyes
    snappyyesyes
    soapyesyesyes
    socketsyesyesyesyes
    sodiumyesyesyes
    spxyesyesno
    sqlite3yesyesyes
    sqlsrvyesyesyes
    ssh2yesyesyes
    swooleyesyesno
    swoole-hook-mysqlyesyesno
    swoole-hook-pgsqlyespartialno
    swoole-hook-sqliteyesyesno
    swoole-hook-odbcyesyesno
    swowyesyesyes
    sysvmsgyesyesno
    sysvsemyesyesno
    sysvshmyesyesyes
    tidyyesyes
    tokenizeryesyesyesyes
    uuidyesyes
    uvyesyes
    xdebugpartialpartialno
    xhprofyesyes
    xlswriteryesyesyes
    xmlyesyesyes
    xmlreaderyesyesyes
    xmlwriteryesyesyes
    xslyesyes
    xzyesyesyesyes
    yacyesyesyes
    yamlyesyesyes
    zipyesyesyes
    zlibyesyesyesyes
    zstdyesyes

    Released under the MIT License.

    - +
    Skip to content
    Extension NameLinuxmacOSFreeBSDWindows
    amqpyesyesyes
    apcuyesyesyesyes
    astyesyesyesyes
    bcmathyesyesyesyes
    brotliyesyesyesyes
    bz2yesyesyesyes
    calendaryesyesyesyes
    ctypeyesyesyesyes
    curlyesyesyesyes
    dbayesyesyesyes
    dioyesyesyes
    domyesyesyes
    dsyesyesyesyes
    enchant
    evyesyesyesyes
    eventyesyes
    exifyesyesyesyes
    ffipartialyesyes
    fileinfoyesyesyesyes
    filteryesyesyesyes
    ftpyesyesyesyes
    gdyesyesyes
    gettextyesyes
    glfwnoyesno
    gmpyesyes
    gmsslyesyesyes
    grpcyesyes
    iconvyesyesyes
    igbinaryyesyesyes
    imagickyesyes
    imapyesyes
    inotifyyesnono
    intlyesyesyes
    ldapyesyes
    libxmlyesyesyes
    lz4yesyes
    mbregexyesyesyesyes
    mbstringyesyesyesyes
    mcryptnononono
    memcacheyesyes
    memcachedyesyes
    mongodbyesyes
    msgpackyesyesyes
    mysqliyesyesyesyes
    mysqlndyesyesyesyes
    oci8nonono
    odbcyesyes
    opcacheyesyesyesyes
    opensslyesyesyesyes
    opentelemetryyesyesyes
    parallelyesyesyes
    password-argon2yesyes
    pcntlyesyesyesno
    pdoyesyesyesyes
    pdo_mysqlyesyesyesyes
    pdo_odbcyesyesyes
    pdo_pgsqlyesyesyes
    pdo_sqliteyesyesyes
    pdo_sqlsrvyesyesyes
    pgsqlyesyesyes
    pharyesyesyesyes
    posixyesyesyesno
    protobufyesyes
    raryespartialyes
    rdkafkayesyes
    readlineyesyes
    redisyesyesyes
    sessionyesyesyesyes
    shmopyesyesyesyes
    simdjsonyesyesyesyes
    simplexmlyesyesyes
    snappyyesyes
    soapyesyesyes
    socketsyesyesyesyes
    sodiumyesyesyes
    spxyesyesno
    sqlite3yesyesyes
    sqlsrvyesyesyes
    ssh2yesyesyes
    swooleyesyesno
    swoole-hook-mysqlyesyesno
    swoole-hook-pgsqlyespartialno
    swoole-hook-sqliteyesyesno
    swoole-hook-odbcyesyesno
    swowyesyesyes
    sysvmsgyesyesno
    sysvsemyesyesno
    sysvshmyesyesyes
    tidyyesyes
    tokenizeryesyesyesyes
    uuidyesyes
    uvyesyes
    xdebugpartialpartialno
    xhprofyesyes
    xlswriteryesyesyes
    xmlyesyesyes
    xmlreaderyesyesyes
    xmlwriteryesyesyes
    xslyesyes
    xzyesyesyesyes
    yacyesyesyes
    yamlyesyesyes
    zipyesyesyes
    zlibyesyesyesyes
    zstdyesyes

    Released under the MIT License.

    + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json index b96ce1ab..09469a2f 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"deps-craft-yml.md":"DWPKeuXi","deps-map-ext.md":"B9knsysL","deps-map-lib.md":"DOtBR8NX","en_contributing_index.md":"C8tXDL1f","en_develop_craft-yml.md":"BDq8uWIr","en_develop_doctor-module.md":"DYVfKght","en_develop_index.md":"DSlquryN","en_develop_php-src-changes.md":"DadHFaGC","en_develop_source-module.md":"CeJEgS_j","en_develop_structure.md":"D1kBTweh","en_develop_system-build-tools.md":"DK4AaCy_","en_faq_index.md":"DnHLgGcl","en_guide_action-build.md":"BCJvLz8l","en_guide_build-on-windows.md":"CG23CkLK","en_guide_build-with-glibc.md":"BDBCsGWa","en_guide_cli-generator.md":"BsPNkB0u","en_guide_deps-map.md":"C4W5Fd15","en_guide_env-vars.md":"DzVATbtO","en_guide_extension-notes.md":"C-_d-XlC","en_guide_extensions.md":"8tYHqn_N","en_guide_index.md":"By6XUN6E","en_guide_manual-build.md":"BS1NEyZX","en_guide_troubleshooting.md":"BvJgQKvb","en_index.md":"kO-e39M0","extension-notes.md":"DkpYDq7p","extensions.md":"Cm2bD6Wz","index.md":"wJBxKTzp","zh_contributing_index.md":"22akXfoC","zh_develop_craft-yml.md":"Dfv1fXuq","zh_develop_doctor-module.md":"B8r2lbU8","zh_develop_index.md":"DecU9Y3b","zh_develop_php-src-changes.md":"CkjaMIky","zh_develop_source-module.md":"DoBnezP5","zh_develop_structure.md":"DStJTsYD","zh_develop_system-build-tools.md":"CxPkPV_h","zh_faq_index.md":"nE1d0aPt","zh_guide_action-build.md":"CYeVjGhJ","zh_guide_build-on-windows.md":"6JBREABQ","zh_guide_build-with-glibc.md":"CGbU937o","zh_guide_cli-generator.md":"DVBBaW5t","zh_guide_deps-map.md":"BK_n00u9","zh_guide_env-vars.md":"DqYHbUfS","zh_guide_extension-notes.md":"D1f-13YX","zh_guide_extensions.md":"CRNxXzeG","zh_guide_index.md":"DWAO4_zO","zh_guide_manual-build.md":"DAnA1dt8","zh_guide_troubleshooting.md":"DSUIb51x","zh_index.md":"DcikGFee"} +{"deps-craft-yml.md":"DqNYV3B0","deps-map-ext.md":"BVAR3McO","deps-map-lib.md":"BnsDnV_s","en_contributing_index.md":"fCA6lXnW","en_develop_craft-yml.md":"Ci97ssL7","en_develop_doctor-module.md":"BTDyp-aK","en_develop_index.md":"DUNrUVP9","en_develop_php-src-changes.md":"dN8aSiwg","en_develop_source-module.md":"hhJuiZD0","en_develop_structure.md":"X2JId3N9","en_develop_system-build-tools.md":"BmQhyTle","en_faq_index.md":"B89Sredc","en_guide_action-build.md":"Dnzq6gNC","en_guide_build-on-windows.md":"DiYVSaPG","en_guide_build-with-glibc.md":"CkVR75n5","en_guide_cli-generator.md":"Dw8fQLl3","en_guide_deps-map.md":"BUF4uebw","en_guide_env-vars.md":"51DQ7bvx","en_guide_extension-notes.md":"CHFGRiKx","en_guide_extensions.md":"UqRV3ESR","en_guide_index.md":"BC5dTAQW","en_guide_manual-build.md":"D7BTH2HF","en_guide_troubleshooting.md":"D19jRB1K","en_index.md":"WiGlW8EH","extension-notes.md":"BB7Xlw1w","extensions.md":"hO1GVZPt","index.md":"AJG02Jxt","zh_contributing_index.md":"fiiKMXnj","zh_develop_craft-yml.md":"CAUu6v38","zh_develop_doctor-module.md":"1NRXIINs","zh_develop_index.md":"CRxnJZDt","zh_develop_php-src-changes.md":"CwVUc0oE","zh_develop_source-module.md":"3iGbQTPs","zh_develop_structure.md":"CEd1RycZ","zh_develop_system-build-tools.md":"CQ4BvPVa","zh_faq_index.md":"BihV7puH","zh_guide_action-build.md":"CQ3Vf3i9","zh_guide_build-on-windows.md":"oogWrPn_","zh_guide_build-with-glibc.md":"CHXyK61r","zh_guide_cli-generator.md":"BoINN2LK","zh_guide_deps-map.md":"Cu7XhPTT","zh_guide_env-vars.md":"CtNlqGk4","zh_guide_extension-notes.md":"BCwDjBZH","zh_guide_extensions.md":"DEhoyCES","zh_guide_index.md":"C3GV6eqU","zh_guide_manual-build.md":"DVCjR4yy","zh_guide_troubleshooting.md":"BRQLW2WP","zh_index.md":"Dv99zA_s"} diff --git a/index.html b/index.html index c7ff5626..6d26e2da 100644 --- a/index.html +++ b/index.html @@ -5,21 +5,21 @@ static-php-cli - - + + - + - - - + + + -
    Skip to content

    static-php-cli

    Build standalone PHP binary on Linux, macOS, FreeBSD, Windows, with PHP project together, with popular extensions included.

    Special Sponsors

    Released under the MIT License.

    - +
    Skip to content

    static-php-cli

    Build standalone PHP binary on Linux, macOS, FreeBSD, Windows, with PHP project together, with popular extensions included.

    Special Sponsors

    Beyond Code
    NativePHP

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/contributing/index.html b/zh/contributing/index.html index 2d27e4f1..e07f7d11 100644 --- a/zh/contributing/index.html +++ b/zh/contributing/index.html @@ -5,21 +5,21 @@ 贡献指南 | static-php-cli - - + + - + - - - + + + -
    Skip to content

    贡献指南

    感谢你能够看到这里,本项目非常欢迎你的贡献!

    贡献方法

    如果你有代码或文档要贡献,以下是你需要首先了解的内容。

    1. 你要贡献什么类型的代码?(新扩展、修复 Bug、安全问题、项目框架优化、文档)
    2. 如果你贡献了新文件或新片段,你的代码是否经过 php-cs-fixerphpstan 的检查?
    3. 在贡献代码前是否充分阅读了 开发指南

    如果你能回答上述问题并对代码进行了修改,可以及时在项目 GitHub 仓库发起 Pull Request。 代码审查完成后,可以根据建议修改代码,或直接合并到主分支。

    贡献类型

    本项目的主要目的是编译静态链接的 PHP 二进制文件,命令行处理功能基于 symfony/console 编写。 在开发之前,如果你对它不够熟悉,请先查看 symfony/console 文档

    安全更新

    因为本项目基本上是一个本地运行的 PHP 项目,一般来说不会有远程攻击。 但如果你发现此类问题,请不要在 GitHub 仓库提交 PR 或 Issue, 你需要通过 邮件 联系项目维护者(crazywhalecc)。

    修复 Bug

    修复 Bug 一般不涉及项目结构和框架的修改,所以如果你能定位到错误代码并直接修复它,请直接提交 PR。

    新扩展

    对于添加新扩展,你需要了解项目的一些基本结构以及如何根据现有逻辑添加新扩展。 这将在本页的下一节中详细介绍。 总的来说,你需要:

    1. 评估扩展是否可以内联编译到 PHP 中。
    2. 评估扩展的依赖库(如果有)是否可以静态编译。
    3. 编写不同平台的库编译命令。
    4. 验证扩展及其依赖项与现有扩展和依赖项兼容。
    5. 验证扩展在 climicrofpmembed SAPIs 中正常工作。
    6. 编写文档并添加你的扩展。

    项目框架优化

    如果你已经熟悉 symfony/console 的工作原理,并同时要对项目的框架进行一些修改或优化,请先了解以下事情:

    1. 添加扩展不属于项目框架优化,但如果你在添加新扩展时发现必须优化框架,则需要先修改框架本身,然后再添加扩展。
    2. 对于一些大规模逻辑修改(例如涉及 LibraryBase、Extension 对象等的修改),建议先提交 Issue 或 Draft PR 进行讨论。
    3. 在项目早期,它是一个纯私有开发项目,代码中有一些中文注释。项目国际化后,你可以提交 PR 将这些注释翻译为英语。
    4. 请不要在代码中提交更多无用的代码片段,例如大量未使用的变量、方法、类以及多次重写的代码。

    Released under the MIT License.

    - +
    Skip to content

    贡献指南

    感谢你能够看到这里,本项目非常欢迎你的贡献!

    贡献方法

    如果你有代码或文档要贡献,以下是你需要首先了解的内容。

    1. 你要贡献什么类型的代码?(新扩展、修复 Bug、安全问题、项目框架优化、文档)
    2. 如果你贡献了新文件或新片段,你的代码是否经过 php-cs-fixerphpstan 的检查?
    3. 在贡献代码前是否充分阅读了 开发指南

    如果你能回答上述问题并对代码进行了修改,可以及时在项目 GitHub 仓库发起 Pull Request。 代码审查完成后,可以根据建议修改代码,或直接合并到主分支。

    贡献类型

    本项目的主要目的是编译静态链接的 PHP 二进制文件,命令行处理功能基于 symfony/console 编写。 在开发之前,如果你对它不够熟悉,请先查看 symfony/console 文档

    安全更新

    因为本项目基本上是一个本地运行的 PHP 项目,一般来说不会有远程攻击。 但如果你发现此类问题,请不要在 GitHub 仓库提交 PR 或 Issue, 你需要通过 邮件 联系项目维护者(crazywhalecc)。

    修复 Bug

    修复 Bug 一般不涉及项目结构和框架的修改,所以如果你能定位到错误代码并直接修复它,请直接提交 PR。

    新扩展

    对于添加新扩展,你需要了解项目的一些基本结构以及如何根据现有逻辑添加新扩展。 这将在本页的下一节中详细介绍。 总的来说,你需要:

    1. 评估扩展是否可以内联编译到 PHP 中。
    2. 评估扩展的依赖库(如果有)是否可以静态编译。
    3. 编写不同平台的库编译命令。
    4. 验证扩展及其依赖项与现有扩展和依赖项兼容。
    5. 验证扩展在 climicrofpmembed SAPIs 中正常工作。
    6. 编写文档并添加你的扩展。

    项目框架优化

    如果你已经熟悉 symfony/console 的工作原理,并同时要对项目的框架进行一些修改或优化,请先了解以下事情:

    1. 添加扩展不属于项目框架优化,但如果你在添加新扩展时发现必须优化框架,则需要先修改框架本身,然后再添加扩展。
    2. 对于一些大规模逻辑修改(例如涉及 LibraryBase、Extension 对象等的修改),建议先提交 Issue 或 Draft PR 进行讨论。
    3. 在项目早期,它是一个纯私有开发项目,代码中有一些中文注释。项目国际化后,你可以提交 PR 将这些注释翻译为英语。
    4. 请不要在代码中提交更多无用的代码片段,例如大量未使用的变量、方法、类以及多次重写的代码。

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/develop/craft-yml.html b/zh/develop/craft-yml.html index 37083ab2..e02d0be9 100644 --- a/zh/develop/craft-yml.html +++ b/zh/develop/craft-yml.html @@ -5,20 +5,20 @@ craft.yml 配置 | static-php-cli - - + + - + - - - + + + -
    Skip to content

    craft.yml 配置

    yaml
    # PHP version to build (default: 8.4)
    +    
    Skip to content

    craft.yml 配置

    yaml
    # PHP version to build (default: 8.4)
     php-version: 8.4
     # [REQUIRED] Static PHP extensions to build (list or comma-separated are both accepted)
     extensions: bcmath,fileinfo,phar,zlib,sodium,posix,pcntl
    @@ -85,8 +85,8 @@
     # Extra environment variables
     extra-env:
       # e.g. Use github token to avoid rate limit
    -  GITHUB_TOKEN: your-github-token

    Released under the MIT License.

    - + GITHUB_TOKEN: your-github-token

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/develop/doctor-module.html b/zh/develop/doctor-module.html index 17bcb6ea..c9e2f4ee 100644 --- a/zh/develop/doctor-module.html +++ b/zh/develop/doctor-module.html @@ -5,20 +5,20 @@ Doctor 模块 | static-php-cli - - + + - + - - - + + + -
    Skip to content

    Doctor 模块

    Doctor 模块是一个较为独立的用于检查系统环境的模块,可使用命令 bin/spc doctor 进入,入口的命令类在 DoctorCommand.php 中。

    Doctor 模块是一个检查单,里面有一系列的检查项目和自动修复项目。这些项目都存放在 src/SPC/doctor/item/ 目录中, 并且使用了两种 Attribute 用作检查项标记和自动修复项目标记:#[AsCheckItem]#[AsFixItem]

    以现有的检查项 if necessary tools are installed,它是用于检查编译必需的包是否安装在 macOS 系统内,下面是它的源码:

    php
    use SPC\doctor\AsCheckItem;
    +    
    Skip to content

    Doctor 模块

    Doctor 模块是一个较为独立的用于检查系统环境的模块,可使用命令 bin/spc doctor 进入,入口的命令类在 DoctorCommand.php 中。

    Doctor 模块是一个检查单,里面有一系列的检查项目和自动修复项目。这些项目都存放在 src/SPC/doctor/item/ 目录中, 并且使用了两种 Attribute 用作检查项标记和自动修复项目标记:#[AsCheckItem]#[AsFixItem]

    以现有的检查项 if necessary tools are installed,它是用于检查编译必需的包是否安装在 macOS 系统内,下面是它的源码:

    php
    use SPC\doctor\AsCheckItem;
     use SPC\doctor\AsFixItem;
     use SPC\doctor\CheckResult;
     
    @@ -46,8 +46,8 @@
             }
         }
         return true;
    -}

    #[AsFixItem()] 属性传入的参数即修复项的名称,该方法必须返回 True 或 False。当返回 False 时,表明自动修复失败,需要手动处理。

    此处的代码中 shell()->exec() 是项目的执行命令的方法,用于替代 exec()system(),同时提供了 debug、获取执行状态、进入目录等特性。

    Released under the MIT License.

    - +}

    #[AsFixItem()] 属性传入的参数即修复项的名称,该方法必须返回 True 或 False。当返回 False 时,表明自动修复失败,需要手动处理。

    此处的代码中 shell()->exec() 是项目的执行命令的方法,用于替代 exec()system(),同时提供了 debug、获取执行状态、进入目录等特性。

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/develop/index.html b/zh/develop/index.html index 5dd32140..f662883b 100644 --- a/zh/develop/index.html +++ b/zh/develop/index.html @@ -5,21 +5,21 @@ 开发简介 | static-php-cli - - + + - + - - - + + + -
    Skip to content

    开发简介

    开发本项目需要安装部署 PHP 环境,以及一些 PHP 项目常用的扩展和 Composer。

    项目的开发环境和运行环境几乎完全一致。你可以参照 手动构建 部分安装系统 PHP 或使用本项目预构建的静态 PHP 作为环境。这里不再赘述。

    抛开用途,本项目本身其实就是一个 php-cli 程序,你可以将它当作一个正常的 PHP 项目进行编辑和开发,同时你需要了解不同系统的 Shell 命令行。

    本项目目前的目的就是为了编译静态编译的独立 PHP,但主体部分也包含编译很多依赖库的静态版本,所以你可以复用这套编译逻辑,用于构建其他程序的独立二进制版本,例如 Nginx 等。

    环境准备

    开发本项目需要 PHP 环境。你可以使用系统自带的 PHP,也可以使用本项目构建的静态 PHP。

    无论是使用哪种 PHP,在开发环境,你需要安装这些扩展:

    curl,dom,filter,mbstring,openssl,pcntl,phar,posix,sodium,tokenizer,xml,xmlwriter

    static-php-cli 项目本身不需要这么多扩展,但在开发过程中,你会用到 Composer 和 PHPUnit 等工具,它们需要这些扩展。

    对于 static-php-cli 自身构建的 micro 自执行二进制,仅需要 pcntl,posix,mbstring,tokenizer,phar

    开始开发

    继续向下查看项目结构文档,你可以学习 static-php-cli 是如何工作的。

    Released under the MIT License.

    - +
    Skip to content

    开发简介

    开发本项目需要安装部署 PHP 环境,以及一些 PHP 项目常用的扩展和 Composer。

    项目的开发环境和运行环境几乎完全一致。你可以参照 手动构建 部分安装系统 PHP 或使用本项目预构建的静态 PHP 作为环境。这里不再赘述。

    抛开用途,本项目本身其实就是一个 php-cli 程序,你可以将它当作一个正常的 PHP 项目进行编辑和开发,同时你需要了解不同系统的 Shell 命令行。

    本项目目前的目的就是为了编译静态编译的独立 PHP,但主体部分也包含编译很多依赖库的静态版本,所以你可以复用这套编译逻辑,用于构建其他程序的独立二进制版本,例如 Nginx 等。

    环境准备

    开发本项目需要 PHP 环境。你可以使用系统自带的 PHP,也可以使用本项目构建的静态 PHP。

    无论是使用哪种 PHP,在开发环境,你需要安装这些扩展:

    curl,dom,filter,mbstring,openssl,pcntl,phar,posix,sodium,tokenizer,xml,xmlwriter

    static-php-cli 项目本身不需要这么多扩展,但在开发过程中,你会用到 Composer 和 PHPUnit 等工具,它们需要这些扩展。

    对于 static-php-cli 自身构建的 micro 自执行二进制,仅需要 pcntl,posix,mbstring,tokenizer,phar

    开始开发

    继续向下查看项目结构文档,你可以学习 static-php-cli 是如何工作的。

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/develop/php-src-changes.html b/zh/develop/php-src-changes.html index 634407f1..3e677270 100644 --- a/zh/develop/php-src-changes.html +++ b/zh/develop/php-src-changes.html @@ -5,21 +5,21 @@ 对 PHP 源码的修改 | static-php-cli - - + + - + - - - + + + -
    Skip to content

    对 PHP 源码的修改

    由于 static-php-cli 在静态编译过程中为了实现良好的兼容性、性能和安全性,对 PHP 源码进行了一些修改。下面是目前对 PHP 源码修改的说明。

    micro 相关补丁

    基于 phpmicro 项目提供的补丁,static-php-cli 对 PHP 源码进行了一些修改,以适应静态编译的需求。补丁列表 包含:

    目前 static-php-cli 在编译时用到的补丁有:

    • static_opcache
    • static_extensions_win32
    • cli_checks
    • disable_huge_page
    • vcruntime140
    • win32
    • zend_stream
    • cli_static
    • macos_iconv
    • phar

    PHP <= 8.1 libxml 补丁

    因为 PHP 官方仅对 8.1 进行安全更新,旧版本停止更新,所以 static-php-cli 对 PHP 8.1 及以下版本应用了在新版本 PHP 中已经应用的 libxml 编译补丁。

    gd 扩展 Windows 补丁

    在 Windows 下编译 gd 扩展需要大幅改动 config.w32 文件,static-php-cli 对 gd 扩展进行了一些修改,使其在 Windows 下编译更加方便。

    yaml 扩展 Windows 补丁

    yaml 扩展在 Windows 下编译需要修改 config.w32 文件,static-php-cli 对 yaml 扩展进行了一些修改,使其在 Windows 下编译更加方便。

    static-php-cli 版本信息插入

    static-php-cli 在编译时会在 PHP 版本信息中插入 static-php-cli 的版本信息,以便于识别。

    加入硬编码 INI 的选项

    在使用 -I 参数硬编码 INI 到静态 PHP 的功能中,static-php-cli 会修改 PHP 源码以插入硬编码内容。

    Linux 系统修复补丁

    部分编译环境可能缺少一些头文件或库,static-php-cli 会在编译时自动修复这些问题,如:

    • HAVE_STRLCAT missing problem
    • HAVE_STRLCPY missing problem

    Windows 系统下 Fiber 问题修复补丁

    在 Windows 下编译 PHP 时,Fiber 扩展会出现一些问题,static-php-cli 会在编译时自动修复这些问题(修改 php-src 的 config.w32)。

    Released under the MIT License.

    - +
    Skip to content

    对 PHP 源码的修改

    由于 static-php-cli 在静态编译过程中为了实现良好的兼容性、性能和安全性,对 PHP 源码进行了一些修改。下面是目前对 PHP 源码修改的说明。

    micro 相关补丁

    基于 phpmicro 项目提供的补丁,static-php-cli 对 PHP 源码进行了一些修改,以适应静态编译的需求。补丁列表 包含:

    目前 static-php-cli 在编译时用到的补丁有:

    • static_opcache
    • static_extensions_win32
    • cli_checks
    • disable_huge_page
    • vcruntime140
    • win32
    • zend_stream
    • cli_static
    • macos_iconv
    • phar

    PHP <= 8.1 libxml 补丁

    因为 PHP 官方仅对 8.1 进行安全更新,旧版本停止更新,所以 static-php-cli 对 PHP 8.1 及以下版本应用了在新版本 PHP 中已经应用的 libxml 编译补丁。

    gd 扩展 Windows 补丁

    在 Windows 下编译 gd 扩展需要大幅改动 config.w32 文件,static-php-cli 对 gd 扩展进行了一些修改,使其在 Windows 下编译更加方便。

    yaml 扩展 Windows 补丁

    yaml 扩展在 Windows 下编译需要修改 config.w32 文件,static-php-cli 对 yaml 扩展进行了一些修改,使其在 Windows 下编译更加方便。

    static-php-cli 版本信息插入

    static-php-cli 在编译时会在 PHP 版本信息中插入 static-php-cli 的版本信息,以便于识别。

    加入硬编码 INI 的选项

    在使用 -I 参数硬编码 INI 到静态 PHP 的功能中,static-php-cli 会修改 PHP 源码以插入硬编码内容。

    Linux 系统修复补丁

    部分编译环境可能缺少一些头文件或库,static-php-cli 会在编译时自动修复这些问题,如:

    • HAVE_STRLCAT missing problem
    • HAVE_STRLCPY missing problem

    Windows 系统下 Fiber 问题修复补丁

    在 Windows 下编译 PHP 时,Fiber 扩展会出现一些问题,static-php-cli 会在编译时自动修复这些问题(修改 php-src 的 config.w32)。

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/develop/source-module.html b/zh/develop/source-module.html index 0f1aa26e..c2997eef 100644 --- a/zh/develop/source-module.html +++ b/zh/develop/source-module.html @@ -5,20 +5,20 @@ 资源模块 | static-php-cli - - + + - + - - - + + + -
    Skip to content

    资源模块

    static-php-cli 的下载资源模块是一个主要的功能,它包含了所依赖的库、外部扩展、PHP 源码的下载方式和资源解压方式。 下载的配置文件主要涉及 source.jsonpkg.json 文件,这个文件记录了所有可下载的资源的下载方式。

    下载功能主要涉及的命令有 bin/spc downloadbin/spc extract。其中 download 命令是一个下载器,它会根据配置文件下载资源; extract 命令是一个解压器,它会根据配置文件解压资源。

    一般来说,下载资源可能会比较慢,因为这些资源来源于各个官网、GitHub 等不同位置,同时它们也占用了较大空间,所以你可以在一次下载资源后,可重复使用。

    下载器的配置文件是 source.json,它包含了所有资源的下载方式,你可以在其中添加你需要的资源下载方式,也可以修改已有的资源下载方式。

    每个资源的下载配置结构如下,下面是 libevent 扩展对应的资源下载配置:

    json
    {
    +    
    Skip to content

    资源模块

    static-php-cli 的下载资源模块是一个主要的功能,它包含了所依赖的库、外部扩展、PHP 源码的下载方式和资源解压方式。 下载的配置文件主要涉及 source.jsonpkg.json 文件,这个文件记录了所有可下载的资源的下载方式。

    下载功能主要涉及的命令有 bin/spc downloadbin/spc extract。其中 download 命令是一个下载器,它会根据配置文件下载资源; extract 命令是一个解压器,它会根据配置文件解压资源。

    一般来说,下载资源可能会比较慢,因为这些资源来源于各个官网、GitHub 等不同位置,同时它们也占用了较大空间,所以你可以在一次下载资源后,可重复使用。

    下载器的配置文件是 source.json,它包含了所有资源的下载方式,你可以在其中添加你需要的资源下载方式,也可以修改已有的资源下载方式。

    每个资源的下载配置结构如下,下面是 libevent 扩展对应的资源下载配置:

    json
    {
       "libevent": {
         "type": "ghrel",
         "repo": "libevent/libevent",
    @@ -137,8 +137,8 @@
           ]
         }
       }
    -}

    Released under the MIT License.

    - +}

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/develop/structure.html b/zh/develop/structure.html index 1d26270e..e1e58e05 100644 --- a/zh/develop/structure.html +++ b/zh/develop/structure.html @@ -5,20 +5,20 @@ 项目结构简介 | static-php-cli - - + + - + - - - + + + -
    Skip to content

    项目结构简介

    static-php-cli 主要包含三种逻辑组件:资源、依赖库、扩展。这三种组件四个配置文件:source.jsonlib.jsonext.jsonpkg.json

    一个完整的构建静态 PHP 流程是:

    1. 使用资源下载模块 Downloader 下载指定或所有资源,这些资源包含 PHP 源码、依赖库源码、扩展源码。
    2. 使用资源解压模块 SourceExtractor 解压下载的资源到编译目录。
    3. 使用依赖工具计算出当前加入的扩展的依赖扩展、依赖库,然后对每个需要编译的依赖库进行编译,按照依赖顺序。
    4. 使用对应操作系统下的 Builder 构建每个依赖库后,将其安装到 buildroot 目录。
    5. 如果包含外部扩展(源码没有包含在 PHP 内的扩展),将外部扩展拷贝到 source/php-src/ext/ 目录。
    6. 使用 Builder 构建 PHP 源码,将其安装到 buildroot 目录。

    项目主要分为几个文件夹:

    • bin/: 用于存放程序入口文件,包含 bin/spcbin/spc-alpine-dockerbin/setup-runtime
    • config/: 包含了所有项目支持的扩展、依赖库以及这些资源下载的地址、下载方式等,:lib.jsonext.jsonsource.jsonpkg.jsonpre-built.json
    • src/SPC/: 项目的核心代码,包含了整个框架以及编译各种扩展和库的命令。
    • src/globals/: 项目的全局方法和常量、运行时需要的测试文件(例如:扩展的可用性检查代码)。
    • vendor/: Composer 依赖的目录,你无需对它做出任何修改。

    其中运行原理就是启动一个 symfony/consoleConsoleApplication,然后解析用户在终端输入的命令。

    基本命令行结构

    bin/spc 是一个 PHP 代码入口文件,包含了 Unix 通用的 #!/usr/bin/env php 用来让系统自动以系统安装好的 PHP 解释器执行。 在项目执行了 new ConsoleApplication() 后,框架会自动使用反射的方式,解析 src/SPC/command 目录下的所有类,并将其注册成为命令。

    项目并没有直接使用 Symfony 推荐的 Command 注册方式和命令执行方式,这里做出了一点小变动:

    1. 每个命令都使用 #[AsCommand()] Attribute 来注册名称和简介。
    2. execute() 抽象化,让所有命令基于 BaseCommand(它基于 Symfony\Component\Console\Command\Command),每个命令本身的执行代码写到了 handle() 方法中。
    3. BaseCommand 添加了变量 $no_motd,用于是否在该命令执行时显示 Figlet 欢迎词。
    4. BaseCommandInputInterfaceOutputInterface 保存为成员变量,你可以在命令的类内使用 $this->input$this->output

    基本源码结构

    项目的源码位于 src/SPC 目录,支持 PSR-4 标准的自动加载,包含以下子目录和类:

    • src/SPC/builder/: 用于不同操作系统下构建依赖库、PHP 及相关扩展的核心编译命令代码,还包含了一些编译的系统工具方法。
    • src/SPC/command/: 项目的所有命令都在这里。
    • src/SPC/doctor/: Doctor 模块,它是一个较为独立的用于检查系统环境的模块,可使用命令 bin/spc doctor 进入。
    • src/SPC/exception/: 异常类。
    • src/SPC/store/: 有关存储、文件和资源的类都在这里。
    • src/SPC/util/: 一些可以复用的工具方法都在这里。
    • src/SPC/ConsoleApplication.php: 命令行程序入口文件。

    如果你阅读过源码,你可能会发现还有一个 src/globals/ 目录,它是用于存放一些全局变量、全局方法、构建过程中依赖的非 PSR-4 标准的 PHP 源码,例如测试扩展代码等。

    Phar 应用目录问题

    和其他 php-cli 项目一样,spc 自身对路径有额外的考虑。 因为 spc 可以在 php-cli directlymicro SAPIphp-cli with Pharvendor with Phar 等多种模式下运行,各类根目录存在歧义。这里会进行一个完整的说明。 此问题一般常见于 PHP 项目中存取文件的基类路径选择问题,尤其是在配合 micro.sfx 使用时容易出现路径问题。

    注意,此处仅对你在开发 Phar 项目或 PHP 框架时可能有用。

    接下来我们都将 static-php-cli(也就是 spc)当作一个普通的 php 命令行程序来看,你可以将 spc 理解为你自己的任何 php-cli 应用以参考。

    下面主要有三个基本的常量理论值,我们建议你在编写 php 项目时引入这三种常量:

    • WORKING_DIR:执行 PHP 脚本时的工作目录
    • SOURCE_ROOT_DIRROOT_DIR:项目文件夹的根目录,一般为 composer.json 所在目录
    • FRAMEWORK_ROOT_DIR:使用框架的根目录,自行开发的框架可能会用到,一般框架目录为只读

    你可以在你的框架或者 cli 应用程序入口中定义这些常量,以方便在你的项目中使用路径。

    下面是 PHP 内置的常量值,在 PHP 解释器内部已被定义:

    • __DIR__:当前执行脚本的文件所在目录
    • __FILE__:当前执行脚本的文件路径

    Git 项目模式(source)

    Git 项目模式指的是一个框架或程序本身在当前文件夹以纯文本形式存放,运行通过 php path/to/entry.php 方式。

    假设你的项目存放在 /home/example/static-php-cli/ 目录下,或你的项目就是框架本身,里面包含 composer.json 等项目文件:

    composer.json
    +    
    Skip to content

    项目结构简介

    static-php-cli 主要包含三种逻辑组件:资源、依赖库、扩展。这三种组件四个配置文件:source.jsonlib.jsonext.jsonpkg.json

    一个完整的构建静态 PHP 流程是:

    1. 使用资源下载模块 Downloader 下载指定或所有资源,这些资源包含 PHP 源码、依赖库源码、扩展源码。
    2. 使用资源解压模块 SourceExtractor 解压下载的资源到编译目录。
    3. 使用依赖工具计算出当前加入的扩展的依赖扩展、依赖库,然后对每个需要编译的依赖库进行编译,按照依赖顺序。
    4. 使用对应操作系统下的 Builder 构建每个依赖库后,将其安装到 buildroot 目录。
    5. 如果包含外部扩展(源码没有包含在 PHP 内的扩展),将外部扩展拷贝到 source/php-src/ext/ 目录。
    6. 使用 Builder 构建 PHP 源码,将其安装到 buildroot 目录。

    项目主要分为几个文件夹:

    • bin/: 用于存放程序入口文件,包含 bin/spcbin/spc-alpine-dockerbin/setup-runtime
    • config/: 包含了所有项目支持的扩展、依赖库以及这些资源下载的地址、下载方式等,:lib.jsonext.jsonsource.jsonpkg.jsonpre-built.json
    • src/SPC/: 项目的核心代码,包含了整个框架以及编译各种扩展和库的命令。
    • src/globals/: 项目的全局方法和常量、运行时需要的测试文件(例如:扩展的可用性检查代码)。
    • vendor/: Composer 依赖的目录,你无需对它做出任何修改。

    其中运行原理就是启动一个 symfony/consoleConsoleApplication,然后解析用户在终端输入的命令。

    基本命令行结构

    bin/spc 是一个 PHP 代码入口文件,包含了 Unix 通用的 #!/usr/bin/env php 用来让系统自动以系统安装好的 PHP 解释器执行。 在项目执行了 new ConsoleApplication() 后,框架会自动使用反射的方式,解析 src/SPC/command 目录下的所有类,并将其注册成为命令。

    项目并没有直接使用 Symfony 推荐的 Command 注册方式和命令执行方式,这里做出了一点小变动:

    1. 每个命令都使用 #[AsCommand()] Attribute 来注册名称和简介。
    2. execute() 抽象化,让所有命令基于 BaseCommand(它基于 Symfony\Component\Console\Command\Command),每个命令本身的执行代码写到了 handle() 方法中。
    3. BaseCommand 添加了变量 $no_motd,用于是否在该命令执行时显示 Figlet 欢迎词。
    4. BaseCommandInputInterfaceOutputInterface 保存为成员变量,你可以在命令的类内使用 $this->input$this->output

    基本源码结构

    项目的源码位于 src/SPC 目录,支持 PSR-4 标准的自动加载,包含以下子目录和类:

    • src/SPC/builder/: 用于不同操作系统下构建依赖库、PHP 及相关扩展的核心编译命令代码,还包含了一些编译的系统工具方法。
    • src/SPC/command/: 项目的所有命令都在这里。
    • src/SPC/doctor/: Doctor 模块,它是一个较为独立的用于检查系统环境的模块,可使用命令 bin/spc doctor 进入。
    • src/SPC/exception/: 异常类。
    • src/SPC/store/: 有关存储、文件和资源的类都在这里。
    • src/SPC/util/: 一些可以复用的工具方法都在这里。
    • src/SPC/ConsoleApplication.php: 命令行程序入口文件。

    如果你阅读过源码,你可能会发现还有一个 src/globals/ 目录,它是用于存放一些全局变量、全局方法、构建过程中依赖的非 PSR-4 标准的 PHP 源码,例如测试扩展代码等。

    Phar 应用目录问题

    和其他 php-cli 项目一样,spc 自身对路径有额外的考虑。 因为 spc 可以在 php-cli directlymicro SAPIphp-cli with Pharvendor with Phar 等多种模式下运行,各类根目录存在歧义。这里会进行一个完整的说明。 此问题一般常见于 PHP 项目中存取文件的基类路径选择问题,尤其是在配合 micro.sfx 使用时容易出现路径问题。

    注意,此处仅对你在开发 Phar 项目或 PHP 框架时可能有用。

    接下来我们都将 static-php-cli(也就是 spc)当作一个普通的 php 命令行程序来看,你可以将 spc 理解为你自己的任何 php-cli 应用以参考。

    下面主要有三个基本的常量理论值,我们建议你在编写 php 项目时引入这三种常量:

    • WORKING_DIR:执行 PHP 脚本时的工作目录
    • SOURCE_ROOT_DIRROOT_DIR:项目文件夹的根目录,一般为 composer.json 所在目录
    • FRAMEWORK_ROOT_DIR:使用框架的根目录,自行开发的框架可能会用到,一般框架目录为只读

    你可以在你的框架或者 cli 应用程序入口中定义这些常量,以方便在你的项目中使用路径。

    下面是 PHP 内置的常量值,在 PHP 解释器内部已被定义:

    • __DIR__:当前执行脚本的文件所在目录
    • __FILE__:当前执行脚本的文件路径

    Git 项目模式(source)

    Git 项目模式指的是一个框架或程序本身在当前文件夹以纯文本形式存放,运行通过 php path/to/entry.php 方式。

    假设你的项目存放在 /home/example/static-php-cli/ 目录下,或你的项目就是框架本身,里面包含 composer.json 等项目文件:

    composer.json
     src/App/MyCommand.app
     vendor/*
     bin/entry.php

    我们假设从 src/App/MyCommand.php 中获取以上常量:

    ConstantValue
    WORKING_DIR/home/example/static-php-cli
    SOURCE_ROOT_DIR/home/example/static-php-cli
    FRAMEWORK_ROOT_DIR/home/example/static-php-cli
    __DIR__/home/example/static-php-cli/src/App
    __FILE__/home/example/static-php-cli/src/App/MyCommand.php

    这种情况下,WORKING_DIRSOURCE_ROOT_DIRFRAMEWORK_ROOT_DIR 的值是完全一致的:/home/example/static-php-cli。 框架的源码和应用的源码都在当前路径下。

    Vendor 库模式(vendor)

    Vendor 库模式一般是指你的项目为框架类或者被其他应用作为 composer 依赖项安装到项目中,存放位置在 vendor/author/XXX 目录。

    假设你的项目是 crazywhalecc/static-php-cli,你或其他人在另一个项目使用 composer require 安装了这个项目。

    我们假设 static-php-cli 中包含同 Git 模式 的除 vendor 目录外的所有文件,并从 src/App/MyCommand 中获取常量值, 目录常量应该是:

    ConstantValue
    WORKING_DIR/home/example/another-app
    SOURCE_ROOT_DIR/home/example/another-app
    FRAMEWORK_ROOT_DIR/home/example/another-app/vendor/crazywhalecc/static-php-cli
    __DIR__/home/example/another-app/vendor/crazywhalecc/static-php-cli/src/App
    __FILE__/home/example/another-app/vendor/crazywhalecc/static-php-cli/src/App/MyCommand.php

    这里的 SOURCE_ROOT_DIR 就指的是使用 static-php-cli 的项目的根目录。

    Git 项目 Phar 模式(source-phar)

    Git 项目 Phar 模式指的是将 Git 项目模式的项目目录打包为一个 phar 文件的模式。我们假设 /home/example/static-php-cli 将打包为一个 Phar 文件,目录有以下文件:

    composer.json
    @@ -27,8 +27,8 @@
     bin/entry.php

    打包为 app.phar 并存放到 /home/example/static-php-cli 目录下时,此时执行 app.phar,假设执行了 src/App/MyCommand 代码,常量在该文件内获取:

    ConstantValue
    WORKING_DIR/home/example/static-php-cli
    SOURCE_ROOT_DIRphar:///home/example/static-php-cli/app.phar/
    FRAMEWORK_ROOT_DIRphar:///home/example/static-php-cli/app.phar/
    __DIR__phar:///home/example/static-php-cli/app.phar/src/App
    __FILE__phar:///home/example/static-php-cli/app.phar/src/App/MyCommand.php

    因为在 phar 内读取自身 phar 的文件需要 phar:// 协议进行,所以项目根目录和框架目录将会和 WORKING_DIR 不同。

    Vendor 库 Phar 模式(vendor-phar)

    Vendor 库 Phar 模式指的是你的项目作为框架安装在其他项目内,存储于 vendor 目录下。

    我们假设你的项目目录结构如下:

    composer.json # 当前项目的 Composer 配置文件
     box.json # 打包 Phar 的配置文件
     another-app.php # 另一个项目的入口文件
    -vendor/crazywhalecc/static-php-cli/* # 你的项目被作为依赖库

    将该目录 /home/example/another-app/ 下的这些文件打包为 app.phar 时,对于你的项目而言,下面常量的值应为:

    ConstantValue
    WORKING_DIR/home/example/another-app
    SOURCE_ROOT_DIRphar:///home/example/another-app/app.phar/
    FRAMEWORK_ROOT_DIRphar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli
    __DIR__phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App
    __FILE__phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App/MyCommand.php

    Released under the MIT License.

    - +vendor/crazywhalecc/static-php-cli/* # 你的项目被作为依赖库

    将该目录 /home/example/another-app/ 下的这些文件打包为 app.phar 时,对于你的项目而言,下面常量的值应为:

    ConstantValue
    WORKING_DIR/home/example/another-app
    SOURCE_ROOT_DIRphar:///home/example/another-app/app.phar/
    FRAMEWORK_ROOT_DIRphar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli
    __DIR__phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App
    __FILE__phar:///home/example/another-app/app.phar/vendor/crazywhalecc/static-php-cli/src/App/MyCommand.php

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/develop/system-build-tools.html b/zh/develop/system-build-tools.html index 6c7300ac..5177e2f8 100644 --- a/zh/develop/system-build-tools.html +++ b/zh/develop/system-build-tools.html @@ -5,20 +5,20 @@ 系统编译工具 | static-php-cli - - + + - + - - - + + + -
    Skip to content

    系统编译工具

    static-php-cli 在构建静态 PHP 时使用了许多系统编译工具,这些工具主要包括:

    • autoconf: 用于生成 configure 脚本。
    • make: 用于执行 Makefile
    • cmake: 用于执行 CMakeLists.txt
    • pkg-config: 用于查找依赖库的安装路径。
    • gcc: 用于在 Linux 下编译 C/C++ 语言代码。
    • clang: 用于在 macOS 下编译 C/C++ 语言代码。

    对于 Linux 和 macOS 操作系统,这些工具通常可以通过包管理安装,这部分在 doctor 模块中编写了。 理论上我们也可以通过编译和手动下载这些工具,但这样会增加编译的复杂度,所以我们不推荐这样做。

    Linux 环境编译工具

    对于 Linux 系统来说,不同发行版的编译工具安装方式不同。而且对于静态编译来说,某些发行版的包管理无法安装用于纯静态编译的库和工具, 所以对于 Linux 平台及其不同发行版,我们目前提供了多种编译环境的部署措施。

    glibc 环境

    glibc 环境指的是系统底层的 libc 库(即所有 C 语言编写的程序动态链接的 C 标准库)使用的是 glibc,这是大多数发行版的默认环境。 例如:Ubuntu、Debian、CentOS、RHEL、openSUSE、Arch Linux 等。

    而 glibc 环境下,我们使用的包管理、编译器都是默认指向 glibc 的,glibc 不能被良好地静态链接。它不能被静态链接的原因之一是它的网络库 nss 无法静态编译。

    对于 glibc 环境,在 2.0 RC8 及以后的 static-php-cli 及 spc 中,你可以选择两种方式来构建静态 PHP:

    1. 使用 Docker 构建,这是最简单的方式,你可以使用 bin/spc-alpine-docker 来构建,它会在 Alpine Linux 环境下构建。
    2. 使用 bin/spc doctor 安装 musl-wrapper 和 musl-cross-make 套件,然后直接正常构建。(相关源码

    一般来说,这两种构建方式的构建结果是一致的,你可以根据实际需求选择。

    在 doctor 模块中,static-php-cli 会先检测当前的 Linux 发行版。如果当前发行版是 glibc 环境,会提示需要安装 musl-wrapper 和 musl-cross-make 套件。

    在 glibc 环境下安装 musl-wrapper 的过程如下:

    1. 从 musl 官网下载特定版本的 musl-wrapper 源码
    2. 使用从包管理安装的 gcc 编译 musl-wrapper 源码,生成 musl-libc 等库:./configure --disable-gcc-wrapper && make -j && sudo make install
    3. musl-wrapper 相关库将被安装在 /usr/local/musl 目录。

    在 glibc 环境下安装 musl-cross-make 的过程如下:

    1. 从 dl.static-php.dev 下载预编译好的 musl-cross-make 压缩包。
    2. 解压到 /usr/local/musl 目录。

    TIP

    在 glibc 环境下,静态编译可以通过直接安装 musl-wrapper 来实现,但是 musl-wrapper 仅包含了 musl-gcc,而没有 musl-g++,这也就意味着无法编译 C++ 代码。 所以我们需要 musl-cross-make 来提供 musl-g++

    而 musl-cross-make 套件无法在本地直接编译的原因是它的编译环境要求比较高(需要 36GB 以上内存,Alpine Linux 下编译),所以我们提供了预编译好的二进制包,可用于所有 Linux 发行版。

    同时,部分发行版的包管理提供了 musl-wrapper,但 musl-cross-make 需要匹配对应的 musl-wrapper 版本,所以我们不使用包管理安装 musl-wrapper。

    对于如何编译 musl-cross-make,将在本章节内的 编译 musl-cross-make 小节中介绍。

    musl 环境

    musl 环境指的是系统底层的 libc 库使用的是 musl,这是一种轻量级的 C 标准库,它的特点是可以被良好地静态链接。

    对于目前流行的 Linux 发行版,Alpine Linux 使用的就是 musl 环境,所以 static-php-cli 在 Alpine Linux 下可以直接构建静态 PHP,仅需直接从包管理安装基础编译工具(如 gcc、cmake 等)即可。

    对于其他发行版,如果你的发行版使用的是 musl 环境,那么你也可以在安装必要的编译工具后直接使用 static-php-cli 构建静态 PHP。

    TIP

    在 musl 环境下,static-php-cli 会自动跳过 musl-wrapper 和 musl-cross-make 的安装。

    Docker 环境

    Docker 环境指的是使用 Docker 容器来构建静态 PHP,你可以使用 bin/spc-alpine-docker 来构建。 执行这个命令前需要先安装 Docker,然后在项目根目录执行 bin/spc-alpine-docker 即可。

    在执行 bin/spc-alpine-docker 后,static-php-cli 会自动下载 Alpine Linux 镜像,然后构建一个 cwcc-spc-x86_64cwcc-spc-aarch64 的镜像。 然后一切的构建都在这个镜像内进行,相当于在 Alpine Linux 内编译。总的来说,Docker 环境就是 musl 环境。

    musl-cross-make 工具链编译

    在 Linux 中,尽管你不需要手动编译 musl-cross-make 工具,但是如果你想了解它的编译过程,可以参考这里。 还有一个重要的原因就是,这个可能无法使用 CI、Actions 等自动化工具编译,因为现有的 CI 服务编译环境不满足 musl-cross-make 的编译要求,满足要求的配置价格太高。

    musl-cross-make 的编译过程如下:

    准备一个 Alpine Linux 环境(直接安装或使用 Docker 均可),编译的过程需要 36GB 以上内存,所以你需要在内存较大的机器上编译。如果没有这么多内存,可能会导致编译失败。

    然后将以下内容写入 config.mak 文件内:

    makefile
    STAT = -static --static
    +    
    Skip to content

    系统编译工具

    static-php-cli 在构建静态 PHP 时使用了许多系统编译工具,这些工具主要包括:

    • autoconf: 用于生成 configure 脚本。
    • make: 用于执行 Makefile
    • cmake: 用于执行 CMakeLists.txt
    • pkg-config: 用于查找依赖库的安装路径。
    • gcc: 用于在 Linux 下编译 C/C++ 语言代码。
    • clang: 用于在 macOS 下编译 C/C++ 语言代码。

    对于 Linux 和 macOS 操作系统,这些工具通常可以通过包管理安装,这部分在 doctor 模块中编写了。 理论上我们也可以通过编译和手动下载这些工具,但这样会增加编译的复杂度,所以我们不推荐这样做。

    Linux 环境编译工具

    对于 Linux 系统来说,不同发行版的编译工具安装方式不同。而且对于静态编译来说,某些发行版的包管理无法安装用于纯静态编译的库和工具, 所以对于 Linux 平台及其不同发行版,我们目前提供了多种编译环境的部署措施。

    glibc 环境

    glibc 环境指的是系统底层的 libc 库(即所有 C 语言编写的程序动态链接的 C 标准库)使用的是 glibc,这是大多数发行版的默认环境。 例如:Ubuntu、Debian、CentOS、RHEL、openSUSE、Arch Linux 等。

    而 glibc 环境下,我们使用的包管理、编译器都是默认指向 glibc 的,glibc 不能被良好地静态链接。它不能被静态链接的原因之一是它的网络库 nss 无法静态编译。

    对于 glibc 环境,在 2.0 RC8 及以后的 static-php-cli 及 spc 中,你可以选择两种方式来构建静态 PHP:

    1. 使用 Docker 构建,这是最简单的方式,你可以使用 bin/spc-alpine-docker 来构建,它会在 Alpine Linux 环境下构建。
    2. 使用 bin/spc doctor 安装 musl-wrapper 和 musl-cross-make 套件,然后直接正常构建。(相关源码

    一般来说,这两种构建方式的构建结果是一致的,你可以根据实际需求选择。

    在 doctor 模块中,static-php-cli 会先检测当前的 Linux 发行版。如果当前发行版是 glibc 环境,会提示需要安装 musl-wrapper 和 musl-cross-make 套件。

    在 glibc 环境下安装 musl-wrapper 的过程如下:

    1. 从 musl 官网下载特定版本的 musl-wrapper 源码
    2. 使用从包管理安装的 gcc 编译 musl-wrapper 源码,生成 musl-libc 等库:./configure --disable-gcc-wrapper && make -j && sudo make install
    3. musl-wrapper 相关库将被安装在 /usr/local/musl 目录。

    在 glibc 环境下安装 musl-cross-make 的过程如下:

    1. 从 dl.static-php.dev 下载预编译好的 musl-cross-make 压缩包。
    2. 解压到 /usr/local/musl 目录。

    TIP

    在 glibc 环境下,静态编译可以通过直接安装 musl-wrapper 来实现,但是 musl-wrapper 仅包含了 musl-gcc,而没有 musl-g++,这也就意味着无法编译 C++ 代码。 所以我们需要 musl-cross-make 来提供 musl-g++

    而 musl-cross-make 套件无法在本地直接编译的原因是它的编译环境要求比较高(需要 36GB 以上内存,Alpine Linux 下编译),所以我们提供了预编译好的二进制包,可用于所有 Linux 发行版。

    同时,部分发行版的包管理提供了 musl-wrapper,但 musl-cross-make 需要匹配对应的 musl-wrapper 版本,所以我们不使用包管理安装 musl-wrapper。

    对于如何编译 musl-cross-make,将在本章节内的 编译 musl-cross-make 小节中介绍。

    musl 环境

    musl 环境指的是系统底层的 libc 库使用的是 musl,这是一种轻量级的 C 标准库,它的特点是可以被良好地静态链接。

    对于目前流行的 Linux 发行版,Alpine Linux 使用的就是 musl 环境,所以 static-php-cli 在 Alpine Linux 下可以直接构建静态 PHP,仅需直接从包管理安装基础编译工具(如 gcc、cmake 等)即可。

    对于其他发行版,如果你的发行版使用的是 musl 环境,那么你也可以在安装必要的编译工具后直接使用 static-php-cli 构建静态 PHP。

    TIP

    在 musl 环境下,static-php-cli 会自动跳过 musl-wrapper 和 musl-cross-make 的安装。

    Docker 环境

    Docker 环境指的是使用 Docker 容器来构建静态 PHP,你可以使用 bin/spc-alpine-docker 来构建。 执行这个命令前需要先安装 Docker,然后在项目根目录执行 bin/spc-alpine-docker 即可。

    在执行 bin/spc-alpine-docker 后,static-php-cli 会自动下载 Alpine Linux 镜像,然后构建一个 cwcc-spc-x86_64cwcc-spc-aarch64 的镜像。 然后一切的构建都在这个镜像内进行,相当于在 Alpine Linux 内编译。总的来说,Docker 环境就是 musl 环境。

    musl-cross-make 工具链编译

    在 Linux 中,尽管你不需要手动编译 musl-cross-make 工具,但是如果你想了解它的编译过程,可以参考这里。 还有一个重要的原因就是,这个可能无法使用 CI、Actions 等自动化工具编译,因为现有的 CI 服务编译环境不满足 musl-cross-make 的编译要求,满足要求的配置价格太高。

    musl-cross-make 的编译过程如下:

    准备一个 Alpine Linux 环境(直接安装或使用 Docker 均可),编译的过程需要 36GB 以上内存,所以你需要在内存较大的机器上编译。如果没有这么多内存,可能会导致编译失败。

    然后将以下内容写入 config.mak 文件内:

    makefile
    STAT = -static --static
     FLAG = -g0 -Os -Wno-error
     
     ifneq ($(NATIVE),)
    @@ -84,8 +84,8 @@
     sed -i 's/poison calloc/poison/g' ./gcc-13.2.0/gcc/system.h
     make TARGET=x86_64-linux-musl -j
     make TARGET=x86_64-linux-musl install -j
    -tar cvzf x86_64-musl-toolchain.tgz output/*

    TIP

    以上所有脚本都适用于 x86_64 架构的 Linux。如果你需要构建 ARM 环境的 musl-cross-make,只需要将上方所有 x86_64 替换为 aarch64 即可。

    这个编译过程可能会因为内存不足、网络问题等原因导致编译失败,你可以多尝试几次,或者使用更大内存的机器来编译。 如果遇到了问题,或者你有更好的改进方案,可以在 讨论 中提出。

    macOS 环境编译工具

    对于 macOS 系统来说,我们使用的编译工具主要是 clang,它是 macOS 系统默认的编译器,同时也是 Xcode 的编译器。

    在 macOS 下编译,主要依赖于 Xcode 或 Xcode Command Line Tools,你可以在 App Store 下载 Xcode,或者在终端执行 xcode-select --install 来安装 Xcode Command Line Tools。

    此外,在 doctor 环境检查模块中,static-php-cli 会检查 macOS 系统是否安装了 Homebrew、编译工具等,如果没有,会提示你安装,这里不再赘述。

    FreeBSD 环境编译工具

    FreeBSD 也是 Unix 系统,它的编译工具和 macOS 类似,你可以直接使用包管理 pkg 安装 clang 等编译工具,通过 doctor 命令。

    pkg-config 编译

    如果你在使用 static-php-cli 构建静态 PHP 时仔细观察编译的日志,你会发现无论编译什么,都会先编译 pkg-config,这是因为 pkg-config 是一个用于查找依赖库的工具。 在早期的 static-php-cli 版本中,我们直接使用了包管理安装的 pkg-config 工具,但是这样会导致一些问题,例如:

    • 即使指定了 PKG_CONFIG_PATHpkg-config 也会尝试从系统路径中查找依赖包。
    • 由于 pkg-config 会从系统路径中查找依赖包,所以如果系统中存在同名的依赖包,可能会导致编译失败。

    为了避免以上问题,我们将 pkg-config 编译到用户态的 buildroot/bin 内并使用,使用了 --without-sysroot 等参数来避免从系统路径中查找依赖包。

    Released under the MIT License.

    - +tar cvzf x86_64-musl-toolchain.tgz output/*

    TIP

    以上所有脚本都适用于 x86_64 架构的 Linux。如果你需要构建 ARM 环境的 musl-cross-make,只需要将上方所有 x86_64 替换为 aarch64 即可。

    这个编译过程可能会因为内存不足、网络问题等原因导致编译失败,你可以多尝试几次,或者使用更大内存的机器来编译。 如果遇到了问题,或者你有更好的改进方案,可以在 讨论 中提出。

    macOS 环境编译工具

    对于 macOS 系统来说,我们使用的编译工具主要是 clang,它是 macOS 系统默认的编译器,同时也是 Xcode 的编译器。

    在 macOS 下编译,主要依赖于 Xcode 或 Xcode Command Line Tools,你可以在 App Store 下载 Xcode,或者在终端执行 xcode-select --install 来安装 Xcode Command Line Tools。

    此外,在 doctor 环境检查模块中,static-php-cli 会检查 macOS 系统是否安装了 Homebrew、编译工具等,如果没有,会提示你安装,这里不再赘述。

    FreeBSD 环境编译工具

    FreeBSD 也是 Unix 系统,它的编译工具和 macOS 类似,你可以直接使用包管理 pkg 安装 clang 等编译工具,通过 doctor 命令。

    pkg-config 编译

    如果你在使用 static-php-cli 构建静态 PHP 时仔细观察编译的日志,你会发现无论编译什么,都会先编译 pkg-config,这是因为 pkg-config 是一个用于查找依赖库的工具。 在早期的 static-php-cli 版本中,我们直接使用了包管理安装的 pkg-config 工具,但是这样会导致一些问题,例如:

    • 即使指定了 PKG_CONFIG_PATHpkg-config 也会尝试从系统路径中查找依赖包。
    • 由于 pkg-config 会从系统路径中查找依赖包,所以如果系统中存在同名的依赖包,可能会导致编译失败。

    为了避免以上问题,我们将 pkg-config 编译到用户态的 buildroot/bin 内并使用,使用了 --without-sysroot 等参数来避免从系统路径中查找依赖包。

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/faq/index.html b/zh/faq/index.html index f00a9a6a..1f377252 100644 --- a/zh/faq/index.html +++ b/zh/faq/index.html @@ -5,24 +5,24 @@ 常见问题 | static-php-cli - - + + - + - - - + + + -
    Skip to content

    常见问题

    这里将会编写一些你容易遇到的问题。目前有很多,但是我需要花时间来整理一下。

    php.ini 的路径是什么?

    在 Linux、macOS 和 FreeBSD 上,php.ini 的路径是 /usr/local/etc/php/php.ini。 在 Windows 中,路径是 C:\windows\php.iniphp.exe 所在的当前目录。 可以在 *nix 系统中使用手动构建选项 --with-config-file-path 来更改查找 php.ini 的目录。

    此外,在 Linux、macOS 和 FreeBSD 上,/usr/local/etc/php/conf.d 目录中的 .ini 文件也会被加载。 在 Windows 中,该路径默认为空。 可以使用手动构建选项 --with-config-file-scan-dir 更改该目录。

    PHP 默认也会从 其他标准位置 中搜索 php.ini

    静态编译的 PHP 可以安装扩展吗?

    因为传统架构下的 PHP 安装扩展的原理是使用 .so 类型的动态链接的库方式安装新扩展,而使用本项目编译的静态链接的 PHP。但是静态链接在不同操作系统有不同的定义。

    首先,对于 Linux 系统,静态链接的二进制文件不会链接系统的动态链接库。纯静态链接的二进制文件(-all-static)无法加载动态库,因此无法添加新扩展。 同时,在纯静态模式下,你也不能使用 ffi 等扩展来加载外部 .so 模块。

    你可以使用命令 ldd buildroot/bin/php 来检查你在 Linux 下构建的二进制文件是否为纯静态链接。

    如果你 构建基于 GNU libc 的 PHP,你可以使用 ffi 扩展来加载外部 .so 模块,并加载具有相同 ABI 的 .so 扩展。

    例如,你可以使用以下命令构建一个与 glibc 动态链接的静态 PHP 二进制文件,支持 FFI 扩展并加载相同 PHP 版本和相同 TS 类型的 xdebug.so 扩展:

    bash
    bin/spc-gnu-docker download --for-extensions=ffi,xml --with-php=8.4
    +    
    Skip to content

    常见问题

    这里将会编写一些你容易遇到的问题。目前有很多,但是我需要花时间来整理一下。

    php.ini 的路径是什么?

    在 Linux、macOS 和 FreeBSD 上,php.ini 的路径是 /usr/local/etc/php/php.ini。 在 Windows 中,路径是 C:\windows\php.iniphp.exe 所在的当前目录。 可以在 *nix 系统中使用手动构建选项 --with-config-file-path 来更改查找 php.ini 的目录。

    此外,在 Linux、macOS 和 FreeBSD 上,/usr/local/etc/php/conf.d 目录中的 .ini 文件也会被加载。 在 Windows 中,该路径默认为空。 可以使用手动构建选项 --with-config-file-scan-dir 更改该目录。

    PHP 默认也会从 其他标准位置 中搜索 php.ini

    静态编译的 PHP 可以安装扩展吗?

    因为传统架构下的 PHP 安装扩展的原理是使用 .so 类型的动态链接的库方式安装新扩展,而使用本项目编译的静态链接的 PHP。但是静态链接在不同操作系统有不同的定义。

    首先,对于 Linux 系统,静态链接的二进制文件不会链接系统的动态链接库。纯静态链接的二进制文件(-all-static)无法加载动态库,因此无法添加新扩展。 同时,在纯静态模式下,你也不能使用 ffi 等扩展来加载外部 .so 模块。

    你可以使用命令 ldd buildroot/bin/php 来检查你在 Linux 下构建的二进制文件是否为纯静态链接。

    如果你 构建基于 GNU libc 的 PHP,你可以使用 ffi 扩展来加载外部 .so 模块,并加载具有相同 ABI 的 .so 扩展。

    例如,你可以使用以下命令构建一个与 glibc 动态链接的静态 PHP 二进制文件,支持 FFI 扩展并加载相同 PHP 版本和相同 TS 类型的 xdebug.so 扩展:

    bash
    bin/spc-gnu-docker download --for-extensions=ffi,xml --with-php=8.4
     bin/spc-gnu-docker build ffi,xml --build-cli --debug
     
    -buildroot/bin/php -d "zend_extension=/path/to/php{PHP_VER}-{ts/nts}/xdebug.so" --ri xdebug

    对于 macOS 平台,macOS 下的几乎所有二进制文件都无法真正纯静态链接,几乎所有二进制文件都会链接 macOS 系统库:/usr/lib/libresolv.9.dylib/usr/lib/libSystem.B.dylib。 因此,在 macOS 上,你可以直接使用 SPC 构建具有动态链接扩展的静态编译 PHP 二进制文件:

    1. 使用 --build-shared=XXX 选项构建共享扩展 xxx.so。例如:bin/spc build bcmath,zlib --build-shared=xdebug --build-cli
    2. 你将获得 buildroot/modules/xdebug.sobuildroot/bin/php
    3. xdebug.so 文件可用于版本和线程安全相同的 php。

    可以支持 Oracle 数据库扩展吗?

    部分依赖库闭源的扩展,如 oci8sourceguardian 等,它们没有提供纯静态编译的依赖库文件(.a),仅提供了动态依赖库文件(.so), 这些扩展无法使用源码的形式编译到 static-php-cli 中,所以本项目可能永远也不会支持这些扩展。不过,理论上你可以根据上面的问题在 macOS 和 Linux 下接入和使用这类扩展。

    如果你对此类扩展有需求,或者大部分人都对这些闭源扩展使用有需求, 可以看看有关 standalone-php-cli 的讨论。欢迎留言。

    支持 Windows 吗?

    该项目目前支持 Windows,但支持的扩展数量较少。Windows 支持并不完美。主要有以下问题:

    1. Windows 的编译过程与 *nix 不同,使用的工具链也不同。用于编译每个扩展依赖库的编译工具也几乎完全不同。
    2. Windows 版本的需求也会根据所有使用本项目的人的需求推进。如果很多人需要,我会尽快支持相关扩展。

    我可以使用 micro 保护我的源代码吗?

    不可以。micro.sfx 本质上是将 php 和 php 代码合并为一个文件,没有编译或加密 PHP 代码的过程。

    首先,php-src 是 PHP 代码的官方解释器,市场上没有与主流分支兼容的 PHP 编译器。 我在网上看到一个名为 BPC(Binary PHP Compiler?)的项目可以将 PHP 编译为二进制,但有很多限制。

    加密和保护代码的方向与编译不同。编译后,也可以通过逆向工程等方法获得代码。真正的保护仍然通过打包和加密代码等手段进行。

    因此,本项目(static-php-cli)和相关项目(lwmbs、swoole-cli)都提供了 php-src 源代码的便捷编译工具。 本项目和相关项目引用的 phpmicro 只是 PHP 的 sapi 接口封装,而不是 PHP 代码的编译工具。 PHP 代码的编译器是一个完全不同的项目,因此不考虑额外的情况。 如果你对加密感兴趣,可以考虑使用现有的加密技术,如 Swoole Compiler、Source Guardian 等。

    无法使用 ssl

    更新:该问题已在最新版本的 static-php-cli 中修复,现在默认读取系统的证书文件。如果你仍然遇到问题,请尝试下面的解决方案。

    使用 curl、pgsql 等请求 HTTPS 网站或建立 SSL 连接时,可能会出现 error:80000002:system library::No such file or directory 错误。 此错误是由于静态编译的 PHP 未通过 php.ini 指定 openssl.cafile 导致的。

    你可以通过在使用 PHP 前指定 php.ini 并在 INI 中添加 openssl.cafile=/path/to/your-cert.pem 来解决此问题。

    对于 Linux 系统,你可以从 curl 官方网站下载 cacert.pem 文件,也可以使用系统自带的证书文件。 有关不同发行版的证书位置,请参考 Golang 文档

    INI 配置 openssl.cafile 不能使用 ini_set() 函数动态设置,因为 openssl.cafilePHP_INI_SYSTEM 类型的配置,只能在 php.ini 文件中设置。

    为什么不支持旧版本的 PHP?

    因为旧版本的 PHP 有很多问题,如安全问题、性能问题和功能问题。此外,许多旧版本的 PHP 与最新的依赖库不兼容,这也是不支持旧版本 PHP 的原因之一。

    你可以使用 static-php-cli 早期编译的旧版本,如 PHP 8.0,但不会明确支持早期版本。

    Released under the MIT License.

    - +buildroot/bin/php -d "zend_extension=/path/to/php{PHP_VER}-{ts/nts}/xdebug.so" --ri xdebug

    对于 macOS 平台,macOS 下的几乎所有二进制文件都无法真正纯静态链接,几乎所有二进制文件都会链接 macOS 系统库:/usr/lib/libresolv.9.dylib/usr/lib/libSystem.B.dylib。 因此,在 macOS 上,你可以直接使用 SPC 构建具有动态链接扩展的静态编译 PHP 二进制文件:

    1. 使用 --build-shared=XXX 选项构建共享扩展 xxx.so。例如:bin/spc build bcmath,zlib --build-shared=xdebug --build-cli
    2. 你将获得 buildroot/modules/xdebug.sobuildroot/bin/php
    3. xdebug.so 文件可用于版本和线程安全相同的 php。

    可以支持 Oracle 数据库扩展吗?

    部分依赖库闭源的扩展,如 oci8sourceguardian 等,它们没有提供纯静态编译的依赖库文件(.a),仅提供了动态依赖库文件(.so), 这些扩展无法使用源码的形式编译到 static-php-cli 中,所以本项目可能永远也不会支持这些扩展。不过,理论上你可以根据上面的问题在 macOS 和 Linux 下接入和使用这类扩展。

    如果你对此类扩展有需求,或者大部分人都对这些闭源扩展使用有需求, 可以看看有关 standalone-php-cli 的讨论。欢迎留言。

    支持 Windows 吗?

    该项目目前支持 Windows,但支持的扩展数量较少。Windows 支持并不完美。主要有以下问题:

    1. Windows 的编译过程与 *nix 不同,使用的工具链也不同。用于编译每个扩展依赖库的编译工具也几乎完全不同。
    2. Windows 版本的需求也会根据所有使用本项目的人的需求推进。如果很多人需要,我会尽快支持相关扩展。

    我可以使用 micro 保护我的源代码吗?

    不可以。micro.sfx 本质上是将 php 和 php 代码合并为一个文件,没有编译或加密 PHP 代码的过程。

    首先,php-src 是 PHP 代码的官方解释器,市场上没有与主流分支兼容的 PHP 编译器。 我在网上看到一个名为 BPC(Binary PHP Compiler?)的项目可以将 PHP 编译为二进制,但有很多限制。

    加密和保护代码的方向与编译不同。编译后,也可以通过逆向工程等方法获得代码。真正的保护仍然通过打包和加密代码等手段进行。

    因此,本项目(static-php-cli)和相关项目(lwmbs、swoole-cli)都提供了 php-src 源代码的便捷编译工具。 本项目和相关项目引用的 phpmicro 只是 PHP 的 sapi 接口封装,而不是 PHP 代码的编译工具。 PHP 代码的编译器是一个完全不同的项目,因此不考虑额外的情况。 如果你对加密感兴趣,可以考虑使用现有的加密技术,如 Swoole Compiler、Source Guardian 等。

    无法使用 ssl

    更新:该问题已在最新版本的 static-php-cli 中修复,现在默认读取系统的证书文件。如果你仍然遇到问题,请尝试下面的解决方案。

    使用 curl、pgsql 等请求 HTTPS 网站或建立 SSL 连接时,可能会出现 error:80000002:system library::No such file or directory 错误。 此错误是由于静态编译的 PHP 未通过 php.ini 指定 openssl.cafile 导致的。

    你可以通过在使用 PHP 前指定 php.ini 并在 INI 中添加 openssl.cafile=/path/to/your-cert.pem 来解决此问题。

    对于 Linux 系统,你可以从 curl 官方网站下载 cacert.pem 文件,也可以使用系统自带的证书文件。 有关不同发行版的证书位置,请参考 Golang 文档

    INI 配置 openssl.cafile 不能使用 ini_set() 函数动态设置,因为 openssl.cafilePHP_INI_SYSTEM 类型的配置,只能在 php.ini 文件中设置。

    为什么不支持旧版本的 PHP?

    因为旧版本的 PHP 有很多问题,如安全问题、性能问题和功能问题。此外,许多旧版本的 PHP 与最新的依赖库不兼容,这也是不支持旧版本 PHP 的原因之一。

    你可以使用 static-php-cli 早期编译的旧版本,如 PHP 8.0,但不会明确支持早期版本。

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/guide/action-build.html b/zh/guide/action-build.html index 9173ed02..00506bcb 100644 --- a/zh/guide/action-build.html +++ b/zh/guide/action-build.html @@ -5,21 +5,21 @@ Action 构建 | static-php-cli - - + + - + - - - + + + -
    Skip to content

    Action 构建

    Action 构建指的是直接使用 GitHub Action 进行编译。

    如果你不想自行编译,可以从本项目现有的 Action 下载 Artifact,也可以从自托管的服务器下载:进入

    自托管的二进制也是由 Action 构建而来,项目仓库地址。 包含的扩展有:bcmath,bz2,calendar,ctype,curl,dom,exif,fileinfo,filter,ftp,gd,gmp,iconv,xml,mbstring,mbregex,mysqlnd,openssl,pcntl,pdo,pdo_mysql,pdo_sqlite,phar,posix,redis,session,simplexml,soap,sockets,sqlite3,tokenizer,xmlwriter,xmlreader,zlib,zip

    构建方法

    使用 GitHub Action 可以方便地构建一个静态编译的 PHP 和 phpmicro,同时可以自行定义要编译的扩展。

    1. Fork 本项目。
    2. 进入项目的 Actions,选择 CI 开头的 Workflow(根据你需要的操作系统选择)。
    3. 选择 Run workflow,填入你要编译的 PHP 版本、目标类型、扩展列表。(扩展列表使用英文逗号分割,例如 bcmath,curl,mbstring
    4. 等待大约一段时间后,进入对应的任务中,获取 Artifacts

    如果你选择了 debug,则会在构建时输出所有日志,包括编译的日志,以供排查错误。

    如果你需要在其他环境构建,可以使用 手动构建

    扩展选择

    你可以到 扩展列表 中查看目前你需要的扩展是否均支持, 然后到 在线命令生成 中选择你需要编译的扩展,复制扩展字符串到 Action 的 extensions 中,编译即可。

    Released under the MIT License.

    - +
    Skip to content

    Action 构建

    Action 构建指的是直接使用 GitHub Action 进行编译。

    如果你不想自行编译,可以从本项目现有的 Action 下载 Artifact,也可以从自托管的服务器下载:进入

    自托管的二进制也是由 Action 构建而来,项目仓库地址。 包含的扩展有:bcmath,bz2,calendar,ctype,curl,dom,exif,fileinfo,filter,ftp,gd,gmp,iconv,xml,mbstring,mbregex,mysqlnd,openssl,pcntl,pdo,pdo_mysql,pdo_sqlite,phar,posix,redis,session,simplexml,soap,sockets,sqlite3,tokenizer,xmlwriter,xmlreader,zlib,zip

    构建方法

    使用 GitHub Action 可以方便地构建一个静态编译的 PHP 和 phpmicro,同时可以自行定义要编译的扩展。

    1. Fork 本项目。
    2. 进入项目的 Actions,选择 CI 开头的 Workflow(根据你需要的操作系统选择)。
    3. 选择 Run workflow,填入你要编译的 PHP 版本、目标类型、扩展列表。(扩展列表使用英文逗号分割,例如 bcmath,curl,mbstring
    4. 等待大约一段时间后,进入对应的任务中,获取 Artifacts

    如果你选择了 debug,则会在构建时输出所有日志,包括编译的日志,以供排查错误。

    如果你需要在其他环境构建,可以使用 手动构建

    扩展选择

    你可以到 扩展列表 中查看目前你需要的扩展是否均支持, 然后到 在线命令生成 中选择你需要编译的扩展,复制扩展字符串到 Action 的 extensions 中,编译即可。

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/guide/build-on-windows.html b/zh/guide/build-on-windows.html index fcf1c483..da2ab51a 100644 --- a/zh/guide/build-on-windows.html +++ b/zh/guide/build-on-windows.html @@ -5,20 +5,20 @@ 在 Windows 上构建 | static-php-cli - - + + - + - - - + + + -
    Skip to content

    在 Windows 上构建

    因为 Windows 系统是 NT 内核,与类 Unix 的操作系统使用的编译工具及操作系统接口几乎完全不同,所以在 Windows 上的构建流程会与 Unix 系统有些许不同。

    GitHub Actions 构建

    现在已支持从 Actions 构建 Windows 版本的 static-php 了。 和 Linux、macOS 一样,你需要先 Fork static-php-cli 仓库到你的 GitHub 账户中,然后你可以进入 扩展列表 选择要编译的扩展,然后进入自己仓库的 CI on Windows 选择 PHP 版本、填入扩展列表(逗号分割),点击 Run 即可。

    如果你要在本地开发或构建,请继续向下阅读。

    环境准备

    在 Windows 上构建静态 PHP 所需要的工具与 PHP 官方的 Windows 构建工具是相同的。你可以阅读 官方文档

    总结下来,你需要以下环境及工具:

    • Windows 10(需要 build 17063 或以后的更新)
    • Visual Studio 2019/2022(推荐 2022)
    • Visual Studio 的 C++ 桌面开发
    • Git for Windows
    • static-php-cli 仓库
    • PHP 和 Composer(static-php-cli 需要它们,可使用 bin/setup-runtime 自动安装)
    • php-sdk-binary-tools(可使用 doctor 自动安装)
    • strawberry-perl(可使用 doctor 自动安装)
    • nasm(可使用 doctor 自动安装)

    TIP

    static-php-cli 在 Windows 上的构建指的是使用 MSVC 构建 PHP,不基于 MinGW、Cygwin、WSL 等环境。

    如果你更倾向使用 WSL,请参考在 Linux 上构建的章节。

    在安装 Visual Studio 后,选择 C++ 桌面开发的工作负荷后,可能会下载 8GB 左右的编译工具,下载速度取决于你的网络状况。

    安装 Git

    Git for Windows 可以从 这里 下载并安装 Standalone Installer 64-bit 版本,安装在默认位置(C:\Program Files\Git\)。 如果不想手动下载和安装,你也可以使用 Visual Studio Installer,在单个组件的选择列表中,勾选 Git。

    准备 static-php-cli

    static-php-cli 项目的下载方式很简单,只需要使用 git clone 即可。推荐将项目放在 C:\spc-build\ 或类似目录,路径最好不要有空格。

    shell
    mkdir "C:\spc-build"
    +    
    Skip to content

    在 Windows 上构建

    因为 Windows 系统是 NT 内核,与类 Unix 的操作系统使用的编译工具及操作系统接口几乎完全不同,所以在 Windows 上的构建流程会与 Unix 系统有些许不同。

    GitHub Actions 构建

    现在已支持从 Actions 构建 Windows 版本的 static-php 了。 和 Linux、macOS 一样,你需要先 Fork static-php-cli 仓库到你的 GitHub 账户中,然后你可以进入 扩展列表 选择要编译的扩展,然后进入自己仓库的 CI on Windows 选择 PHP 版本、填入扩展列表(逗号分割),点击 Run 即可。

    如果你要在本地开发或构建,请继续向下阅读。

    环境准备

    在 Windows 上构建静态 PHP 所需要的工具与 PHP 官方的 Windows 构建工具是相同的。你可以阅读 官方文档

    总结下来,你需要以下环境及工具:

    • Windows 10(需要 build 17063 或以后的更新)
    • Visual Studio 2019/2022(推荐 2022)
    • Visual Studio 的 C++ 桌面开发
    • Git for Windows
    • static-php-cli 仓库
    • PHP 和 Composer(static-php-cli 需要它们,可使用 bin/setup-runtime 自动安装)
    • php-sdk-binary-tools(可使用 doctor 自动安装)
    • strawberry-perl(可使用 doctor 自动安装)
    • nasm(可使用 doctor 自动安装)

    TIP

    static-php-cli 在 Windows 上的构建指的是使用 MSVC 构建 PHP,不基于 MinGW、Cygwin、WSL 等环境。

    如果你更倾向使用 WSL,请参考在 Linux 上构建的章节。

    在安装 Visual Studio 后,选择 C++ 桌面开发的工作负荷后,可能会下载 8GB 左右的编译工具,下载速度取决于你的网络状况。

    安装 Git

    Git for Windows 可以从 这里 下载并安装 Standalone Installer 64-bit 版本,安装在默认位置(C:\Program Files\Git\)。 如果不想手动下载和安装,你也可以使用 Visual Studio Installer,在单个组件的选择列表中,勾选 Git。

    准备 static-php-cli

    static-php-cli 项目的下载方式很简单,只需要使用 git clone 即可。推荐将项目放在 C:\spc-build\ 或类似目录,路径最好不要有空格。

    shell
    mkdir "C:\spc-build"
     cd C:\spc-build
     git clone https://github.com/crazywhalecc/static-php-cli.git
     cd static-php-cli

    static-php-cli 自身需要 PHP 环境,是有点奇怪,但现在可以通过脚本快速安装 PHP 环境。 一般你的电脑不会安装 Windows 版本的 PHP,所以我们建议你在下载 static-php-cli 后,直接使用 bin/setup-runtime,在当前目录安装 PHP 和 Composer。

    shell
    # 安装 PHP 和 Composer 到 ./runtime/ 目录
    @@ -39,8 +39,8 @@
     my-app.exe

    使用 php.exe

    php.exe 编译后位于 buildroot\bin\ 目录,你可以将其拷贝到任意位置使用。

    shell
    .\php -v

    使用 micro

    phpmicro 是一个提供自执行二进制 PHP 的项目,本项目依赖 phpmicro 进行编译自执行二进制。详见 dixyes/phpmicro

    最后编译结果会输出一个 ./micro.sfx 的文件,此文件需要配合你的 PHP 源码使用。 该文件编译后会存放在 buildroot/bin/ 目录中。

    使用时应准备好你的项目源码文件,可以是单个 PHP 文件,也可以是 Phar 文件。

    如果要结合 phar 文件,编译时必须包含 phar 扩展!

    shell
    # code.php "<?php echo 'Hello world' . PHP_EOL;"
     bin/spc micro:combine code.php -O my-app.exe
     # Run it!!! Copy it to another computer!!!
    -./my-app.exe

    如果打包 PHAR 文件,仅需把 code.php 更换为 phar 文件路径即可。 你可以使用 box-project/box 将你的 CLI 项目打包为 Phar, 然后将它与 phpmicro 结合,生成独立可执行的二进制文件。

    有关 micro:combine 命令的更多细节,请参考 Unix 系统上的 命令

    Released under the MIT License.

    - +./my-app.exe

    如果打包 PHAR 文件,仅需把 code.php 更换为 phar 文件路径即可。 你可以使用 box-project/box 将你的 CLI 项目打包为 Phar, 然后将它与 phpmicro 结合,生成独立可执行的二进制文件。

    有关 micro:combine 命令的更多细节,请参考 Unix 系统上的 命令

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/guide/build-with-glibc.html b/zh/guide/build-with-glibc.html index 84b5a48c..5bc495fd 100644 --- a/zh/guide/build-with-glibc.html +++ b/zh/guide/build-with-glibc.html @@ -5,21 +5,21 @@ 构建 glibc 兼容的 Linux 二进制 | static-php-cli - - + + - + - - - + + + -
    Skip to content

    构建 glibc 兼容的 Linux 二进制

    为什么要构建 glibc 兼容的二进制

    目前,static-php-cli 在默认条件下在 Linux 系统构建的二进制都是基于 musl-libc(静态链接)的。 musl-libc 是一个轻量级的 libc 实现,它的目标是与 glibc 兼容,并且提供良好的纯静态链接支持。 这意味着,编译出来的静态 PHP 可执行文件在几乎任何 Linux 发行版都可以使用,而不需要考虑 libc、libstdc++ 等库的版本问题。

    但是,Linux 系统的纯静态链接 musl-libc 二进制文件存在以下问题:

    • 无法使用 PHP 的 dl() 函数加载动态链接库和外部 PHP 扩展。
    • 无法使用 PHP 的 FFI 扩展。
    • 部分极端情况下,可能会出现性能问题,参见 musl-libc 的性能问题

    对于不同的 Linux 发行版,它们使用的默认 libc 可能不同,比如 Alpine Linux 使用 musl libc,而大多数 Linux 发行版使用 glibc。 但即便如此,我们也不能直接使用任意的发行版和 glibc 构建便携的静态二进制文件,因为 glibc 有一些问题:

    • 基于新版本的发行版在使用 gcc 等工具构建的二进制,无法在旧版本的发行版上运行。
    • glibc 不推荐被静态链接,因为它的一些特性需要动态链接库的支持。

    但是,我们可以使用 Docker 容器来解决这个问题,最终输出的结果是一个动态链接 glibc 和一些必要库的二进制,但它静态链接所有其他依赖。

    1. 使用一个旧版本的 Linux 发行版(如 CentOS 7.x),它的 glibc 版本比较旧,但是可以在大多数现代 Linux 发行版上运行。
    2. 在这个容器中构建 PHP 的静态二进制文件,这样就可以在大多数现代 Linux 发行版上运行了。

    使用 glibc 的静态二进制文件,可以在大多数现代 Linux 发行版上运行,但是不能在 musl libc 的发行版上运行,如 CentOS 6、Alpine Linux 等。

    构建 glibc 兼容的 Linux 二进制

    最新版的 static-php-cli 内置了 bin/spc-gnu-docker 脚本,可以一键创建一个 CentOS 7.x (glibc-2.17) 的 Docker 容器,并在容器中构建 glibc 兼容的 PHP 静态二进制文件。

    然后,先运行一次以下命令。首次运行时时间较长,因为需要下载 CentOS 7.x 的镜像和一些编译工具。

    bash
    bin/spc-gnu-docker

    构建镜像完成后,你将看到和 bin/spc 一样的命令帮助菜单,这时说明容器已经准备好了。

    在容器准备好后,你可以参考 本地构建 章节的内容,构建你的 PHP 静态二进制文件。仅需要把 bin/spc./spc 替换为 bin/spc-gnu-docker 即可。

    bash
    bin/spc-gnu-docker build bcmath,ctype,openssl,pdo,phar,posix,session,tokenizer,xml,zip --build-cli --debug

    注意事项

    极少数情况下,基于 glibc 的静态 PHP 可能会出现 segment fault 等错误,但目前例子较少,如果遇到问题请提交 issue。

    glibc 构建为扩展的特性,不属于默认 static-php 的支持范围。如果有相关问题或需求,请在提交 Issue 时注明你是基于 glibc 构建的。

    如果你需要不使用 Docker 构建基于 glibc 的二进制,请参考 bin/spc-gnu-docker 脚本,手动构建一个类似的环境。

    请注意,我们仅支持使用 bin/spc-gnu-docker 构建的 glibc 版本。已在 RHEL 9 和 10 上进行了编译测试并验证其稳定性,但如果您遇到问题,我们可能不会进行修复。

    Released under the MIT License.

    - +
    Skip to content

    构建 glibc 兼容的 Linux 二进制

    为什么要构建 glibc 兼容的二进制

    目前,static-php-cli 在默认条件下在 Linux 系统构建的二进制都是基于 musl-libc(静态链接)的。 musl-libc 是一个轻量级的 libc 实现,它的目标是与 glibc 兼容,并且提供良好的纯静态链接支持。 这意味着,编译出来的静态 PHP 可执行文件在几乎任何 Linux 发行版都可以使用,而不需要考虑 libc、libstdc++ 等库的版本问题。

    但是,Linux 系统的纯静态链接 musl-libc 二进制文件存在以下问题:

    • 无法使用 PHP 的 dl() 函数加载动态链接库和外部 PHP 扩展。
    • 无法使用 PHP 的 FFI 扩展。
    • 部分极端情况下,可能会出现性能问题,参见 musl-libc 的性能问题

    对于不同的 Linux 发行版,它们使用的默认 libc 可能不同,比如 Alpine Linux 使用 musl libc,而大多数 Linux 发行版使用 glibc。 但即便如此,我们也不能直接使用任意的发行版和 glibc 构建便携的静态二进制文件,因为 glibc 有一些问题:

    • 基于新版本的发行版在使用 gcc 等工具构建的二进制,无法在旧版本的发行版上运行。
    • glibc 不推荐被静态链接,因为它的一些特性需要动态链接库的支持。

    但是,我们可以使用 Docker 容器来解决这个问题,最终输出的结果是一个动态链接 glibc 和一些必要库的二进制,但它静态链接所有其他依赖。

    1. 使用一个旧版本的 Linux 发行版(如 CentOS 7.x),它的 glibc 版本比较旧,但是可以在大多数现代 Linux 发行版上运行。
    2. 在这个容器中构建 PHP 的静态二进制文件,这样就可以在大多数现代 Linux 发行版上运行了。

    使用 glibc 的静态二进制文件,可以在大多数现代 Linux 发行版上运行,但是不能在 musl libc 的发行版上运行,如 CentOS 6、Alpine Linux 等。

    构建 glibc 兼容的 Linux 二进制

    最新版的 static-php-cli 内置了 bin/spc-gnu-docker 脚本,可以一键创建一个 CentOS 7.x (glibc-2.17) 的 Docker 容器,并在容器中构建 glibc 兼容的 PHP 静态二进制文件。

    然后,先运行一次以下命令。首次运行时时间较长,因为需要下载 CentOS 7.x 的镜像和一些编译工具。

    bash
    bin/spc-gnu-docker

    构建镜像完成后,你将看到和 bin/spc 一样的命令帮助菜单,这时说明容器已经准备好了。

    在容器准备好后,你可以参考 本地构建 章节的内容,构建你的 PHP 静态二进制文件。仅需要把 bin/spc./spc 替换为 bin/spc-gnu-docker 即可。

    bash
    bin/spc-gnu-docker build bcmath,ctype,openssl,pdo,phar,posix,session,tokenizer,xml,zip --build-cli --debug

    注意事项

    极少数情况下,基于 glibc 的静态 PHP 可能会出现 segment fault 等错误,但目前例子较少,如果遇到问题请提交 issue。

    glibc 构建为扩展的特性,不属于默认 static-php 的支持范围。如果有相关问题或需求,请在提交 Issue 时注明你是基于 glibc 构建的。

    如果你需要不使用 Docker 构建基于 glibc 的二进制,请参考 bin/spc-gnu-docker 脚本,手动构建一个类似的环境。

    请注意,我们仅支持使用 bin/spc-gnu-docker 构建的 glibc 版本。已在 RHEL 9 和 10 上进行了编译测试并验证其稳定性,但如果您遇到问题,我们可能不会进行修复。

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/guide/cli-generator.html b/zh/guide/cli-generator.html index 1f515d2d..019ba1e2 100644 --- a/zh/guide/cli-generator.html +++ b/zh/guide/cli-generator.html @@ -5,27 +5,27 @@ CLI 编译命令生成器 | static-php-cli - - + + - + - - - - + + + + -
    Skip to content

    CLI 编译命令生成器

    TIP

    下面选择扩展可能包含所选操作系统不支持的扩展,这可能导致编译失败。请先查阅 支持的扩展

    选择操作系统

    选择扩展


    选择常用扩展
    选择全部
    全部取消选择
    要构建的库

    TIP

    选择扩展后,不可选中的项目为必需的依赖,编译的依赖库列表中可选的为现有扩展和依赖库的可选依赖。选择可选依赖后,将生成 --with-libs 参数。

    无法同时构建所有扩展,因为有些扩展之间相互冲突。请根据需要选择扩展。

    选择编译目标

    编译选项

    编译环境
    下载 PHP 版本
    是否开启调试输出
    是否编译线程安全版
    是否展示仅下载对应扩展依赖的命令
    如果可能,下载预编译的依赖库(减少编译时间)
    是否开启 UPX 压缩(减小二进制体积)

    硬编码 INI 选项

    结果展示

    下载 spc 二进制命令
    curl -fsSL -o spc.tgz https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-x86_64.tar.gz && tar -zxvf spc.tgz && rm spc.tgz
    只下载对应扩展的依赖包命令
    ./spc download --with-php=8.4 --for-extensions "" --prefer-pre-built
    自动检查和准备构建环境命令
    ./spc doctor --auto-fix
    编译命令
    ./spc build --build-cli ""
    craft.yml
    php-version: 8.4 +
    Skip to content

    CLI 编译命令生成器

    TIP

    下面选择扩展可能包含所选操作系统不支持的扩展,这可能导致编译失败。请先查阅 支持的扩展

    选择操作系统

    选择扩展


    选择常用扩展
    选择全部
    全部取消选择
    要构建的库

    TIP

    选择扩展后,不可选中的项目为必需的依赖,编译的依赖库列表中可选的为现有扩展和依赖库的可选依赖。选择可选依赖后,将生成 --with-libs 参数。

    无法同时构建所有扩展,因为有些扩展之间相互冲突。请根据需要选择扩展。

    选择编译目标

    编译选项

    编译环境
    下载 PHP 版本
    是否开启调试输出
    是否编译线程安全版
    是否展示仅下载对应扩展依赖的命令
    如果可能,下载预编译的依赖库(减少编译时间)
    是否开启 UPX 压缩(减小二进制体积)

    硬编码 INI 选项

    结果展示

    下载 spc 二进制命令
    curl -fsSL -o spc.tgz https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-x86_64.tar.gz && tar -zxvf spc.tgz && rm spc.tgz
    只下载对应扩展的依赖包命令
    ./spc download --with-php=8.4 --for-extensions "" --prefer-pre-built
    自动检查和准备构建环境命令
    ./spc doctor --auto-fix
    编译命令
    ./spc build --build-cli ""
    craft.yml
    php-version: 8.4 extensions: "" sapi: cli build-options: prefer-pre-built: true -

    Released under the MIT License.

    - +

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/guide/deps-map.html b/zh/guide/deps-map.html index ff7e1a32..2598a269 100644 --- a/zh/guide/deps-map.html +++ b/zh/guide/deps-map.html @@ -5,21 +5,21 @@ 依赖关系图表 | static-php-cli - - + + - + - - - + + + -
    Skip to content

    依赖关系图表

    在编译 PHP 时,每个扩展、库都有依赖关系,这些依赖关系可能是必需的,也可能是可选的。在编译 PHP 时,可以选择是否包含这些可选的依赖关系。

    例如,在 Linux 下编译 gd 扩展时,会强制编译 zlib,libpng 库和 zlib 扩展,而 libavif,libwebp,libjpeg,freetype 库都是可选的库,默认不会编译,除非通过 --with-libs=avif,webp,jpeg,freetype 选项指定。

    • 对于可选扩展(扩展的可选特性),需手动在编译时指定,例如启用 Redis 的 igbinary 支持:bin/spc build redis,igbinary
    • 对于可选库,需通过 --with-libs=XXX 选项编译指定。
    • 如果想启用所有的可选扩展,可以使用 bin/spc build redis --with-suggested-exts 参数。
    • 如果想启用所有的可选库,可以使用 --with-suggested-libs 参数。

    扩展的依赖图

    Linux

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvpcntlunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    liburing
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    macOS

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    glfwglfw
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    Windows

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqpopenssllibrabbitmq
    brotlibrotli
    bz2bzip2
    curlzlib
    openssl
    curl
    dbaqdbm
    domxmllibxml2
    zlib
    evsockets
    ffilibffi-win
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gmsslgmssl
    iconvlibiconv-win
    igbinarysession
    apcu
    intlicu-static-win
    libxmlxml
    mbregexmbstringonig
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    parallelpthreads4w
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    pdo_pgsqlpdo
    pgsql
    postgresql-win
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql-win
    pharzlib
    redissession
    igbinary
    msgpack
    simplexmlxmllibxml2
    soapxmllibxml2
    sodiumlibsodium
    sqlite3sqlite
    ssh2openssl
    zlib
    libssh2
    swowopenssl
    curl
    openssl
    curl
    xlswriterzlib
    zip
    openssl
    xmliconvlibxml2
    xmlreaderxml
    dom
    libxml2
    xmlwriterxmllibxml2
    xzxz
    yamllibyaml
    zipzlib
    bz2
    libzip
    zlib
    bzip2
    xz
    zlibzlib

    FreeBSD

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    evsockets
    ftpopenssl
    mbregexmbstringonig
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    pdo_mysqlpdo
    mysqlnd
    pharzlib
    xzxz
    zlibzlib

    库的依赖表

    Linux

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libaclattr
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    macOS

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    Windows

    Library NameRequired LibrariesSuggested Libraries
    curlzlib
    libssh2
    nghttp2
    brotli
    zstd
    freetypezliblibpng
    bzip2
    brotli
    libjpegzlib
    libpngzlib
    librabbitmqopenssl
    libssh2openssl
    libxml2libiconv-winzlib
    libzipzlib
    bzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib

    FreeBSD

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    opensslzlib

    Released under the MIT License.

    - +
    Skip to content

    依赖关系图表

    在编译 PHP 时,每个扩展、库都有依赖关系,这些依赖关系可能是必需的,也可能是可选的。在编译 PHP 时,可以选择是否包含这些可选的依赖关系。

    例如,在 Linux 下编译 gd 扩展时,会强制编译 zlib,libpng 库和 zlib 扩展,而 libavif,libwebp,libjpeg,freetype 库都是可选的库,默认不会编译,除非通过 --with-libs=avif,webp,jpeg,freetype 选项指定。

    • 对于可选扩展(扩展的可选特性),需手动在编译时指定,例如启用 Redis 的 igbinary 支持:bin/spc build redis,igbinary
    • 对于可选库,需通过 --with-libs=XXX 选项编译指定。
    • 如果想启用所有的可选扩展,可以使用 bin/spc build redis --with-suggested-exts 参数。
    • 如果想启用所有的可选库,可以使用 --with-suggested-libs 参数。

    扩展的依赖图

    Linux

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvpcntlunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    liburing
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    macOS

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqplibrabbitmq
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    domlibxml2
    zlib
    evsockets
    eventopensslsocketslibevent
    ffilibffi
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gettextgettext
    glfwglfw
    gmpgmp
    gmsslgmssl
    grpcgrpc
    iconvlibiconv
    igbinarysession
    apcu
    imagickimagemagick
    imapopensslimap
    intlicu
    ldapopensslldapgmp
    libsodium
    libxmlxml
    lz4liblz4
    mbregexmbstringonig
    memcachezlib
    session
    memcachedsession
    zlib
    libmemcached
    fastlz
    mongodbicu
    openssl
    zstd
    zlib
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    odbcunixodbc
    opensslzlibopenssl
    zlib
    password-argon2libargon2
    openssl
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    unixodbc
    pdo_pgsqlpdo
    pgsql
    postgresql
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql
    pharzlib
    rdkafkalibrdkafka
    readlinereadline
    redissession
    igbinary
    msgpack
    zstd
    liblz4
    simplexmllibxml2
    snappyapcusnappy
    soaplibxml2
    sodiumlibsodium
    spxzlib
    sqlite3sqlite
    sqlsrvunixodbc
    ssh2openssl
    zlib
    libssh2
    swooleopenssl
    curl
    sockets
    swoole-hook-pgsql
    swoole-hook-mysql
    swoole-hook-sqlite
    swoole-hook-odbc
    libcares
    brotli
    nghttp2
    zlib
    zstd
    swoole-hook-mysqlmysqlnd
    pdo
    pdo_mysql
    swoole
    mysqli
    swoole-hook-pgsqlpgsql
    pdo
    swoole
    swoole-hook-sqlitesqlite3
    pdo
    swoole
    swoole-hook-odbcpdo
    swoole
    unixodbc
    swowopenssl
    curl
    openssl
    curl
    tidytidy
    uuidlibuuid
    uvsocketslibuv
    xhprofctype
    xlswriterzlib
    zip
    openssl
    xmllibxml2
    xmlreaderlibxml2
    xmlwriterlibxml2
    xslxml
    dom
    libxslt
    xzxz
    yacigbinaryfastlz
    yamllibyaml
    ziplibzip
    zlibzlib
    zstdzstd

    Windows

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    amqpopenssllibrabbitmq
    brotlibrotli
    bz2bzip2
    curlzlib
    openssl
    curl
    dbaqdbm
    domxmllibxml2
    zlib
    evsockets
    ffilibffi-win
    ftpopenssl
    gdzlibzlib
    libpng
    libavif
    libwebp
    libjpeg
    freetype
    gmsslgmssl
    iconvlibiconv-win
    igbinarysession
    apcu
    intlicu-static-win
    libxmlxml
    mbregexmbstringonig
    msgpacksession
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    parallelpthreads4w
    pdo_mysqlpdo
    mysqlnd
    pdo_odbcpdo
    odbc
    pdo_pgsqlpdo
    pgsql
    postgresql-win
    pdo_sqlitepdo
    sqlite3
    sqlite
    pdo_sqlsrvpdo
    sqlsrv
    pgsqlpostgresql-win
    pharzlib
    redissession
    igbinary
    msgpack
    simplexmlxmllibxml2
    soapxmllibxml2
    sodiumlibsodium
    sqlite3sqlite
    ssh2openssl
    zlib
    libssh2
    swowopenssl
    curl
    openssl
    curl
    xlswriterzlib
    zip
    openssl
    xmliconvlibxml2
    xmlreaderxml
    dom
    libxml2
    xmlwriterxmllibxml2
    xzxz
    yamllibyaml
    zipzlib
    bz2
    libzip
    zlib
    bzip2
    xz
    zlibzlib

    FreeBSD

    Extension NameRequired ExtensionsSuggested ExtensionsRequired LibrariesSuggested Libraries
    brotlibrotli
    bz2bzip2
    curlcurl
    dbaqdbm
    evsockets
    ftpopenssl
    mbregexmbstringonig
    mysqlimysqlnd
    mysqlndzlib
    opensslzlibopenssl
    zlib
    pdo_mysqlpdo
    mysqlnd
    pharzlib
    xzxz
    zlibzlib

    库的依赖表

    Linux

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libaclattr
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    macOS

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    freetypezliblibpng
    bzip2
    brotli
    gettextlibiconvncurses
    libxml2
    grpczlib
    openssl
    libcares
    imagemagickzlib
    libjpeg
    libjxl
    libpng
    libwebp
    freetype
    libtiff
    libheif
    bzip2
    zstd
    xz
    libzip
    libxml2
    imapopenssl
    ldapopenssl
    zlib
    gmp
    libsodium
    libeventopenssl
    libheiflibde265
    libwebp
    libaom
    zlib
    brotli
    libjxlbrotli
    libjpeg
    libpng
    libwebp
    libpngzlib
    librabbitmqopenssl
    librdkafkazstd
    libssh2openssl
    libtiffzlib
    libjpeg
    lerc
    libwebp
    jbig
    xz
    zstd
    libxml2libiconvxz
    icu
    zlib
    libxsltlibxml2
    libzipzlibbzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib
    postgresqllibiconv
    libxml2
    openssl
    zlib
    readline
    icu
    libxslt
    ldap
    zstd
    readlinencurses
    snappyzlib
    unixodbclibiconv
    xzlibiconv

    Windows

    Library NameRequired LibrariesSuggested Libraries
    curlzlib
    libssh2
    nghttp2
    brotli
    zstd
    freetypezliblibpng
    bzip2
    brotli
    libjpegzlib
    libpngzlib
    librabbitmqopenssl
    libssh2openssl
    libxml2libiconv-winzlib
    libzipzlib
    bzip2
    xz
    zstd
    openssl
    nghttp2zlib
    openssl
    libxml2
    nghttp3
    ngtcp2
    nghttp3openssl
    ngtcp2opensslnghttp3
    brotli
    opensslzlib

    FreeBSD

    Library NameRequired LibrariesSuggested Libraries
    curlopenssl
    zlib
    libssh2
    brotli
    nghttp2
    nghttp3
    ngtcp2
    zstd
    libcares
    ldap
    opensslzlib

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/guide/env-vars.html b/zh/guide/env-vars.html index 060d7a61..2950f1a8 100644 --- a/zh/guide/env-vars.html +++ b/zh/guide/env-vars.html @@ -5,20 +5,20 @@ 环境变量 | static-php-cli - - + + - + - - - + + + -
    Skip to content

    环境变量

    本页面的环境变量列表中所提到的所有环境变量都具有默认值,除非另有说明。你可以通过设置这些环境变量来覆盖默认值。

    环境变量列表

    在 2.3.5 版本之后,我们将环境变量集中到了 config/env.ini 文件中,你可以通过修改这个文件来设置环境变量。

    我们将 static-php-cli 支持的环境变量分为三种:

    • 全局内部环境变量:在 static-php-cli 启动后即声明,你可以在 static-php-cli 的内部使用 getenv() 来获取他们,也可以在启动 static-php-cli 前覆盖。
    • 固定环境变量:在 static-php-cli 启动后声明,你仅可使用 getenv() 获取,但无法通过 shell 脚本对其覆盖。
    • 配置文件环境变量:在 static-php-cli 构建前声明,你可以通过修改 config/env.ini 文件或通过 shell 脚本来设置这些环境变量。

    你可以阅读 config/env.ini 中每项参数的注释来了解其作用(仅限英文版)。

    自定义环境变量

    一般情况下,你不需要修改任何以下环境变量,因为它们已经被设置为最佳值。 但是,如果你有特殊需求,你可以通过设置这些环境变量来满足你的需求(比如你需要调试不同编译参数下的 PHP 性能表现)。

    如需使用自定义环境变量,你可以在终端中使用 export 命令或者在命令前直接设置环境变量,例如:

    shell
    # export 方式
    +    
    Skip to content

    环境变量

    本页面的环境变量列表中所提到的所有环境变量都具有默认值,除非另有说明。你可以通过设置这些环境变量来覆盖默认值。

    环境变量列表

    在 2.3.5 版本之后,我们将环境变量集中到了 config/env.ini 文件中,你可以通过修改这个文件来设置环境变量。

    我们将 static-php-cli 支持的环境变量分为三种:

    • 全局内部环境变量:在 static-php-cli 启动后即声明,你可以在 static-php-cli 的内部使用 getenv() 来获取他们,也可以在启动 static-php-cli 前覆盖。
    • 固定环境变量:在 static-php-cli 启动后声明,你仅可使用 getenv() 获取,但无法通过 shell 脚本对其覆盖。
    • 配置文件环境变量:在 static-php-cli 构建前声明,你可以通过修改 config/env.ini 文件或通过 shell 脚本来设置这些环境变量。

    你可以阅读 config/env.ini 中每项参数的注释来了解其作用(仅限英文版)。

    自定义环境变量

    一般情况下,你不需要修改任何以下环境变量,因为它们已经被设置为最佳值。 但是,如果你有特殊需求,你可以通过设置这些环境变量来满足你的需求(比如你需要调试不同编译参数下的 PHP 性能表现)。

    如需使用自定义环境变量,你可以在终端中使用 export 命令或者在命令前直接设置环境变量,例如:

    shell
    # export 方式
     export SPC_CONCURRENCY=4
     bin/spc build mbstring,pcntl --build-cli
     
    @@ -29,8 +29,8 @@
     SPC_CONCURRENCY=4
     
     [linux]
    -SPC_DEFAULT_C_FLAGS="-O3"

    编译依赖库的环境变量(仅限 Unix 系统)

    从 2.2.0 开始,static-php-cli 对所有 macOS、Linux、FreeBSD 等 Unix 系统的编译依赖库的命令均支持自定义环境变量。

    这样你就可以随时通过环境变量来调整编译依赖库的行为。例如你可以通过 xxx_CFLAGS=-O0 来设置编译 xxx 库的优化参数。

    当然,不是每个依赖库都支持注入环境变量,我们目前提供了三个通配的环境变量,后缀分别为:

    • _CFLAGS: C 编译器的参数
    • _LDFLAGS: 链接器的参数
    • _LIBS: 额外的链接库

    前缀为依赖库的名称,具体依赖库的名称以 lib.json 为准。其中,带有 - 的依赖库名称需要将 - 替换为 _

    下面是一个替换 openssl 库编译的优化选项示例:

    shell
    openssl_CFLAGS="-O0"

    库名称使用同 lib.json 中列举的名称,区分大小写。

    TIP

    当未指定相关环境变量时,除以下变量外,其余值均默认为空:

    var namevar default value
    pkg_config_CFLAGSmacOS: $SPC_DEFAULT_C_FLAGS -Wimplicit-function-declaration -Wno-int-conversion, Other: empty
    pkg_config_LDFLAGSLinux: --static, Other: empty
    imagemagick_LDFLAGSLinux: -static, Other: empty
    imagemagick_LIBSmacOS: -liconv, Other: empty
    ldap_LDFLAGS-L$BUILD_LIB_PATH
    openssl_CFLAGSLinux: $SPC_DEFAULT_C_FLAGS, Other: empty
    others...empty

    下表是支持自定义以上三种变量的依赖库名称列表:

    lib name
    brotli
    bzip
    curl
    freetype
    gettext
    gmp
    imagemagick
    ldap
    libargon2
    libavif
    libcares
    libevent
    openssl

    TIP

    因为给每个库适配自定义环境变量是一项特别繁琐的工作,且大部分情况下你都不需要这些库的自定义环境变量,所以我们目前只支持了部分库的自定义环境变量。

    如果你需要自定义环境变量的库不在上方列表,可以通过 GitHub Issue 来提出需求。

    Released under the MIT License.

    - +SPC_DEFAULT_C_FLAGS="-O3"

    编译依赖库的环境变量(仅限 Unix 系统)

    从 2.2.0 开始,static-php-cli 对所有 macOS、Linux、FreeBSD 等 Unix 系统的编译依赖库的命令均支持自定义环境变量。

    这样你就可以随时通过环境变量来调整编译依赖库的行为。例如你可以通过 xxx_CFLAGS=-O0 来设置编译 xxx 库的优化参数。

    当然,不是每个依赖库都支持注入环境变量,我们目前提供了三个通配的环境变量,后缀分别为:

    • _CFLAGS: C 编译器的参数
    • _LDFLAGS: 链接器的参数
    • _LIBS: 额外的链接库

    前缀为依赖库的名称,具体依赖库的名称以 lib.json 为准。其中,带有 - 的依赖库名称需要将 - 替换为 _

    下面是一个替换 openssl 库编译的优化选项示例:

    shell
    openssl_CFLAGS="-O0"

    库名称使用同 lib.json 中列举的名称,区分大小写。

    TIP

    当未指定相关环境变量时,除以下变量外,其余值均默认为空:

    var namevar default value
    pkg_config_CFLAGSmacOS: $SPC_DEFAULT_C_FLAGS -Wimplicit-function-declaration -Wno-int-conversion, Other: empty
    pkg_config_LDFLAGSLinux: --static, Other: empty
    imagemagick_LDFLAGSLinux: -static, Other: empty
    imagemagick_LIBSmacOS: -liconv, Other: empty
    ldap_LDFLAGS-L$BUILD_LIB_PATH
    openssl_CFLAGSLinux: $SPC_DEFAULT_C_FLAGS, Other: empty
    others...empty

    下表是支持自定义以上三种变量的依赖库名称列表:

    lib name
    brotli
    bzip
    curl
    freetype
    gettext
    gmp
    imagemagick
    ldap
    libargon2
    libavif
    libcares
    libevent
    openssl

    TIP

    因为给每个库适配自定义环境变量是一项特别繁琐的工作,且大部分情况下你都不需要这些库的自定义环境变量,所以我们目前只支持了部分库的自定义环境变量。

    如果你需要自定义环境变量的库不在上方列表,可以通过 GitHub Issue 来提出需求。

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/guide/extension-notes.html b/zh/guide/extension-notes.html index dd68f8bf..4b408304 100644 --- a/zh/guide/extension-notes.html +++ b/zh/guide/extension-notes.html @@ -5,21 +5,21 @@ 扩展注意事项 | static-php-cli - - + + - + - - - + + + -
    Skip to content

    扩展注意事项

    因为是静态编译,扩展不会 100% 完美编译,而且不同扩展对 PHP、环境都有不同的要求,这里将一一列举。

    curl

    HTTP3 支持默认未启用,需在编译时添加 --with-libs="nghttp2,nghttp3,ngtcp2" 以启用 PHP 8.4 及以上版本的 HTTP3 支持。

    使用 curl 请求 HTTPS 时,可能存在 error:80000002:system library::No such file or directory 错误, 解决办法详见 FAQ - 无法使用 ssl

    phpmicro

    1. phpmicro SAPI 仅支持 PHP >= 8.0 版本。

    swoole

    1. swoole >= 5.0 版本仅支持 PHP >= 8.0 版本。
    2. swoole 目前不支持 PHP 8.0 版本 curl 的 hook(后续有可能会修复)。
    3. 编译时只包含 swoole 扩展时不会完整开启支持的 Swoole 数据库协程 hook,如需使用请加入对应的 swoole-hook-xxx 扩展。
    4. swoole 在部分扩展组合下可能出现 zend_mm_heap corrupted 问题,暂未找到是什么原因导致的。

    swoole-hook-pgsql

    swoole-hook-pgsql 不是一个扩展,而是 Swoole 的 Hook 特性。 如果你在编译时添加了 swoole,swoole-hook-pgsql,你将启用 Swoole 的 PostgreSQL 客户端和 pdo_pgsql 扩展的协程模式。

    swoole-hook-pgsql 与 pdo_pgsql 扩展冲突。如需使用 Swoole 和 pdo_pgsql,请删除 pdo_pgsql 扩展,启用 swooleswoole-hook-pgsql 即可。 该扩展包含了 pdo_pgsql 的协程环境的实现。

    在 macOS 系统,pdo_pgsql 可能无法正常连接到 postgresql 服务器,请谨慎使用。

    swoole-hook-mysql

    swoole-hook-mysql 不是一个扩展,而是 Swoole 的 Hook 特性。 如果你在编译时添加了 swoole,swoole-hook-mysql,你将启用 Swoole 的 mysqlndpdo_mysql 的协程模式。

    swoole-hook-sqlite

    swoole-hook-sqlite 不是一个扩展,而是 Swoole 的 Hook 特性。 如果你在编译时添加了 swoole,swoole-hook-sqlite,你将启用 Swoole 的 pdo_sqlite 的协程模式(Swoole 必须为 5.1 以上)。

    swoole-hook-sqlite 与 pdo_sqlite 扩展冲突。如需使用 Swoole 和 pdo_sqlite,请删除 pdo_sqlite 扩展,启用 swooleswoole-hook-sqlite 即可。 该扩展包含了 pdo_sqlite 的协程环境的实现。

    swoole-hook-odbc

    swoole-hook-odbc 不是一个扩展,而是 Swoole 的 Hook 特性。 如果你在编译时添加了 swoole,swoole-hook-odbc,你将启用 Swoole 的 odbc 扩展的协程模式。

    swoole-hook-odbc 与 pdo_odbc 扩展冲突。如需使用 Swoole 和 pdo_odbc,请删除 pdo_odbc 扩展,启用 swooleswoole-hook-odbc 即可。 该扩展包含了 pdo_odbc 的协程环境的实现。

    swow

    1. swow 仅支持 PHP 8.0+ 版本。

    imagick

    1. OpenMP 支持已被禁用,这是维护者推荐的做法,系统软件包也是如此配置。

    imap

    1. 该扩展目前不支持 Kerberos。
    2. 由于底层的 c-client、ext-imap 不是线程安全的。 无法在 --enable-zts 构建中使用它。
    3. 该扩展已在 PHP 8.4 中被移除,因此我们建议您寻找替代实现,例如 Webklex/php-imap

    gd

    1. gd 扩展依赖了较多的额外图形库,默认情况下,直接使用 bin/spc build gd 不会引入和支持部分图形库,例如 libjpeglibavif 等, 需要使用 --with-libs 参数补全。目前支持 freetype,libjpeg,libavif,libwebp 四个库的支持,所以这里可以使用以下命令来让 gd 库引入它们:
    bash
    bin/spc build gd --with-libs=freetype,libjpeg,libavif,libwebp --build-cli

    mcrypt

    1. 目前未支持,未来也不计划支持此扩展。#32

    oci8

    1. oci8 是 Oracle 数据库的扩展,因为 Oracle 提供的扩展所依赖的库未提供静态编译版本(.a)或源代码,无法使用静态链接的方式将此扩展编译到 php 内,故无法支持。

    xdebug

    1. Xdebug 只能作为共享扩展进行构建。您需要使用除了 musl-static 外的其他 SPC_TARGET 构建目标。
    2. 使用 Linux/glibc 或 macOS 时,您可以使用 --build-shared=xdebug 将 Xdebug 编译为共享扩展。 编译后的 ./php 二进制文件可以通过指定 INI 文件进行配置和运行,例如 ./php -d 'zend_extension=/path/to/xdebug.so' your-code.php

    xml

    1. xml包括 xmlreader、xmlwriter、dom、simplexml 等,添加 xml 扩展时最好同时启用这些扩展。
    2. libxml 包含在 xml 扩展中。 启用 xml 相当于启用 libxml。

    glfw

    1. glfw 扩展依赖 OpenGL,在 Linux 平台还依赖 X11 等环境,这些库都无法被轻易地动态链接。
    2. 在 macOS 系统下,我们可以动态链接系统的 OpenGL 和一些相关的库。

    rar

    1. rar 扩展目前在 macOS x86_64 环境下与 common 扩展集合编译 phpmicro 存在问题。

    pgsql

    pgsql ssl 连接与 openssl 3.2.0 不兼容。相关链接:

    pgsql 16.2 修复了这个 Bug,现在正常工作了。

    在 pgsql 使用 SSL 连接时,可能存在 error:80000002:system library::No such file or directory 错误, 解决办法详见 FAQ - 无法使用 ssl

    openssl

    使用基于 openssl 的扩展(如 curl、pgsql 等网络库)时,可能存在 error:80000002:system library::No such file or directory 错误, 解决办法详见 FAQ - 无法使用 ssl

    password-argon2

    1. password-argon2不是一个标准的扩展。password_hash 函数的 PASSWORD_ARGON2ID 算法需要 libsodium 或 libargon2 才能工作。
    2. 使用 password-argon2 可以为此启用多线程支持。

    ffi

    1. 由于 musl libc 静态链接的限制,无法加载动态库,因此无法使用 ffi。 如果您需要使用 ffi 扩展,请参阅 使用 GNU libc 编译 PHP
    2. macOS 支持 ffi 扩展,但某些内核不包含调试符号时会出现错误。
    3. Windows x64 支持 ffi 扩展。

    xhprof

    xhprof 扩展包含三部分:xhprof_extensionxhprof_htmlxhprof_libs。编译的二进制中只包含 xhprof_extension。 如果需要使用 xhprof,请到 pecl.php.net/package/xhprof 下载源码,指定 xhprof_libsxhprof_html 路径来使用。

    event

    event 扩展在 macOS 系统下编译后暂无法使用 openpty 特性。相关 Issue:

    parallel

    parallel 扩展只支持 PHP 8.0 及以上版本,并只支持 ZTS 构建(--enable-zts)。

    spx

    1. SPX 目前不支持 Windows,且官方仓库也不支持静态编译,static-php-cli 使用了 修改版本

    mimalloc

    1. 从技术上讲,这不是扩展,而是一个库。
    2. 在 Linux 或 macOS 上使用 --with-libs="mimalloc" 进行构建将覆盖默认分配器。
    3. 目前,这还处于实验阶段,但建议在线程环境中使用。

    Released under the MIT License.

    - +
    Skip to content

    扩展注意事项

    因为是静态编译,扩展不会 100% 完美编译,而且不同扩展对 PHP、环境都有不同的要求,这里将一一列举。

    curl

    HTTP3 支持默认未启用,需在编译时添加 --with-libs="nghttp2,nghttp3,ngtcp2" 以启用 PHP 8.4 及以上版本的 HTTP3 支持。

    使用 curl 请求 HTTPS 时,可能存在 error:80000002:system library::No such file or directory 错误, 解决办法详见 FAQ - 无法使用 ssl

    phpmicro

    1. phpmicro SAPI 仅支持 PHP >= 8.0 版本。

    swoole

    1. swoole >= 5.0 版本仅支持 PHP >= 8.0 版本。
    2. swoole 目前不支持 PHP 8.0 版本 curl 的 hook(后续有可能会修复)。
    3. 编译时只包含 swoole 扩展时不会完整开启支持的 Swoole 数据库协程 hook,如需使用请加入对应的 swoole-hook-xxx 扩展。
    4. swoole 在部分扩展组合下可能出现 zend_mm_heap corrupted 问题,暂未找到是什么原因导致的。

    swoole-hook-pgsql

    swoole-hook-pgsql 不是一个扩展,而是 Swoole 的 Hook 特性。 如果你在编译时添加了 swoole,swoole-hook-pgsql,你将启用 Swoole 的 PostgreSQL 客户端和 pdo_pgsql 扩展的协程模式。

    swoole-hook-pgsql 与 pdo_pgsql 扩展冲突。如需使用 Swoole 和 pdo_pgsql,请删除 pdo_pgsql 扩展,启用 swooleswoole-hook-pgsql 即可。 该扩展包含了 pdo_pgsql 的协程环境的实现。

    在 macOS 系统,pdo_pgsql 可能无法正常连接到 postgresql 服务器,请谨慎使用。

    swoole-hook-mysql

    swoole-hook-mysql 不是一个扩展,而是 Swoole 的 Hook 特性。 如果你在编译时添加了 swoole,swoole-hook-mysql,你将启用 Swoole 的 mysqlndpdo_mysql 的协程模式。

    swoole-hook-sqlite

    swoole-hook-sqlite 不是一个扩展,而是 Swoole 的 Hook 特性。 如果你在编译时添加了 swoole,swoole-hook-sqlite,你将启用 Swoole 的 pdo_sqlite 的协程模式(Swoole 必须为 5.1 以上)。

    swoole-hook-sqlite 与 pdo_sqlite 扩展冲突。如需使用 Swoole 和 pdo_sqlite,请删除 pdo_sqlite 扩展,启用 swooleswoole-hook-sqlite 即可。 该扩展包含了 pdo_sqlite 的协程环境的实现。

    swoole-hook-odbc

    swoole-hook-odbc 不是一个扩展,而是 Swoole 的 Hook 特性。 如果你在编译时添加了 swoole,swoole-hook-odbc,你将启用 Swoole 的 odbc 扩展的协程模式。

    swoole-hook-odbc 与 pdo_odbc 扩展冲突。如需使用 Swoole 和 pdo_odbc,请删除 pdo_odbc 扩展,启用 swooleswoole-hook-odbc 即可。 该扩展包含了 pdo_odbc 的协程环境的实现。

    swow

    1. swow 仅支持 PHP 8.0+ 版本。

    imagick

    1. OpenMP 支持已被禁用,这是维护者推荐的做法,系统软件包也是如此配置。

    imap

    1. 该扩展目前不支持 Kerberos。
    2. 由于底层的 c-client、ext-imap 不是线程安全的。 无法在 --enable-zts 构建中使用它。
    3. 该扩展已在 PHP 8.4 中被移除,因此我们建议您寻找替代实现,例如 Webklex/php-imap

    gd

    1. gd 扩展依赖了较多的额外图形库,默认情况下,直接使用 bin/spc build gd 不会引入和支持部分图形库,例如 libjpeglibavif 等, 需要使用 --with-libs 参数补全。目前支持 freetype,libjpeg,libavif,libwebp 四个库的支持,所以这里可以使用以下命令来让 gd 库引入它们:
    bash
    bin/spc build gd --with-libs=freetype,libjpeg,libavif,libwebp --build-cli

    mcrypt

    1. 目前未支持,未来也不计划支持此扩展。#32

    oci8

    1. oci8 是 Oracle 数据库的扩展,因为 Oracle 提供的扩展所依赖的库未提供静态编译版本(.a)或源代码,无法使用静态链接的方式将此扩展编译到 php 内,故无法支持。

    xdebug

    1. Xdebug 只能作为共享扩展进行构建。您需要使用除了 musl-static 外的其他 SPC_TARGET 构建目标。
    2. 使用 Linux/glibc 或 macOS 时,您可以使用 --build-shared=xdebug 将 Xdebug 编译为共享扩展。 编译后的 ./php 二进制文件可以通过指定 INI 文件进行配置和运行,例如 ./php -d 'zend_extension=/path/to/xdebug.so' your-code.php

    xml

    1. xml包括 xmlreader、xmlwriter、dom、simplexml 等,添加 xml 扩展时最好同时启用这些扩展。
    2. libxml 包含在 xml 扩展中。 启用 xml 相当于启用 libxml。

    glfw

    1. glfw 扩展依赖 OpenGL,在 Linux 平台还依赖 X11 等环境,这些库都无法被轻易地动态链接。
    2. 在 macOS 系统下,我们可以动态链接系统的 OpenGL 和一些相关的库。

    rar

    1. rar 扩展目前在 macOS x86_64 环境下与 common 扩展集合编译 phpmicro 存在问题。

    pgsql

    pgsql ssl 连接与 openssl 3.2.0 不兼容。相关链接:

    pgsql 16.2 修复了这个 Bug,现在正常工作了。

    在 pgsql 使用 SSL 连接时,可能存在 error:80000002:system library::No such file or directory 错误, 解决办法详见 FAQ - 无法使用 ssl

    openssl

    使用基于 openssl 的扩展(如 curl、pgsql 等网络库)时,可能存在 error:80000002:system library::No such file or directory 错误, 解决办法详见 FAQ - 无法使用 ssl

    password-argon2

    1. password-argon2不是一个标准的扩展。password_hash 函数的 PASSWORD_ARGON2ID 算法需要 libsodium 或 libargon2 才能工作。
    2. 使用 password-argon2 可以为此启用多线程支持。

    ffi

    1. 由于 musl libc 静态链接的限制,无法加载动态库,因此无法使用 ffi。 如果您需要使用 ffi 扩展,请参阅 使用 GNU libc 编译 PHP
    2. macOS 支持 ffi 扩展,但某些内核不包含调试符号时会出现错误。
    3. Windows x64 支持 ffi 扩展。

    xhprof

    xhprof 扩展包含三部分:xhprof_extensionxhprof_htmlxhprof_libs。编译的二进制中只包含 xhprof_extension。 如果需要使用 xhprof,请到 pecl.php.net/package/xhprof 下载源码,指定 xhprof_libsxhprof_html 路径来使用。

    event

    event 扩展在 macOS 系统下编译后暂无法使用 openpty 特性。相关 Issue:

    parallel

    parallel 扩展只支持 PHP 8.0 及以上版本,并只支持 ZTS 构建(--enable-zts)。

    spx

    1. SPX 目前不支持 Windows,且官方仓库也不支持静态编译,static-php-cli 使用了 修改版本

    mimalloc

    1. 从技术上讲,这不是扩展,而是一个库。
    2. 在 Linux 或 macOS 上使用 --with-libs="mimalloc" 进行构建将覆盖默认分配器。
    3. 目前,这还处于实验阶段,但建议在线程环境中使用。

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/guide/extensions.html b/zh/guide/extensions.html index 5f656142..f9cfcf31 100644 --- a/zh/guide/extensions.html +++ b/zh/guide/extensions.html @@ -5,22 +5,22 @@ 扩展列表 | static-php-cli - - + + - + - - - - + + + + -
    Skip to content

    扩展列表

    • yes: 已支持
    • 空白: 目前还不支持,或正在支持中
    • no with issue link: 确定不支持或无法支持
    • partial with issue link: 已支持,但是无法完美工作
    Extension NameLinuxmacOSFreeBSDWindows
    amqpyesyesyes
    apcuyesyesyesyes
    astyesyesyesyes
    bcmathyesyesyesyes
    brotliyesyesyesyes
    bz2yesyesyesyes
    calendaryesyesyesyes
    ctypeyesyesyesyes
    curlyesyesyesyes
    dbayesyesyesyes
    dioyesyesyes
    domyesyesyes
    dsyesyesyesyes
    enchant
    evyesyesyesyes
    eventyesyes
    exifyesyesyesyes
    ffipartialyesyes
    fileinfoyesyesyesyes
    filteryesyesyesyes
    ftpyesyesyesyes
    gdyesyesyes
    gettextyesyes
    glfwnoyesno
    gmpyesyes
    gmsslyesyesyes
    grpcyesyes
    iconvyesyesyes
    igbinaryyesyesyes
    imagickyesyes
    imapyesyes
    inotifyyesnono
    intlyesyesyes
    ldapyesyes
    libxmlyesyesyes
    lz4yesyes
    mbregexyesyesyesyes
    mbstringyesyesyesyes
    mcryptnononono
    memcacheyesyes
    memcachedyesyes
    mongodbyesyes
    msgpackyesyesyes
    mysqliyesyesyesyes
    mysqlndyesyesyesyes
    oci8nonono
    odbcyesyes
    opcacheyesyesyesyes
    opensslyesyesyesyes
    opentelemetryyesyesyes
    parallelyesyesyes
    password-argon2yesyes
    pcntlyesyesyesno
    pdoyesyesyesyes
    pdo_mysqlyesyesyesyes
    pdo_odbcyesyesyes
    pdo_pgsqlyesyesyes
    pdo_sqliteyesyesyes
    pdo_sqlsrvyesyesyes
    pgsqlyesyesyes
    pharyesyesyesyes
    posixyesyesyesno
    protobufyesyes
    raryespartialyes
    rdkafkayesyes
    readlineyesyes
    redisyesyesyes
    sessionyesyesyesyes
    shmopyesyesyesyes
    simdjsonyesyesyesyes
    simplexmlyesyesyes
    snappyyesyes
    soapyesyesyes
    socketsyesyesyesyes
    sodiumyesyesyes
    spxyesyesno
    sqlite3yesyesyes
    sqlsrvyesyesyes
    ssh2yesyesyes
    swooleyesyesno
    swoole-hook-mysqlyesyesno
    swoole-hook-pgsqlyespartialno
    swoole-hook-sqliteyesyesno
    swoole-hook-odbcyesyesno
    swowyesyesyes
    sysvmsgyesyesno
    sysvsemyesyesno
    sysvshmyesyesyes
    tidyyesyes
    tokenizeryesyesyesyes
    uuidyesyes
    uvyesyes
    xdebugpartialpartialno
    xhprofyesyes
    xlswriteryesyesyes
    xmlyesyesyes
    xmlreaderyesyesyes
    xmlwriteryesyesyes
    xslyesyes
    xzyesyesyesyes
    yacyesyesyes
    yamlyesyesyes
    zipyesyesyes
    zlibyesyesyesyes
    zstdyesyes

    TIP

    如果缺少您需要的扩展,您可以创建 功能请求

    有些扩展或扩展依赖的库会有一些可选的特性,例如 gd 库可选支持 libwebp、freetype 等。 如果你只使用 bin/spc build gd --build-cli 是不会包含它们(static-php-cli 默认为最小依赖原则)。

    有关编译可选库,请参考 扩展、库的依赖关系图表。对于可选的库,你也可以从 编译命令生成器 中选择扩展后展开选择可选库。

    Released under the MIT License.

    - +
    Skip to content

    扩展列表

    • yes: 已支持
    • 空白: 目前还不支持,或正在支持中
    • no with issue link: 确定不支持或无法支持
    • partial with issue link: 已支持,但是无法完美工作
    Extension NameLinuxmacOSFreeBSDWindows
    amqpyesyesyes
    apcuyesyesyesyes
    astyesyesyesyes
    bcmathyesyesyesyes
    brotliyesyesyesyes
    bz2yesyesyesyes
    calendaryesyesyesyes
    ctypeyesyesyesyes
    curlyesyesyesyes
    dbayesyesyesyes
    dioyesyesyes
    domyesyesyes
    dsyesyesyesyes
    enchant
    evyesyesyesyes
    eventyesyes
    exifyesyesyesyes
    ffipartialyesyes
    fileinfoyesyesyesyes
    filteryesyesyesyes
    ftpyesyesyesyes
    gdyesyesyes
    gettextyesyes
    glfwnoyesno
    gmpyesyes
    gmsslyesyesyes
    grpcyesyes
    iconvyesyesyes
    igbinaryyesyesyes
    imagickyesyes
    imapyesyes
    inotifyyesnono
    intlyesyesyes
    ldapyesyes
    libxmlyesyesyes
    lz4yesyes
    mbregexyesyesyesyes
    mbstringyesyesyesyes
    mcryptnononono
    memcacheyesyes
    memcachedyesyes
    mongodbyesyes
    msgpackyesyesyes
    mysqliyesyesyesyes
    mysqlndyesyesyesyes
    oci8nonono
    odbcyesyes
    opcacheyesyesyesyes
    opensslyesyesyesyes
    opentelemetryyesyesyes
    parallelyesyesyes
    password-argon2yesyes
    pcntlyesyesyesno
    pdoyesyesyesyes
    pdo_mysqlyesyesyesyes
    pdo_odbcyesyesyes
    pdo_pgsqlyesyesyes
    pdo_sqliteyesyesyes
    pdo_sqlsrvyesyesyes
    pgsqlyesyesyes
    pharyesyesyesyes
    posixyesyesyesno
    protobufyesyes
    raryespartialyes
    rdkafkayesyes
    readlineyesyes
    redisyesyesyes
    sessionyesyesyesyes
    shmopyesyesyesyes
    simdjsonyesyesyesyes
    simplexmlyesyesyes
    snappyyesyes
    soapyesyesyes
    socketsyesyesyesyes
    sodiumyesyesyes
    spxyesyesno
    sqlite3yesyesyes
    sqlsrvyesyesyes
    ssh2yesyesyes
    swooleyesyesno
    swoole-hook-mysqlyesyesno
    swoole-hook-pgsqlyespartialno
    swoole-hook-sqliteyesyesno
    swoole-hook-odbcyesyesno
    swowyesyesyes
    sysvmsgyesyesno
    sysvsemyesyesno
    sysvshmyesyesyes
    tidyyesyes
    tokenizeryesyesyesyes
    uuidyesyes
    uvyesyes
    xdebugpartialpartialno
    xhprofyesyes
    xlswriteryesyesyes
    xmlyesyesyes
    xmlreaderyesyesyes
    xmlwriteryesyesyes
    xslyesyes
    xzyesyesyesyes
    yacyesyesyes
    yamlyesyesyes
    zipyesyesyes
    zlibyesyesyesyes
    zstdyesyes

    TIP

    如果缺少您需要的扩展,您可以创建 功能请求

    有些扩展或扩展依赖的库会有一些可选的特性,例如 gd 库可选支持 libwebp、freetype 等。 如果你只使用 bin/spc build gd --build-cli 是不会包含它们(static-php-cli 默认为最小依赖原则)。

    有关编译可选库,请参考 扩展、库的依赖关系图表。对于可选的库,你也可以从 编译命令生成器 中选择扩展后展开选择可选库。

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/guide/index.html b/zh/guide/index.html index 8b071652..fbf5c353 100644 --- a/zh/guide/index.html +++ b/zh/guide/index.html @@ -5,21 +5,21 @@ 指南 | static-php-cli - - + + - + - - - + + + -
    Skip to content

    指南

    static-php-cli 是一个用于构建静态编译的 PHP 二进制的工具,目前支持 Linux 和 macOS 系统。

    在指南章节中,你将了解到如何使用 static-php-cli 构建独立的 php 程序。

    编译环境

    下面是架构支持情况,⚙️ 代表支持 GitHub Action 构建,💻 代表支持本地构建,空 代表暂不支持。

    x86_64aarch64
    macOS⚙️ 💻⚙️ 💻
    Linux⚙️ 💻⚙️ 💻
    Windows⚙️ 💻
    FreeBSD💻💻

    其中,Linux 目前仅在 Ubuntu、Debian、Alpine 发行版测试通过,其他发行版未进行测试,不能保证编译成功。 对于未经过测试的发行版,可以使用 Docker 等方式本地编译,避免环境导致的问题。

    macOS 下支持 x86_64 和 Arm 两种架构,但在其中一个架构上编译的二进制无法直接在另一个架构上使用。 Rosetta 2 不能保证 Arm 架构编译的程序可以完全运行在 x86_64 环境下。

    Windows 目前只支持 x86_64 架构,不支持 32 位 x86、不支持 arm64 架构。

    PHP 支持版本

    目前,static-php-cli 对 PHP 8.1 ~ 8.5 版本是支持的,对于 PHP 8.0 及更早版本理论上支持,只需下载时选择早期版本即可。 但由于部分扩展和特殊组件已对早期版本的 PHP 停止了支持,所以 static-php-cli 不会明确支持早期版本。 我们推荐你编译尽可能新的 PHP 版本,以获得更好的体验。

    Released under the MIT License.

    - +
    Skip to content

    指南

    static-php-cli 是一个用于构建静态编译的 PHP 二进制的工具,目前支持 Linux 和 macOS 系统。

    在指南章节中,你将了解到如何使用 static-php-cli 构建独立的 php 程序。

    编译环境

    下面是架构支持情况,⚙️ 代表支持 GitHub Action 构建,💻 代表支持本地构建,空 代表暂不支持。

    x86_64aarch64
    macOS⚙️ 💻⚙️ 💻
    Linux⚙️ 💻⚙️ 💻
    Windows⚙️ 💻
    FreeBSD💻💻

    其中,Linux 目前仅在 Ubuntu、Debian、Alpine 发行版测试通过,其他发行版未进行测试,不能保证编译成功。 对于未经过测试的发行版,可以使用 Docker 等方式本地编译,避免环境导致的问题。

    macOS 下支持 x86_64 和 Arm 两种架构,但在其中一个架构上编译的二进制无法直接在另一个架构上使用。 Rosetta 2 不能保证 Arm 架构编译的程序可以完全运行在 x86_64 环境下。

    Windows 目前只支持 x86_64 架构,不支持 32 位 x86、不支持 arm64 架构。

    PHP 支持版本

    目前,static-php-cli 对 PHP 8.1 ~ 8.5 版本是支持的,对于 PHP 8.0 及更早版本理论上支持,只需下载时选择早期版本即可。 但由于部分扩展和特殊组件已对早期版本的 PHP 停止了支持,所以 static-php-cli 不会明确支持早期版本。 我们推荐你编译尽可能新的 PHP 版本,以获得更好的体验。

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/guide/manual-build.html b/zh/guide/manual-build.html index 1a8426b3..5a424478 100644 --- a/zh/guide/manual-build.html +++ b/zh/guide/manual-build.html @@ -5,20 +5,20 @@ 本地构建(Linux、macOS、FreeBSD) | static-php-cli - - + + - + - - - + + + -
    Skip to content

    本地构建(Linux、macOS、FreeBSD)

    本章节为 Linux、macOS、FreeBSD 的构建过程,如果你要在 Windows 上构建,请到 在 Windows 上构建

    手动构建(使用 SPC 二进制)(推荐)

    本项目提供了一个 static-php-cli 的二进制文件,你可以直接下载对应平台的二进制文件,然后使用它来构建静态的 PHP。目前 spc 二进制支持的平台有 Linux 和 macOS。

    使用以下命令从自托管服务器下载:

    bash
    # Download from self-hosted nightly builds (sync with main branch)
    +    
    Skip to content

    本地构建(Linux、macOS、FreeBSD)

    本章节为 Linux、macOS、FreeBSD 的构建过程,如果你要在 Windows 上构建,请到 在 Windows 上构建

    手动构建(使用 SPC 二进制)(推荐)

    本项目提供了一个 static-php-cli 的二进制文件,你可以直接下载对应平台的二进制文件,然后使用它来构建静态的 PHP。目前 spc 二进制支持的平台有 Linux 和 macOS。

    使用以下命令从自托管服务器下载:

    bash
    # Download from self-hosted nightly builds (sync with main branch)
     # For Linux x86_64
     curl -fsSL -o spc https://dl.static-php.dev/static-php-cli/spc-bin/nightly/spc-linux-x86_64
     # For Linux aarch64
    @@ -208,8 +208,8 @@
     clang embed.c $(bin/spc spc-config bcmath,zlib) -o embed
     
     ./embed
    -# out: Hello world!

    Released under the MIT License.

    - +# out: Hello world!

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/guide/troubleshooting.html b/zh/guide/troubleshooting.html index 0a30ca4c..66494d82 100644 --- a/zh/guide/troubleshooting.html +++ b/zh/guide/troubleshooting.html @@ -5,21 +5,21 @@ 故障排除 | static-php-cli - - + + - + - - - + + + -
    Skip to content

    故障排除

    使用 static-php-cli 过程中可能会碰到各种各样的故障,这里将讲述如何自行查看错误并反馈 Issue。

    下载失败问题

    下载资源问题是 spc 最常见的问题之一。主要是由于 spc 下载资源使用的地址一般均为对应项目的官方网站或 GitHub 等,而这些网站可能偶尔会宕机、屏蔽 IP 地址。 在遇到下载失败后,可以多次尝试调用下载命令。

    当下载资源时,你可能最终会看到类似 curl: (56) The requested URL returned error: 403 的错误,这通常是由于 GitHub 限制导致的。 你可以通过在命令中添加 --debug 来验证,会看到类似 [DEBU] Running command (no output) : curl -sfSL "https://api.github.com/repos/openssl/openssl/releases" 的输出。

    要解决这个问题,可以在 GitHub 上 创建 一个个人访问令牌,并将其设置为环境变量 GITHUB_TOKEN=<XXX>

    如果确认地址确实无法正常访问,可以提交 Issue 或 PR 更新地址或下载类型。

    Doctor 无法修复某些问题

    在绝大部分情况下,doctor 模块都可以对缺失的系统环境进行自动修复和安装,但也存在特殊的环境无法正常使用自动修复功能。

    由于系统限制(例如,Windows 下无法自动安装 Visual Studio 等软件),自动修复功能无法用于某些项目。 在遇到无法自动修复功能时,如果遇到 Some check items can not be fixed 字样,则表明无法自动修复。 请根据终端显示的方法提交 Issue 或自行修复环境。

    编译错误

    遇到编译错误时,如果没有开启 --debug 日志,请先开启调试日志,然后确定报错的命令。 报错的终端输出对于修复编译错误非常重要。 在提交 Issue 时,请上传终端日志的最后报错片段(或整个终端日志输出),并且包含使用的 spc 命令和参数。

    如果你是重复构建,请参考 本地构建 - 多次构建 章节。

    Released under the MIT License.

    - +
    Skip to content

    故障排除

    使用 static-php-cli 过程中可能会碰到各种各样的故障,这里将讲述如何自行查看错误并反馈 Issue。

    下载失败问题

    下载资源问题是 spc 最常见的问题之一。主要是由于 spc 下载资源使用的地址一般均为对应项目的官方网站或 GitHub 等,而这些网站可能偶尔会宕机、屏蔽 IP 地址。 在遇到下载失败后,可以多次尝试调用下载命令。

    当下载资源时,你可能最终会看到类似 curl: (56) The requested URL returned error: 403 的错误,这通常是由于 GitHub 限制导致的。 你可以通过在命令中添加 --debug 来验证,会看到类似 [DEBU] Running command (no output) : curl -sfSL "https://api.github.com/repos/openssl/openssl/releases" 的输出。

    要解决这个问题,可以在 GitHub 上 创建 一个个人访问令牌,并将其设置为环境变量 GITHUB_TOKEN=<XXX>

    如果确认地址确实无法正常访问,可以提交 Issue 或 PR 更新地址或下载类型。

    Doctor 无法修复某些问题

    在绝大部分情况下,doctor 模块都可以对缺失的系统环境进行自动修复和安装,但也存在特殊的环境无法正常使用自动修复功能。

    由于系统限制(例如,Windows 下无法自动安装 Visual Studio 等软件),自动修复功能无法用于某些项目。 在遇到无法自动修复功能时,如果遇到 Some check items can not be fixed 字样,则表明无法自动修复。 请根据终端显示的方法提交 Issue 或自行修复环境。

    编译错误

    遇到编译错误时,如果没有开启 --debug 日志,请先开启调试日志,然后确定报错的命令。 报错的终端输出对于修复编译错误非常重要。 在提交 Issue 时,请上传终端日志的最后报错片段(或整个终端日志输出),并且包含使用的 spc 命令和参数。

    如果你是重复构建,请参考 本地构建 - 多次构建 章节。

    Released under the MIT License.

    + \ No newline at end of file diff --git a/zh/index.html b/zh/index.html index 471de6cc..7c33f77a 100644 --- a/zh/index.html +++ b/zh/index.html @@ -5,21 +5,21 @@ static-php-cli - - + + - + - - - + + + -
    Skip to content

    static-php-cli

    在 Linux、macOS、FreeBSD、Windows 上与 PHP 项目一起构建独立的 PHP 二进制文件,并包含流行的扩展。

    Released under the MIT License.

    - +
    Skip to content

    static-php-cli

    在 Linux、macOS、FreeBSD、Windows 上与 PHP 项目一起构建独立的 PHP 二进制文件,并包含流行的扩展。

    Released under the MIT License.

    + \ No newline at end of file