From cd49fd918ab6883fba8f17827fdb7757e8afc0b0 Mon Sep 17 00:00:00 2001 From: Jesse205 Date: Sat, 23 Sep 2023 16:11:36 +0000 Subject: [PATCH] deploy: 1bc5f997114c0af83249045044e10275ed2c840c --- 404.html | 19 +- README.html | 53 +- app_changes.html | 25 +- assets/JetBrainsMono-Italic.f115aaa1.ttf | Bin 0 -> 308888 bytes assets/JetBrainsMono.662a196d.ttf | Bin 0 -> 303144 bytes assets/README.md.04cb5627.js | 1 - assets/README.md.04cb5627.lean.js | 1 - assets/README.md.e3702901.js | 27 + assets/README.md.e3702901.lean.js | 1 + assets/app.5ad92296.js | 1 - assets/app.d1ec6776.js | 1 + ...6856ae7f.js => app_changes.md.de37dcd7.js} | 2 +- ...ean.js => app_changes.md.de37dcd7.lean.js} | 2 +- assets/boot.md.5c35ff3b.js | 1 + ...b583f.lean.js => boot.md.5c35ff3b.lean.js} | 2 +- assets/boot.md.a0ab583f.js | 1 - assets/build.md.4713d06e.js | 4 - assets/build.md.4713d06e.lean.js | 1 - assets/build.md.66bfa6cb.js | 7 + assets/build.md.66bfa6cb.lean.js | 1 + assets/changes.md.0bfaa152.js | 1 - assets/changes.md.0bfaa152.lean.js | 1 - assets/changes.md.1854017d.js | 1 + assets/changes.md.1854017d.lean.js | 1 + .../chunks/@localSearchIndexroot.44f29214.js | 1 - .../chunks/@localSearchIndexroot.93b308b9.js | 1 + assets/chunks/VPLocalSearchBox.6e49b274.js | 7 + assets/chunks/VPLocalSearchBox.9fe80cd9.js | 1 - assets/chunks/framework.ed90c782.js | 2 + assets/chunks/framework.fc84ac3a.js | 2 - assets/chunks/theme.1c7a0dc0.js | 7 - assets/chunks/theme.98402b24.js | 1 + assets/delta_faq.md.f7380f2d.js | 1 + assets/delta_faq.md.f7380f2d.lean.js | 1 + assets/delta_internal-guide.md.65b191bb.js | 23 + .../delta_internal-guide.md.65b191bb.lean.js | 1 + assets/details.md.8ac7ccaf.js | 47 -- assets/details.md.8ac7ccaf.lean.js | 1 - assets/details.md.a7ca6af8.js | 93 +++ assets/details.md.a7ca6af8.lean.js | 1 + assets/faq.md.0f89f64c.js | 1 - assets/faq.md.0f89f64c.lean.js | 1 - assets/faq.md.d3f195dc.js | 1 + assets/faq.md.d3f195dc.lean.js | 1 + assets/guides.md.19fb9662.js | 134 ---- assets/guides.md.19fb9662.lean.js | 1 - assets/guides.md.513bdfd5.js | 267 +++++++ assets/guides.md.513bdfd5.lean.js | 1 + assets/index.md.43313836.js | 20 - assets/index.md.43313836.lean.js | 1 - assets/index.md.df26462f.js | 39 + assets/index.md.df26462f.lean.js | 1 + assets/install.md.4596894c.js | 7 + assets/install.md.4596894c.lean.js | 1 + assets/install.md.d1d3e2f1.js | 7 - assets/install.md.d1d3e2f1.lean.js | 1 - ...{ota.md.93c63cee.js => ota.md.65ab8a7c.js} | 2 +- ...c63cee.lean.js => ota.md.65ab8a7c.lean.js} | 2 +- assets/releases_18000.md.6eb41e04.js | 1 + assets/releases_18000.md.6eb41e04.lean.js | 1 + assets/releases_18000.md.7c18a94a.js | 1 - assets/releases_18000.md.7c18a94a.lean.js | 1 - ...c5ac9.js => releases_18100.md.4d7c3cf0.js} | 2 +- assets/releases_18100.md.4d7c3cf0.lean.js | 1 + assets/releases_18100.md.512c5ac9.lean.js | 1 - assets/releases_19000.md.13328490.lean.js | 1 - ...28490.js => releases_19000.md.ed972ef1.js} | 2 +- assets/releases_19000.md.ed972ef1.lean.js | 1 + ...27b55.js => releases_19100.md.10d48686.js} | 2 +- assets/releases_19100.md.10d48686.lean.js | 1 + assets/releases_19100.md.e4827b55.lean.js | 1 - ...67985.js => releases_19200.md.79dfaefa.js} | 2 +- ....js => releases_19200.md.79dfaefa.lean.js} | 2 +- ...82635.js => releases_19300.md.a7abaab5.js} | 2 +- ....js => releases_19300.md.a7abaab5.lean.js} | 2 +- ...9945f.js => releases_19400.md.40a338af.js} | 2 +- assets/releases_19400.md.40a338af.lean.js | 1 + assets/releases_19400.md.cd99945f.lean.js | 1 - ...a467b.js => releases_20000.md.6a645446.js} | 2 +- assets/releases_20000.md.6a645446.lean.js | 1 + assets/releases_20000.md.74fa467b.lean.js | 1 - ...41a26.js => releases_20100.md.4151533a.js} | 2 +- assets/releases_20100.md.4151533a.lean.js | 1 + assets/releases_20100.md.4cc41a26.lean.js | 1 - ...2625d.js => releases_20200.md.5d9b9708.js} | 2 +- assets/releases_20200.md.5d9b9708.lean.js | 1 + assets/releases_20200.md.f6d2625d.lean.js | 1 - assets/releases_20300.md.285288fe.js | 1 - assets/releases_20300.md.285288fe.lean.js | 1 - assets/releases_20300.md.b29964a4.js | 1 + assets/releases_20300.md.b29964a4.lean.js | 1 + assets/releases_20400.md.b4d99bf2.js | 1 - assets/releases_20400.md.b4d99bf2.lean.js | 1 - assets/releases_20400.md.f3caa241.js | 1 + assets/releases_20400.md.f3caa241.lean.js | 1 + assets/releases_21000.md.792fbc82.js | 1 - assets/releases_21000.md.792fbc82.lean.js | 1 - assets/releases_21000.md.94426129.js | 1 + assets/releases_21000.md.94426129.lean.js | 1 + assets/releases_21100.md.945acb51.js | 1 - assets/releases_21100.md.945acb51.lean.js | 1 - assets/releases_21100.md.ac6f3d1f.js | 1 + assets/releases_21100.md.ac6f3d1f.lean.js | 1 + assets/releases_21200.md.c9fd3f8c.js | 1 - assets/releases_21200.md.c9fd3f8c.lean.js | 1 - assets/releases_21200.md.f65699a3.js | 1 + assets/releases_21200.md.f65699a3.lean.js | 1 + assets/releases_21400.md.b582e920.js | 1 - assets/releases_21400.md.b582e920.lean.js | 1 - assets/releases_21400.md.bf9f03aa.js | 1 + assets/releases_21400.md.bf9f03aa.lean.js | 1 + assets/releases_22000.md.8c658003.js | 1 - assets/releases_22000.md.8c658003.lean.js | 1 - assets/releases_22000.md.a664d51e.js | 1 + assets/releases_22000.md.a664d51e.lean.js | 1 + assets/releases_22100.md.551a2e63.js | 1 - assets/releases_22100.md.551a2e63.lean.js | 1 - assets/releases_22100.md.fafc6195.js | 1 + assets/releases_22100.md.fafc6195.lean.js | 1 + assets/releases_23000.md.7d4a1d83.js | 1 + assets/releases_23000.md.7d4a1d83.lean.js | 1 + assets/releases_23000.md.bacddf11.js | 1 - assets/releases_23000.md.bacddf11.lean.js | 1 - assets/releases_24000.md.1958b910.js | 1 - assets/releases_24000.md.1958b910.lean.js | 1 - assets/releases_24000.md.a2288654.js | 1 + assets/releases_24000.md.a2288654.lean.js | 1 + assets/releases_24100.md.15429fef.js | 1 + assets/releases_24100.md.15429fef.lean.js | 1 + assets/releases_24100.md.6b9a3320.js | 1 - assets/releases_24100.md.6b9a3320.lean.js | 1 - assets/releases_24200.md.6091c70d.js | 1 - assets/releases_24200.md.6091c70d.lean.js | 1 - assets/releases_24200.md.eab9d9d7.js | 1 + assets/releases_24200.md.eab9d9d7.lean.js | 1 + assets/releases_24300.md.3ff8f899.js | 1 - assets/releases_24300.md.3ff8f899.lean.js | 1 - assets/releases_24300.md.8db6782c.js | 1 + assets/releases_24300.md.8db6782c.lean.js | 1 + assets/releases_25000.md.6c7ad114.js | 1 - assets/releases_25000.md.6c7ad114.lean.js | 1 - assets/releases_25000.md.a96540ec.js | 1 + assets/releases_25000.md.a96540ec.lean.js | 1 + assets/releases_25100.md.16546601.js | 1 + assets/releases_25100.md.16546601.lean.js | 1 + assets/releases_25100.md.7021edff.js | 1 - assets/releases_25100.md.7021edff.lean.js | 1 - assets/releases_25200.md.1983de15.js | 1 - assets/releases_25200.md.1983de15.lean.js | 1 - assets/releases_25200.md.94a4189a.js | 1 + assets/releases_25200.md.94a4189a.lean.js | 1 + assets/releases_26000.md.8ba36e0d.js | 1 + assets/releases_26000.md.8ba36e0d.lean.js | 1 + assets/releases_26000.md.dc2422e5.js | 1 - assets/releases_26000.md.dc2422e5.lean.js | 1 - assets/releases_26100.md.3336cb75.js | 1 + assets/releases_26100.md.3336cb75.lean.js | 1 + assets/releases_26100.md.6724a4c6.js | 1 - assets/releases_26100.md.6724a4c6.lean.js | 1 - assets/releases_26200.md.20898ea4.js | 1 + assets/releases_26200.md.20898ea4.lean.js | 1 + assets/releases_26300.md.7a9b8346.js | 1 + assets/releases_26300.md.7a9b8346.lean.js | 1 + assets/releases_index.md.2825e5f5.js | 1 + ....js => releases_index.md.2825e5f5.lean.js} | 2 +- assets/releases_index.md.b47a879f.js | 1 - assets/style.645eff1b.css | 1 - assets/style.f2974067.css | 1 + assets/tools.md.4de0b4c5.js | 231 ------ assets/tools.md.4de0b4c5.lean.js | 1 - assets/tools.md.641886ad.js | 461 +++++++++++ assets/tools.md.641886ad.lean.js | 1 + boot.html | 25 +- build.html | 34 +- changes.html | 25 +- delta/faq.html | 27 + delta/internal-guide.html | 49 ++ details.html | 163 ++-- faq.html | 25 +- guides.html | 410 ++++++---- hashmap.json | 2 +- index.html | 82 +- install.html | 37 +- ota.html | 25 +- releases/18000.html | 27 +- releases/18100.html | 25 +- releases/19000.html | 25 +- releases/19100.html | 25 +- releases/19200.html | 25 +- releases/19300.html | 25 +- releases/19400.html | 25 +- releases/20000.html | 25 +- releases/20100.html | 25 +- releases/20200.html | 25 +- releases/20300.html | 25 +- releases/20400.html | 27 +- releases/21000.html | 27 +- releases/21100.html | 27 +- releases/21200.html | 27 +- releases/21400.html | 27 +- releases/22000.html | 27 +- releases/22100.html | 27 +- releases/23000.html | 27 +- releases/24000.html | 27 +- releases/24100.html | 27 +- releases/24200.html | 27 +- releases/24300.html | 27 +- releases/25000.html | 27 +- releases/25100.html | 27 +- releases/25200.html | 27 +- releases/26000.html | 27 +- releases/26100.html | 27 +- releases/26200.html | 27 + releases/26300.html | 27 + releases/index.html | 25 +- tools.html | 715 ++++++++++++------ 216 files changed, 2641 insertions(+), 1441 deletions(-) create mode 100644 assets/JetBrainsMono-Italic.f115aaa1.ttf create mode 100644 assets/JetBrainsMono.662a196d.ttf delete mode 100644 assets/README.md.04cb5627.js delete mode 100644 assets/README.md.04cb5627.lean.js create mode 100644 assets/README.md.e3702901.js create mode 100644 assets/README.md.e3702901.lean.js delete mode 100644 assets/app.5ad92296.js create mode 100644 assets/app.d1ec6776.js rename assets/{app_changes.md.6856ae7f.js => app_changes.md.de37dcd7.js} (99%) rename assets/{app_changes.md.6856ae7f.lean.js => app_changes.md.de37dcd7.lean.js} (70%) create mode 100644 assets/boot.md.5c35ff3b.js rename assets/{boot.md.a0ab583f.lean.js => boot.md.5c35ff3b.lean.js} (52%) delete mode 100644 assets/boot.md.a0ab583f.js delete mode 100644 assets/build.md.4713d06e.js delete mode 100644 assets/build.md.4713d06e.lean.js create mode 100644 assets/build.md.66bfa6cb.js create mode 100644 assets/build.md.66bfa6cb.lean.js delete mode 100644 assets/changes.md.0bfaa152.js delete mode 100644 assets/changes.md.0bfaa152.lean.js create mode 100644 assets/changes.md.1854017d.js create mode 100644 assets/changes.md.1854017d.lean.js delete mode 100644 assets/chunks/@localSearchIndexroot.44f29214.js create mode 100644 assets/chunks/@localSearchIndexroot.93b308b9.js create mode 100644 assets/chunks/VPLocalSearchBox.6e49b274.js delete mode 100644 assets/chunks/VPLocalSearchBox.9fe80cd9.js create mode 100644 assets/chunks/framework.ed90c782.js delete mode 100644 assets/chunks/framework.fc84ac3a.js delete mode 100644 assets/chunks/theme.1c7a0dc0.js create mode 100644 assets/chunks/theme.98402b24.js create mode 100644 assets/delta_faq.md.f7380f2d.js create mode 100644 assets/delta_faq.md.f7380f2d.lean.js create mode 100644 assets/delta_internal-guide.md.65b191bb.js create mode 100644 assets/delta_internal-guide.md.65b191bb.lean.js delete mode 100644 assets/details.md.8ac7ccaf.js delete mode 100644 assets/details.md.8ac7ccaf.lean.js create mode 100644 assets/details.md.a7ca6af8.js create mode 100644 assets/details.md.a7ca6af8.lean.js delete mode 100644 assets/faq.md.0f89f64c.js delete mode 100644 assets/faq.md.0f89f64c.lean.js create mode 100644 assets/faq.md.d3f195dc.js create mode 100644 assets/faq.md.d3f195dc.lean.js delete mode 100644 assets/guides.md.19fb9662.js delete mode 100644 assets/guides.md.19fb9662.lean.js create mode 100644 assets/guides.md.513bdfd5.js create mode 100644 assets/guides.md.513bdfd5.lean.js delete mode 100644 assets/index.md.43313836.js delete mode 100644 assets/index.md.43313836.lean.js create mode 100644 assets/index.md.df26462f.js create mode 100644 assets/index.md.df26462f.lean.js create mode 100644 assets/install.md.4596894c.js create mode 100644 assets/install.md.4596894c.lean.js delete mode 100644 assets/install.md.d1d3e2f1.js delete mode 100644 assets/install.md.d1d3e2f1.lean.js rename assets/{ota.md.93c63cee.js => ota.md.65ab8a7c.js} (97%) rename assets/{ota.md.93c63cee.lean.js => ota.md.65ab8a7c.lean.js} (80%) create mode 100644 assets/releases_18000.md.6eb41e04.js create mode 100644 assets/releases_18000.md.6eb41e04.lean.js delete mode 100644 assets/releases_18000.md.7c18a94a.js delete mode 100644 assets/releases_18000.md.7c18a94a.lean.js rename assets/{releases_18100.md.512c5ac9.js => releases_18100.md.4d7c3cf0.js} (62%) create mode 100644 assets/releases_18100.md.4d7c3cf0.lean.js delete mode 100644 assets/releases_18100.md.512c5ac9.lean.js delete mode 100644 assets/releases_19000.md.13328490.lean.js rename assets/{releases_19000.md.13328490.js => releases_19000.md.ed972ef1.js} (88%) create mode 100644 assets/releases_19000.md.ed972ef1.lean.js rename assets/{releases_19100.md.e4827b55.js => releases_19100.md.10d48686.js} (50%) create mode 100644 assets/releases_19100.md.10d48686.lean.js delete mode 100644 assets/releases_19100.md.e4827b55.lean.js rename assets/{releases_19200.md.7a067985.js => releases_19200.md.79dfaefa.js} (76%) rename assets/{releases_19200.md.7a067985.lean.js => releases_19200.md.79dfaefa.lean.js} (76%) rename assets/{releases_19300.md.63682635.js => releases_19300.md.a7abaab5.js} (76%) rename assets/{releases_19300.md.63682635.lean.js => releases_19300.md.a7abaab5.lean.js} (76%) rename assets/{releases_19400.md.cd99945f.js => releases_19400.md.40a338af.js} (77%) create mode 100644 assets/releases_19400.md.40a338af.lean.js delete mode 100644 assets/releases_19400.md.cd99945f.lean.js rename assets/{releases_20000.md.74fa467b.js => releases_20000.md.6a645446.js} (78%) create mode 100644 assets/releases_20000.md.6a645446.lean.js delete mode 100644 assets/releases_20000.md.74fa467b.lean.js rename assets/{releases_20100.md.4cc41a26.js => releases_20100.md.4151533a.js} (68%) create mode 100644 assets/releases_20100.md.4151533a.lean.js delete mode 100644 assets/releases_20100.md.4cc41a26.lean.js rename assets/{releases_20200.md.f6d2625d.js => releases_20200.md.5d9b9708.js} (68%) create mode 100644 assets/releases_20200.md.5d9b9708.lean.js delete mode 100644 assets/releases_20200.md.f6d2625d.lean.js delete mode 100644 assets/releases_20300.md.285288fe.js delete mode 100644 assets/releases_20300.md.285288fe.lean.js create mode 100644 assets/releases_20300.md.b29964a4.js create mode 100644 assets/releases_20300.md.b29964a4.lean.js delete mode 100644 assets/releases_20400.md.b4d99bf2.js delete mode 100644 assets/releases_20400.md.b4d99bf2.lean.js create mode 100644 assets/releases_20400.md.f3caa241.js create mode 100644 assets/releases_20400.md.f3caa241.lean.js delete mode 100644 assets/releases_21000.md.792fbc82.js delete mode 100644 assets/releases_21000.md.792fbc82.lean.js create mode 100644 assets/releases_21000.md.94426129.js create mode 100644 assets/releases_21000.md.94426129.lean.js delete mode 100644 assets/releases_21100.md.945acb51.js delete mode 100644 assets/releases_21100.md.945acb51.lean.js create mode 100644 assets/releases_21100.md.ac6f3d1f.js create mode 100644 assets/releases_21100.md.ac6f3d1f.lean.js delete mode 100644 assets/releases_21200.md.c9fd3f8c.js delete mode 100644 assets/releases_21200.md.c9fd3f8c.lean.js create mode 100644 assets/releases_21200.md.f65699a3.js create mode 100644 assets/releases_21200.md.f65699a3.lean.js delete mode 100644 assets/releases_21400.md.b582e920.js delete mode 100644 assets/releases_21400.md.b582e920.lean.js create mode 100644 assets/releases_21400.md.bf9f03aa.js create mode 100644 assets/releases_21400.md.bf9f03aa.lean.js delete mode 100644 assets/releases_22000.md.8c658003.js delete mode 100644 assets/releases_22000.md.8c658003.lean.js create mode 100644 assets/releases_22000.md.a664d51e.js create mode 100644 assets/releases_22000.md.a664d51e.lean.js delete mode 100644 assets/releases_22100.md.551a2e63.js delete mode 100644 assets/releases_22100.md.551a2e63.lean.js create mode 100644 assets/releases_22100.md.fafc6195.js create mode 100644 assets/releases_22100.md.fafc6195.lean.js create mode 100644 assets/releases_23000.md.7d4a1d83.js create mode 100644 assets/releases_23000.md.7d4a1d83.lean.js delete mode 100644 assets/releases_23000.md.bacddf11.js delete mode 100644 assets/releases_23000.md.bacddf11.lean.js delete mode 100644 assets/releases_24000.md.1958b910.js delete mode 100644 assets/releases_24000.md.1958b910.lean.js create mode 100644 assets/releases_24000.md.a2288654.js create mode 100644 assets/releases_24000.md.a2288654.lean.js create mode 100644 assets/releases_24100.md.15429fef.js create mode 100644 assets/releases_24100.md.15429fef.lean.js delete mode 100644 assets/releases_24100.md.6b9a3320.js delete mode 100644 assets/releases_24100.md.6b9a3320.lean.js delete mode 100644 assets/releases_24200.md.6091c70d.js delete mode 100644 assets/releases_24200.md.6091c70d.lean.js create mode 100644 assets/releases_24200.md.eab9d9d7.js create mode 100644 assets/releases_24200.md.eab9d9d7.lean.js delete mode 100644 assets/releases_24300.md.3ff8f899.js delete mode 100644 assets/releases_24300.md.3ff8f899.lean.js create mode 100644 assets/releases_24300.md.8db6782c.js create mode 100644 assets/releases_24300.md.8db6782c.lean.js delete mode 100644 assets/releases_25000.md.6c7ad114.js delete mode 100644 assets/releases_25000.md.6c7ad114.lean.js create mode 100644 assets/releases_25000.md.a96540ec.js create mode 100644 assets/releases_25000.md.a96540ec.lean.js create mode 100644 assets/releases_25100.md.16546601.js create mode 100644 assets/releases_25100.md.16546601.lean.js delete mode 100644 assets/releases_25100.md.7021edff.js delete mode 100644 assets/releases_25100.md.7021edff.lean.js delete mode 100644 assets/releases_25200.md.1983de15.js delete mode 100644 assets/releases_25200.md.1983de15.lean.js create mode 100644 assets/releases_25200.md.94a4189a.js create mode 100644 assets/releases_25200.md.94a4189a.lean.js create mode 100644 assets/releases_26000.md.8ba36e0d.js create mode 100644 assets/releases_26000.md.8ba36e0d.lean.js delete mode 100644 assets/releases_26000.md.dc2422e5.js delete mode 100644 assets/releases_26000.md.dc2422e5.lean.js create mode 100644 assets/releases_26100.md.3336cb75.js create mode 100644 assets/releases_26100.md.3336cb75.lean.js delete mode 100644 assets/releases_26100.md.6724a4c6.js delete mode 100644 assets/releases_26100.md.6724a4c6.lean.js create mode 100644 assets/releases_26200.md.20898ea4.js create mode 100644 assets/releases_26200.md.20898ea4.lean.js create mode 100644 assets/releases_26300.md.7a9b8346.js create mode 100644 assets/releases_26300.md.7a9b8346.lean.js create mode 100644 assets/releases_index.md.2825e5f5.js rename assets/{releases_index.md.b47a879f.lean.js => releases_index.md.2825e5f5.lean.js} (54%) delete mode 100644 assets/releases_index.md.b47a879f.js delete mode 100644 assets/style.645eff1b.css create mode 100644 assets/style.f2974067.css delete mode 100644 assets/tools.md.4de0b4c5.js delete mode 100644 assets/tools.md.4de0b4c5.lean.js create mode 100644 assets/tools.md.641886ad.js create mode 100644 assets/tools.md.641886ad.lean.js create mode 100644 delta/faq.html create mode 100644 delta/internal-guide.html create mode 100644 releases/26200.html create mode 100644 releases/26300.html diff --git a/404.html b/404.html index 259972b0..2c6a44e7 100644 --- a/404.html +++ b/404.html @@ -5,17 +5,20 @@ 404 | Magisk 中文文档 - - + + + - - - + + + + -
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.

原始文档版本: 2023年05月13日
在 GPL-3.0 许可下发布

- +
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.

原始 Magisk 文档版本: 2023年05月13日
+ 原始 Magisk Delta 文档版本: 2023年08月15日
+ 在 GPL-3.0 许可下发布

+ \ No newline at end of file diff --git a/README.html b/README.html index e76d9cbd..9bc5e9c0 100644 --- a/README.html +++ b/README.html @@ -3,22 +3,51 @@ - Magisk 中文文档 | Magisk 中文文档 + Magisk 中文文档 | Magisk Chinese Document | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
Skip to content
本页内容

Magisk 中文文档

这是由 Jesse205 根据 Magisk 官方文档 翻译的中文文档,并补充了一些内容。

注意:请尽量采用《中文技术文档写作规范》

注:此仓库分别存在 Gitee 与 Github 上,Gitee 为主仓库,Github 为镜像仓库

原始文档版本: 2023年05月13日
在 GPL-3.0 许可下发布

- +
Skip to content

原始 Magisk 文档版本: 2023年05月13日
+ 原始 Magisk Delta 文档版本: 2023年08月15日
+ 在 GPL-3.0 许可下发布

+ \ No newline at end of file diff --git a/app_changes.html b/app_changes.html index a1106ac1..096624c8 100644 --- a/app_changes.html +++ b/app_changes.html @@ -5,20 +5,23 @@ Magisk Manager 更新日志 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
Skip to content
本页内容

Magisk Manager 更新日志

v8.0.7

  • 修复升级时的sepolicy规则迁移

v8.0.6

  • 轻微的UI更改

  • 更新内部脚本

v8.0.5

  • 修复sepolicy规则复制

v8.0.4

  • 大量的稳定性更改和小错误修复
  • 在日志菜单中保存日志时,收集设备属性、应用程序日志和Magisk日志

v8.0.3

  • 切换到新的Magisk模块仓库设置,以允许第三方仓库
  • 在超级用户请求对话框中添加抽头劫持保护
  • 稳定性更改和错误修复

v8.0.2

  • Fix an issue with requesting permission on devices older than Android 10
  • Make more files download through CDN

v8.0.1

  • Fix vbmeta.img patching for Samsung AP.tar files. This fixes bootloops on devices like Galaxy S10 after flashing updated AP files.
  • Properly truncate existing files before writing to prevent corrupted files
  • Prevent a possible UI loop when device ran into very low memory
  • Switch to use JSDelivr CDN for several files

v8.0.0

  • 100% full app rewrite! Will highlight functional changes below.
  • Add detailed device info in home screen to assist user installation
  • Support Magisk v21.0 communication protocol
  • Support patching modern Samsung AP.tar

v7.5.1

  • Fix toggling app components in MagiskHide screen
  • Update translations

v7.5.0

  • Support new MagiskSU communication method (ContentProvider)
  • Fix several issues with hidden stub APK
  • Support using BiometricPrompt (face unlock)

v7.4.0

  • Hide Magisk Manager with stub APKs on Android 9.0+
  • Allow customizing app name when hiding Magisk Manager
  • Generate random keys to sign the hidden Magisk Manager to prevent signature detections
  • Fix fingerprint UI infinite loop

v7.3.5

  • Sort installed modules by name
  • Better pre-5.0 support
  • Fix potential issues when patching tar files

v7.3.4

  • App is now fully written in Kotlin!
  • New downloading system
  • Add new "Recovery Mode" to Advanced Settings

v7.3.0/1/2

  • HUGE code base modernization, thanks @diareuse!
  • More sweet changes coming in the future!
  • Reboot device using proper API (no more abrupt reboot)
  • New floating button in Magisk logs to go to bottom

v7.2.0

  • Huge UI overhaul
  • More sweet changes coming in the future!

v7.1.2

  • Support patching Samsung AP firmware
  • Much better module downloading mechanism

v7.1.1

  • Fix a bug that causes some modules using new format not showing up

v7.1.0

  • Support the new module format
  • Support per-application component granularity MagiskHide targets (only on v19+)
  • Ask for fingerprint before deleting rules if enabled
  • Fix the bug that causes repackaging to lose settings
  • Several UI fixes

v7.0.0

  • Major UI redesign!
  • Render Markdown natively (no more buggy WebView!)
  • Support down to Android 4.1 (native Magisk only support Android 4.2 though)
  • Significantly improve Magisk log display performance
  • Fix post OTA scripts for A/B devices
  • Reduce memory usages when verifying and signing boot image
  • Drop support for Magisk lower than v18.0

v6.1.0

  • Introduce new downloading methods: no longer uses buggy system Download Manager
  • Introduce many new notifications for better user experience
  • Add support for Magisk v18.0
  • Change application name to "Manager" after hiding(repackaging) to prevent app name detection
  • Add built-in systemless hosts module (access in settings)
  • Auto launch the newly installed app after hiding(repackaging) and restoring Magisk Manager
  • Fix bug causing incomplete module.prop in modules to have improper UI

v6.0.1

  • Update to use new online module's organizing method
  • When fingerprint authentication is enabled, toggling root permissions in "Superuser" section now requires fingerprint beforehand
  • Fix crashes when entering MagiskHide section on some devices
  • Remove support to Magisk version lower than v15.0
  • Ask storage permissions before patching stock boot image
  • Update dark theme CardView color

v6.0.0

  • Update to latest AndroidX support library
  • Fix crashes when online repos contain incomplete metadata
  • Optimize BootSigner to use as little memory as possible, prevent OutOfMemoryError
  • Support new communication scheme between Magisk v17.2 and Magisk Manager
  • Enable excessive obfuscation to prevent APK analysis root detections (still not 100% obfuscated due to backwards compatibility with stable channel)

v5.9.0/v5.9.1

  • No more on boot notifications
  • Support new mechanism for installing to inactive slot for OTAs on A/B devices
  • Fix restore Magisk Manager settings on Android P
  • Verify existing file checksums to prevent unnecessary re-downloads
  • Update SNET extension to use new Google API, fix "Invalid Response" errors
  • Move fingerprint settings to magisk database to prevent the settings to be easily removed
  • Fingerprint settings are now guarded with fingerprint authentications before it can get changed
  • Prevent any files to be downloaded to /sdcard/MagiskManager

v5.8.3

  • Prevent invalid modules in the online repo crashing the app
  • Update Stable and Beta channel URLs

v5.8.1

  • Fix a bug that cause the root shell initializer not running in BusyBox environment

v5.8.0

  • Remain hidden when upgrading within repackaged Magisk Manager
  • New feature: support reconstructing a proper Magisk environment if error detected (e.g. after factory reset)
  • New uninstall method: download uninstaller and completely remove Magisk + Magisk Manager, following with a reboot
  • Hidden apps are now shown on the top of the list in MagiskHide fragment
  • Tons of under-the-hood bug fixes and improvements

v5.7.0

  • Add app shortcuts for Android 7.1+
  • Bump minimal module minMagisk requirement to 1500
  • Adjustments for new sepolicies on v16.4+
  • Fix crashes when refreshing the online repo

v5.6.4

  • Remove the blacklisted apps using SafetyNet (e.g. Pokemon GO)

v5.6.3

  • Fix repo loading UI logic

v5.6.2

  • Cleanup folders if installation failed
  • Add support for Android P

v5.6.1

  • Fix database crashes on F2FS with SQLite 3.21.0+
  • Optimize several settings options
  • Use native XML for settings migration

v5.6.0

  • Remove JNI requirement, Magisk Manager is now pure Java
  • Update the method of handling su database, may fix the issue that root requests won't save
  • Add the option to restore Magisk Manager after repackaging with random package name
  • Massive under-the-hood

v5.5.5

  • Fix crashes on Lollipop and some devices not following AOSP standards

v5.5.4

  • Fix dtbo on-boot detection, should follow configured dtbo patching behavior on Pixel 2 devices
  • Add fingerprint authentication for Superuser requests

v5.5.3

  • Update translations
  • Update internal scripts (in sync with Magisk)
  • Minor adjustments

v5.5.2

  • Support sorting online repos with last update
  • Fix issue that advanced installation settings won't stick
  • Prevent sudb crashing Magisk Manager

v5.5.1

  • Fix an issue in setting up superuser database, which causes some users to experience tons of root issues

v5.5.0

  • Fix dynamic resource loading, prevent crashes when checking SafetyNet
  • Update SignAPK to use very little RAM for supporting old devices
  • Support settings migration after hiding Magisk Manager
  • Add reboot menu in modules section
  • Add dark theme to superuser request dialogs
  • Properly handle new HIGHCOMP and add recommended KEEPVERITY and KEEPFORCEENCRYPT flags for installation
  • Support new paths for v14.6
  • Massive improvements in repackaging Magisk Manager

v5.4.3

  • Add flags to intent to prevent crashes
  • Update translations

v5.4.2

  • Support new paths and setup of v14.5
  • Support repackaging Magisk Manager for hiding (only works on v14.5+)
  • Support hardlinking global su database into app data
  • Support signing boot images (AVB 1.0)
  • Update app icon to adaptive icons
  • Remove app from MagiskHide list if uninstalled
  • Add support to save detailed logs when installing Magisk or modules
  • Fix download progress error if module is larger than 20MB
  • Changed the way how downloaded repos are processed, should be rock stable
  • Prevent crashes when database is corrupted - clear db instead
  • Fix saving wrong UID issue on multiuser mode
  • Add custom update channel support - you can now switch to your own update server!
  • Some UI adjustments and asynchronous UI performance improvements

v5.4.0

  • SafetyNet checks now require external code extension (for 100% FOSS)
  • Repo loading will now show real-time progress instead of blank screen
  • Show progress when downloading an online module
  • Allow secondary users to access superuser settings if allowed
  • Fix several places where external storage is needed but forgot to request
  • Fetching online repo info from sever is significantly faster thanks to multithreading
  • Pulling down Download page will now force a full refresh, thanks to the faster loading speed
  • Using new resetprop tool to properly detect MagiskHide status

v5.3.5

  • Fix error when MagiskManager folder doesn't exist
  • Offload many logic to scripts: script fixes will also be picked up in the app
  • Add installing Magisk to second slot on A/B partition devices
  • Support file based encryption: store necessary files into DE storage
  • Update uninstall method to self remove app and prompt user to manually reboot

v5.3.0

  • Add hide Magisk Manager feature - hide the app from detection
  • Add update channel settings - you can now receive beta updates through the app
  • Proper runtime permission implementation - request storage permission only when needed
  • Add boot image file patch feature - you can patch boot images without root!
  • Rewrite Magisk direct install method - merge with boot image file patch mode
  • Add feature to restore stock boot image - convenient for applying OTAs

v5.2.0

  • Fix force close which occurs when failure in flashing zips
  • Remove several external dependencies and rewrite a large portion of components
  • Improve MarkDown support: showing README.MD is much faster and will properly render Unicode characters (e.g. Chinese characters)
  • Add language settings: you can now switch to languages other than system default
  • Remove busybox included within APK; download through Internet if needed
  • Use Magisk internal busybox if detected
  • Busybox is added to the highest priority in PATH to create reliable shell environment
  • Always use global namespace for internal shell if possible

v5.1.1

  • Fix Magisk Manager hanging when reading files with no end newline
  • Massive rewrite AsyncTasks to prevent potential memory leak
  • Fix some minor issues with notifications
  • Improve update notification and popup behavior
  • Update internal uninstaller script

v5.1.0

  • Introduce a new flash log activity, so you know what is actually happening, just like flashing in custom recoveries!
  • Rewritten Java native shall interface: merged root shell and normal shell
  • Cleaned up implementation of repo recyclerview and adapters

v5.0.6

  • Fix crash when installing modules downloading from repos

v5.0.5

  • Fix update notifications on Android O
  • Fix crash when trying to install Magisk Manager update
  • Update translations

v5.0.4

  • Fix bug in su timeout

v5.0.3

  • Fix FC on boot on Android O
  • Adapt to Android O broadcast limitations: re-authenticate app when update is disabled on Android O

v5.0.2

  • Rewrite zip signing part, zips downloaded from repo will be properly signed and adjusted for custom recoveries

v5.0.1

  • Add namespace mode options
  • Fix a bug in Manager OTA system

v5.0.0

  • Support the new Magisk unified binary
  • Properly handle application install / uninstall root management issues
  • Add multiuser mode support
  • Add application upgrade re-authentication feature
  • Add basic integrity check for SafetyNet
  • Merged install fragment and status fragment into Magisk fragment
  • Fix theme switching glitch
  • Update translations

v4.3.3

  • Re-build APK with stable build tools

v4.3.2

  • Improve usage of Github API to support unlimited amount of online repos
  • Update translations (thanks to all contributors!!)

v4.3.1

  • Update proper Magisk busybox detection, will not be confused by busybox installed by default in custom roms

v4.3.0

  • Add Core Only Mode option
  • Fix crashes when selecting release note on Samsung devices
  • Hide modules using template lower than version 3

v4.2.7

  • Update translations
  • Update uninstall scripts

v4.2.6

  • Samsung crashes finally fixed (confirmed!)
  • Add settings to disable update notifications
  • Adjust Dark theme colors
  • Refined download section, now support download only when root is not detected
  • Fix crashes in boot image selection

v4.2

  • Change Repo cache to database
  • Dark theme refined
  • Alert Dialog buttons now properly aligned
  • Support very large online modules' zip processing
  • You can now download online modules without installing
  • Add notifications when new Magisk version is available
  • Removed changelog, donation link, support link in download cards
  • Read and display README.md for online modules

v4.1

  • Change MagiskHide startup
  • Reduce static data (= less memory leaks/issues)
  • Translation updates

v4.0

  • Whole new Superuser section for MagiskSU management!
  • Add Superuser tab in Logs section
  • Add lots of Superuser settings
  • Handle MagiskSU requests, logging, notifications
  • Controls MagiskHide initialization
  • Add disable button
  • Add uninstall button
  • Tons of improvements, not practical to list all 😃

v3.1

  • Fix online repo inaccessible issue
  • Fix repo list card expanding issues
  • Change SafetyNet check to manually triggered
  • Update translations
  • Tons of bug fixes preventing potential crashes

v3.0

  • Now on Play Store
  • Add Status Section, you can check Safety Net, root status, and Magisk status in one place
  • Add Install Section, you can manually choose the boot image location and advanced options

v2.5

  • Add Magisk Hide section, you can now add/remove apps from Magisk Hide list
  • Support custom Magisk Version names, any string is now accepted (for custom builds)
  • Fixed modules and repos not sorted by name

v2.1

  • Add Magisk Hide settings
  • Add search bar in "Downloads Sections"
  • Fix crashes when no root is available
  • Fix trash can icon not updated when removing module
  • Prevent crash when Magisk Version is set incorrectly

v2.0

  • Massive refactor
  • Material Design
  • Module Management
  • Download Section
  • And much more....

v1.0

  • 初始版本

参考链接

原始文档版本: 2023年05月13日
在 GPL-3.0 许可下发布

- +
Skip to content

原始 Magisk 文档版本: 2023年05月13日
+ 原始 Magisk Delta 文档版本: 2023年08月15日
+ 在 GPL-3.0 许可下发布

+ \ No newline at end of file diff --git a/assets/JetBrainsMono-Italic.f115aaa1.ttf b/assets/JetBrainsMono-Italic.f115aaa1.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5414835536ecf67b336e82642dbba2c5d2f32dfb GIT binary patch literal 308888 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�z{# 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

p_r)^;F^SB&oAwAUvat>AaH*WM-R9KsutQD*d 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%0D_|qoNNhGUnvG#&**I3n#=L$~UCJ(F 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 Z%h#_b*~^!E-WSq^XhsVQb2wuQ{{qd0QA+>- literal 0 HcmV?d00001 diff --git a/assets/README.md.04cb5627.js b/assets/README.md.04cb5627.js deleted file mode 100644 index 00c481df..00000000 --- a/assets/README.md.04cb5627.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as t,c as a,V as r}from"./chunks/framework.fc84ac3a.js";const f=JSON.parse('{"title":"Magisk 中文文档","description":"","frontmatter":{},"headers":[],"relativePath":"README.md","filePath":"README.md","lastUpdated":1684159642000}'),i={name:"README.md"},s=r('

Magisk 中文文档

这是由 Jesse205 根据 Magisk 官方文档 翻译的中文文档,并补充了一些内容。

注意:请尽量采用《中文技术文档写作规范》

注:此仓库分别存在 Gitee 与 Github 上,Gitee 为主仓库,Github 为镜像仓库

',6),o=[s];function n(h,l,_,u,c,g){return t(),a("div",null,o)}const k=e(i,[["render",n]]);export{f as __pageData,k as default}; diff --git a/assets/README.md.04cb5627.lean.js b/assets/README.md.04cb5627.lean.js deleted file mode 100644 index f6d58c0e..00000000 --- a/assets/README.md.04cb5627.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as t,c as a,V as r}from"./chunks/framework.fc84ac3a.js";const f=JSON.parse('{"title":"Magisk 中文文档","description":"","frontmatter":{},"headers":[],"relativePath":"README.md","filePath":"README.md","lastUpdated":1684159642000}'),i={name:"README.md"},s=r("",6),o=[s];function n(h,l,_,u,c,g){return t(),a("div",null,o)}const k=e(i,[["render",n]]);export{f as __pageData,k as default}; diff --git a/assets/README.md.e3702901.js b/assets/README.md.e3702901.js new file mode 100644 index 00000000..c757df1b --- /dev/null +++ b/assets/README.md.e3702901.js @@ -0,0 +1,27 @@ +import{_ as e,o as s,c as a,Q as n}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"Magisk 中文文档 | Magisk Chinese Document","description":"","frontmatter":{},"headers":[],"relativePath":"README.md","filePath":"README.md","lastUpdated":1694965516000}'),t={name:"README.md"},i=n(`

Magisk 中文文档 | Magisk Chinese Document

这是由 Jesse205 根据 Magisk 官方文档 翻译的中文文档,并补充了一些内容。

This is a Chinese translation by Jesse205 based on Magisk official documentation with some additions.

License

截图

这不是官方支持的 topjohnwu 项目!

NOTE
此仓库分别存在 Gitee 与 Github 上,Gitee 为主仓库,Github 为镜像仓库

开发

  • 调试:yarn dev
  • 构建:yarn build

贡献

许可

txt
Copyright (C) 2023 Jesse205
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
Copyright (C) 2023 Jesse205
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.

NOTE
如果您只是引用了本文档翻译的内容,则您的代码无需遵循 GPL 许可。

Star 历史

Star 历史图表

`,17),o=[i];function l(r,p,c,h,u,d){return s(),a("div",null,o)}const b=e(t,[["render",l]]);export{m as __pageData,b as default}; diff --git a/assets/README.md.e3702901.lean.js b/assets/README.md.e3702901.lean.js new file mode 100644 index 00000000..42795bf7 --- /dev/null +++ b/assets/README.md.e3702901.lean.js @@ -0,0 +1 @@ +import{_ as e,o as s,c as a,Q as n}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"Magisk 中文文档 | Magisk Chinese Document","description":"","frontmatter":{},"headers":[],"relativePath":"README.md","filePath":"README.md","lastUpdated":1694965516000}'),t={name:"README.md"},i=n("",17),o=[i];function l(r,p,c,h,u,d){return s(),a("div",null,o)}const b=e(t,[["render",l]]);export{m as __pageData,b as default}; diff --git a/assets/app.5ad92296.js b/assets/app.5ad92296.js deleted file mode 100644 index ba60bd15..00000000 --- a/assets/app.5ad92296.js +++ /dev/null @@ -1 +0,0 @@ -import{Q as s,a5 as p,a6 as i,a7 as u,a8 as c,a9 as l,aa as d,ab as f,ac as m,ad as h,ae as A,M as g,d as P,u as v,q as y,k as C,af as w,ag as _,ah as b,ai as E}from"./chunks/framework.fc84ac3a.js";import{t as R}from"./chunks/theme.1c7a0dc0.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(R),D=P({name:"VitePressApp",setup(){const{site:e}=v();return y(()=>{C(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),w(),_(),b(),n.setup&&n.setup(),()=>E(n.Layout)}});async function O(){const e=T(),a=S();a.provide(i,e);const t=u(e.route);return a.provide(c,t),a.component("Content",l),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:f}),{app:a,router:e,data:t}}function S(){return m(D)}function T(){let e=s,a;return h(t=>{let o=A(t);return e&&(a=o),(e||a===o)&&(o=o.replace(/\.js$/,".lean.js")),s&&(e=!1),g(()=>import(o),[])},n.NotFound)}s&&O().then(({app:e,router:a,data:t})=>{a.go().then(()=>{p(a.route,t.site),e.mount("#app")})});export{O as createApp}; diff --git a/assets/app.d1ec6776.js b/assets/app.d1ec6776.js new file mode 100644 index 00000000..7762f76c --- /dev/null +++ b/assets/app.d1ec6776.js @@ -0,0 +1 @@ +import{a1 as l,h as d,y as c,o as f,b as m,l as h,s as u,a2 as _,a3 as A,a4 as v,a5 as y,a6 as g,a7 as P,a8 as w,a9 as C,aa as L,ab as R,V as b,d as E,u as x,j as D,ac as T,ad as j,ae as O,af as S}from"./chunks/framework.ed90c782.js";import{t as i}from"./chunks/theme.98402b24.js";const V={__name:"Layout",setup(e){const{Layout:t}=i,a=l(),n=d(!1);return c(()=>{n.value=a.route.path.includes("/delta/")}),c(()=>{const s=document.documentElement.classList,r=s.contains("delta");n.value&&!r?s.add("delta"):r&&s.remove("delta")}),(s,r)=>(f(),m(h(t)))}},B={Layout:V,extends:i,enhanceApp(e){}};function p(e){if(e.extends){const t=p(e.extends);return{...t,...e,async enhanceApp(a){t.enhanceApp&&await t.enhanceApp(a),e.enhanceApp&&await e.enhanceApp(a)}}}return e}const o=p(B),F=E({name:"VitePressApp",setup(){const{site:e}=x();return D(()=>{c(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),T(),j(),O(),o.setup&&o.setup(),()=>S(o.Layout)}});async function $(){const e=I(),t=k();t.provide(A,e);const a=v(e.route);return t.provide(y,a),t.component("Content",g),t.component("ClientOnly",P),Object.defineProperties(t.config.globalProperties,{$frontmatter:{get(){return a.frontmatter.value}},$params:{get(){return a.page.value.params}}}),o.enhanceApp&&await o.enhanceApp({app:t,router:e,siteData:w}),{app:t,router:e,data:a}}function k(){return C(F)}function I(){let e=u,t;return L(a=>{let n=R(a),s=null;return n&&(e&&(t=n),(e||t===n)&&(n=n.replace(/\.js$/,".lean.js")),s=b(()=>import(n),[])),u&&(e=!1),s},o.NotFound)}u&&$().then(({app:e,router:t,data:a})=>{t.go().then(()=>{_(t.route,a.site),e.mount("#app")})});export{$ as createApp}; diff --git a/assets/app_changes.md.6856ae7f.js b/assets/app_changes.md.de37dcd7.js similarity index 99% rename from assets/app_changes.md.6856ae7f.js rename to assets/app_changes.md.de37dcd7.js index aa1e21c9..3f024326 100644 --- a/assets/app_changes.md.6856ae7f.js +++ b/assets/app_changes.md.de37dcd7.js @@ -1 +1 @@ -import{_ as e,o as i,c as a,V as l}from"./chunks/framework.fc84ac3a.js";const g=JSON.parse('{"title":"Magisk Manager 更新日志","description":"","frontmatter":{},"headers":[],"relativePath":"app_changes.md","filePath":"app_changes.md","lastUpdated":1675020658000}'),t={name:"app_changes.md"},o=l('

Magisk Manager 更新日志

v8.0.7

  • 修复升级时的sepolicy规则迁移

v8.0.6

  • 轻微的UI更改

  • 更新内部脚本

v8.0.5

  • 修复sepolicy规则复制

v8.0.4

  • 大量的稳定性更改和小错误修复
  • 在日志菜单中保存日志时,收集设备属性、应用程序日志和Magisk日志

v8.0.3

  • 切换到新的Magisk模块仓库设置,以允许第三方仓库
  • 在超级用户请求对话框中添加抽头劫持保护
  • 稳定性更改和错误修复

v8.0.2

  • Fix an issue with requesting permission on devices older than Android 10
  • Make more files download through CDN

v8.0.1

  • Fix vbmeta.img patching for Samsung AP.tar files. This fixes bootloops on devices like Galaxy S10 after flashing updated AP files.
  • Properly truncate existing files before writing to prevent corrupted files
  • Prevent a possible UI loop when device ran into very low memory
  • Switch to use JSDelivr CDN for several files

v8.0.0

  • 100% full app rewrite! Will highlight functional changes below.
  • Add detailed device info in home screen to assist user installation
  • Support Magisk v21.0 communication protocol
  • Support patching modern Samsung AP.tar

v7.5.1

  • Fix toggling app components in MagiskHide screen
  • Update translations

v7.5.0

  • Support new MagiskSU communication method (ContentProvider)
  • Fix several issues with hidden stub APK
  • Support using BiometricPrompt (face unlock)

v7.4.0

  • Hide Magisk Manager with stub APKs on Android 9.0+
  • Allow customizing app name when hiding Magisk Manager
  • Generate random keys to sign the hidden Magisk Manager to prevent signature detections
  • Fix fingerprint UI infinite loop

v7.3.5

  • Sort installed modules by name
  • Better pre-5.0 support
  • Fix potential issues when patching tar files

v7.3.4

  • App is now fully written in Kotlin!
  • New downloading system
  • Add new "Recovery Mode" to Advanced Settings

v7.3.0/1/2

  • HUGE code base modernization, thanks @diareuse!
  • More sweet changes coming in the future!
  • Reboot device using proper API (no more abrupt reboot)
  • New floating button in Magisk logs to go to bottom

v7.2.0

  • Huge UI overhaul
  • More sweet changes coming in the future!

v7.1.2

  • Support patching Samsung AP firmware
  • Much better module downloading mechanism

v7.1.1

  • Fix a bug that causes some modules using new format not showing up

v7.1.0

  • Support the new module format
  • Support per-application component granularity MagiskHide targets (only on v19+)
  • Ask for fingerprint before deleting rules if enabled
  • Fix the bug that causes repackaging to lose settings
  • Several UI fixes

v7.0.0

  • Major UI redesign!
  • Render Markdown natively (no more buggy WebView!)
  • Support down to Android 4.1 (native Magisk only support Android 4.2 though)
  • Significantly improve Magisk log display performance
  • Fix post OTA scripts for A/B devices
  • Reduce memory usages when verifying and signing boot image
  • Drop support for Magisk lower than v18.0

v6.1.0

  • Introduce new downloading methods: no longer uses buggy system Download Manager
  • Introduce many new notifications for better user experience
  • Add support for Magisk v18.0
  • Change application name to "Manager" after hiding(repackaging) to prevent app name detection
  • Add built-in systemless hosts module (access in settings)
  • Auto launch the newly installed app after hiding(repackaging) and restoring Magisk Manager
  • Fix bug causing incomplete module.prop in modules to have improper UI

v6.0.1

  • Update to use new online module's organizing method
  • When fingerprint authentication is enabled, toggling root permissions in "Superuser" section now requires fingerprint beforehand
  • Fix crashes when entering MagiskHide section on some devices
  • Remove support to Magisk version lower than v15.0
  • Ask storage permissions before patching stock boot image
  • Update dark theme CardView color

v6.0.0

  • Update to latest AndroidX support library
  • Fix crashes when online repos contain incomplete metadata
  • Optimize BootSigner to use as little memory as possible, prevent OutOfMemoryError
  • Support new communication scheme between Magisk v17.2 and Magisk Manager
  • Enable excessive obfuscation to prevent APK analysis root detections (still not 100% obfuscated due to backwards compatibility with stable channel)

v5.9.0/v5.9.1

  • No more on boot notifications
  • Support new mechanism for installing to inactive slot for OTAs on A/B devices
  • Fix restore Magisk Manager settings on Android P
  • Verify existing file checksums to prevent unnecessary re-downloads
  • Update SNET extension to use new Google API, fix "Invalid Response" errors
  • Move fingerprint settings to magisk database to prevent the settings to be easily removed
  • Fingerprint settings are now guarded with fingerprint authentications before it can get changed
  • Prevent any files to be downloaded to /sdcard/MagiskManager

v5.8.3

  • Prevent invalid modules in the online repo crashing the app
  • Update Stable and Beta channel URLs

v5.8.1

  • Fix a bug that cause the root shell initializer not running in BusyBox environment

v5.8.0

  • Remain hidden when upgrading within repackaged Magisk Manager
  • New feature: support reconstructing a proper Magisk environment if error detected (e.g. after factory reset)
  • New uninstall method: download uninstaller and completely remove Magisk + Magisk Manager, following with a reboot
  • Hidden apps are now shown on the top of the list in MagiskHide fragment
  • Tons of under-the-hood bug fixes and improvements

v5.7.0

  • Add app shortcuts for Android 7.1+
  • Bump minimal module minMagisk requirement to 1500
  • Adjustments for new sepolicies on v16.4+
  • Fix crashes when refreshing the online repo

v5.6.4

  • Remove the blacklisted apps using SafetyNet (e.g. Pokemon GO)

v5.6.3

  • Fix repo loading UI logic

v5.6.2

  • Cleanup folders if installation failed
  • Add support for Android P

v5.6.1

  • Fix database crashes on F2FS with SQLite 3.21.0+
  • Optimize several settings options
  • Use native XML for settings migration

v5.6.0

  • Remove JNI requirement, Magisk Manager is now pure Java
  • Update the method of handling su database, may fix the issue that root requests won't save
  • Add the option to restore Magisk Manager after repackaging with random package name
  • Massive under-the-hood

v5.5.5

  • Fix crashes on Lollipop and some devices not following AOSP standards

v5.5.4

  • Fix dtbo on-boot detection, should follow configured dtbo patching behavior on Pixel 2 devices
  • Add fingerprint authentication for Superuser requests

v5.5.3

  • Update translations
  • Update internal scripts (in sync with Magisk)
  • Minor adjustments

v5.5.2

  • Support sorting online repos with last update
  • Fix issue that advanced installation settings won't stick
  • Prevent sudb crashing Magisk Manager

v5.5.1

  • Fix an issue in setting up superuser database, which causes some users to experience tons of root issues

v5.5.0

  • Fix dynamic resource loading, prevent crashes when checking SafetyNet
  • Update SignAPK to use very little RAM for supporting old devices
  • Support settings migration after hiding Magisk Manager
  • Add reboot menu in modules section
  • Add dark theme to superuser request dialogs
  • Properly handle new HIGHCOMP and add recommended KEEPVERITY and KEEPFORCEENCRYPT flags for installation
  • Support new paths for v14.6
  • Massive improvements in repackaging Magisk Manager

v5.4.3

  • Add flags to intent to prevent crashes
  • Update translations

v5.4.2

  • Support new paths and setup of v14.5
  • Support repackaging Magisk Manager for hiding (only works on v14.5+)
  • Support hardlinking global su database into app data
  • Support signing boot images (AVB 1.0)
  • Update app icon to adaptive icons
  • Remove app from MagiskHide list if uninstalled
  • Add support to save detailed logs when installing Magisk or modules
  • Fix download progress error if module is larger than 20MB
  • Changed the way how downloaded repos are processed, should be rock stable
  • Prevent crashes when database is corrupted - clear db instead
  • Fix saving wrong UID issue on multiuser mode
  • Add custom update channel support - you can now switch to your own update server!
  • Some UI adjustments and asynchronous UI performance improvements

v5.4.0

  • SafetyNet checks now require external code extension (for 100% FOSS)
  • Repo loading will now show real-time progress instead of blank screen
  • Show progress when downloading an online module
  • Allow secondary users to access superuser settings if allowed
  • Fix several places where external storage is needed but forgot to request
  • Fetching online repo info from sever is significantly faster thanks to multithreading
  • Pulling down Download page will now force a full refresh, thanks to the faster loading speed
  • Using new resetprop tool to properly detect MagiskHide status

v5.3.5

  • Fix error when MagiskManager folder doesn't exist
  • Offload many logic to scripts: script fixes will also be picked up in the app
  • Add installing Magisk to second slot on A/B partition devices
  • Support file based encryption: store necessary files into DE storage
  • Update uninstall method to self remove app and prompt user to manually reboot

v5.3.0

  • Add hide Magisk Manager feature - hide the app from detection
  • Add update channel settings - you can now receive beta updates through the app
  • Proper runtime permission implementation - request storage permission only when needed
  • Add boot image file patch feature - you can patch boot images without root!
  • Rewrite Magisk direct install method - merge with boot image file patch mode
  • Add feature to restore stock boot image - convenient for applying OTAs

v5.2.0

  • Fix force close which occurs when failure in flashing zips
  • Remove several external dependencies and rewrite a large portion of components
  • Improve MarkDown support: showing README.MD is much faster and will properly render Unicode characters (e.g. Chinese characters)
  • Add language settings: you can now switch to languages other than system default
  • Remove busybox included within APK; download through Internet if needed
  • Use Magisk internal busybox if detected
  • Busybox is added to the highest priority in PATH to create reliable shell environment
  • Always use global namespace for internal shell if possible

v5.1.1

  • Fix Magisk Manager hanging when reading files with no end newline
  • Massive rewrite AsyncTasks to prevent potential memory leak
  • Fix some minor issues with notifications
  • Improve update notification and popup behavior
  • Update internal uninstaller script

v5.1.0

  • Introduce a new flash log activity, so you know what is actually happening, just like flashing in custom recoveries!
  • Rewritten Java native shall interface: merged root shell and normal shell
  • Cleaned up implementation of repo recyclerview and adapters

v5.0.6

  • Fix crash when installing modules downloading from repos

v5.0.5

  • Fix update notifications on Android O
  • Fix crash when trying to install Magisk Manager update
  • Update translations

v5.0.4

  • Fix bug in su timeout

v5.0.3

  • Fix FC on boot on Android O
  • Adapt to Android O broadcast limitations: re-authenticate app when update is disabled on Android O

v5.0.2

  • Rewrite zip signing part, zips downloaded from repo will be properly signed and adjusted for custom recoveries

v5.0.1

  • Add namespace mode options
  • Fix a bug in Manager OTA system

v5.0.0

  • Support the new Magisk unified binary
  • Properly handle application install / uninstall root management issues
  • Add multiuser mode support
  • Add application upgrade re-authentication feature
  • Add basic integrity check for SafetyNet
  • Merged install fragment and status fragment into Magisk fragment
  • Fix theme switching glitch
  • Update translations

v4.3.3

  • Re-build APK with stable build tools

v4.3.2

  • Improve usage of Github API to support unlimited amount of online repos
  • Update translations (thanks to all contributors!!)

v4.3.1

  • Update proper Magisk busybox detection, will not be confused by busybox installed by default in custom roms

v4.3.0

  • Add Core Only Mode option
  • Fix crashes when selecting release note on Samsung devices
  • Hide modules using template lower than version 3

v4.2.7

  • Update translations
  • Update uninstall scripts

v4.2.6

  • Samsung crashes finally fixed (confirmed!)
  • Add settings to disable update notifications
  • Adjust Dark theme colors
  • Refined download section, now support download only when root is not detected
  • Fix crashes in boot image selection

v4.2

  • Change Repo cache to database
  • Dark theme refined
  • Alert Dialog buttons now properly aligned
  • Support very large online modules' zip processing
  • You can now download online modules without installing
  • Add notifications when new Magisk version is available
  • Removed changelog, donation link, support link in download cards
  • Read and display README.md for online modules

v4.1

  • Change MagiskHide startup
  • Reduce static data (= less memory leaks/issues)
  • Translation updates

v4.0

  • Whole new Superuser section for MagiskSU management!
  • Add Superuser tab in Logs section
  • Add lots of Superuser settings
  • Handle MagiskSU requests, logging, notifications
  • Controls MagiskHide initialization
  • Add disable button
  • Add uninstall button
  • Tons of improvements, not practical to list all 😃

v3.1

  • Fix online repo inaccessible issue
  • Fix repo list card expanding issues
  • Change SafetyNet check to manually triggered
  • Update translations
  • Tons of bug fixes preventing potential crashes

v3.0

  • Now on Play Store
  • Add Status Section, you can check Safety Net, root status, and Magisk status in one place
  • Add Install Section, you can manually choose the boot image location and advanced options

v2.5

  • Add Magisk Hide section, you can now add/remove apps from Magisk Hide list
  • Support custom Magisk Version names, any string is now accepted (for custom builds)
  • Fixed modules and repos not sorted by name

v2.1

  • Add Magisk Hide settings
  • Add search bar in "Downloads Sections"
  • Fix crashes when no root is available
  • Fix trash can icon not updated when removing module
  • Prevent crash when Magisk Version is set incorrectly

v2.0

  • Massive refactor
  • Material Design
  • Module Management
  • Download Section
  • And much more....

v1.0

  • 初始版本

参考链接

',139),n=[o];function r(s,d,h,u,c,v){return i(),a("div",null,n)}const m=e(t,[["render",r]]);export{g as __pageData,m as default}; +import{_ as e,o as i,c as a,Q as l}from"./chunks/framework.ed90c782.js";const g=JSON.parse('{"title":"Magisk Manager 更新日志","description":"","frontmatter":{},"headers":[],"relativePath":"app_changes.md","filePath":"app_changes.md","lastUpdated":1675020658000}'),t={name:"app_changes.md"},o=l('

Magisk Manager 更新日志

v8.0.7

  • 修复升级时的sepolicy规则迁移

v8.0.6

  • 轻微的UI更改

  • 更新内部脚本

v8.0.5

  • 修复sepolicy规则复制

v8.0.4

  • 大量的稳定性更改和小错误修复
  • 在日志菜单中保存日志时,收集设备属性、应用程序日志和Magisk日志

v8.0.3

  • 切换到新的Magisk模块仓库设置,以允许第三方仓库
  • 在超级用户请求对话框中添加抽头劫持保护
  • 稳定性更改和错误修复

v8.0.2

  • Fix an issue with requesting permission on devices older than Android 10
  • Make more files download through CDN

v8.0.1

  • Fix vbmeta.img patching for Samsung AP.tar files. This fixes bootloops on devices like Galaxy S10 after flashing updated AP files.
  • Properly truncate existing files before writing to prevent corrupted files
  • Prevent a possible UI loop when device ran into very low memory
  • Switch to use JSDelivr CDN for several files

v8.0.0

  • 100% full app rewrite! Will highlight functional changes below.
  • Add detailed device info in home screen to assist user installation
  • Support Magisk v21.0 communication protocol
  • Support patching modern Samsung AP.tar

v7.5.1

  • Fix toggling app components in MagiskHide screen
  • Update translations

v7.5.0

  • Support new MagiskSU communication method (ContentProvider)
  • Fix several issues with hidden stub APK
  • Support using BiometricPrompt (face unlock)

v7.4.0

  • Hide Magisk Manager with stub APKs on Android 9.0+
  • Allow customizing app name when hiding Magisk Manager
  • Generate random keys to sign the hidden Magisk Manager to prevent signature detections
  • Fix fingerprint UI infinite loop

v7.3.5

  • Sort installed modules by name
  • Better pre-5.0 support
  • Fix potential issues when patching tar files

v7.3.4

  • App is now fully written in Kotlin!
  • New downloading system
  • Add new "Recovery Mode" to Advanced Settings

v7.3.0/1/2

  • HUGE code base modernization, thanks @diareuse!
  • More sweet changes coming in the future!
  • Reboot device using proper API (no more abrupt reboot)
  • New floating button in Magisk logs to go to bottom

v7.2.0

  • Huge UI overhaul
  • More sweet changes coming in the future!

v7.1.2

  • Support patching Samsung AP firmware
  • Much better module downloading mechanism

v7.1.1

  • Fix a bug that causes some modules using new format not showing up

v7.1.0

  • Support the new module format
  • Support per-application component granularity MagiskHide targets (only on v19+)
  • Ask for fingerprint before deleting rules if enabled
  • Fix the bug that causes repackaging to lose settings
  • Several UI fixes

v7.0.0

  • Major UI redesign!
  • Render Markdown natively (no more buggy WebView!)
  • Support down to Android 4.1 (native Magisk only support Android 4.2 though)
  • Significantly improve Magisk log display performance
  • Fix post OTA scripts for A/B devices
  • Reduce memory usages when verifying and signing boot image
  • Drop support for Magisk lower than v18.0

v6.1.0

  • Introduce new downloading methods: no longer uses buggy system Download Manager
  • Introduce many new notifications for better user experience
  • Add support for Magisk v18.0
  • Change application name to "Manager" after hiding(repackaging) to prevent app name detection
  • Add built-in systemless hosts module (access in settings)
  • Auto launch the newly installed app after hiding(repackaging) and restoring Magisk Manager
  • Fix bug causing incomplete module.prop in modules to have improper UI

v6.0.1

  • Update to use new online module's organizing method
  • When fingerprint authentication is enabled, toggling root permissions in "Superuser" section now requires fingerprint beforehand
  • Fix crashes when entering MagiskHide section on some devices
  • Remove support to Magisk version lower than v15.0
  • Ask storage permissions before patching stock boot image
  • Update dark theme CardView color

v6.0.0

  • Update to latest AndroidX support library
  • Fix crashes when online repos contain incomplete metadata
  • Optimize BootSigner to use as little memory as possible, prevent OutOfMemoryError
  • Support new communication scheme between Magisk v17.2 and Magisk Manager
  • Enable excessive obfuscation to prevent APK analysis root detections (still not 100% obfuscated due to backwards compatibility with stable channel)

v5.9.0/v5.9.1

  • No more on boot notifications
  • Support new mechanism for installing to inactive slot for OTAs on A/B devices
  • Fix restore Magisk Manager settings on Android P
  • Verify existing file checksums to prevent unnecessary re-downloads
  • Update SNET extension to use new Google API, fix "Invalid Response" errors
  • Move fingerprint settings to magisk database to prevent the settings to be easily removed
  • Fingerprint settings are now guarded with fingerprint authentications before it can get changed
  • Prevent any files to be downloaded to /sdcard/MagiskManager

v5.8.3

  • Prevent invalid modules in the online repo crashing the app
  • Update Stable and Beta channel URLs

v5.8.1

  • Fix a bug that cause the root shell initializer not running in BusyBox environment

v5.8.0

  • Remain hidden when upgrading within repackaged Magisk Manager
  • New feature: support reconstructing a proper Magisk environment if error detected (e.g. after factory reset)
  • New uninstall method: download uninstaller and completely remove Magisk + Magisk Manager, following with a reboot
  • Hidden apps are now shown on the top of the list in MagiskHide fragment
  • Tons of under-the-hood bug fixes and improvements

v5.7.0

  • Add app shortcuts for Android 7.1+
  • Bump minimal module minMagisk requirement to 1500
  • Adjustments for new sepolicies on v16.4+
  • Fix crashes when refreshing the online repo

v5.6.4

  • Remove the blacklisted apps using SafetyNet (e.g. Pokemon GO)

v5.6.3

  • Fix repo loading UI logic

v5.6.2

  • Cleanup folders if installation failed
  • Add support for Android P

v5.6.1

  • Fix database crashes on F2FS with SQLite 3.21.0+
  • Optimize several settings options
  • Use native XML for settings migration

v5.6.0

  • Remove JNI requirement, Magisk Manager is now pure Java
  • Update the method of handling su database, may fix the issue that root requests won't save
  • Add the option to restore Magisk Manager after repackaging with random package name
  • Massive under-the-hood

v5.5.5

  • Fix crashes on Lollipop and some devices not following AOSP standards

v5.5.4

  • Fix dtbo on-boot detection, should follow configured dtbo patching behavior on Pixel 2 devices
  • Add fingerprint authentication for Superuser requests

v5.5.3

  • Update translations
  • Update internal scripts (in sync with Magisk)
  • Minor adjustments

v5.5.2

  • Support sorting online repos with last update
  • Fix issue that advanced installation settings won't stick
  • Prevent sudb crashing Magisk Manager

v5.5.1

  • Fix an issue in setting up superuser database, which causes some users to experience tons of root issues

v5.5.0

  • Fix dynamic resource loading, prevent crashes when checking SafetyNet
  • Update SignAPK to use very little RAM for supporting old devices
  • Support settings migration after hiding Magisk Manager
  • Add reboot menu in modules section
  • Add dark theme to superuser request dialogs
  • Properly handle new HIGHCOMP and add recommended KEEPVERITY and KEEPFORCEENCRYPT flags for installation
  • Support new paths for v14.6
  • Massive improvements in repackaging Magisk Manager

v5.4.3

  • Add flags to intent to prevent crashes
  • Update translations

v5.4.2

  • Support new paths and setup of v14.5
  • Support repackaging Magisk Manager for hiding (only works on v14.5+)
  • Support hardlinking global su database into app data
  • Support signing boot images (AVB 1.0)
  • Update app icon to adaptive icons
  • Remove app from MagiskHide list if uninstalled
  • Add support to save detailed logs when installing Magisk or modules
  • Fix download progress error if module is larger than 20MB
  • Changed the way how downloaded repos are processed, should be rock stable
  • Prevent crashes when database is corrupted - clear db instead
  • Fix saving wrong UID issue on multiuser mode
  • Add custom update channel support - you can now switch to your own update server!
  • Some UI adjustments and asynchronous UI performance improvements

v5.4.0

  • SafetyNet checks now require external code extension (for 100% FOSS)
  • Repo loading will now show real-time progress instead of blank screen
  • Show progress when downloading an online module
  • Allow secondary users to access superuser settings if allowed
  • Fix several places where external storage is needed but forgot to request
  • Fetching online repo info from sever is significantly faster thanks to multithreading
  • Pulling down Download page will now force a full refresh, thanks to the faster loading speed
  • Using new resetprop tool to properly detect MagiskHide status

v5.3.5

  • Fix error when MagiskManager folder doesn't exist
  • Offload many logic to scripts: script fixes will also be picked up in the app
  • Add installing Magisk to second slot on A/B partition devices
  • Support file based encryption: store necessary files into DE storage
  • Update uninstall method to self remove app and prompt user to manually reboot

v5.3.0

  • Add hide Magisk Manager feature - hide the app from detection
  • Add update channel settings - you can now receive beta updates through the app
  • Proper runtime permission implementation - request storage permission only when needed
  • Add boot image file patch feature - you can patch boot images without root!
  • Rewrite Magisk direct install method - merge with boot image file patch mode
  • Add feature to restore stock boot image - convenient for applying OTAs

v5.2.0

  • Fix force close which occurs when failure in flashing zips
  • Remove several external dependencies and rewrite a large portion of components
  • Improve MarkDown support: showing README.MD is much faster and will properly render Unicode characters (e.g. Chinese characters)
  • Add language settings: you can now switch to languages other than system default
  • Remove busybox included within APK; download through Internet if needed
  • Use Magisk internal busybox if detected
  • Busybox is added to the highest priority in PATH to create reliable shell environment
  • Always use global namespace for internal shell if possible

v5.1.1

  • Fix Magisk Manager hanging when reading files with no end newline
  • Massive rewrite AsyncTasks to prevent potential memory leak
  • Fix some minor issues with notifications
  • Improve update notification and popup behavior
  • Update internal uninstaller script

v5.1.0

  • Introduce a new flash log activity, so you know what is actually happening, just like flashing in custom recoveries!
  • Rewritten Java native shall interface: merged root shell and normal shell
  • Cleaned up implementation of repo recyclerview and adapters

v5.0.6

  • Fix crash when installing modules downloading from repos

v5.0.5

  • Fix update notifications on Android O
  • Fix crash when trying to install Magisk Manager update
  • Update translations

v5.0.4

  • Fix bug in su timeout

v5.0.3

  • Fix FC on boot on Android O
  • Adapt to Android O broadcast limitations: re-authenticate app when update is disabled on Android O

v5.0.2

  • Rewrite zip signing part, zips downloaded from repo will be properly signed and adjusted for custom recoveries

v5.0.1

  • Add namespace mode options
  • Fix a bug in Manager OTA system

v5.0.0

  • Support the new Magisk unified binary
  • Properly handle application install / uninstall root management issues
  • Add multiuser mode support
  • Add application upgrade re-authentication feature
  • Add basic integrity check for SafetyNet
  • Merged install fragment and status fragment into Magisk fragment
  • Fix theme switching glitch
  • Update translations

v4.3.3

  • Re-build APK with stable build tools

v4.3.2

  • Improve usage of Github API to support unlimited amount of online repos
  • Update translations (thanks to all contributors!!)

v4.3.1

  • Update proper Magisk busybox detection, will not be confused by busybox installed by default in custom roms

v4.3.0

  • Add Core Only Mode option
  • Fix crashes when selecting release note on Samsung devices
  • Hide modules using template lower than version 3

v4.2.7

  • Update translations
  • Update uninstall scripts

v4.2.6

  • Samsung crashes finally fixed (confirmed!)
  • Add settings to disable update notifications
  • Adjust Dark theme colors
  • Refined download section, now support download only when root is not detected
  • Fix crashes in boot image selection

v4.2

  • Change Repo cache to database
  • Dark theme refined
  • Alert Dialog buttons now properly aligned
  • Support very large online modules' zip processing
  • You can now download online modules without installing
  • Add notifications when new Magisk version is available
  • Removed changelog, donation link, support link in download cards
  • Read and display README.md for online modules

v4.1

  • Change MagiskHide startup
  • Reduce static data (= less memory leaks/issues)
  • Translation updates

v4.0

  • Whole new Superuser section for MagiskSU management!
  • Add Superuser tab in Logs section
  • Add lots of Superuser settings
  • Handle MagiskSU requests, logging, notifications
  • Controls MagiskHide initialization
  • Add disable button
  • Add uninstall button
  • Tons of improvements, not practical to list all 😃

v3.1

  • Fix online repo inaccessible issue
  • Fix repo list card expanding issues
  • Change SafetyNet check to manually triggered
  • Update translations
  • Tons of bug fixes preventing potential crashes

v3.0

  • Now on Play Store
  • Add Status Section, you can check Safety Net, root status, and Magisk status in one place
  • Add Install Section, you can manually choose the boot image location and advanced options

v2.5

  • Add Magisk Hide section, you can now add/remove apps from Magisk Hide list
  • Support custom Magisk Version names, any string is now accepted (for custom builds)
  • Fixed modules and repos not sorted by name

v2.1

  • Add Magisk Hide settings
  • Add search bar in "Downloads Sections"
  • Fix crashes when no root is available
  • Fix trash can icon not updated when removing module
  • Prevent crash when Magisk Version is set incorrectly

v2.0

  • Massive refactor
  • Material Design
  • Module Management
  • Download Section
  • And much more....

v1.0

  • 初始版本

参考链接

',139),n=[o];function r(s,d,h,u,c,v){return i(),a("div",null,n)}const m=e(t,[["render",r]]);export{g as __pageData,m as default}; diff --git a/assets/app_changes.md.6856ae7f.lean.js b/assets/app_changes.md.de37dcd7.lean.js similarity index 70% rename from assets/app_changes.md.6856ae7f.lean.js rename to assets/app_changes.md.de37dcd7.lean.js index 93be9b77..a8f089b3 100644 --- a/assets/app_changes.md.6856ae7f.lean.js +++ b/assets/app_changes.md.de37dcd7.lean.js @@ -1 +1 @@ -import{_ as e,o as i,c as a,V as l}from"./chunks/framework.fc84ac3a.js";const g=JSON.parse('{"title":"Magisk Manager 更新日志","description":"","frontmatter":{},"headers":[],"relativePath":"app_changes.md","filePath":"app_changes.md","lastUpdated":1675020658000}'),t={name:"app_changes.md"},o=l("",139),n=[o];function r(s,d,h,u,c,v){return i(),a("div",null,n)}const m=e(t,[["render",r]]);export{g as __pageData,m as default}; +import{_ as e,o as i,c as a,Q as l}from"./chunks/framework.ed90c782.js";const g=JSON.parse('{"title":"Magisk Manager 更新日志","description":"","frontmatter":{},"headers":[],"relativePath":"app_changes.md","filePath":"app_changes.md","lastUpdated":1675020658000}'),t={name:"app_changes.md"},o=l("",139),n=[o];function r(s,d,h,u,c,v){return i(),a("div",null,n)}const m=e(t,[["render",r]]);export{g as __pageData,m as default}; diff --git a/assets/boot.md.5c35ff3b.js b/assets/boot.md.5c35ff3b.js new file mode 100644 index 00000000..32f15af2 --- /dev/null +++ b/assets/boot.md.5c35ff3b.js @@ -0,0 +1 @@ +import{_ as t,o as e,c as o,Q as r}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"Android 引导诡计","description":"","frontmatter":{},"headers":[],"relativePath":"boot.md","filePath":"boot.md","lastUpdated":1695485311000}'),d={name:"boot.md"},n=r('

Android 引导诡计

术语

  • rootdir:根目录 (/)。所有 文件、文件夹或文件系统 都存储在 rootdir 中或挂载在 rootdir 下。在 Android 上,文件系统可以是 rootfssystem 分区。
  • initramfs:Android 启动映像中的一个部分,Linux 内核将使用它作为rootfs。人们也可以使用术语 ramdisk
  • recoveryboot 分区:这两个实际上非常相似:都是包含 ramdisk 和 Linux 内核的 Android 启动映像(加上其他一些东西)。 唯一的区别是,启动 boot 分区将把我们带到 Android,而 recovery 有一个用于修复和升级设备的极简自带 Linux 环境。
  • SAR:系统作为根(System-as-root)。也就是说,设备使用 system 作为 rootdir,而不是 rootfs
  • A/B, A-only:对于支持无缝系统更新的设备,它将具有所有只读分区的2个插槽(partition);我们称这些为A/B设备。为了区分,非A/B设备将称为A-only
  • 2SI:两阶段初始化。Android 10+ 的启动方式。稍后提供更多信息。

以下是一些参数,可帮助您更精确地定义设备的 Android 版本:

  • LV:推出版本。设备推出时使用的安卓版本。也就是说,设备首次上市时预装的 Android 版本。
  • RV:运行版本。设备当前运行的 Android 版本。

我们将使用 Android API 级别 来表示 LV 和 RV 。API 级别和 Android 版本之间的映射可以在这张表格中看到。例如:Pixel XL 随 Android 7.1 发布,并运行 Android 10,这些参数将为 (LV = 25, RV = 29)

引导方法

Android 启动可以大致分为 3 种主要的不同方法。我们提供了一个一般的经验法则,以确定您的设备最有可能使用哪种方法,但例外情况单独列出。

方法初始根目录最终根目录
Arootfsrootfs
Bsystemsystem
Crootfssystem
  • 方法 A - 传统 ramdisk:这是所有 Android 设备过去启动的方式(过去的美好时光)。内核使用 initramfs 作为 rootdir,exec /init 来引导。
    • 不属于方法 B 和 C 标准中的设备
  • 方法 B - 传统 SAR:此方法首次出现在 Pixel 1 上。内核直接挂载 system 分区作为 rootdir 并且 exec /init 来引导。
    • 具有 (LV = 28) 的设备
    • 谷歌:Pixel 1 和 2。Pixel3 和 3a 为 (RV = 28)
    • 一加:6 - 7
    • 也许一些 (LV < 29) Android Go 设备?
  • 方法 C - 2SI ramdisk SAR:此方法首次出现在 Pixel 3 Android 10 开发者预览版中。内核使用 initramfs 作为 rootdir,在 rootfs 中使用 exec /init。这个 init 负责挂载 system 分区并将其用作新的 rootdir,最后执行 /system/bin/init 来引导。
    • 具有 (LV >= 29) 的设备
    • 具有 (LV < 28, RV >= 29) 的设备,不包括已在使用方法 B 的设备
    • 谷歌:Pixel 3 和 3a 为 (RV >= 29)

讨论

从文档来看,谷歌对 SAR 的定义只考虑了内核如何引导设备(上表中的初始根目录),这意味着从谷歌的角度来看,只有使用方法B的设备才被正式视为 SAR 设备。

然而,对于 Magisk 来说,真正的区别在于设备在完全启动时使用的是什么(上表中的最终根目录),这意味着就 Magisk 而言,方法 B 和方法 C 都是 SAR 的一种形式,但实施方式不同。除非另有特别说明,否则本文件后面提到的每一个 SAR 实例都将参考 Magisk 的定义

通俗地说,方法 C 的标准有点复杂:您的设备足够现代,可以使用 Android 10+ 启动,或者您在使用方法 A 的设备上运行 Android 10+ 第三方 ROM。

  • 任何运行 Android 10+ 的设备都将自动使用方法 C
  • 方法 B 设备卡在方法 B 上,唯一的例外是 Pixel 3 和 3a,Google 对设备进行了改造以适应新方法。

SAR 是 Project Treble 中非常重要的一部分,因为 rootdir 应该与平台绑定。这也是方法 B 和 C 带有 (LV >= ver) 标准的原因,因为谷歌每年都强制所有 OEM 遵守更新的要求。

一些历史

当谷歌发布第一代 Pixel 时,它还推出了 A/B(无缝)系统更新。由于存储大小问题,与仅 A 相比有几个区别,最相关的是删除 recovery 分区和 recovery ramdisk ,合并到boot中。

让我们回到 Google 第一次设计 A/B 的时候。如果使用 SAR(当时只有引导方法 B 存在),内核不需要 initramfs 来引导 Android(因为 rootdir 在 system 中)。这意味着我们可以很聪明,只需将 recovery ramdisk(包含极简的 Linux 环境)塞入 boot ,删除 recovery ,然后让内核根据引导加载程序的信息选择要使用的任何根目录(ramdisk 或 system)。

随着时间从 Android 7.1 到 Android 10 的流逝,谷歌推出了动态分区。这对 SAR 来说是个坏消息,因为 Linux 内核无法直接理解这种新的分区格式,因此无法直接将 system 挂载为 rootdir。这是他们想出引导方法 C 的时候:总是引导到 initramfs ,并让 userspace 处理其余的引导。这包括决定启动到 Android 或 recovery,或者他们正式称之为 USES_RECOVERY_AS_BOOT

一些使用带有 2SI 的 A/B 的现代设备还带有 recovery_a/_b 分区。谷歌的标准正式支持这一点。当 recovery 存储在单独的分区中时,这些设备将只使用 boot ramdisk 引导到 Android。

将这些拼凑在一起

有了上面的所有知识,现在我们可以将所有 Android 设备分类为以下不同类型:

类型引导方式分区2SIboot 里的 ramdisk
IAA-onlyNoboot ramdisk
IIBA/BAnyrecovery ramdisk
IIIBA-onlyAnyN/A
IVCAnyYes混合 ramdisk

这些类型按首次可用时的时间顺序排序。

  • I 类:好的旧传统 ramdisk 引导
  • II 类:旧版 A/B 设备。Pixel 1 是这种类型的第一个设备,同时也是第一个 A/B 和 SAR 设备。
  • III 类:2018 年末 - 2019 年 A-only 的设备。就 Magisk 而言,这是迄今为止最糟糕的一种设备类型
  • IV 类:所有使用引导方法 C 的设备都是 IV 型设备。A/B IV 类 ramdisk 可以根据引导加载程序的信息启动到 Android 或 recovery;A-only IV 类 ramdisk 只能引导到 Android。

关于 III 类设备的更多详细信息:Magisk 始终安装在引导映像的 ramdisk 中。对于所有其他类型的设备,由于其 boot 分区包含 ramdisk,因此可以通过 Magisk app 或第三方 recovery 中的刷入 ZIP 修补引导映像来轻松安装 Magisk。然而,对于 III 型设备,它们仅限于将 Magisk 安装到 recovery 分区中。Magisk 在正常启动时无法运行;相反,III 类设备用户必须始终重新启动到 recovery,以保持 Magisk 访问。

一些 III 类设备的引导加载程序仍然会接受并提供手动添加到内核 boot 映像中的 initramfs(例如一些小米手机),但许多设备不接受(例如三星 S10,Note 10)。这完全取决于 OEM 如何实现其引导加载程序。

参考链接

',30),i=[n];function s(a,l,c,g,h,A){return e(),o("div",null,i)}const p=t(d,[["render",s]]);export{m as __pageData,p as default}; diff --git a/assets/boot.md.a0ab583f.lean.js b/assets/boot.md.5c35ff3b.lean.js similarity index 52% rename from assets/boot.md.a0ab583f.lean.js rename to assets/boot.md.5c35ff3b.lean.js index d1b713e7..23e57220 100644 --- a/assets/boot.md.a0ab583f.lean.js +++ b/assets/boot.md.5c35ff3b.lean.js @@ -1 +1 @@ -import{_ as t,o as e,c as o,V as r}from"./chunks/framework.fc84ac3a.js";const m=JSON.parse('{"title":"Android 引导诡计","description":"","frontmatter":{},"headers":[],"relativePath":"boot.md","filePath":"boot.md","lastUpdated":1675020658000}'),d={name:"boot.md"},n=r("",30),i=[n];function s(a,l,c,g,h,A){return e(),o("div",null,i)}const p=t(d,[["render",s]]);export{m as __pageData,p as default}; +import{_ as t,o as e,c as o,Q as r}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"Android 引导诡计","description":"","frontmatter":{},"headers":[],"relativePath":"boot.md","filePath":"boot.md","lastUpdated":1695485311000}'),d={name:"boot.md"},n=r("",30),i=[n];function s(a,l,c,g,h,A){return e(),o("div",null,i)}const p=t(d,[["render",s]]);export{m as __pageData,p as default}; diff --git a/assets/boot.md.a0ab583f.js b/assets/boot.md.a0ab583f.js deleted file mode 100644 index 5c5a0393..00000000 --- a/assets/boot.md.a0ab583f.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,o as e,c as o,V as r}from"./chunks/framework.fc84ac3a.js";const m=JSON.parse('{"title":"Android 引导诡计","description":"","frontmatter":{},"headers":[],"relativePath":"boot.md","filePath":"boot.md","lastUpdated":1675020658000}'),d={name:"boot.md"},n=r('

Android 引导诡计

术语

  • rootdir:根目录 (/)。所有 文件、文件夹或文件系统 都存储在 rootdir 中或挂载在 rootdir 下。在 Android 上,文件系统可以是 rootfssystem 分区。
  • initramfs:Android 启动映像中的一个部分,Linux 内核将使用它作为rootfs。人们也可以使用术语 ramdisk
  • recoveryboot 分区:这两个实际上非常相似:都是包含 ramdisk 和 Linux 内核的 Android 启动映像(加上其他一些东西)。 唯一的区别是,启动 boot 分区将把我们带到 Android,而 recovery 有一个用于修复和升级设备的极简自带 Linux 环境。
  • SAR:系统作为根(System-as-root)。也就是说,设备使用 system 作为rootdir,而不是 rootfs
  • A/B, A-only:对于支持无缝系统更新的设备,它将具有所有只读分区的2个插槽(partition);我们称这些为A/B设备。为了区分,非A/B设备将称为A-only
  • 2SI:两阶段初始化。Android 10+ 的启动方式。稍后提供更多信息。

以下是一些参数,可帮助您更精确地定义设备的 Android 版本:

  • LV:推出版本。设备推出时使用的安卓版本。也就是说,设备首次上市时预装的 Android 版本。
  • RV:运行版本。设备当前运行的 Android 版本。

我们将使用 Android API 级别 来表示 LV 和 RV 。API 级别和 Android 版本之间的映射可以在 (https://source.android.google.cn/setup/start/build-numbers#platform-code-names-versions-api-levels-and-ndk-releases) 中看到。例如:Pixel XL 随 Android 7.1 发布,并运行 Android 10,这些参数将为 (LV = 25, RV = 29)

引导方法

Android 启动可以大致分为 3 种主要的不同方法。我们提供了一个一般的经验法则,以确定您的设备最有可能使用哪种方法,但例外情况单独列出。

方法初始根目录最终根目录
Arootfsrootfs
Bsystemsystem
Crootfssystem
  • 方法 A - 传统 ramdisk:这是所有 Android 设备过去启动的方式(过去的美好时光)。内核使用 initramfs 作为 rootdir,exec /init 来引导。
    • 不属于方法 B 和 C 标准中的设备
  • 方法 B - 传统 SAR:此方法首次出现在 Pixel 1 上。内核直接挂载 system 分区作为 rootdir 并且 exec /init 来引导。
    • 具有 (LV = 28) 的设备
    • 谷歌:Pixel 1 和 2。Pixel3 和 3a 为 (RV = 28)
    • 一加:6 - 7
    • 也许一些 (LV < 29) Android Go 设备?
  • 方法 C - 2SI ramdisk SAR:此方法首次出现在 Pixel 3 Android 10 开发者预览版中。内核使用 initramfs 作为 rootdir,在 rootfs 中使用 exec /init。这个 init 负责挂载 system 分区并将其用作新的 rootdir,最后执行 /system/bin/init 来引导。
    • 具有 (LV >= 29) 的设备
    • 具有 (LV < 28, RV >= 29) 的设备,不包括已在使用方法 B 的设备
    • 谷歌:Pixel 3 和 3a 为 (RV >= 29)

讨论

从文档来看,谷歌对 SAR 的定义只考虑了内核如何引导设备(上表中的初始根目录),这意味着从谷歌的角度来看,只有使用方法B的设备才被正式视为 SAR 设备。

然而,对于 Magisk 来说,真正的区别在于设备在完全启动时使用的是什么(上表中的最终根目录),这意味着就 Magisk 而言,方法 B 和方法 C 都是 SAR 的一种形式,但实施方式不同。除非另有特别说明,否则本文件后面提到的每一个 SAR 实例都将参考 Magisk 的定义

通俗地说,方法 C 的标准有点复杂:您的设备足够现代,可以使用 Android 10+ 启动,或者您在使用方法 A 的设备上运行 Android 10+ 第三方 ROM。

  • 任何运行 Android 10+ 的设备都将自动使用方法 C
  • 方法 B 设备卡在方法 B 上,唯一的例外是 Pixel 3 和 3a,Google 对设备进行了改造以适应新方法。

SAR 是 Project Treble 中非常重要的一部分,因为 rootdir 应该与平台绑定。这也是方法 B 和 C 带有 (LV >= ver) 标准的原因,因为谷歌每年都强制所有 OEM 遵守更新的要求。

一些历史

当谷歌发布第一代 Pixel 时,它还推出了 A/B(无缝)系统更新。由于存储大小问题,与仅 A 相比有几个区别,最相关的是删除 recovery 分区和 recovery ramdisk ,合并到boot中。

让我们回到 Google 第一次设计 A/B 的时候。如果使用 SAR(当时只有引导方法 B 存在),内核不需要 initramfs 来引导 Android(因为 rootdir 在 system 中)。这意味着我们可以很聪明,只需将 recovery ramdisk(包含极简的 Linux 环境)塞入 boot ,删除 recovery ,然后让内核根据引导加载程序的信息选择要使用的任何根目录(ramdisk 或 system)。

随着时间从 Android 7.1 到 Android 10 的流逝,谷歌推出了动态分区。这对 SAR 来说是个坏消息,因为 Linux 内核无法直接理解这种新的分区格式,因此无法直接将 system 挂载为 rootdir。这是他们想出引导方法 C 的时候:总是引导到 initramfs ,并让 userspace 处理其余的引导。这包括决定是否启动到 Android 或 recovery,或者他们正式称之为 USES_RECOVERY_AS_BOOT

一些使用带有 2SI 的 A/B 的现代设备还带有 recovery_a/_b 分区。谷歌的标准正式支持这一点。当 recovery 存储在单独的分区中时,这些设备将只使用 boot ramdisk 引导到 Android。

将事物拼凑在一起

有了上面的所有知识,现在我们可以将所有 Android 设备分类为以下不同类型:

类型引导方式分区2SIboot 里的 ramdisk
IAA-onlyNoboot ramdisk
IIBA/BAnyrecovery ramdisk
IIIBA-onlyAnyN/A
IVCAnyYes混合 ramdisk

这些类型按首次可用时的时间顺序排序。

  • I 类:好的旧传统 ramdisk 引导
  • II 类:旧版 A/B 设备。Pixel 1 是这种类型的第一个设备,同时也是第一个 A/B 和 SAR 设备。
  • III 类:2018年末-2019年仅限A级的设备就 Magisk 而言,这是迄今为止最糟糕的一种设备类型
  • IV 类:所有使用引导方法 C 的设备都是 IV 型设备。A/B IV 类 ramdisk 可以根据引导加载程序的信息启动到 Android 或 recovery;A-only IV 类 ramdisk 只能引导到 Android。

关于 III 类设备的更多详细信息:Magisk 始终安装在引导映像的 ramdisk 中。对于所有其他类型的设备,由于其 boot 分区包含 ramdisk,因此可以通过 Magisk app 或第三方 recovery 中的刷入 ZIP 修补引导映像来轻松安装 Magisk。然而,对于 III 型设备,它们仅限于将 Magisk 安装到 recovery 分区中。Magisk 在正常启动时无法运行;相反,III 类设备用户必须始终重新启动到 recovery,以保持 Magisk 访问。

一些 III 类设备的引导加载程序仍然会接受并提供手动添加到内核“引导”映像中的 initramfs(例如一些小米手机),但许多设备不接受(例如三星 S10,Note 10)。这完全取决于 OEM 如何实现其引导加载程序。

参考链接

',30),i=[n];function s(a,l,c,g,h,A){return e(),o("div",null,i)}const p=t(d,[["render",s]]);export{m as __pageData,p as default}; diff --git a/assets/build.md.4713d06e.js b/assets/build.md.4713d06e.js deleted file mode 100644 index b813f2eb..00000000 --- a/assets/build.md.4713d06e.js +++ /dev/null @@ -1,4 +0,0 @@ -import{_ as a,o as l,c as o,V as s}from"./chunks/framework.fc84ac3a.js";const b=JSON.parse('{"title":"构建和开发 Magisk","description":"","frontmatter":{},"headers":[],"relativePath":"build.md","filePath":"build.md","lastUpdated":1684157238000}'),e={name:"build.md"},i=s(`

构建和开发 Magisk

设置环境

  • 支持的平台:
    • Linux x64
    • macOS x64 (Intel)
    • macOS arm64 (Apple Silicon)
    • Windows x64
  • 仅 Windows: 启用开发者模式。因为需要支持符号链接。
  • 安装 Python 3.8+:
    • 在 Unix 上,使用您喜欢的软件包管理器安装 python3
    • 在 Windows 上,在官方网站上下载并安装 Python 最新的版本.
      请在安装过程中选择 “Add Python to PATH(将 Python 添加到 PATH)”
    • (在 Windows 上,可选):运行 pip install colorama 以安装 colorama python 包
  • 安装 Git:
    • 在 Unix 上,使用您喜欢的软件包管理器安装 git
    • 在 Windows 上,在官方网站上下载并安装最新的 Git 版本.
      请确保在安装过程前 “启用符号链接”
  • 安装 Android Studio 并按照说明进行初始设置。
  • 将环境变量 ANDROID_SDK_ROOT 设置为 Android SDK 文件夹。此路径可以在 Android Studio 设置中找到。
  • 设置 JDK:
    • 建议的选项是将环境变量 ANDROID_STUDIO 设置为 Android Studio 的安装路径。构建脚本将自动查找并使用捆绑的 JDK。
    • 您也可以自己设置 JDK 17,但本指南不包含说明。
  • 克隆源代码:
bash
git clone --recurse-submodules https://github.com/topjohnwu/Magisk.git
  • 运行 ./build.py ndk 让脚本下载并安装 NDK

构建

  • 要构建所有内容并创建最终的 Magisk APK,请运行 ./build.py all
  • 您还可以构建特定的子组件。调用 build.py 查看您的选项
    对于每个操作,使用 -h 访问帮助(例如 ./build.py binary -h
  • 使用 config.prop 配置构建。提供了示例 config.prop.sample

IDE 支持

  • Magisk 的存储库可以作为一个项目直接使用 Android Studio 打开。
  • 项目中的 Kotlin、Java、C++ 和 C 代码应该在 Android Studio 中得到开箱即用的适当支持。
  • 在处理原生(native)代码之前运行 ./build.py binary ,因为某些生成的代码仅在构建过程中创建。

在 Android Studio 中开发 Rust

由于 Magisk NDK 软件包 ONDK(与 ./build.py ndk 一起安装的软件包)包含一个完全独立的 Clang + Rust 工具链,因此单独构建 Magisk 项目不需要配置工具链。但是,由于 Intellij Rust 插件的工作方式,您必须进行一些额外的设置才能使 Android Studio 与 Magisk 的 Rust 代码库一起使用:

  • 安装官方 Rust 工具链管理器 rustup
  • 链接 ONDK Rust 工具链并将其设置为默认值:
bash
# 将 ONDK 工具链与名称“magisk”链接起来
-rustup toolchain link magisk "$ANDROID_SDK_ROOT/ndk/magisk/toolchains/rust"
-# 设置为默认
-rustup default magisk
  • 在 Android Studio 中安装 Intellij Rust 插件
  • 在 首选项(Preferences) > 语言和框架(Languages & Frameworks) > Rust 中,将 $ANDROID_SDK_ROOT/ndk/magisk/toolchains/rust/bin 设置为工具链位置
  • 打开 native/src/Cargo.toml ,然后在“未找到 Cargo 项目(No Cargo projects found)”横幅中选择“附加(Attach)”

签名和分发

  • 在发布版本中,Magisk 的 root 守护程序将使用对 Magisk APK 进行密钥签名的证书作为参考,拒绝并强制卸载任何不匹配的 Magisk 应用,保护用户免受恶意和未经验证的 Magisk APK 的侵害。
  • 要在 Magisk 本身上进行任何开发,请切换到 官方调试版本并重新安装 Magisk 以关闭签名检查。
  • 要分发使用您自己的密钥签名的自己的 Magisk 构建,请在 config.prop 中设置您的签名配置。
  • 查看 Google 的文档,了解有关生成自己的密钥的更多详细信息。
`,16),t=[i];function n(r,d,c,p,u,h){return l(),o("div",null,t)}const k=a(e,[["render",n]]);export{b as __pageData,k as default}; diff --git a/assets/build.md.4713d06e.lean.js b/assets/build.md.4713d06e.lean.js deleted file mode 100644 index a25c2199..00000000 --- a/assets/build.md.4713d06e.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as l,c as o,V as s}from"./chunks/framework.fc84ac3a.js";const b=JSON.parse('{"title":"构建和开发 Magisk","description":"","frontmatter":{},"headers":[],"relativePath":"build.md","filePath":"build.md","lastUpdated":1684157238000}'),e={name:"build.md"},i=s("",16),t=[i];function n(r,d,c,p,u,h){return l(),o("div",null,t)}const k=a(e,[["render",n]]);export{b as __pageData,k as default}; diff --git a/assets/build.md.66bfa6cb.js b/assets/build.md.66bfa6cb.js new file mode 100644 index 00000000..857e0beb --- /dev/null +++ b/assets/build.md.66bfa6cb.js @@ -0,0 +1,7 @@ +import{_ as n,C as e,o as t,c as i,k as s,a,H as r,Q as l}from"./chunks/framework.ed90c782.js";const P=JSON.parse('{"title":"构建和开发 Magisk","description":"","frontmatter":{},"headers":[],"relativePath":"build.md","filePath":"build.md","lastUpdated":1685389078000}'),p={name:"build.md"},c=s("h1",{id:"构建和开发-magisk",tabindex:"-1"},[a("构建和开发 Magisk "),s("a",{class:"header-anchor",href:"#构建和开发-magisk","aria-label":'Permalink to "构建和开发 Magisk"'},"​")],-1),d=s("h2",{id:"设置环境",tabindex:"-1"},[a("设置环境 "),s("a",{class:"header-anchor",href:"#设置环境","aria-label":'Permalink to "设置环境"'},"​")],-1),u=s("li",null,[a("支持的平台: "),s("ul",null,[s("li",null,"Linux x64"),s("li",null,"macOS x64 (Intel)"),s("li",null,"macOS arm64 (Apple Silicon)"),s("li",null,"Windows x64")])],-1),h=s("li",null,[a("仅 Windows: 启用"),s("a",{href:"https://learn.microsoft.com/zh-cn/windows/apps/get-started/enable-your-device-for-development",target:"_blank",rel:"noreferrer"},"开发者模式"),a("。因为需要支持符号链接。")],-1),g=s("li",null,"在 Unix 上,使用您喜欢的软件包管理器安装 python3",-1),_=s("li",null,[a("在 Windows 上,在"),s("a",{href:"https://www.python.org/downloads/windows/",target:"_blank",rel:"noreferrer"},"官方网站"),a("上下载并安装 Python 最新的版本。"),s("br"),a(" 请在安装过程中选择 "),s("strong",null,"“Add Python to PATH(将 Python 添加到 PATH)”"),a("。")],-1),y=s("code",null,"pip install colorama",-1),k=s("code",null,"colorama",-1),b=l('
  • 安装 Git:
    • 在 Unix 上,使用您喜欢的软件包管理器安装 git
    • 在 Windows 上,在官方网站上下载并安装最新的 Git 版本。
      请确保在安装过程前 “启用符号链接”
  • 安装 Android Studio 并按照说明进行初始设置。
  • 将环境变量 ANDROID_SDK_ROOT 设置为 Android SDK 文件夹。此路径可以在 Android Studio 设置中找到。
  • 设置 JDK:
    • 建议的选项是将环境变量 ANDROID_STUDIO 设置为 Android Studio 的安装路径。构建脚本将自动查找并使用捆绑的 JDK。
    • 您也可以自己设置 JDK 17,但本指南不再赘述。
  • 克隆源代码:
  • ',5),E=l(`
    bash
    git clone --recurse-submodules https://github.com/topjohnwu/Magisk.git
    git clone --recurse-submodules https://github.com/topjohnwu/Magisk.git
    • 运行 ./build.py ndk 使用脚本下载并安装 NDK

    构建

    • 要构建所有内容并创建最终的 Magisk APK,请运行 ./build.py all
    • 您还可以构建特定的子组件。调用 build.py 查看您的选项
      对于每个操作,使用 -h 访问帮助(例如 ./build.py binary -h
    • 使用 config.prop 配置构建。提供了示例 config.prop.sample

    IDE 支持

    • Magisk 的存储库可以作为一个项目直接使用 Android Studio 打开。
    • 项目中的 Kotlin、Java、C++ 和 C 代码应该在 Android Studio 中得到适当的开箱即用的支持。
    • 在处理原生(native)代码之前运行 ./build.py binary ,因为某些生成的代码仅在构建过程中创建。

    在 Android Studio 中开发 Rust

    由于 Magisk NDK 软件包 ONDK(与 ./build.py ndk 一起安装的软件包)包含一个完全独立的 Clang + Rust 工具链,因此单独构建 Magisk 项目不需要配置工具链。但是,由于 Intellij Rust 插件的工作方式,您必须进行一些额外的设置才能使 Android Studio 与 Magisk 的 Rust 代码库一起使用:

    • 安装官方 Rust 工具链管理器 rustup
    • 链接 ONDK Rust 工具链并将其设置为默认值:
    bash
    # 将 ONDK 工具链与名称“magisk”链接起来
    +rustup toolchain link magisk "$ANDROID_SDK_ROOT/ndk/magisk/toolchains/rust"
    +# 设置为默认
    +rustup default magisk
    # 将 ONDK 工具链与名称“magisk”链接起来
    +rustup toolchain link magisk "$ANDROID_SDK_ROOT/ndk/magisk/toolchains/rust"
    +# 设置为默认
    +rustup default magisk
    • 在 Android Studio 中安装 Intellij Rust 插件
    • 在 首选项(Preferences) > 语言和框架(Languages & Frameworks) > Rust 中,将 $ANDROID_SDK_ROOT/ndk/magisk/toolchains/rust/bin 设置为工具链位置
    • 打开 native/src/Cargo.toml ,然后在“未找到 Cargo 项目(No Cargo projects found)”横幅中选择“附加(Attach)”

    签名和分发

    • 在发布版本中,Magisk 的 root 守护程序将使用对 Magisk APK 进行密钥签名的证书作为参考,拒绝并强制卸载任何不匹配的 Magisk 应用,保护用户免受恶意和未经验证的 Magisk APK 的侵害。
    • 要在 Magisk 本身上进行任何开发,请切换到 官方调试版本并重新安装 Magisk 以关闭签名检查。
    • 要分发使用您自己的密钥签名的自己的 Magisk 构建,请在 config.prop 中设置您的签名配置。
    • 查看 Google 的文档,了解有关生成自己的密钥的更多详细信息。
    `,13);function m(f,F,D,A,C,S){const o=e("Badge");return t(),i("div",null,[c,d,s("ul",null,[u,h,s("li",null,[a("安装 Python 3.8+: "),s("ul",null,[g,_,s("li",null,[a("在 Windows 上 "),r(o,{type:"tip",text:"可选"}),a(" :运行 "),y,a(" 以安装 "),k,a(" python 包")])])]),b]),E])}const v=n(p,[["render",m]]);export{P as __pageData,v as default}; diff --git a/assets/build.md.66bfa6cb.lean.js b/assets/build.md.66bfa6cb.lean.js new file mode 100644 index 00000000..f6549749 --- /dev/null +++ b/assets/build.md.66bfa6cb.lean.js @@ -0,0 +1 @@ +import{_ as n,C as e,o as t,c as i,k as s,a,H as r,Q as l}from"./chunks/framework.ed90c782.js";const P=JSON.parse('{"title":"构建和开发 Magisk","description":"","frontmatter":{},"headers":[],"relativePath":"build.md","filePath":"build.md","lastUpdated":1685389078000}'),p={name:"build.md"},c=s("h1",{id:"构建和开发-magisk",tabindex:"-1"},[a("构建和开发 Magisk "),s("a",{class:"header-anchor",href:"#构建和开发-magisk","aria-label":'Permalink to "构建和开发 Magisk"'},"​")],-1),d=s("h2",{id:"设置环境",tabindex:"-1"},[a("设置环境 "),s("a",{class:"header-anchor",href:"#设置环境","aria-label":'Permalink to "设置环境"'},"​")],-1),u=s("li",null,[a("支持的平台: "),s("ul",null,[s("li",null,"Linux x64"),s("li",null,"macOS x64 (Intel)"),s("li",null,"macOS arm64 (Apple Silicon)"),s("li",null,"Windows x64")])],-1),h=s("li",null,[a("仅 Windows: 启用"),s("a",{href:"https://learn.microsoft.com/zh-cn/windows/apps/get-started/enable-your-device-for-development",target:"_blank",rel:"noreferrer"},"开发者模式"),a("。因为需要支持符号链接。")],-1),g=s("li",null,"在 Unix 上,使用您喜欢的软件包管理器安装 python3",-1),_=s("li",null,[a("在 Windows 上,在"),s("a",{href:"https://www.python.org/downloads/windows/",target:"_blank",rel:"noreferrer"},"官方网站"),a("上下载并安装 Python 最新的版本。"),s("br"),a(" 请在安装过程中选择 "),s("strong",null,"“Add Python to PATH(将 Python 添加到 PATH)”"),a("。")],-1),y=s("code",null,"pip install colorama",-1),k=s("code",null,"colorama",-1),b=l("",5),E=l("",13);function m(f,F,D,A,C,S){const o=e("Badge");return t(),i("div",null,[c,d,s("ul",null,[u,h,s("li",null,[a("安装 Python 3.8+: "),s("ul",null,[g,_,s("li",null,[a("在 Windows 上 "),r(o,{type:"tip",text:"可选"}),a(" :运行 "),y,a(" 以安装 "),k,a(" python 包")])])]),b]),E])}const v=n(p,[["render",m]]);export{P as __pageData,v as default}; diff --git a/assets/changes.md.0bfaa152.js b/assets/changes.md.0bfaa152.js deleted file mode 100644 index 52663038..00000000 --- a/assets/changes.md.0bfaa152.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,o as e,c as o,V as a}from"./chunks/framework.fc84ac3a.js";const h=JSON.parse('{"title":"Magisk 更新日志","description":"","frontmatter":{},"headers":[],"relativePath":"changes.md","filePath":"changes.md","lastUpdated":1681768747000}'),l={name:"changes.md"},t=a('

    Magisk 更新日志

    v26.1

    • [App] Fix crashing when revoking root permissions
    • [MagiskInit] Always prefer ext4 partitions over f2fs when selecting the pre-init partition
    • [General] Restore module files' context/owner/group from mirror. This is a regression introduced in v26.0

    v26.0

    • [General] Bump minimum supported Android version to Android 6.0
    • [General] New magic mount backend. It supports loading modules into system with overlayfs files injected
    • [Zygisk] Release new API version 4
    • [Zygisk] Prevent crashing daemon in error
    • [Zygisk] Rewrite zygote code injection with new loader library approach
    • [Zygisk] Rewrite code unloading implementation
    • [MagiskBoot] Support amonet microloader devices
    • [MagiskBoot] Always use lz4_legacy compression on v4 boot images. This fixes boot image patching issues on Android U preview.
    • [MagiskInit] Support replacing existing *.rc files in overlay.d
    • [MagiskInit] Rewrite sepolicy.rules mounting and loading implementation
    • [App] Make stub patching 100% offline
    • [App] Support patching init_boot.img for Samsung ODIN firmware
    • [MagiskPolicy] Fix minor bug in command line argument parsing
    • [MagiskPolicy] Update rules to support Android U

    v25.2

    • [MagiskInit] Fix a potential issue when stub cpio is used
    • [MagiskInit] Fix reboot to recovery when stub cpio is used
    • [MagiskInit] Fix sepolicy.rules symlink for rootfs devices
    • [General] Better data encryption detection
    • [General] Move the whole logging infrastructure into Rust

    v25.1

    • [MagiskBoot] Fix ramdisk backup being incorrectly skipped
    • [MagiskBoot] Add new feature to detect unsupported dtb and abort during installation
    • [Zygisk] Change binary hijack paths
    • [App] Fix incorrect recovery mode detection and installation
    • [MagiskInit] Fix config not properly exported in legacy SAR devices
    • [General] Enforce the Magisk app to always match or be newer than magiskd

    v25.0

    • [MagiskInit] Update 2SI implementation, significantly increase device compatibility (e.g. Sony Xperia devices)
    • [MagiskInit] Introduce new sepolicy injection mechanism
    • [MagiskInit] Support Oculus Go
    • [MagiskInit] Support Android 13 GKIs (Pixel 6)
    • [MagiskBoot] Fix vbmeta extraction implementation
    • [App] Fix stub app on older Android versions
    • [App] [MagiskSU] Properly support apps using sharedUserId
    • [MagiskSU] Fix a possible crash in magiskd
    • [MagiskSU] Prune unused UIDs as soon as system_server restarts to prevent UID reuse attacks
    • [MagiskSU] Verify and enforce the installed Magisk app's certificate to match the distributor's signature
    • [MagiskSU] [Zygisk] Proper package management and detection
    • [Zygisk] Fix function hooking on devices running Android 12 with old kernels
    • [Zygisk] Fix Zygisk's self code unloading implementation
    • [DenyList] Fix DenyList on shared UID apps
    • [BusyBox] Add workaround for devices running old kernels

    v24.3

    • [General] Stop using getrandom syscall
    • [Zygisk] Update API to v3, adding new fields to AppSpecializeArgs
    • [App] Improve app repackaging installation workflow

    v24.2

    • [MagiskSU] Fix buffer overflow
    • [MagiskSU] Fix owner managed multiuser superuser settings
    • [MagiskSU] Fix command logging when using su -c <cmd>
    • [MagiskSU] Prevent su request indefinite blocking
    • [MagiskBoot] Support lz4_legacy archive with multiple magic
    • [MagiskBoot] Fix lz4_lg compression
    • [DenyList] Allow targeting processes running as system UID
    • [Zygisk] Workaround Samsung's "early zygote"
    • [Zygisk] Improved Zygisk loading mechanism
    • [Zygisk] Fix application UID tracking
    • [Zygisk] Fix improper umask being set in zygote
    • [App] Fix BusyBox execution test
    • [App] Improve stub loading mechanism
    • [App] Major app upgrade flow improvements
    • [General] Improve commandline error handling and messaging

    v24.1

    • [App] Stability improvements

    v24.0

    • [General] MagiskHide is removed from Magisk
    • [General] Support Android 12
    • [General] Support devices that do not support 32-bit and only runs 64-bit code
    • [General] Update BusyBox to 1.34.1
    • [Zygisk] Introduce new feature: Zygisk
    • [Zygisk] Introduce DenyList feature to revert Magisk features in user selected processes
    • [MagiskBoot] Support patching 32-bit kernel zImages
    • [MagiskBoot] Support boot image header v4
    • [MagiskBoot] Support patching out skip_initramfs from dtb bootargs
    • [MagiskBoot] Add new env variable PATCHVBMETAFLAG to configure whether vbmeta flags should be patched
    • [MagiskInit] Support loading fstab from /system/etc (required for Pixel 6)
    • [MagiskInit] Support /proc/bootconfig for loading boot configurations
    • [MagiskInit] Better support for some Meizu devices
    • [MagiskInit] Better support for some OnePlus/Oppo/Realme devices
    • [MagiskInit] Support init.real on some Sony devices
    • [MagiskInit] Skip loading Magisk when detecting DSU
    • [MagiskPolicy] Load *_compat_cil_file from system_ext
    • [MagiskSU] Use isolated devpts if the kernel supports it
    • [MagiskSU] Fix root shell if isolated mount namespace is set
    • [resetprop] Deleted properties are now wiped from memory instead of just unlinking
    • [App] Build a single APK for all ABIs
    • [App] Switch to use standard bottom navigation bar
    • [App] Downloading modules from the centralized Magisk-Modules-Repo is removed
    • [App] Support user configuration of boot image vbmeta patching
    • [App] Restore the ability to install Magisk on the other slot on some A/B devices
    • [App] Allow modules to specify an update URL for in-app update + install

    v23.0

    • [App] Update snet extension. This fixes SafetyNet API errors.
    • [App] Fix a bug in the stub app that causes APK installation to fail
    • [App] Hide annoying errors in logs when hidden as stub
    • [App] Fix issues when patching ODIN tar files when the app is hidden
    • [General] Remove all pre Android 5.0 support
    • [General] Update BusyBox to use proper libc
    • [General] Fix C++ undefined behaviors
    • [General] Several sepolicy.rule copy/installation fixes
    • [MagiskPolicy] Remove unnecessary sepolicy rules
    • [MagiskHide] Update package and process name validation logic
    • [MagiskHide] Some changes that prevents zygote deadlock

    v22.1

    • [App] Prevent multiple installation sessions running in parallel
    • [App] Prevent OutOfMemory crashes when checking boot signature on PXA boot images
    • [General] Proper cgroup migration implementation
    • [General] Rewrite log writer from scratch, should resolve any crashes and deadlocks
    • [General] Many scripts updates fixing regressions
    • [MagiskHide] Prevent possible deadlock when signal arrives
    • [MagiskHide] Partial match process names if necessary
    • [MagiskBoot] Preserve and patch AVB 2.0 structures/headers in boot images
    • [MagiskBoot] Properly strip out data encryption flags
    • [MagiskBoot] Prevent possible integer overflow
    • [MagiskInit] Fix sepolicy.rule mounting strategy
    • [resetprop] Always delete existing ro. props before updating. This will fix bootloops that could be caused by modifying device fingerprint properties.

    v22.0

    • [General] Magisk and Magisk Manager is now merged into the same package!
    • [App] The term "Magisk Manager" is no longer used elsewhere. We refer it as the Magisk app.
    • [App] Support hiding the Magisk app with advanced technique (stub APK loading) on Android 5.0+ (it used to be 9.0+)
    • [App] Disallow re-packaging the Magisk app on devices lower than Android 5.0
    • [App] Detect and warn about multiple invalid states and provide instructions on how to resolve it
    • [MagiskHide] Fix a bug when stopping MagiskHide does not take effect
    • [MagiskBoot] Fix bug when unpacking lz4_lg compressed boot images
    • [MagiskInit] Support Galaxy S21 series
    • [MagiskSU] Fix incorrect APEX paths that caused libsqlite.so fail to load

    v21.4

    • [MagiskSU] Fix su -c behavior that broke many root apps
    • [General] Properly handle read/write over sockets (the broken pipe issue)

    v21.3

    • [MagiskInit] Avoid mounting f2fs userdata as it may result in kernel crashes. This shall fix a lot of bootloops
    • [MagiskBoot] Fix a minor header checksum bug for DHTB header and ASUS blob image formats
    • [MagiskHide] Allowing hiding isolated processes if the mount namespace is separated

    v21.2

    • [MagiskInit] Detect 2SI after mounting system_root on legacy SAR devices
    • [General] Make sure post-fs-data scripts cannot block more than 35 seconds
    • [General] Fix the magisk --install-module command
    • [General] Trim Windows newline when reading files
    • [General] Directly log to file to prevent logcat weirdness
    • [MagiskBoot] Fix header dump/load for header v3 images

    v21.1

    • [MagiskBoot] Support boot header v3 (Pixel 5 and 4a 5G)
    • [MagiskBoot] Distinguish lz4_lg and lz4_legacy (Pixel 5 and 4a 5G)
    • [MagiskBoot] Support vendor boot images (for dev, not relevant for Magisk installation)
    • [MagiskInit] Support kernel cmdline androidboot.fstab_suffix
    • [MagiskInit] Support kernel initialized dm-verity on legacy SAR
    • [General] Significantly broaden sepolicy.rule compatibility
    • [General] Add Magisk binaries to PATH when executing boot scripts
    • [General] Update --remove-modules command implementation
    • [General] Make Magisk properly survive after factory reset on Android 11
    • [MagiskSU] Add APEX package com.android.i18n to LD_LIBRARY_PATH when linking libsqlite.so
    • [MagiskHide] Support hiding apps installed in secondary users (e.g. work profile)
    • [MagiskHide] Make zygote detection more robust

    v21.0

    • [General] Support Android 11 🎉
    • [General] Add Safe Mode detection. Disable all modules when the device is booting into Safe Mode.
    • [General] Increase post-fs-data mode timeout from 10 seconds to 40 seconds
    • [MagiskInit] Rewritten 2SI support from scratch
    • [MagiskInit] Support when no /sbin folder exists (Android 11)
    • [MagiskInit] Dump fstab from device-tree to rootfs and force init to use it for 2SI devices
    • [MagiskInit] Strip out AVB for 2SI as it may cause bootloop
    • [Modules] Rewritten module mounting logic from scratch
    • [MagiskSU] For Android 8.0+, a completely new policy setup is used. This reduces compromises in Android's sandbox, providing more policy isolation and better security for root users.
    • [MagiskSU] Isolated mount namespace will now first inherit from parent process, then isolate itself from the world
    • [MagiskSU] Update communication protocol with Magisk Manager to work with the hardened SELinux setup
    • [MagiskPolicy] Optimize match all rules. This will significantly reduce policy binary size and save memory and improve general kernel performance.
    • [MagiskPolicy] Support declaring new types and attributes
    • [MagiskPolicy] Make policy statement closer to stock *.te format. Please check updated documentation or magiskpolicy --help for more details.
    • [MagiskBoot] Support compressed extra blobs
    • [MagiskBoot] Pad boot images to original size with zeros
    • [MagiskHide] Manipulate additional vendor properties

    v20.4

    • [MagiskInit] Fix potential bootloop in A-only 2SI devices
    • [MagiskInit] Properly support Tegra partition naming
    • [General] Load libsqlite.so dynamically, which removes the need to use wrapper scripts on Android 10+
    • [General] Detect API level with a fallback method on some devices
    • [General] Workaround possible bug in x86 kernel readlinkat system call
    • [BusyBox] Enable SELinux features. Add chcon/runcon etc., and '-Z' option to many applets
    • [BusyBox] Introduce standalone mode. More details in release notes
    • [MagiskHide] Disable MagiskHide by default
    • [MagiskHide] Add more potential detectable system properties
    • [MagiskHide] Add workaround for Xiaomi devices bootloop when MagiskHide is enabled on cross region ROMs
    • [MagiskBoot] Support patching special Motorolla DTB format
    • [MagiskPolicy] Support 'genfscon' sepolicy rules
    • [Scripts] Support NAND based boot images (character nodes in /dev/block)
    • [Scripts] Better addon.d (both v1 and v2) support
    • [Scripts] Support Lineage Recovery for Android 10+

    v20.3

    • [MagiskBoot] Fix lz4_legacy decompression

    v20.2

    • [MagiskSU] Properly handle communication between daemon and application (root request prompt)
    • [MagiskInit] Fix logging in kmsg
    • [MagiskBoot] Support patching dtb/dtbo partition formats
    • [General] Support pre-init sepolicy patch in modules
    • [Scripts] Update magisk stock image backup format

    v20.1

    • [MagiskSU] Support component name agnostic communication (for stub APK)
    • [MagiskBoot] Set proper header_size in boot image headers (fix vbmeta error on Samsung devices)
    • [MagiskHide] Scan zygote multiple times
    • [MagiskInit] Support recovery images without /sbin/recovery binary. This will fix some A/B devices unable to boot to recovery after flashing Magisk
    • [General] Move acct to prevent daemon being killed
    • [General] Make sure "--remove-modules" will execute uninstall.sh after removal

    v20.0

    • [MagiskBoot] Support inject/modify mnt_point value in DTB fstab
    • [MagiskBoot] Support patching QCDT
    • [MagiskBoot] Support patching DTBH
    • [MagiskBoot] Support patching PXA-DT
    • [MagiskInit] [2SI] Support non A/B setup (Android 10)
    • [MagiskHide] Fix bug that reject process names with ":"
    • [MagicMount] Fix a bug that cause /product mirror not created

    v19.4

    • [MagiskInit] [SAR] Boot system-as-root devices with system mounted as /
    • [MagiskInit] [2SI] Support 2-stage-init for A/B devices (Pixel 3 Android 10)
    • [MagiskInit] [initramfs] Delay sbin overlay creation to post-fs-data
    • [MagiskInit] [SARCompat] Old system-as-root implementation is deprecated, no more future changes
    • [MagiskInit] Add overlay.d support for root directory overlay for new system-as-root implementation
    • [MagiskSU] Unblock all signals in root shells (fix bash on Android)
    • [MagicMount] Support replacing files in /product
    • [MagiskHide] Support Android 10's Zygote blastula pool
    • [MagiskHide] All random strings now also have random length
    • [MagiskBoot] Allow no recompression for ramdisk.cpio
    • [MagiskBoot] Support some weird Huawei boot images
    • [General] Add new --remove-modules command to remove modules without root in ADB shell
    • [General] Support Android 10 new APEX libraries (Project Mainline)

    v19.3

    • [MagiskHide] Hugely improve process monitor implementation, hopefully should no longer cause 100% CPU and daemon crashes
    • [MagiskInit] Wait for partitions to be ready for early mount, should fix bootloops on a handful of devices
    • [MagiskInit] Support EROFS used in EMUI 9.1
    • [MagiskSU] Properly implement mount namespace isolation
    • [MagiskBoot] Proper checksum calculation for header v2

    v19.2

    • [General] Fix uninstaller
    • [General] Fix bootloops on some devices with tmpfs mounting to /data
    • [MagiskInit] Add Kirin hi6250 support
    • [MagiskSU] Stop claiming device focus for su logging/notify if feasible. This fix issues with users locking Magisk Manager with app lock, and prevent video apps get messed up when an app is requesting root in the background.

    v19.1

    • [General] Support recovery based Magisk
    • [General] Support Android Q Beta 2
    • [MagiskInit] New sbin overlay setup process for better compatibility
    • [MagiskInit] Allow long pressing volume up to boot to recovery in recovery mode
    • [MagicMount] Use proper system_root mirror
    • [MagicMount] Use self created device nodes for mirrors
    • [MagicMount] Do not allow adding new files/folders in partition root folder (e.g. /system or /vendor)

    v19.0

    • [General] Remove usage of magisk.img
    • [General] Add 64 bit magisk binary for native 64 bit support
    • [General] Support A only system-as-root devices that released with Android 9.0
    • [General] Support non EXT4 system and vendor partitions
    • [MagiskHide] Use Zygote ptracing for monitoring new processes
    • [MagiskHide] Targets are now per-application component
    • [MagiskInit] Support Android Q (no logical partition support yet!)
    • [MagiskPolicy] Support Android Q new split sepolicy setup
    • [MagiskInit] Move sbin overlay creation from main daemon post-fs-data to early-init
    • [General] Service scripts now run in parallel
    • [MagiskInit] Directly inject magisk services to init.rc
    • [General] Use lzma2 compressed ramdisk in extreme conditions
    • [MagicMount] Clone attributes from original file if exists
    • [MagiskSU] Use ACTION_REBOOT intent to workaround some OEM broadcast restrictions
    • [General] Use skip_mount instead of auto_mount: from opt-in to opt-out

    v18.1

    • [General] Support EMUI 9.0
    • [General] Support Kirin 960 devices
    • [General] Support down to Android 4.2
    • [General] Major code base modernization under-the-hood

    v18.0

    • [General] Migrate all code base to C++
    • [General] Modify database natively instead of going through Magisk Manager
    • [General] Deprecate path /sbin/.core, please start using /sbin/.magisk
    • [General] Boot scripts are moved from <magisk_img>/.core/<stage>.d to /data/adb/<stage>.d
    • [General] Remove native systemless hosts (Magisk Manager is updated with a built-in systemless hosts module)
    • [General] Allow module post-fs-data.sh scripts to disable/remove modules
    • [MagiskHide] Use component names instead of process names as targets
    • [MagiskHide] Add procfs protection on SDK 24+ (Nougat)
    • [MagiskHide] Remove the folder /.backup to prevent detection
    • [MagiskHide] Hide list is now stored in database instead of raw textfile in images
    • [MagiskHide] Add "--status" option to CLI
    • [MagiskHide] Stop unmounting non-custom related mount points
    • [MagiskSU] Add FLAG_INCLUDE_STOPPED_PACKAGES in broadcasts to force wake Magisk Manager
    • [MagiskSU] Fix a bug causing SIGWINCH not properly detected
    • [MagiskPolicy] Support new av rules: type_change, type_member
    • [MagiskPolicy] Remove all AUDITDENY rules after patching sepolicy to log all denies for debugging
    • [MagiskBoot] Properly support extra_cmdline in boot headers
    • [MagiskBoot] Try to repair broken v1 boot image headers
    • [MagiskBoot] Add new CPIO command: "exists"

    v17.3

    • [MagiskBoot] Support boot image header v1 (Pixel 3)
    • [MagiskSU] No more linked lists for caching su_info
    • [MagiskSU] Parse command-lines in client side and send only options to daemon
    • [MagiskSU] Early ACK to prevent client freezes and early denies
    • [Daemon] Prevent bootloops in situations where /data is mounted twice
    • [Daemon] Prevent logcat failures when /system/bin is magic mounting, could cause MagiskHide to fail
    • [Scripts] Switch hexpatch to remove Samsung Defex to a more general pattern
    • [Scripts] Update data encryption detection for better custom recovery support

    v17.2

    • [ResetProp] Update to AOSP upstream to support serialized system properties
    • [MagiskInit] Randomize Magisk service names to prevent detection (e.g. FGO)
    • [MagiskSU] New communication scheme to communicate with Magisk Manager

    v17.0/17.1

    • [General] Bring back install to inactive slot for OTAs on A/B devices
    • [Script] Remove system based root in addon.d
    • [Script] Add proper addon.d-v2 for preserving Magisk on custom ROMs on A/B devices
    • [Script] Enable KEEPVERITY when the device is using system_root_image
    • [Script] Add hexpatch to remove Samsung defex in new Oreo kernels
    • [Daemon] Support non ext4 filesystems for mirrors (system/vendor)
    • [MagiskSU] Make pts sockets always run in dev_pts secontext, providing all terminal emulator root shell the same power as adb shells
    • [MagiskHide] Kill all processes with same UID of the target to workaround OOS embryo optimization
    • [MagiskInit] Move all sepolicy patches pre-init to prevent Pixel 2 (XL) boot service breakdown

    v16.7

    • [Scripts] Fix boot image patching errors on Android P (workaround the strengthened seccomp)
    • [MagiskHide] Support hardlink based ns proc mnt (old kernel support)
    • [Daemon] Fix permission of /dev/null after logcat commands, fix ADB on EMUI
    • [Daemon] Log fatal errors only on debug builds
    • [MagiskInit] Detect early mount partname from fstab in device tree

    v16.6

    • [General] Add wrapper script to overcome weird LD_XXX flags set in apps
    • [General] Prevent bootloop when flashing Magisk after full wipe on FBE devices
    • [Scripts] Support patching DTB placed in extra sections in boot images (Samsung S9/S9+)
    • [Scripts] Add support for addon.d-v2 (untested)
    • [Scripts] Fix custom recovery console output in addon.d
    • [Scripts] Fallback to parsing sysfs for detecting block devices
    • [Daemon] Check whether a valid Magisk Manager is installed on boot, if not, install stub APK embedded in magiskinit
    • [Daemon] Check whether Magisk Manager is repackaged (hidden), and prevent malware from hijacking com.topjohnwu.magisk
    • [Daemon] Introduce new daemon: magisklogd, a dedicated daemon to handle all logcat related monitoring
    • [Daemon] Replace old invincible mode with handshake between magiskd and magisklogd, one will respawn the other if disconnected
    • [Daemon] Support GSI adbd bind mounting
    • [MagiskInit] Support detecting block names in upper case (Samsung)
    • [MagiskBoot] Check DTB headers to prevent false detections within kernel binary
    • [MagiskHide] Compare mount namespace with PPID to make sure the namespace is actually separated, fix root loss
    • [MagiskSU] Simplify su_info caching system, should use less resources and computing power
    • [MagiskSU] Reduce the amount of broadcasting to Magisk Manager
    • [ImgTool] Separate all ext4 image related operations to a new applet called "imgtool"
    • [ImgTool] Use precise free space calculation methods
    • [ImgTool] Use our own set of loop devices hidden along side with sbin tmpfs overlay. This not only eliminates another possible detection method, but also fixes apps that mount OBB files as loop devices (huge thanks to dev of Pzizz for reporting this issue)

    v16.4

    • [Daemon] Directly check logcat command instead of detecting logd, should fix logging and MagiskHide on several Samsung devices
    • [Daemon] Fix startup Magisk Manager APK installation on Android P
    • [MagiskPolicy] Switch from AOSP u:r:su:s0 to u:r:magisk:s0 to prevent conflicts
    • [MagiskPolicy] Remove unnecessary sepolicy rules to reduce security penalty
    • [Daemon] Massive re-design /sbin tmpfs overlay and daemon start up
    • [MagiskInit] Remove magiskinit_daemon, the actual magisk daemon (magiskd) shall handle everything itself
    • [Daemon] Remove post-fs stage as it is very limited and also will not work on A/B devices; replaced with simple mount in post-fs-data, which will run ASAP even before the daemon is started
    • [General] Remove all 64-bit binaries as there is no point in using them; all binaries are now 32-bit only. Some weirdly implemented root apps might break (e.g. Tasker, already reported to the developer), but it is not my fault 😃
    • [resetprop] Add Protobuf encode/decode to support manipulating persist properties on Android P
    • [MagiskHide] Include app sub-services as hiding targets. This might significantly increase the amount of apps that could be properly hidden

    v16.3

    • [General] Remove symlinks used for backwards compatibility
    • [MagiskBoot] Fix a small size calculation bug

    v16.2

    • [General] Force use system binaries in handling ext4 images (fix module installation on Android P)
    • [MagiskHide] Change property state to disable if logd is disabled

    v16.1

    • [MagiskBoot] Fix MTK boot image packaging
    • [MagiskBoot] Add more Nook/Acclaim headers support
    • [MagiskBoot] Support unpacking DTB with empty kernel image
    • [MagiskBoot] Update high compression mode detection logic
    • [Daemon] Support new mke2fs tool on Android P
    • [resetprop] Support Android P new property context files
    • [MagiskPolicy] Add new rules for Android P

    v16.0

    • [MagiskInit] Support non skip_initramfs devices with slot suffix (Huawei Treble)
    • [MagiskPolicy] Add rules for Magisk Manager
    • [Compiler] Workaround an NDK compiler bug that causes bootloops

    v15.4

    • [MagiskBoot] Support Samsung PXA, DHTB header images
    • [MagiskBoot] Support ASUS blob images
    • [MagiskBoot] Support Nook Green Loader images
    • [MagiskBoot] Support pure ramdisk images
    • [MagiskInit] Prevent OnePlus angela sepolicy_debug from loading
    • [MagiskInit] Obfuscate Magisk socket entry to prevent detection and security
    • [Daemon] Fix subfolders in /sbin shadowed by overlay
    • [Daemon] Obfuscate binary names to prevent naive detections
    • [Daemon] Check logd before force trying to start logcat in a loop

    v15.3

    • [Daemon] Fix the bug that only one script would be executed in post-fs-data.d/service.d
    • [Daemon] Add MS_SILENT flag when mounting, should fix some devices that cannot mount magisk.img
    • [MagiskBoot] Fix potential segmentation fault when patching ramdisk, should fix some installation failures

    v15.2

    • [MagiskBoot] Fix dtb verity patches, should fix dm-verity bootloops on newer devices placing fstabs in dtb
    • [MagiskPolicy] Add new rules for proper Samsung support, should fix MagiskHide
    • [MagiskInit] Support non skip_initramfs devices using split sepolicies (e.g. Zenfone 4 Oreo)
    • [Daemon] Use specific logcat buffers, some devices does not support all log buffers
    • [scripts] Update scripts to double check whether boot slot is available, some devices set a boot slot without A/B partitions

    v15.1

    • [MagiskBoot] Fix faulty code in ramdisk patches which causes bootloops in some config and fstab format combos

    v15.0

    • [Daemon] Fix the bug that Magisk cannot properly detect /data encryption state
    • [Daemon] Add merging /cache/magisk.img and /data/adb/magisk_merge.img support
    • [Daemon] Update to upstream libsepol to support cutting edge split policy custom ROM cil compilations

    v14.6 (1468)

    • [General] Move all files into a safe location: /data/adb
    • [Daemon] New invincible implementation: use magiskinit_daemon to monitor sockets
    • [Daemon] Rewrite logcat monitor to be more efficient
    • [Daemon] Fix a bug where logcat monitor may spawn infinite logcat processes
    • [MagiskSU] Update su to work the same as proper Linux implementation: Initialize window size; all environment variables will be migrated (except HOME, SHELL, USER, LOGNAME, these will be set accordingly), "--preserve-environment" option will preserve all variables, including those four exceptions. Check the Linux su manpage for more info
    • [MagiskBoot] Massive refactor, rewrite all cpio operations and CLI
    • [MagiskInit][magiskboot] Support ramdisk high compression mode

    v14.5 (1456)

    • [Magiskinit] Fix bootloop issues on several devices
    • [misc] Build binaries with NDK r10e, should get rid of the nasty linker warning when executing magisk

    v14.5 (1455)

    • [Daemon] Moved internal path to /sbin/.core, new image mountpoint is /sbin/.core/img
    • [MagiskSU] Support switching package name, used when Magisk Manager is hidden
    • [MagiskHide] Add temporary /magisk removal
    • [MagiskHide] All changes above contributes to hiding from nasty apps like FGO and several banking apps
    • [Magiskinit] Use magiskinit for all devices (dynamic initramfs)
    • [Magiskinit] Fix Xiaomi A1 support
    • [Magiskinit] Add Pixel 2 (XL) support
    • [Magiskboot] Add support to remove avb-verity in dtbo.img
    • [Magiskboot] Fix typo in handling MTK boot image headers
    • [script] Along with updates in Magisk Manager, add support to sign boot images (AVB 1.0)
    • [script] Add dtbo.img backup and restore support
    • [misc] Many small adjustments to properly support old platforms like Android 5.0

    v14.3 (1437)

    • [MagiskBoot] Fix Pixel C installation
    • [MagiskBoot] Handle special lz4_legacy format properly, should fix all LG devices
    • [Daemon] New universal logcat monitor is added, support plug-and-play to worker threads
    • [Daemon] Invincible mode: daemon will be restarted by init, everything should seamlessly through daemon restarts
    • [Daemon] Add new restorecon action, will go through and fix all Magisk files with selinux unlabeled to system_file context
    • [Daemon] Add brute-force image resizing mode, should prevent the notorious Samsung crappy resize2fs from affecting the result
    • [resetprop] Add new "-p" flag, used to toggle whether alter/access the actual persist storage for persist props

    v14.2

    • [MagicMount] Clone attributes to tmpfs mountpoint, should fix massive module breakage

    v14.1

    • [MagiskInit] Introduce a new init binary to support skip_initramfs devices (Pixel family)
    • [script] Fix typo in update-binary for x86 devices
    • [script] Fix stock boot image backup not moved to proper location
    • [script] Add functions to support A/B slot and skip_initramfs devices
    • [script] Detect Meizu boot blocks
    • [MagiskBoot] Add decompress zImage support
    • [MagiskBoot] Support extracting dtb appended to zImage block
    • [MagiskBoot] Support patching fstab within dtb
    • [Daemon/MagiskSU] Proper file based encryption support
    • [Daemon] Create core folders if not exist
    • [resetprop] Fix a bug which delete props won't remove persist props not in memory
    • [MagicMount] Remove usage of dummy folder, directly mount tmpfs and construct file structure skeleton in place

    v14.0

    • [script] Simplify installation scripts
    • [script] Fix a bug causing backing up and restoring stock boot images failure
    • [script] Installation and uninstallation will migrate old or broken stock boot image backups to proper format
    • [script] Fix an issue with selabel setting in util_functions.sh on Lollipop
    • [rc script] Enable logd in post-fs to start logging as early as possible
    • [MagiskHide] magisk.img mounted is no longer a requirement Devices with issues mounting magisk.img can now run in proper core-only mode
    • [MagiskBoot] Add native function to extract stock SHA1 from ramdisk
    • [b64xz] New tool to extract compressed and encoded binary dumps in shell script
    • [busybox] Add busybox to Magisk source, and embed multi-arch busybox binary into update-binary shell script
    • [busybox] Busybox is added into PATH for all boot scripts (post-fs-data.d, service.d, and all module scripts)
    • [MagiskSU] Fully fix multiuser issues
    • [Magic Mount] Fix a typo in cloning attributes
    • [Daemon] Fix the daemon crashing when boot scripts opens a subshell
    • [Daemon] Adjustments to prevent stock Samsung kernel restrictions on exec system calls for binaries started from /data
    • [Daemon] Workaround on Samsung device with weird fork behaviors

    v13.3

    • [MagiskHide] Update to bypass Google CTS (2017.7.17)
    • [resetprop] Properly support removing persist props
    • [uninstaller] Remove Magisk Manager and persist props

    v13.2

    • [magiskpolicy] Fix magiskpolicy segfault on old Android versions, should fix tons of older devices that couldn't use v13.1
    • [MagiskHide] Set proper selinux context while re-linking /sbin to hide Magisk, should potentially fix many issues
    • [MagiskBoot] Change lzma compression encoder flag from LZMA_CHECK_CRC64 to LZMA_CHECK_CRC32, kernel only supports latter
    • [General] Core-only mode now properly mounts systemless hosts and magiskhide

    v13.1

    • [General] Merge MagiskSU, magiskhide, resetprop, magiskpolicy into one binary
    • [General] Add Android O support (tested on DP3)
    • [General] Dynamic link libselinux.so, libsqlite.so from system to greatly reduce binary size
    • [General] Remove bundled busybox because it causes a lot of issues
    • [General] Unlock all block devices for read-write support instead of emmc only (just figured not all devices uses emmc lol)
    • [Scripts] Run all ext4 image operations through magisk binary in flash scripts
    • [Scripts] Updated scripts to use magisk native commands to increase compatibility
    • [Scripts] Add addon.d survival support
    • [Scripts] Introduce util_functions.sh, used as a global shell script function source for all kinds of installation
    • [MagiskBoot] Moved boot patch logic into magiskboot binary
    • [MagiskSU] Does not fork new process for each request, add new threads instead
    • [MagiskSU] Added multiuser support
    • [MagiskSU] Introduce new timeout queue mechanism, prevent performance hit with poorly written su apps
    • [MagiskSU] Multiple settings moved from prop detection to database
    • [MagiskSU] Add namespace mode option support
    • [MagiskSU] Add master-mount option
    • [resetprop] Updated to latest AOSP upstream, support props from 5.0 to Android O
    • [resetprop] Renamed all functions to prevent calling functions from external libc
    • [magiskpolicy] Updated libsepol from official SELinux repo
    • [magiskpolicy] Added xperm patching support (in order to make Android O work properly)
    • [magiskpolicy] Updated rules for Android O, and Liveboot support
    • [MagiskHide] Remove pseudo permissive mode, directly hide permissive status instead
    • [MagiskHide] Remove unreliable list file monitor, change to daemon request mode
    • [MagiskHide] MagiskHide is now enabled by default
    • [MagiskHide] Update unmount policies, passes CTS in SafetyNet!
    • [MagiskHide] Add more props for hiding
    • [MagiskHide] Remove background magiskhide daemon, spawn short life process for unmounting purpose
    • [Magic Mount] Ditched shell script based mounting, use proper C program to parse and mount files. Speed is SIGNIFICANTLY improved

    v12.0

    • [General] Move most binaries into magisk.img (Samsung cannot run su daemon in /data)
    • [General] Move sepolicy live patch to late_start service This shall fix the long boot times, especially on Samsung devices
    • [General] Add Samsung RKP hexpatch back, should now work on Samsung stock kernels
    • [General] Fix installation with SuperSU
    • [MagiskHide] Support other logcat am_proc_start patterns
    • [MagiskHide] Change /sys/fs/selinux/enforce(policy) permissions if required Samsung devices cannot switch selinux states, if running on permissive custom kernel, the users will stuck at permissive If this scenario is detected, change permissions to hide the permissive state, leads to SafetyNet passes
    • [MagiskHide] Add built in prop rules to fake KNOX status Samsung apps requiring KNOX status to be 0x0 should now work (Samsung Pay not tested)
    • [MagiskHide] Remove all ro.build props, since they cause more issues than they benefit...
    • [MagiskBoot] Add lz4 legacy format support (most linux kernel using lz4 for compression is using this)
    • [MagiskBoot] Fix MTK kernels with MTK headers

    v11.5/11.6

    • [Magic Mount] Fix mounting issues with devices that have separate /vendor partitions
    • [MagiskBoot] Whole new boot image patching tool, please check release note for more info
    • [magiskpolicy] Rename sepolicy-inject to magiskpolicy
    • [magiskpolicy] Update a rule to allow chcon everything properly
    • [MagiskHide] Prevent multirom crashes
    • [MagiskHide] Add patches for ro.debuggable, ro.secure, ro.build.type, ro.build.tags, ro.build.selinux
    • [MagiskHide] Change /sys/fs/selinux/enforce, /sys/fs/selinux/policy permissions for Samsung compatibility
    • [MagiskSU] Fix read-only partition mounting issues
    • [MagiskSU] Disable -cn option, the option will do nothing, preserved for compatibility

    v11.1

    • [sepolicy-inject] Add missing messages
    • [magiskhide] Start MagiskHide with scripts

    v11.0

    • [Magic Mount] Support replacing symlinks. Symlinks cannot be a target of a bind mounted, so they are treated the same as new files
    • [Magic Mount] Fix the issue when file/folder name contains spaces
    • [BusyBox] Updated to v1.26.2. Should fix the black screen issues of FlashFire
    • [resetprop] Support reading prop files that contains spaces in prop values
    • [MagiskSU] Adapt communication to Magisk Manager; stripped out unused data transfer
    • [MagiskSU] Implement SuperUser access option (Disable, APP only, ADB Only, APP & ADB) phh Superuser app has this option but the feature isn't implemented within the su binary
    • [MagiskSU] Fixed all issues with su -c "commands" (run commands with root) This feature is supposed to only allow one single option, but apparently adb shell su -c "command" doesn't work this way, and plenty of root apps don't follow the rule. The su binary will now consider everything after -c as a part of the command.
    • [MagiskSU] Removed legacy context hack for TiBack, what it currently does is slowing down the invocation
    • [MagiskSU] Preserve the current working directory after invoking su Previously phh superuser will change the path to /data/data after obtaining root shell. It will now stay in the same directory where you called su
    • [MagiskSU] Daemon now also runs in u:r:su:s0 context
    • [MagiskSU] Removed an unnecessary fork, reduce running processes and speed up the invocation
    • [MagiskSU] Add -cn option to the binary Not sure if this is still relevant, and also not sure if implemented correctly, but hey it's here
    • [sepolicy-inject] Complete re-write the command-line options, now nearly matches supolicy syntax
    • [sepolicy-inject] Support all matching mode for nearly every action (makes pseudo enforced possible)
    • [sepolicy-inject] Fixed an ancient bug that allocated memory isn't reset
    • [uninstaller] Now works as a independent script that can be executed at boot Fully support recovery with no /data access, Magisk uninstallation with Magisk Manager
    • [Addition] Busybox, MagiskHide, hosts settings can now be applied instantly; no reboots required
    • [Addition] Add post-fs-data.d and service.d
    • [Addition] Add option to disable Magisk (MagiskSU will still be started)

    v10.2

    • [Magic Mount] Remove apps/priv-app from whitelist, should fix all crashes
    • [phh] Fix binary out-of-date issue
    • [scripts] Fix root disappear issue when upgrading within Magisk Manager

    v10

    • [Magic Mount] Use a new way to mount system (vendor) mirrors
    • [Magic Mount] Use universal way to deal with /vendor, handle both separate partition or not
    • [Magic Mount] Adding anything to any place is now officially supported (including /system root and /vendor root)
    • [Magic Mount] Use symlinks for mirroring back if possible, reduce bind mounts for adding files
    • [Magisk Hide] Check init namespace, zygote namespace to prevent Magic Mount breakage (a.k.a root loss)
    • [Magisk Hide] Send SIGSTOP to pause target process ASAP to prevent crashing if unmounting too late
    • [Magisk Hide] Hiding should work under any conditions, including adding libs and /system root etc.
    • [phh] Root the device if no proper root detected
    • [phh] Move /sbin to /sbin_orig and link back, fix Samsung no-suid issue
    • [scripts] Improve SuperSU integration, now uses sukernel to patch ramdisk, support SuperSU built in ramdisk restore
    • [template] Add PROPFILE option to load system.prop

    v9

    • [API Change] Remove the interface for post-fs modules
    • [resetprop] New tool "resetprop" is added to Magisk to replace most post-fs modules' functionality
    • [resetprop] Magisk will now patch "ro.boot.verifiedbootstate", "ro.boot.flash.locked", "ro.boot.veritymode" to bypass Safety Net
    • [Magic Mount] Move dummy skeleton / mirror / mountinfo filesystem tree to tmpfs
    • [Magic Mount] Rewritten dummy cloning mechanism from scratch, will result in minimal bind mounts, minimal file traversal, eliminate all possible issues that might happen in extreme cases
    • [Magic Mount] Adding new items to /system/bin, /system/vendor, /system/lib(64) is properly supported (devices with separate vendor partition is not supported yet)
    • [Magisk Hide] Rewritten from scratch, now run in daemon mode, proper list monitoring, proper mount detection, and maybe more.....
    • [Boot Image] Add support for Motorola boot image dtb, it shall now unpack correctly
    • [Uninstaller] Add removal of SuperSU custom patch script

    v8

    • Add Magisk Hide to bypass SafetyNet
    • Improve SuperSU integration: no longer changes the SuperSU PATH
    • Support rc script entry points not located in init.rc

    v7

    • Fully open source
    • Remove supolicy dependency, use my own sepolicy-injection
    • Run everything in its own selinux domain, should fix all selinux issues
    • Add Note 7 stock kernel hex patches
    • Add support to install Magisk in Magisk Manager
    • Add support for image merging for module flashing in Magisk Manager
    • Add root helpers for SuperSU auto module-ize and auto upgrading legacy phh superuser
    • New paths to toggle busybox, and support all root solutions
    • Remove root management API; both SuperSU and phh has their own superior solutions

    v6

    • Fixed the algorithm for adding new files and dummy system
    • Updated the module template with a default permission, since people tend to forget them 😃

    v5

    • Hotfix for older Android versions (detect policy before patching)
    • Update uninstaller to NOT uninstall Magisk Manager, since it cause problems

    v4

    • Important: Uninstall v1 - v3 Magisk before upgrading with the uninstaller in the OP!!
    • Massive Rewrite Magisk Interface API! All previous mods are NOT compatible! Please download the latest version of the mods you use (root/xposed)
    • Mods are now installed independently in their own subfolder. This paves the way for future Magisk Manager versions to manage mods, just like how Xposed Modules are handled
    • Support small boot partition devices (Huawei devices)
    • Use minimal sepolicy patch in boot image for smaller ramdisk size. Live patch policies after bootup
    • Include updated open source sepolicy injection tool (source code available), support nearly all SuperSU supolicy tool's functionality

    v3

    • Fix bootimg-extract for Exynos Samsung devices (thanks to @phhusson), should fix all Samsung device issues
    • Add supolicy back to patch sepolicy (stock Samsung do not accept permissive domain)
    • Update sepolicy-injection to patch su domain for Samsung devices to use phh's root
    • Update root disable method, using more aggressive approach
    • Use lazy unmount to unmount root from system, should fix some issues with custom roms
    • Use the highest possible compression rate for ramdisk, hope to fix some devices with no boot partition space
    • Detect boot partition space insufficient, will abort installer instead of breaking your device

    v2

    • Fix verity patch. It should now work on all devices (might fix some of the unable-to-boot issues)
    • All scripts will now run in selinux permissive mode for maximum compatibility (this will NOT turn your device to permissive)
    • Add Nougat Developer Preview 5 support
    • Add systemless host support for AdBlock Apps (enabled by default)
    • Add support for new root disable method
    • Remove sepolicy patches that uses SuperSU's supolicy tool; it is now using a minimal set of modifications
    • Removed Magisk Manager in Magisk patch, it is now included in Magisk phh's superuser only

    v1

    • Initial release

    参考链接

    ',141),s=[t];function n(r,d,c,p,u,g){return e(),o("div",null,s)}const k=i(l,[["render",n]]);export{h as __pageData,k as default}; diff --git a/assets/changes.md.0bfaa152.lean.js b/assets/changes.md.0bfaa152.lean.js deleted file mode 100644 index 4ce8a45d..00000000 --- a/assets/changes.md.0bfaa152.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as i,o as e,c as o,V as a}from"./chunks/framework.fc84ac3a.js";const h=JSON.parse('{"title":"Magisk 更新日志","description":"","frontmatter":{},"headers":[],"relativePath":"changes.md","filePath":"changes.md","lastUpdated":1681768747000}'),l={name:"changes.md"},t=a("",141),s=[t];function n(r,d,c,p,u,g){return e(),o("div",null,s)}const k=i(l,[["render",n]]);export{h as __pageData,k as default}; diff --git a/assets/changes.md.1854017d.js b/assets/changes.md.1854017d.js new file mode 100644 index 00000000..3ee729ba --- /dev/null +++ b/assets/changes.md.1854017d.js @@ -0,0 +1 @@ +import{_ as i,o as e,c as o,Q as a}from"./chunks/framework.ed90c782.js";const h=JSON.parse('{"title":"Magisk 更新日志","description":"","frontmatter":{},"headers":[],"relativePath":"changes.md","filePath":"changes.md","lastUpdated":1694964698000}'),l={name:"changes.md"},t=a('

    Magisk 更新日志

    v26.3

    • [常规] 修复设备信息检测脚本
    • [常规] 将 BusyBox 更新到 1.36.1
    • [常规] 更新工具链,生成损坏的 arm32 可执行文件
    • [应用] 修复根服务无法绑定一加设备的问题
    英文原版
    • [General] Fix device information detection script
    • [General] Update BusyBox to 1.36.1
    • [General] Update toolchain that produces broken arm32 executables
    • [App] Fix root service unable to bind on OnePlus devices

    v26.2

    • [MagiskBoot] 支持从payload.bin中提取启动映像
    • [MagiskBoot] 支持包含字符文件的 cpio 文件
    • [MagiskBoot] 支持列出 cpio 内容
    • [MagiskBoot] 直接处理 AVB 1.0 签名和验证,无需通过 Java 实现
    • [守护进程] 使守护程序套接字成为 MAGISKTMP 中的固定路径
    • [resetprop] 支持打印属性上下文
    • [resetprop] 仅支持从存储中打印持久属性
    • [resetprop] 正确支持设置持久属性绕过 property_service
    • [MagiskSU] 支持 -g-G 选项
    • [MagiskSU] 支持使用 -t 将挂载命名空间切换到 PID
    • [MagiskPolicy] 修复修补扩展权限
    • [MagiskPolicy] 支持更多语法以获得扩展权限
    • [MagiskPolicy] 支持打印加载的 sepolicy 规则
    • [应用程序] 支持从 ROM 压缩包修补启动映像
    • [应用程序] 使用 init_boot.img 修补三星固件时正确保留 boot.img
    英文原版
    • [MagiskBoot] Support extracting boot image from payload.bin
    • [MagiskBoot] Support cpio files containing character files
    • [MagiskBoot] Support listing cpio content
    • [MagiskBoot] Directly handle AVB 1.0 signing and verification without going through Java implementation
    • [Daemon] Make daemon socket a fixed path in MAGISKTMP
    • [resetprop] Support printing property context
    • [resetprop] Support only printing persistent properties from storage
    • [resetprop] Properly support setting persistent properties bypassing property_service
    • [MagiskSU] Support -g and -G options
    • [MagiskSU] Support switching mount namespace to PID with -t
    • [MagiskPolicy] Fix patching extended permissions
    • [MagiskPolicy] Support more syntax for extended permissions
    • [MagiskPolicy] Support printing out the loaded sepolicy rules
    • [App] Support patching boot image from ROM zips
    • [App] Properly preserve boot.img when patching Samsung firmware with init_boot.img

    v26.1

    • [应用程序] 修复了撤销根权限时崩溃的问题
    • [MagiskInit] 在选择预初始化分区时,始终更喜欢 ext4 分区而不是 f2fs
    • [常规] 从镜像恢复模块文件的上下文/所有者/组。这是 v26.0 中引入的回归
    英文原版
    • [App] Fix crashing when revoking root permissions
    • [MagiskInit] Always prefer ext4 partitions over f2fs when selecting the pre-init partition
    • [General] Restore module files' context/owner/group from mirror. This is a regression introduced in v26.0

    v26.0

    • [General] Bump minimum supported Android version to Android 6.0
    • [General] New magic mount backend. It supports loading modules into system with overlayfs files injected
    • [Zygisk] Release new API version 4
    • [Zygisk] Prevent crashing daemon in error
    • [Zygisk] Rewrite zygote code injection with new loader library approach
    • [Zygisk] Rewrite code unloading implementation
    • [MagiskBoot] Support amonet microloader devices
    • [MagiskBoot] Always use lz4_legacy compression on v4 boot images. This fixes boot image patching issues on Android U preview.
    • [MagiskInit] Support replacing existing *.rc files in overlay.d
    • [MagiskInit] Rewrite sepolicy.rules mounting and loading implementation
    • [App] Make stub patching 100% offline
    • [App] Support patching init_boot.img for Samsung ODIN firmware
    • [MagiskPolicy] Fix minor bug in command line argument parsing
    • [MagiskPolicy] Update rules to support Android U

    v25.2

    • [MagiskInit] Fix a potential issue when stub cpio is used
    • [MagiskInit] Fix reboot to recovery when stub cpio is used
    • [MagiskInit] Fix sepolicy.rules symlink for rootfs devices
    • [General] Better data encryption detection
    • [General] Move the whole logging infrastructure into Rust

    v25.1

    • [MagiskBoot] Fix ramdisk backup being incorrectly skipped
    • [MagiskBoot] Add new feature to detect unsupported dtb and abort during installation
    • [Zygisk] Change binary hijack paths
    • [App] Fix incorrect recovery mode detection and installation
    • [MagiskInit] Fix config not properly exported in legacy SAR devices
    • [General] Enforce the Magisk app to always match or be newer than magiskd

    v25.0

    • [MagiskInit] Update 2SI implementation, significantly increase device compatibility (e.g. Sony Xperia devices)
    • [MagiskInit] Introduce new sepolicy injection mechanism
    • [MagiskInit] Support Oculus Go
    • [MagiskInit] Support Android 13 GKIs (Pixel 6)
    • [MagiskBoot] Fix vbmeta extraction implementation
    • [App] Fix stub app on older Android versions
    • [App] [MagiskSU] Properly support apps using sharedUserId
    • [MagiskSU] Fix a possible crash in magiskd
    • [MagiskSU] Prune unused UIDs as soon as system_server restarts to prevent UID reuse attacks
    • [MagiskSU] Verify and enforce the installed Magisk app's certificate to match the distributor's signature
    • [MagiskSU] [Zygisk] Proper package management and detection
    • [Zygisk] Fix function hooking on devices running Android 12 with old kernels
    • [Zygisk] Fix Zygisk's self code unloading implementation
    • [DenyList] Fix DenyList on shared UID apps
    • [BusyBox] Add workaround for devices running old kernels

    v24.3

    • [General] Stop using getrandom syscall
    • [Zygisk] Update API to v3, adding new fields to AppSpecializeArgs
    • [App] Improve app repackaging installation workflow

    v24.2

    • [MagiskSU] Fix buffer overflow
    • [MagiskSU] Fix owner managed multiuser superuser settings
    • [MagiskSU] Fix command logging when using su -c <cmd>
    • [MagiskSU] Prevent su request indefinite blocking
    • [MagiskBoot] Support lz4_legacy archive with multiple magic
    • [MagiskBoot] Fix lz4_lg compression
    • [DenyList] Allow targeting processes running as system UID
    • [Zygisk] Workaround Samsung's "early zygote"
    • [Zygisk] Improved Zygisk loading mechanism
    • [Zygisk] Fix application UID tracking
    • [Zygisk] Fix improper umask being set in zygote
    • [App] Fix BusyBox execution test
    • [App] Improve stub loading mechanism
    • [App] Major app upgrade flow improvements
    • [General] Improve commandline error handling and messaging

    v24.1

    • [App] Stability improvements

    v24.0

    • [General] MagiskHide is removed from Magisk
    • [General] Support Android 12
    • [General] Support devices that do not support 32-bit and only runs 64-bit code
    • [General] Update BusyBox to 1.34.1
    • [Zygisk] Introduce new feature: Zygisk
    • [Zygisk] Introduce DenyList feature to revert Magisk features in user selected processes
    • [MagiskBoot] Support patching 32-bit kernel zImages
    • [MagiskBoot] Support boot image header v4
    • [MagiskBoot] Support patching out skip_initramfs from dtb bootargs
    • [MagiskBoot] Add new env variable PATCHVBMETAFLAG to configure whether vbmeta flags should be patched
    • [MagiskInit] Support loading fstab from /system/etc (required for Pixel 6)
    • [MagiskInit] Support /proc/bootconfig for loading boot configurations
    • [MagiskInit] Better support for some Meizu devices
    • [MagiskInit] Better support for some OnePlus/Oppo/Realme devices
    • [MagiskInit] Support init.real on some Sony devices
    • [MagiskInit] Skip loading Magisk when detecting DSU
    • [MagiskPolicy] Load *_compat_cil_file from system_ext
    • [MagiskSU] Use isolated devpts if the kernel supports it
    • [MagiskSU] Fix root shell if isolated mount namespace is set
    • [resetprop] Deleted properties are now wiped from memory instead of just unlinking
    • [App] Build a single APK for all ABIs
    • [App] Switch to use standard bottom navigation bar
    • [App] Downloading modules from the centralized Magisk-Modules-Repo is removed
    • [App] Support user configuration of boot image vbmeta patching
    • [App] Restore the ability to install Magisk on the other slot on some A/B devices
    • [App] Allow modules to specify an update URL for in-app update + install

    v23.0

    • [App] Update snet extension. This fixes SafetyNet API errors.
    • [App] Fix a bug in the stub app that causes APK installation to fail
    • [App] Hide annoying errors in logs when hidden as stub
    • [App] Fix issues when patching ODIN tar files when the app is hidden
    • [General] Remove all pre Android 5.0 support
    • [General] Update BusyBox to use proper libc
    • [General] Fix C++ undefined behaviors
    • [General] Several sepolicy.rule copy/installation fixes
    • [MagiskPolicy] Remove unnecessary sepolicy rules
    • [MagiskHide] Update package and process name validation logic
    • [MagiskHide] Some changes that prevents zygote deadlock

    v22.1

    • [App] Prevent multiple installation sessions running in parallel
    • [App] Prevent OutOfMemory crashes when checking boot signature on PXA boot images
    • [General] Proper cgroup migration implementation
    • [General] Rewrite log writer from scratch, should resolve any crashes and deadlocks
    • [General] Many scripts updates fixing regressions
    • [MagiskHide] Prevent possible deadlock when signal arrives
    • [MagiskHide] Partial match process names if necessary
    • [MagiskBoot] Preserve and patch AVB 2.0 structures/headers in boot images
    • [MagiskBoot] Properly strip out data encryption flags
    • [MagiskBoot] Prevent possible integer overflow
    • [MagiskInit] Fix sepolicy.rule mounting strategy
    • [resetprop] Always delete existing ro. props before updating. This will fix bootloops that could be caused by modifying device fingerprint properties.

    v22.0

    • [General] Magisk and Magisk Manager is now merged into the same package!
    • [App] The term "Magisk Manager" is no longer used elsewhere. We refer it as the Magisk app.
    • [App] Support hiding the Magisk app with advanced technique (stub APK loading) on Android 5.0+ (it used to be 9.0+)
    • [App] Disallow re-packaging the Magisk app on devices lower than Android 5.0
    • [App] Detect and warn about multiple invalid states and provide instructions on how to resolve it
    • [MagiskHide] Fix a bug when stopping MagiskHide does not take effect
    • [MagiskBoot] Fix bug when unpacking lz4_lg compressed boot images
    • [MagiskInit] Support Galaxy S21 series
    • [MagiskSU] Fix incorrect APEX paths that caused libsqlite.so fail to load

    v21.4

    • [MagiskSU] Fix su -c behavior that broke many root apps
    • [General] Properly handle read/write over sockets (the broken pipe issue)

    v21.3

    • [MagiskInit] Avoid mounting f2fs userdata as it may result in kernel crashes. This shall fix a lot of bootloops
    • [MagiskBoot] Fix a minor header checksum bug for DHTB header and ASUS blob image formats
    • [MagiskHide] Allowing hiding isolated processes if the mount namespace is separated

    v21.2

    • [MagiskInit] Detect 2SI after mounting system_root on legacy SAR devices
    • [General] Make sure post-fs-data scripts cannot block more than 35 seconds
    • [General] Fix the magisk --install-module command
    • [General] Trim Windows newline when reading files
    • [General] Directly log to file to prevent logcat weirdness
    • [MagiskBoot] Fix header dump/load for header v3 images

    v21.1

    • [MagiskBoot] Support boot header v3 (Pixel 5 and 4a 5G)
    • [MagiskBoot] Distinguish lz4_lg and lz4_legacy (Pixel 5 and 4a 5G)
    • [MagiskBoot] Support vendor boot images (for dev, not relevant for Magisk installation)
    • [MagiskInit] Support kernel cmdline androidboot.fstab_suffix
    • [MagiskInit] Support kernel initialized dm-verity on legacy SAR
    • [General] Significantly broaden sepolicy.rule compatibility
    • [General] Add Magisk binaries to PATH when executing boot scripts
    • [General] Update --remove-modules command implementation
    • [General] Make Magisk properly survive after factory reset on Android 11
    • [MagiskSU] Add APEX package com.android.i18n to LD_LIBRARY_PATH when linking libsqlite.so
    • [MagiskHide] Support hiding apps installed in secondary users (e.g. work profile)
    • [MagiskHide] Make zygote detection more robust

    v21.0

    • [General] Support Android 11 🎉
    • [General] Add Safe Mode detection. Disable all modules when the device is booting into Safe Mode.
    • [General] Increase post-fs-data mode timeout from 10 seconds to 40 seconds
    • [MagiskInit] Rewritten 2SI support from scratch
    • [MagiskInit] Support when no /sbin folder exists (Android 11)
    • [MagiskInit] Dump fstab from device-tree to rootfs and force init to use it for 2SI devices
    • [MagiskInit] Strip out AVB for 2SI as it may cause bootloop
    • [Modules] Rewritten module mounting logic from scratch
    • [MagiskSU] For Android 8.0+, a completely new policy setup is used. This reduces compromises in Android's sandbox, providing more policy isolation and better security for root users.
    • [MagiskSU] Isolated mount namespace will now first inherit from parent process, then isolate itself from the world
    • [MagiskSU] Update communication protocol with Magisk Manager to work with the hardened SELinux setup
    • [MagiskPolicy] Optimize match all rules. This will significantly reduce policy binary size and save memory and improve general kernel performance.
    • [MagiskPolicy] Support declaring new types and attributes
    • [MagiskPolicy] Make policy statement closer to stock *.te format. Please check updated documentation or magiskpolicy --help for more details.
    • [MagiskBoot] Support compressed extra blobs
    • [MagiskBoot] Pad boot images to original size with zeros
    • [MagiskHide] Manipulate additional vendor properties

    v20.4

    • [MagiskInit] Fix potential bootloop in A-only 2SI devices
    • [MagiskInit] Properly support Tegra partition naming
    • [General] Load libsqlite.so dynamically, which removes the need to use wrapper scripts on Android 10+
    • [General] Detect API level with a fallback method on some devices
    • [General] Workaround possible bug in x86 kernel readlinkat system call
    • [BusyBox] Enable SELinux features. Add chcon/runcon etc., and '-Z' option to many applets
    • [BusyBox] Introduce standalone mode. More details in release notes
    • [MagiskHide] Disable MagiskHide by default
    • [MagiskHide] Add more potential detectable system properties
    • [MagiskHide] Add workaround for Xiaomi devices bootloop when MagiskHide is enabled on cross region ROMs
    • [MagiskBoot] Support patching special Motorolla DTB format
    • [MagiskPolicy] Support 'genfscon' sepolicy rules
    • [Scripts] Support NAND based boot images (character nodes in /dev/block)
    • [Scripts] Better addon.d (both v1 and v2) support
    • [Scripts] Support Lineage Recovery for Android 10+

    v20.3

    • [MagiskBoot] Fix lz4_legacy decompression

    v20.2

    • [MagiskSU] Properly handle communication between daemon and application (root request prompt)
    • [MagiskInit] Fix logging in kmsg
    • [MagiskBoot] Support patching dtb/dtbo partition formats
    • [General] Support pre-init sepolicy patch in modules
    • [Scripts] Update magisk stock image backup format

    v20.1

    • [MagiskSU] Support component name agnostic communication (for stub APK)
    • [MagiskBoot] Set proper header_size in boot image headers (fix vbmeta error on Samsung devices)
    • [MagiskHide] Scan zygote multiple times
    • [MagiskInit] Support recovery images without /sbin/recovery binary. This will fix some A/B devices unable to boot to recovery after flashing Magisk
    • [General] Move acct to prevent daemon being killed
    • [General] Make sure "--remove-modules" will execute uninstall.sh after removal

    v20.0

    • [MagiskBoot] Support inject/modify mnt_point value in DTB fstab
    • [MagiskBoot] Support patching QCDT
    • [MagiskBoot] Support patching DTBH
    • [MagiskBoot] Support patching PXA-DT
    • [MagiskInit] [2SI] Support non A/B setup (Android 10)
    • [MagiskHide] Fix bug that reject process names with ":"
    • [MagicMount] Fix a bug that cause /product mirror not created

    v19.4

    • [MagiskInit] [SAR] Boot system-as-root devices with system mounted as /
    • [MagiskInit] [2SI] Support 2-stage-init for A/B devices (Pixel 3 Android 10)
    • [MagiskInit] [initramfs] Delay sbin overlay creation to post-fs-data
    • [MagiskInit] [SARCompat] Old system-as-root implementation is deprecated, no more future changes
    • [MagiskInit] Add overlay.d support for root directory overlay for new system-as-root implementation
    • [MagiskSU] Unblock all signals in root shells (fix bash on Android)
    • [MagicMount] Support replacing files in /product
    • [MagiskHide] Support Android 10's Zygote blastula pool
    • [MagiskHide] All random strings now also have random length
    • [MagiskBoot] Allow no recompression for ramdisk.cpio
    • [MagiskBoot] Support some weird Huawei boot images
    • [General] Add new --remove-modules command to remove modules without root in ADB shell
    • [General] Support Android 10 new APEX libraries (Project Mainline)

    v19.3

    • [MagiskHide] Hugely improve process monitor implementation, hopefully should no longer cause 100% CPU and daemon crashes
    • [MagiskInit] Wait for partitions to be ready for early mount, should fix bootloops on a handful of devices
    • [MagiskInit] Support EROFS used in EMUI 9.1
    • [MagiskSU] Properly implement mount namespace isolation
    • [MagiskBoot] Proper checksum calculation for header v2

    v19.2

    • [General] Fix uninstaller
    • [General] Fix bootloops on some devices with tmpfs mounting to /data
    • [MagiskInit] Add Kirin hi6250 support
    • [MagiskSU] Stop claiming device focus for su logging/notify if feasible. This fix issues with users locking Magisk Manager with app lock, and prevent video apps get messed up when an app is requesting root in the background.

    v19.1

    • [General] Support recovery based Magisk
    • [General] Support Android Q Beta 2
    • [MagiskInit] New sbin overlay setup process for better compatibility
    • [MagiskInit] Allow long pressing volume up to boot to recovery in recovery mode
    • [MagicMount] Use proper system_root mirror
    • [MagicMount] Use self created device nodes for mirrors
    • [MagicMount] Do not allow adding new files/folders in partition root folder (e.g. /system or /vendor)

    v19.0

    • [General] Remove usage of magisk.img
    • [General] Add 64 bit magisk binary for native 64 bit support
    • [General] Support A only system-as-root devices that released with Android 9.0
    • [General] Support non EXT4 system and vendor partitions
    • [MagiskHide] Use Zygote ptracing for monitoring new processes
    • [MagiskHide] Targets are now per-application component
    • [MagiskInit] Support Android Q (no logical partition support yet!)
    • [MagiskPolicy] Support Android Q new split sepolicy setup
    • [MagiskInit] Move sbin overlay creation from main daemon post-fs-data to early-init
    • [General] Service scripts now run in parallel
    • [MagiskInit] Directly inject magisk services to init.rc
    • [General] Use lzma2 compressed ramdisk in extreme conditions
    • [MagicMount] Clone attributes from original file if exists
    • [MagiskSU] Use ACTION_REBOOT intent to workaround some OEM broadcast restrictions
    • [General] Use skip_mount instead of auto_mount: from opt-in to opt-out

    v18.1

    • [General] Support EMUI 9.0
    • [General] Support Kirin 960 devices
    • [General] Support down to Android 4.2
    • [General] Major code base modernization under-the-hood

    v18.0

    • [General] Migrate all code base to C++
    • [General] Modify database natively instead of going through Magisk Manager
    • [General] Deprecate path /sbin/.core, please start using /sbin/.magisk
    • [General] Boot scripts are moved from <magisk_img>/.core/<stage>.d to /data/adb/<stage>.d
    • [General] Remove native systemless hosts (Magisk Manager is updated with a built-in systemless hosts module)
    • [General] Allow module post-fs-data.sh scripts to disable/remove modules
    • [MagiskHide] Use component names instead of process names as targets
    • [MagiskHide] Add procfs protection on SDK 24+ (Nougat)
    • [MagiskHide] Remove the folder /.backup to prevent detection
    • [MagiskHide] Hide list is now stored in database instead of raw textfile in images
    • [MagiskHide] Add "--status" option to CLI
    • [MagiskHide] Stop unmounting non-custom related mount points
    • [MagiskSU] Add FLAG_INCLUDE_STOPPED_PACKAGES in broadcasts to force wake Magisk Manager
    • [MagiskSU] Fix a bug causing SIGWINCH not properly detected
    • [MagiskPolicy] Support new av rules: type_change, type_member
    • [MagiskPolicy] Remove all AUDITDENY rules after patching sepolicy to log all denies for debugging
    • [MagiskBoot] Properly support extra_cmdline in boot headers
    • [MagiskBoot] Try to repair broken v1 boot image headers
    • [MagiskBoot] Add new CPIO command: "exists"

    v17.3

    • [MagiskBoot] Support boot image header v1 (Pixel 3)
    • [MagiskSU] No more linked lists for caching su_info
    • [MagiskSU] Parse command-lines in client side and send only options to daemon
    • [MagiskSU] Early ACK to prevent client freezes and early denies
    • [Daemon] Prevent bootloops in situations where /data is mounted twice
    • [Daemon] Prevent logcat failures when /system/bin is magic mounting, could cause MagiskHide to fail
    • [Scripts] Switch hexpatch to remove Samsung Defex to a more general pattern
    • [Scripts] Update data encryption detection for better custom recovery support

    v17.2

    • [ResetProp] Update to AOSP upstream to support serialized system properties
    • [MagiskInit] Randomize Magisk service names to prevent detection (e.g. FGO)
    • [MagiskSU] New communication scheme to communicate with Magisk Manager

    v17.0/17.1

    • [General] Bring back install to inactive slot for OTAs on A/B devices
    • [Script] Remove system based root in addon.d
    • [Script] Add proper addon.d-v2 for preserving Magisk on custom ROMs on A/B devices
    • [Script] Enable KEEPVERITY when the device is using system_root_image
    • [Script] Add hexpatch to remove Samsung defex in new Oreo kernels
    • [Daemon] Support non ext4 filesystems for mirrors (system/vendor)
    • [MagiskSU] Make pts sockets always run in dev_pts secontext, providing all terminal emulator root shell the same power as adb shells
    • [MagiskHide] Kill all processes with same UID of the target to workaround OOS embryo optimization
    • [MagiskInit] Move all sepolicy patches pre-init to prevent Pixel 2 (XL) boot service breakdown

    v16.7

    • [Scripts] Fix boot image patching errors on Android P (workaround the strengthened seccomp)
    • [MagiskHide] Support hardlink based ns proc mnt (old kernel support)
    • [Daemon] Fix permission of /dev/null after logcat commands, fix ADB on EMUI
    • [Daemon] Log fatal errors only on debug builds
    • [MagiskInit] Detect early mount partname from fstab in device tree

    v16.6

    • [General] Add wrapper script to overcome weird LD_XXX flags set in apps
    • [General] Prevent bootloop when flashing Magisk after full wipe on FBE devices
    • [Scripts] Support patching DTB placed in extra sections in boot images (Samsung S9/S9+)
    • [Scripts] Add support for addon.d-v2 (untested)
    • [Scripts] Fix custom recovery console output in addon.d
    • [Scripts] Fallback to parsing sysfs for detecting block devices
    • [Daemon] Check whether a valid Magisk Manager is installed on boot, if not, install stub APK embedded in magiskinit
    • [Daemon] Check whether Magisk Manager is repackaged (hidden), and prevent malware from hijacking com.topjohnwu.magisk
    • [Daemon] Introduce new daemon: magisklogd, a dedicated daemon to handle all logcat related monitoring
    • [Daemon] Replace old invincible mode with handshake between magiskd and magisklogd, one will respawn the other if disconnected
    • [Daemon] Support GSI adbd bind mounting
    • [MagiskInit] Support detecting block names in upper case (Samsung)
    • [MagiskBoot] Check DTB headers to prevent false detections within kernel binary
    • [MagiskHide] Compare mount namespace with PPID to make sure the namespace is actually separated, fix root loss
    • [MagiskSU] Simplify su_info caching system, should use less resources and computing power
    • [MagiskSU] Reduce the amount of broadcasting to Magisk Manager
    • [ImgTool] Separate all ext4 image related operations to a new applet called "imgtool"
    • [ImgTool] Use precise free space calculation methods
    • [ImgTool] Use our own set of loop devices hidden along side with sbin tmpfs overlay. This not only eliminates another possible detection method, but also fixes apps that mount OBB files as loop devices (huge thanks to dev of Pzizz for reporting this issue)

    v16.4

    • [Daemon] Directly check logcat command instead of detecting logd, should fix logging and MagiskHide on several Samsung devices
    • [Daemon] Fix startup Magisk Manager APK installation on Android P
    • [MagiskPolicy] Switch from AOSP u:r:su:s0 to u:r:magisk:s0 to prevent conflicts
    • [MagiskPolicy] Remove unnecessary sepolicy rules to reduce security penalty
    • [Daemon] Massive re-design /sbin tmpfs overlay and daemon start up
    • [MagiskInit] Remove magiskinit_daemon, the actual magisk daemon (magiskd) shall handle everything itself
    • [Daemon] Remove post-fs stage as it is very limited and also will not work on A/B devices; replaced with simple mount in post-fs-data, which will run ASAP even before the daemon is started
    • [General] Remove all 64-bit binaries as there is no point in using them; all binaries are now 32-bit only. Some weirdly implemented root apps might break (e.g. Tasker, already reported to the developer), but it is not my fault 😃
    • [resetprop] Add Protobuf encode/decode to support manipulating persist properties on Android P
    • [MagiskHide] Include app sub-services as hiding targets. This might significantly increase the amount of apps that could be properly hidden

    v16.3

    • [General] Remove symlinks used for backwards compatibility
    • [MagiskBoot] Fix a small size calculation bug

    v16.2

    • [General] Force use system binaries in handling ext4 images (fix module installation on Android P)
    • [MagiskHide] Change property state to disable if logd is disabled

    v16.1

    • [MagiskBoot] Fix MTK boot image packaging
    • [MagiskBoot] Add more Nook/Acclaim headers support
    • [MagiskBoot] Support unpacking DTB with empty kernel image
    • [MagiskBoot] Update high compression mode detection logic
    • [Daemon] Support new mke2fs tool on Android P
    • [resetprop] Support Android P new property context files
    • [MagiskPolicy] Add new rules for Android P

    v16.0

    • [MagiskInit] Support non skip_initramfs devices with slot suffix (Huawei Treble)
    • [MagiskPolicy] Add rules for Magisk Manager
    • [Compiler] Workaround an NDK compiler bug that causes bootloops

    v15.4

    • [MagiskBoot] Support Samsung PXA, DHTB header images
    • [MagiskBoot] Support ASUS blob images
    • [MagiskBoot] Support Nook Green Loader images
    • [MagiskBoot] Support pure ramdisk images
    • [MagiskInit] Prevent OnePlus angela sepolicy_debug from loading
    • [MagiskInit] Obfuscate Magisk socket entry to prevent detection and security
    • [Daemon] Fix subfolders in /sbin shadowed by overlay
    • [Daemon] Obfuscate binary names to prevent naive detections
    • [Daemon] Check logd before force trying to start logcat in a loop

    v15.3

    • [Daemon] Fix the bug that only one script would be executed in post-fs-data.d/service.d
    • [Daemon] Add MS_SILENT flag when mounting, should fix some devices that cannot mount magisk.img
    • [MagiskBoot] Fix potential segmentation fault when patching ramdisk, should fix some installation failures

    v15.2

    • [MagiskBoot] Fix dtb verity patches, should fix dm-verity bootloops on newer devices placing fstabs in dtb
    • [MagiskPolicy] Add new rules for proper Samsung support, should fix MagiskHide
    • [MagiskInit] Support non skip_initramfs devices using split sepolicies (e.g. Zenfone 4 Oreo)
    • [Daemon] Use specific logcat buffers, some devices does not support all log buffers
    • [scripts] Update scripts to double check whether boot slot is available, some devices set a boot slot without A/B partitions

    v15.1

    • [MagiskBoot] Fix faulty code in ramdisk patches which causes bootloops in some config and fstab format combos

    v15.0

    • [Daemon] Fix the bug that Magisk cannot properly detect /data encryption state
    • [Daemon] Add merging /cache/magisk.img and /data/adb/magisk_merge.img support
    • [Daemon] Update to upstream libsepol to support cutting edge split policy custom ROM cil compilations

    v14.6 (1468)

    • [General] Move all files into a safe location: /data/adb
    • [Daemon] New invincible implementation: use magiskinit_daemon to monitor sockets
    • [Daemon] Rewrite logcat monitor to be more efficient
    • [Daemon] Fix a bug where logcat monitor may spawn infinite logcat processes
    • [MagiskSU] Update su to work the same as proper Linux implementation: Initialize window size; all environment variables will be migrated (except HOME, SHELL, USER, LOGNAME, these will be set accordingly), "--preserve-environment" option will preserve all variables, including those four exceptions. Check the Linux su manpage for more info
    • [MagiskBoot] Massive refactor, rewrite all cpio operations and CLI
    • [MagiskInit][magiskboot] Support ramdisk high compression mode

    v14.5 (1456)

    • [Magiskinit] Fix bootloop issues on several devices
    • [misc] Build binaries with NDK r10e, should get rid of the nasty linker warning when executing magisk

    v14.5 (1455)

    • [Daemon] Moved internal path to /sbin/.core, new image mountpoint is /sbin/.core/img
    • [MagiskSU] Support switching package name, used when Magisk Manager is hidden
    • [MagiskHide] Add temporary /magisk removal
    • [MagiskHide] All changes above contributes to hiding from nasty apps like FGO and several banking apps
    • [Magiskinit] Use magiskinit for all devices (dynamic initramfs)
    • [Magiskinit] Fix Xiaomi A1 support
    • [Magiskinit] Add Pixel 2 (XL) support
    • [Magiskboot] Add support to remove avb-verity in dtbo.img
    • [Magiskboot] Fix typo in handling MTK boot image headers
    • [script] Along with updates in Magisk Manager, add support to sign boot images (AVB 1.0)
    • [script] Add dtbo.img backup and restore support
    • [misc] Many small adjustments to properly support old platforms like Android 5.0

    v14.3 (1437)

    • [MagiskBoot] Fix Pixel C installation
    • [MagiskBoot] Handle special lz4_legacy format properly, should fix all LG devices
    • [Daemon] New universal logcat monitor is added, support plug-and-play to worker threads
    • [Daemon] Invincible mode: daemon will be restarted by init, everything should seamlessly through daemon restarts
    • [Daemon] Add new restorecon action, will go through and fix all Magisk files with selinux unlabeled to system_file context
    • [Daemon] Add brute-force image resizing mode, should prevent the notorious Samsung crappy resize2fs from affecting the result
    • [resetprop] Add new "-p" flag, used to toggle whether alter/access the actual persist storage for persist props

    v14.2

    • [MagicMount] Clone attributes to tmpfs mountpoint, should fix massive module breakage

    v14.1

    • [MagiskInit] Introduce a new init binary to support skip_initramfs devices (Pixel family)
    • [script] Fix typo in update-binary for x86 devices
    • [script] Fix stock boot image backup not moved to proper location
    • [script] Add functions to support A/B slot and skip_initramfs devices
    • [script] Detect Meizu boot blocks
    • [MagiskBoot] Add decompress zImage support
    • [MagiskBoot] Support extracting dtb appended to zImage block
    • [MagiskBoot] Support patching fstab within dtb
    • [Daemon/MagiskSU] Proper file based encryption support
    • [Daemon] Create core folders if not exist
    • [resetprop] Fix a bug which delete props won't remove persist props not in memory
    • [MagicMount] Remove usage of dummy folder, directly mount tmpfs and construct file structure skeleton in place

    v14.0

    • [script] Simplify installation scripts
    • [script] Fix a bug causing backing up and restoring stock boot images failure
    • [script] Installation and uninstallation will migrate old or broken stock boot image backups to proper format
    • [script] Fix an issue with selabel setting in util_functions.sh on Lollipop
    • [rc script] Enable logd in post-fs to start logging as early as possible
    • [MagiskHide] magisk.img mounted is no longer a requirement Devices with issues mounting magisk.img can now run in proper core-only mode
    • [MagiskBoot] Add native function to extract stock SHA1 from ramdisk
    • [b64xz] New tool to extract compressed and encoded binary dumps in shell script
    • [busybox] Add busybox to Magisk source, and embed multi-arch busybox binary into update-binary shell script
    • [busybox] Busybox is added into PATH for all boot scripts (post-fs-data.d, service.d, and all module scripts)
    • [MagiskSU] Fully fix multiuser issues
    • [Magic Mount] Fix a typo in cloning attributes
    • [Daemon] Fix the daemon crashing when boot scripts opens a subshell
    • [Daemon] Adjustments to prevent stock Samsung kernel restrictions on exec system calls for binaries started from /data
    • [Daemon] Workaround on Samsung device with weird fork behaviors

    v13.3

    • [MagiskHide] Update to bypass Google CTS (2017.7.17)
    • [resetprop] Properly support removing persist props
    • [uninstaller] Remove Magisk Manager and persist props

    v13.2

    • [magiskpolicy] Fix magiskpolicy segfault on old Android versions, should fix tons of older devices that couldn't use v13.1
    • [MagiskHide] Set proper selinux context while re-linking /sbin to hide Magisk, should potentially fix many issues
    • [MagiskBoot] Change lzma compression encoder flag from LZMA_CHECK_CRC64 to LZMA_CHECK_CRC32, kernel only supports latter
    • [General] Core-only mode now properly mounts systemless hosts and magiskhide

    v13.1

    • [General] Merge MagiskSU, magiskhide, resetprop, magiskpolicy into one binary
    • [General] Add Android O support (tested on DP3)
    • [General] Dynamic link libselinux.so, libsqlite.so from system to greatly reduce binary size
    • [General] Remove bundled busybox because it causes a lot of issues
    • [General] Unlock all block devices for read-write support instead of emmc only (just figured not all devices uses emmc lol)
    • [Scripts] Run all ext4 image operations through magisk binary in flash scripts
    • [Scripts] Updated scripts to use magisk native commands to increase compatibility
    • [Scripts] Add addon.d survival support
    • [Scripts] Introduce util_functions.sh, used as a global shell script function source for all kinds of installation
    • [MagiskBoot] Moved boot patch logic into magiskboot binary
    • [MagiskSU] Does not fork new process for each request, add new threads instead
    • [MagiskSU] Added multiuser support
    • [MagiskSU] Introduce new timeout queue mechanism, prevent performance hit with poorly written su apps
    • [MagiskSU] Multiple settings moved from prop detection to database
    • [MagiskSU] Add namespace mode option support
    • [MagiskSU] Add master-mount option
    • [resetprop] Updated to latest AOSP upstream, support props from 5.0 to Android O
    • [resetprop] Renamed all functions to prevent calling functions from external libc
    • [magiskpolicy] Updated libsepol from official SELinux repo
    • [magiskpolicy] Added xperm patching support (in order to make Android O work properly)
    • [magiskpolicy] Updated rules for Android O, and Liveboot support
    • [MagiskHide] Remove pseudo permissive mode, directly hide permissive status instead
    • [MagiskHide] Remove unreliable list file monitor, change to daemon request mode
    • [MagiskHide] MagiskHide is now enabled by default
    • [MagiskHide] Update unmount policies, passes CTS in SafetyNet!
    • [MagiskHide] Add more props for hiding
    • [MagiskHide] Remove background magiskhide daemon, spawn short life process for unmounting purpose
    • [Magic Mount] Ditched shell script based mounting, use proper C program to parse and mount files. Speed is SIGNIFICANTLY improved

    v12.0

    • [General] Move most binaries into magisk.img (Samsung cannot run su daemon in /data)
    • [General] Move sepolicy live patch to late_start service This shall fix the long boot times, especially on Samsung devices
    • [General] Add Samsung RKP hexpatch back, should now work on Samsung stock kernels
    • [General] Fix installation with SuperSU
    • [MagiskHide] Support other logcat am_proc_start patterns
    • [MagiskHide] Change /sys/fs/selinux/enforce(policy) permissions if required Samsung devices cannot switch selinux states, if running on permissive custom kernel, the users will stuck at permissive If this scenario is detected, change permissions to hide the permissive state, leads to SafetyNet passes
    • [MagiskHide] Add built in prop rules to fake KNOX status Samsung apps requiring KNOX status to be 0x0 should now work (Samsung Pay not tested)
    • [MagiskHide] Remove all ro.build props, since they cause more issues than they benefit...
    • [MagiskBoot] Add lz4 legacy format support (most linux kernel using lz4 for compression is using this)
    • [MagiskBoot] Fix MTK kernels with MTK headers

    v11.5/11.6

    • [Magic Mount] Fix mounting issues with devices that have separate /vendor partitions
    • [MagiskBoot] Whole new boot image patching tool, please check release note for more info
    • [magiskpolicy] Rename sepolicy-inject to magiskpolicy
    • [magiskpolicy] Update a rule to allow chcon everything properly
    • [MagiskHide] Prevent multirom crashes
    • [MagiskHide] Add patches for ro.debuggable, ro.secure, ro.build.type, ro.build.tags, ro.build.selinux
    • [MagiskHide] Change /sys/fs/selinux/enforce, /sys/fs/selinux/policy permissions for Samsung compatibility
    • [MagiskSU] Fix read-only partition mounting issues
    • [MagiskSU] Disable -cn option, the option will do nothing, preserved for compatibility

    v11.1

    • [sepolicy-inject] Add missing messages
    • [magiskhide] Start MagiskHide with scripts

    v11.0

    • [Magic Mount] Support replacing symlinks. Symlinks cannot be a target of a bind mounted, so they are treated the same as new files
    • [Magic Mount] Fix the issue when file/folder name contains spaces
    • [BusyBox] Updated to v1.26.2. Should fix the black screen issues of FlashFire
    • [resetprop] Support reading prop files that contains spaces in prop values
    • [MagiskSU] Adapt communication to Magisk Manager; stripped out unused data transfer
    • [MagiskSU] Implement SuperUser access option (Disable, APP only, ADB Only, APP & ADB) phh Superuser app has this option but the feature isn't implemented within the su binary
    • [MagiskSU] Fixed all issues with su -c "commands" (run commands with root) This feature is supposed to only allow one single option, but apparently adb shell su -c "command" doesn't work this way, and plenty of root apps don't follow the rule. The su binary will now consider everything after -c as a part of the command.
    • [MagiskSU] Removed legacy context hack for TiBack, what it currently does is slowing down the invocation
    • [MagiskSU] Preserve the current working directory after invoking su Previously phh superuser will change the path to /data/data after obtaining root shell. It will now stay in the same directory where you called su
    • [MagiskSU] Daemon now also runs in u:r:su:s0 context
    • [MagiskSU] Removed an unnecessary fork, reduce running processes and speed up the invocation
    • [MagiskSU] Add -cn option to the binary Not sure if this is still relevant, and also not sure if implemented correctly, but hey it's here
    • [sepolicy-inject] Complete re-write the command-line options, now nearly matches supolicy syntax
    • [sepolicy-inject] Support all matching mode for nearly every action (makes pseudo enforced possible)
    • [sepolicy-inject] Fixed an ancient bug that allocated memory isn't reset
    • [uninstaller] Now works as a independent script that can be executed at boot Fully support recovery with no /data access, Magisk uninstallation with Magisk Manager
    • [Addition] Busybox, MagiskHide, hosts settings can now be applied instantly; no reboots required
    • [Addition] Add post-fs-data.d and service.d
    • [Addition] Add option to disable Magisk (MagiskSU will still be started)

    v10.2

    • [Magic Mount] Remove apps/priv-app from whitelist, should fix all crashes
    • [phh] Fix binary out-of-date issue
    • [scripts] Fix root disappear issue when upgrading within Magisk Manager

    v10

    • [Magic Mount] Use a new way to mount system (vendor) mirrors
    • [Magic Mount] Use universal way to deal with /vendor, handle both separate partition or not
    • [Magic Mount] Adding anything to any place is now officially supported (including /system root and /vendor root)
    • [Magic Mount] Use symlinks for mirroring back if possible, reduce bind mounts for adding files
    • [Magisk Hide] Check init namespace, zygote namespace to prevent Magic Mount breakage (a.k.a root loss)
    • [Magisk Hide] Send SIGSTOP to pause target process ASAP to prevent crashing if unmounting too late
    • [Magisk Hide] Hiding should work under any conditions, including adding libs and /system root etc.
    • [phh] Root the device if no proper root detected
    • [phh] Move /sbin to /sbin_orig and link back, fix Samsung no-suid issue
    • [scripts] Improve SuperSU integration, now uses sukernel to patch ramdisk, support SuperSU built in ramdisk restore
    • [template] Add PROPFILE option to load system.prop

    v9

    • [API Change] Remove the interface for post-fs modules
    • [resetprop] New tool "resetprop" is added to Magisk to replace most post-fs modules' functionality
    • [resetprop] Magisk will now patch "ro.boot.verifiedbootstate", "ro.boot.flash.locked", "ro.boot.veritymode" to bypass Safety Net
    • [Magic Mount] Move dummy skeleton / mirror / mountinfo filesystem tree to tmpfs
    • [Magic Mount] Rewritten dummy cloning mechanism from scratch, will result in minimal bind mounts, minimal file traversal, eliminate all possible issues that might happen in extreme cases
    • [Magic Mount] Adding new items to /system/bin, /system/vendor, /system/lib(64) is properly supported (devices with separate vendor partition is not supported yet)
    • [Magisk Hide] Rewritten from scratch, now run in daemon mode, proper list monitoring, proper mount detection, and maybe more.....
    • [Boot Image] Add support for Motorola boot image dtb, it shall now unpack correctly
    • [Uninstaller] Add removal of SuperSU custom patch script

    v8

    • Add Magisk Hide to bypass SafetyNet
    • Improve SuperSU integration: no longer changes the SuperSU PATH
    • Support rc script entry points not located in init.rc

    v7

    • Fully open source
    • Remove supolicy dependency, use my own sepolicy-injection
    • Run everything in its own selinux domain, should fix all selinux issues
    • Add Note 7 stock kernel hex patches
    • Add support to install Magisk in Magisk Manager
    • Add support for image merging for module flashing in Magisk Manager
    • Add root helpers for SuperSU auto module-ize and auto upgrading legacy phh superuser
    • New paths to toggle busybox, and support all root solutions
    • Remove root management API; both SuperSU and phh has their own superior solutions

    v6

    • Fixed the algorithm for adding new files and dummy system
    • Updated the module template with a default permission, since people tend to forget them 😃

    v5

    • Hotfix for older Android versions (detect policy before patching)
    • Update uninstaller to NOT uninstall Magisk Manager, since it cause problems

    v4

    • Important: Uninstall v1 - v3 Magisk before upgrading with the uninstaller in the OP!!
    • Massive Rewrite Magisk Interface API! All previous mods are NOT compatible! Please download the latest version of the mods you use (root/xposed)
    • Mods are now installed independently in their own subfolder. This paves the way for future Magisk Manager versions to manage mods, just like how Xposed Modules are handled
    • Support small boot partition devices (Huawei devices)
    • Use minimal sepolicy patch in boot image for smaller ramdisk size. Live patch policies after bootup
    • Include updated open source sepolicy injection tool (source code available), support nearly all SuperSU supolicy tool's functionality

    v3

    • Fix bootimg-extract for Exynos Samsung devices (thanks to @phhusson), should fix all Samsung device issues
    • Add supolicy back to patch sepolicy (stock Samsung do not accept permissive domain)
    • Update sepolicy-injection to patch su domain for Samsung devices to use phh's root
    • Update root disable method, using more aggressive approach
    • Use lazy unmount to unmount root from system, should fix some issues with custom roms
    • Use the highest possible compression rate for ramdisk, hope to fix some devices with no boot partition space
    • Detect boot partition space insufficient, will abort installer instead of breaking your device

    v2

    • Fix verity patch. It should now work on all devices (might fix some of the unable-to-boot issues)
    • All scripts will now run in selinux permissive mode for maximum compatibility (this will NOT turn your device to permissive)
    • Add Nougat Developer Preview 5 support
    • Add systemless host support for AdBlock Apps (enabled by default)
    • Add support for new root disable method
    • Remove sepolicy patches that uses SuperSU's supolicy tool; it is now using a minimal set of modifications
    • Removed Magisk Manager in Magisk patch, it is now included in Magisk phh's superuser only

    v1

    • Initial release

    参考链接

    ',148),s=[t];function n(r,d,c,p,u,g){return e(),o("div",null,s)}const k=i(l,[["render",n]]);export{h as __pageData,k as default}; diff --git a/assets/changes.md.1854017d.lean.js b/assets/changes.md.1854017d.lean.js new file mode 100644 index 00000000..16e4577c --- /dev/null +++ b/assets/changes.md.1854017d.lean.js @@ -0,0 +1 @@ +import{_ as i,o as e,c as o,Q as a}from"./chunks/framework.ed90c782.js";const h=JSON.parse('{"title":"Magisk 更新日志","description":"","frontmatter":{},"headers":[],"relativePath":"changes.md","filePath":"changes.md","lastUpdated":1694964698000}'),l={name:"changes.md"},t=a("",148),s=[t];function n(r,d,c,p,u,g){return e(),o("div",null,s)}const k=i(l,[["render",n]]);export{h as __pageData,k as default}; diff --git a/assets/chunks/@localSearchIndexroot.44f29214.js b/assets/chunks/@localSearchIndexroot.44f29214.js deleted file mode 100644 index efc3b624..00000000 --- a/assets/chunks/@localSearchIndexroot.44f29214.js +++ /dev/null @@ -1 +0,0 @@ -const e='{"documentCount":341,"nextId":341,"documentIds":{"0":"/MagiskChineseDocument/README.html#magisk-中文文档","1":"/MagiskChineseDocument/app_changes.html#magisk-manager-更新日志","2":"/MagiskChineseDocument/app_changes.html#v8-0-7","3":"/MagiskChineseDocument/app_changes.html#v8-0-6","4":"/MagiskChineseDocument/app_changes.html#v8-0-5","5":"/MagiskChineseDocument/app_changes.html#v8-0-4","6":"/MagiskChineseDocument/app_changes.html#v8-0-3","7":"/MagiskChineseDocument/app_changes.html#v8-0-2","8":"/MagiskChineseDocument/app_changes.html#v8-0-1","9":"/MagiskChineseDocument/app_changes.html#v8-0-0","10":"/MagiskChineseDocument/app_changes.html#v7-5-1","11":"/MagiskChineseDocument/app_changes.html#v7-5-0","12":"/MagiskChineseDocument/app_changes.html#v7-4-0","13":"/MagiskChineseDocument/app_changes.html#v7-3-5","14":"/MagiskChineseDocument/app_changes.html#v7-3-4","15":"/MagiskChineseDocument/app_changes.html#v7-3-0-1-2","16":"/MagiskChineseDocument/app_changes.html#v7-2-0","17":"/MagiskChineseDocument/app_changes.html#v7-1-2","18":"/MagiskChineseDocument/app_changes.html#v7-1-1","19":"/MagiskChineseDocument/app_changes.html#v7-1-0","20":"/MagiskChineseDocument/app_changes.html#v7-0-0","21":"/MagiskChineseDocument/app_changes.html#v6-1-0","22":"/MagiskChineseDocument/app_changes.html#v6-0-1","23":"/MagiskChineseDocument/app_changes.html#v6-0-0","24":"/MagiskChineseDocument/app_changes.html#v5-9-0-v5-9-1","25":"/MagiskChineseDocument/app_changes.html#v5-8-3","26":"/MagiskChineseDocument/app_changes.html#v5-8-1","27":"/MagiskChineseDocument/app_changes.html#v5-8-0","28":"/MagiskChineseDocument/app_changes.html#v5-7-0","29":"/MagiskChineseDocument/app_changes.html#v5-6-4","30":"/MagiskChineseDocument/app_changes.html#v5-6-3","31":"/MagiskChineseDocument/app_changes.html#v5-6-2","32":"/MagiskChineseDocument/app_changes.html#v5-6-1","33":"/MagiskChineseDocument/app_changes.html#v5-6-0","34":"/MagiskChineseDocument/app_changes.html#v5-5-5","35":"/MagiskChineseDocument/app_changes.html#v5-5-4","36":"/MagiskChineseDocument/app_changes.html#v5-5-3","37":"/MagiskChineseDocument/app_changes.html#v5-5-2","38":"/MagiskChineseDocument/app_changes.html#v5-5-1","39":"/MagiskChineseDocument/app_changes.html#v5-5-0","40":"/MagiskChineseDocument/app_changes.html#v5-4-3","41":"/MagiskChineseDocument/app_changes.html#v5-4-2","42":"/MagiskChineseDocument/app_changes.html#v5-4-0","43":"/MagiskChineseDocument/app_changes.html#v5-3-5","44":"/MagiskChineseDocument/app_changes.html#v5-3-0","45":"/MagiskChineseDocument/app_changes.html#v5-2-0","46":"/MagiskChineseDocument/app_changes.html#v5-1-1","47":"/MagiskChineseDocument/app_changes.html#v5-1-0","48":"/MagiskChineseDocument/app_changes.html#v5-0-6","49":"/MagiskChineseDocument/app_changes.html#v5-0-5","50":"/MagiskChineseDocument/app_changes.html#v5-0-4","51":"/MagiskChineseDocument/app_changes.html#v5-0-3","52":"/MagiskChineseDocument/app_changes.html#v5-0-2","53":"/MagiskChineseDocument/app_changes.html#v5-0-1","54":"/MagiskChineseDocument/app_changes.html#v5-0-0","55":"/MagiskChineseDocument/app_changes.html#v4-3-3","56":"/MagiskChineseDocument/app_changes.html#v4-3-2","57":"/MagiskChineseDocument/app_changes.html#v4-3-1","58":"/MagiskChineseDocument/app_changes.html#v4-3-0","59":"/MagiskChineseDocument/app_changes.html#v4-2-7","60":"/MagiskChineseDocument/app_changes.html#v4-2-6","61":"/MagiskChineseDocument/app_changes.html#v4-2","62":"/MagiskChineseDocument/app_changes.html#v4-1","63":"/MagiskChineseDocument/app_changes.html#v4-0","64":"/MagiskChineseDocument/app_changes.html#v3-1","65":"/MagiskChineseDocument/app_changes.html#v3-0","66":"/MagiskChineseDocument/app_changes.html#v2-5","67":"/MagiskChineseDocument/app_changes.html#v2-1","68":"/MagiskChineseDocument/app_changes.html#v2-0","69":"/MagiskChineseDocument/app_changes.html#v1-0","70":"/MagiskChineseDocument/app_changes.html#参考链接","71":"/MagiskChineseDocument/boot.html#android-引导诡计","72":"/MagiskChineseDocument/boot.html#术语","73":"/MagiskChineseDocument/boot.html#引导方法","74":"/MagiskChineseDocument/boot.html#讨论","75":"/MagiskChineseDocument/boot.html#一些历史","76":"/MagiskChineseDocument/boot.html#将事物拼凑在一起","77":"/MagiskChineseDocument/boot.html#参考链接","78":"/MagiskChineseDocument/build.html#构建和开发-magisk","79":"/MagiskChineseDocument/build.html#设置环境","80":"/MagiskChineseDocument/build.html#构建","81":"/MagiskChineseDocument/build.html#ide-支持","82":"/MagiskChineseDocument/build.html#在-android-studio-中开发-rust","83":"/MagiskChineseDocument/build.html#签名和分发","84":"/MagiskChineseDocument/changes.html#magisk-更新日志","85":"/MagiskChineseDocument/changes.html#v26-1","86":"/MagiskChineseDocument/changes.html#v26-0","87":"/MagiskChineseDocument/changes.html#v25-2","88":"/MagiskChineseDocument/changes.html#v25-1","89":"/MagiskChineseDocument/changes.html#v25-0","90":"/MagiskChineseDocument/changes.html#v24-3","91":"/MagiskChineseDocument/changes.html#v24-2","92":"/MagiskChineseDocument/changes.html#v24-1","93":"/MagiskChineseDocument/changes.html#v24-0","94":"/MagiskChineseDocument/changes.html#v23-0","95":"/MagiskChineseDocument/changes.html#v22-1","96":"/MagiskChineseDocument/changes.html#v22-0","97":"/MagiskChineseDocument/changes.html#v21-4","98":"/MagiskChineseDocument/changes.html#v21-3","99":"/MagiskChineseDocument/changes.html#v21-2","100":"/MagiskChineseDocument/changes.html#v21-1","101":"/MagiskChineseDocument/changes.html#v21-0","102":"/MagiskChineseDocument/changes.html#v20-4","103":"/MagiskChineseDocument/changes.html#v20-3","104":"/MagiskChineseDocument/changes.html#v20-2","105":"/MagiskChineseDocument/changes.html#v20-1","106":"/MagiskChineseDocument/changes.html#v20-0","107":"/MagiskChineseDocument/changes.html#v19-4","108":"/MagiskChineseDocument/changes.html#v19-3","109":"/MagiskChineseDocument/changes.html#v19-2","110":"/MagiskChineseDocument/changes.html#v19-1","111":"/MagiskChineseDocument/changes.html#v19-0","112":"/MagiskChineseDocument/changes.html#v18-1","113":"/MagiskChineseDocument/changes.html#v18-0","114":"/MagiskChineseDocument/changes.html#v17-3","115":"/MagiskChineseDocument/changes.html#v17-2","116":"/MagiskChineseDocument/changes.html#v17-0-17-1","117":"/MagiskChineseDocument/changes.html#v16-7","118":"/MagiskChineseDocument/changes.html#v16-6","119":"/MagiskChineseDocument/changes.html#v16-4","120":"/MagiskChineseDocument/changes.html#v16-3","121":"/MagiskChineseDocument/changes.html#v16-2","122":"/MagiskChineseDocument/changes.html#v16-1","123":"/MagiskChineseDocument/changes.html#v16-0","124":"/MagiskChineseDocument/changes.html#v15-4","125":"/MagiskChineseDocument/changes.html#v15-3","126":"/MagiskChineseDocument/changes.html#v15-2","127":"/MagiskChineseDocument/changes.html#v15-1","128":"/MagiskChineseDocument/changes.html#v15-0","129":"/MagiskChineseDocument/changes.html#v14-6-1468","130":"/MagiskChineseDocument/changes.html#v14-5-1456","131":"/MagiskChineseDocument/changes.html#v14-5-1455","132":"/MagiskChineseDocument/changes.html#v14-3-1437","133":"/MagiskChineseDocument/changes.html#v14-2","134":"/MagiskChineseDocument/changes.html#v14-1","135":"/MagiskChineseDocument/changes.html#v14-0","136":"/MagiskChineseDocument/changes.html#v13-3","137":"/MagiskChineseDocument/changes.html#v13-2","138":"/MagiskChineseDocument/changes.html#v13-1","139":"/MagiskChineseDocument/changes.html#v12-0","140":"/MagiskChineseDocument/changes.html#v11-5-11-6","141":"/MagiskChineseDocument/changes.html#v11-1","142":"/MagiskChineseDocument/changes.html#v11-0","143":"/MagiskChineseDocument/changes.html#v10-2","144":"/MagiskChineseDocument/changes.html#v10","145":"/MagiskChineseDocument/changes.html#v9","146":"/MagiskChineseDocument/changes.html#v8","147":"/MagiskChineseDocument/changes.html#v7","148":"/MagiskChineseDocument/changes.html#v6","149":"/MagiskChineseDocument/changes.html#v5","150":"/MagiskChineseDocument/changes.html#v4","151":"/MagiskChineseDocument/changes.html#v3","152":"/MagiskChineseDocument/changes.html#v2","153":"/MagiskChineseDocument/changes.html#v1","154":"/MagiskChineseDocument/changes.html#参考链接","155":"/MagiskChineseDocument/details.html#内部细节","156":"/MagiskChineseDocument/details.html#文档结构","157":"/MagiskChineseDocument/details.html#magisk-tmpfs-目录-中的路径","158":"/MagiskChineseDocument/details.html#data-中的路径","159":"/MagiskChineseDocument/details.html#magisk引导过程","160":"/MagiskChineseDocument/details.html#预初始化-pre-init","161":"/MagiskChineseDocument/details.html#解密后-post-fs-data","162":"/MagiskChineseDocument/details.html#后期启动-late-start","163":"/MagiskChineseDocument/details.html#重置属性-resetprop","164":"/MagiskChineseDocument/details.html#selinux-政策","165":"/MagiskChineseDocument/details.html#参考链接","166":"/MagiskChineseDocument/faq.html#常见问题","167":"/MagiskChineseDocument/faq.html#q-我安装了一个模块-然后启动时卡在了开机动画。求助","168":"/MagiskChineseDocument/faq.html#q-为什么-xxx应用会检测到-root","169":"/MagiskChineseDocument/faq.html#q-在我隐藏-magisk-app-后-应用图标显示异常","170":"/MagiskChineseDocument/faq.html#q-为什么这个文档很多错误或者不通顺的地方","171":"/MagiskChineseDocument/faq.html#参考链接","172":"/MagiskChineseDocument/guides.html#开发者指南","173":"/MagiskChineseDocument/guides.html#busybox","174":"/MagiskChineseDocument/guides.html#magisk-模块","175":"/MagiskChineseDocument/guides.html#module-prop","176":"/MagiskChineseDocument/guides.html#shell-脚本-sh","177":"/MagiskChineseDocument/guides.html#system-文件夹","178":"/MagiskChineseDocument/guides.html#zygisk","179":"/MagiskChineseDocument/guides.html#system-prop","180":"/MagiskChineseDocument/guides.html#sepolicy-rule","181":"/MagiskChineseDocument/guides.html#magisk-模块安装程序","182":"/MagiskChineseDocument/guides.html#自定义","183":"/MagiskChineseDocument/guides.html#变量","184":"/MagiskChineseDocument/guides.html#函数","185":"/MagiskChineseDocument/guides.html#注意","186":"/MagiskChineseDocument/guides.html#启动脚本","187":"/MagiskChineseDocument/guides.html#根目录覆盖系统","188":"/MagiskChineseDocument/guides.html#参考链接","189":"/MagiskChineseDocument/#magisk-中文文档","190":"/MagiskChineseDocument/#magisk-许可-license","191":"/MagiskChineseDocument/#相关链接","192":"/MagiskChineseDocument/#友情链接","193":"/MagiskChineseDocument/install.html#安装","194":"/MagiskChineseDocument/install.html#入门","195":"/MagiskChineseDocument/install.html#修补映像","196":"/MagiskChineseDocument/install.html#卸载","197":"/MagiskChineseDocument/install.html#recovery-中的-magisk","198":"/MagiskChineseDocument/install.html#三星-system-as-root","199":"/MagiskChineseDocument/install.html#安装-magisk-之前","200":"/MagiskChineseDocument/install.html#解锁-bootloader","201":"/MagiskChineseDocument/install.html#操作指南","202":"/MagiskChineseDocument/install.html#系统更新","203":"/MagiskChineseDocument/install.html#注意事项","204":"/MagiskChineseDocument/install.html#华为","205":"/MagiskChineseDocument/install.html#获得官方映像","206":"/MagiskChineseDocument/install.html#emui-5-及以下","207":"/MagiskChineseDocument/install.html#emui-8","208":"/MagiskChineseDocument/install.html#emui-9-或更高版本","209":"/MagiskChineseDocument/install.html#第三方-recovery","210":"/MagiskChineseDocument/install.html#参考链接","211":"/MagiskChineseDocument/ota.html#ota-升级指南","212":"/MagiskChineseDocument/ota.html#必要条件","213":"/MagiskChineseDocument/ota.html#带-a-b-分区的设备","214":"/MagiskChineseDocument/ota.html#非-a-b-设备","215":"/MagiskChineseDocument/ota.html#参考链接","216":"/MagiskChineseDocument/releases/18000.html#_2018-12-7-magisk-v18-0","217":"/MagiskChineseDocument/releases/18000.html#magiskhide-improvements","218":"/MagiskChineseDocument/releases/18000.html#path-changes","219":"/MagiskChineseDocument/releases/18000.html#dropping-legacy-support","220":"/MagiskChineseDocument/releases/18000.html#modern-c-code-base","221":"/MagiskChineseDocument/releases/18000.html#full-changelog-here","222":"/MagiskChineseDocument/releases/18100.html#_2019-2-4-magisk-v18-1","223":"/MagiskChineseDocument/releases/18100.html#emui-9-support","224":"/MagiskChineseDocument/releases/18100.html#support-down-to-android-4-2","225":"/MagiskChineseDocument/releases/18100.html#major-magisk-manager-update","226":"/MagiskChineseDocument/releases/18100.html#final-words","227":"/MagiskChineseDocument/releases/18100.html#full-changelog-here","228":"/MagiskChineseDocument/releases/19000.html#_2019-3-28-magisk-v19-0","229":"/MagiskChineseDocument/releases/19000.html#magisk-module-installer","230":"/MagiskChineseDocument/releases/19000.html#imageless-magisk","231":"/MagiskChineseDocument/releases/19000.html#native-64-bit-is-back","232":"/MagiskChineseDocument/releases/19000.html#zygote-ptrace-based-magiskhide","233":"/MagiskChineseDocument/releases/19000.html#android-q","234":"/MagiskChineseDocument/releases/19000.html#final-words","235":"/MagiskChineseDocument/releases/19000.html#full-changelog-here","236":"/MagiskChineseDocument/releases/19100.html#_2019-5-1-magisk-v19-1","237":"/MagiskChineseDocument/releases/19100.html#full-changelog-here","238":"/MagiskChineseDocument/releases/19200.html#todo","239":"/MagiskChineseDocument/releases/19300.html#todo","240":"/MagiskChineseDocument/releases/19400.html#_2019-9-19-magisk-v19-4","241":"/MagiskChineseDocument/releases/19400.html#new-system-as-root-implementation","242":"/MagiskChineseDocument/releases/19400.html#android-10-support","243":"/MagiskChineseDocument/releases/19400.html#product-partition-support","244":"/MagiskChineseDocument/releases/19400.html#a-only-system-as-root","245":"/MagiskChineseDocument/releases/19400.html#full-changelog-here","246":"/MagiskChineseDocument/releases/20000.html#_2019-10-11-magisk-v20-0","247":"/MagiskChineseDocument/releases/20000.html#new-system-as-root-implementation","248":"/MagiskChineseDocument/releases/20000.html#android-10-support","249":"/MagiskChineseDocument/releases/20000.html#product-partition-support","250":"/MagiskChineseDocument/releases/20000.html#a-only-system-as-root","251":"/MagiskChineseDocument/releases/20000.html#full-changelog-here","252":"/MagiskChineseDocument/releases/20100.html#_2019-11-2-magisk-v20-1","253":"/MagiskChineseDocument/releases/20100.html#updated-magisk-manager-hiding","254":"/MagiskChineseDocument/releases/20100.html#full-changelog-here","255":"/MagiskChineseDocument/releases/20200.html#_2020-1-2-magisk-v20-2","256":"/MagiskChineseDocument/releases/20200.html#pre-init-sepolicy-patches-for-modules","257":"/MagiskChineseDocument/releases/20200.html#new-module-installer-format","258":"/MagiskChineseDocument/releases/20200.html#full-changelog-here","259":"/MagiskChineseDocument/releases/20300.html#_2020-1-10-magisk-v20-3","260":"/MagiskChineseDocument/releases/20300.html#magisk","261":"/MagiskChineseDocument/releases/20300.html#magisk-manager","262":"/MagiskChineseDocument/releases/20300.html#full-changelog-here","263":"/MagiskChineseDocument/releases/20400.html#_2020-3-23-magisk-v20-4","264":"/MagiskChineseDocument/releases/20400.html#miscellaneous","265":"/MagiskChineseDocument/releases/20400.html#busybox-standalone-mode","266":"/MagiskChineseDocument/releases/20400.html#magisk-changelog","267":"/MagiskChineseDocument/releases/21000.html#_2020-10-3-magisk-v21-0","268":"/MagiskChineseDocument/releases/21000.html#highlights","269":"/MagiskChineseDocument/releases/21000.html#full-changelog-here","270":"/MagiskChineseDocument/releases/21100.html#_2020-11-13-magisk-v21-1","271":"/MagiskChineseDocument/releases/21100.html#full-changelog-here","272":"/MagiskChineseDocument/releases/21200.html#_2020-12-28-magisk-v21-2","273":"/MagiskChineseDocument/releases/21200.html#v21-2","274":"/MagiskChineseDocument/releases/21200.html#full-changelog-here","275":"/MagiskChineseDocument/releases/21400.html#_2021-1-17-magisk-v21-4","276":"/MagiskChineseDocument/releases/21400.html#v21-4","277":"/MagiskChineseDocument/releases/21400.html#v21-3","278":"/MagiskChineseDocument/releases/21400.html#full-changelog-here","279":"/MagiskChineseDocument/releases/22000.html#_2021-2-23-magisk-v22-0","280":"/MagiskChineseDocument/releases/22000.html#restore-the-existing-magisk-manager-back-to-normal-before-upgrading-if-hidden","281":"/MagiskChineseDocument/releases/22000.html#magisk-manager-is-dead-long-live-the-magisk-app","282":"/MagiskChineseDocument/releases/22000.html#app-hiding","283":"/MagiskChineseDocument/releases/22000.html#bug-fixes","284":"/MagiskChineseDocument/releases/22000.html#full-changelog-here","285":"/MagiskChineseDocument/releases/22100.html#_2021-4-9-magisk-v22-1","286":"/MagiskChineseDocument/releases/22100.html#bug-fixes","287":"/MagiskChineseDocument/releases/22100.html#full-changelog-here","288":"/MagiskChineseDocument/releases/23000.html#_2021-5-12-magisk-v23-0","289":"/MagiskChineseDocument/releases/23000.html#bug-fixes","290":"/MagiskChineseDocument/releases/23000.html#full-changelog-here","291":"/MagiskChineseDocument/releases/24000.html#_2022-1-26-magisk-v24-0","292":"/MagiskChineseDocument/releases/24000.html#magiskhide-removal","293":"/MagiskChineseDocument/releases/24000.html#sunsetting-magisk-modules-repo","294":"/MagiskChineseDocument/releases/24000.html#introducing-zygisk","295":"/MagiskChineseDocument/releases/24000.html#documentation","296":"/MagiskChineseDocument/releases/24000.html#full-changelog-here","297":"/MagiskChineseDocument/releases/24100.html#_2022-1-28-magisk-v24-1","298":"/MagiskChineseDocument/releases/24100.html#magiskhide-removal","299":"/MagiskChineseDocument/releases/24100.html#sunsetting-magisk-modules-repo","300":"/MagiskChineseDocument/releases/24100.html#introducing-zygisk","301":"/MagiskChineseDocument/releases/24100.html#documentation","302":"/MagiskChineseDocument/releases/24100.html#full-changelog-here","303":"/MagiskChineseDocument/releases/24200.html#_2022-3-1-magisk-v24-2","304":"/MagiskChineseDocument/releases/24200.html#full-changelog-here","305":"/MagiskChineseDocument/releases/24300.html#_2022-3-10-magisk-v24-3","306":"/MagiskChineseDocument/releases/24300.html#full-changelog-here","307":"/MagiskChineseDocument/releases/25000.html#_2022-6-7-magisk-v25-0","308":"/MagiskChineseDocument/releases/25000.html#magiskinit-rewrite","309":"/MagiskChineseDocument/releases/25000.html#magisksu-security-enhancements","310":"/MagiskChineseDocument/releases/25000.html#full-changelog-here","311":"/MagiskChineseDocument/releases/25100.html#_2022-6-19-magisk-v25-1","312":"/MagiskChineseDocument/releases/25100.html#magiskinit-rewrite","313":"/MagiskChineseDocument/releases/25100.html#magisksu-security-enhancements","314":"/MagiskChineseDocument/releases/25100.html#full-changelog-here","315":"/MagiskChineseDocument/releases/25200.html#_2022-7-20-magisk-v25-2","316":"/MagiskChineseDocument/releases/25200.html#full-changelog-here","317":"/MagiskChineseDocument/releases/26000.html#_2023-4-5-magisk-v26-0","318":"/MagiskChineseDocument/releases/26000.html#bumping-minimum-android-version-to-6-0","319":"/MagiskChineseDocument/releases/26000.html#new-magic-mount-implementation","320":"/MagiskChineseDocument/releases/26000.html#new-sepolicy-rule-implementation","321":"/MagiskChineseDocument/releases/26000.html#zygisk-updates","322":"/MagiskChineseDocument/releases/26000.html#full-changelog-here","323":"/MagiskChineseDocument/releases/26100.html#_2023-4-11-magisk-v26-1","324":"/MagiskChineseDocument/releases/26100.html#changes-from-v26-0","325":"/MagiskChineseDocument/releases/26100.html#bumping-minimum-android-version-to-6-0","326":"/MagiskChineseDocument/releases/26100.html#new-magic-mount-implementation","327":"/MagiskChineseDocument/releases/26100.html#new-sepolicy-rule-implementation","328":"/MagiskChineseDocument/releases/26100.html#zygisk-updates","329":"/MagiskChineseDocument/releases/26100.html#full-changelog-here","330":"/MagiskChineseDocument/releases/#发布日志","331":"/MagiskChineseDocument/releases/#其他日志","332":"/MagiskChineseDocument/releases/#参考链接","333":"/MagiskChineseDocument/tools.html#magisk-工具","334":"/MagiskChineseDocument/tools.html#magiskboot","335":"/MagiskChineseDocument/tools.html#magiskinit","336":"/MagiskChineseDocument/tools.html#magiskpolicy","337":"/MagiskChineseDocument/tools.html#magisk","338":"/MagiskChineseDocument/tools.html#su","339":"/MagiskChineseDocument/tools.html#resetprop","340":"/MagiskChineseDocument/tools.html#参考链接"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[2,1,28],"1":[3,1,1],"2":[3,3,2],"3":[3,3,3],"4":[3,3,2],"5":[3,3,5],"6":[3,3,5],"7":[3,3,19],"8":[3,3,46],"9":[2,3,32],"10":[3,3,10],"11":[3,3,18],"12":[3,3,32],"13":[3,3,18],"14":[3,3,19],"15":[5,3,31],"16":[3,3,11],"17":[3,3,11],"18":[2,3,14],"19":[3,3,34],"20":[2,3,50],"21":[3,3,57],"22":[3,3,52],"23":[2,3,51],"24":[4,3,69],"25":[3,3,16],"26":[3,3,15],"27":[3,3,54],"28":[3,3,28],"29":[3,3,11],"30":[3,3,6],"31":[3,3,11],"32":[3,3,20],"33":[3,3,39],"34":[2,3,12],"35":[3,3,20],"36":[3,3,11],"37":[3,3,22],"38":[3,3,19],"39":[3,3,56],"40":[3,3,9],"41":[3,3,100],"42":[3,3,74],"43":[3,3,54],"44":[3,3,50],"45":[3,3,81],"46":[2,3,34],"47":[3,3,37],"48":[3,3,9],"49":[3,3,16],"50":[3,3,6],"51":[3,3,18],"52":[3,3,18],"53":[3,3,12],"54":[2,3,39],"55":[2,3,7],"56":[3,3,17],"57":[3,3,16],"58":[3,3,23],"59":[3,3,5],"60":[3,3,32],"61":[2,3,48],"62":[2,3,14],"63":[2,3,33],"64":[2,3,25],"65":[2,3,29],"66":[2,3,31],"67":[2,3,30],"68":[2,3,12],"69":[2,3,2],"70":[1,3,5],"71":[2,1,1],"72":[1,2,110],"73":[1,2,71],"74":[1,3,68],"75":[1,2,80],"76":[1,2,86],"77":[1,2,6],"78":[2,1,1],"79":[1,2,79],"80":[1,2,22],"81":[2,2,21],"82":[5,4,73],"83":[1,2,27],"84":[2,1,1],"85":[2,2,37],"86":[2,2,95],"87":[2,2,32],"88":[2,2,50],"89":[2,2,93],"90":[2,2,21],"91":[2,2,75],"92":[2,2,4],"93":[2,2,152],"94":[2,2,69],"95":[2,2,92],"96":[2,2,88],"97":[2,2,22],"98":[2,2,44],"99":[2,2,51],"100":[2,2,86],"101":[2,2,151],"102":[2,2,111],"103":[2,2,6],"104":[2,2,37],"105":[2,2,62],"106":[2,2,40],"107":[2,2,91],"108":[2,2,51],"109":[2,2,53],"110":[2,2,52],"111":[2,2,104],"112":[2,2,21],"113":[2,2,138],"114":[2,2,72],"115":[2,2,27],"116":[4,2,93],"117":[2,2,50],"118":[2,2,189],"119":[2,2,145],"120":[2,2,15],"121":[2,2,26],"122":[2,2,39],"123":[2,2,27],"124":[2,2,53],"125":[2,2,40],"126":[2,2,64],"127":[2,2,17],"128":[2,2,34],"129":[4,2,83],"130":[4,2,25],"131":[4,2,88],"132":[4,2,83],"133":[2,2,12],"134":[2,2,83],"135":[2,2,131],"136":[2,2,21],"137":[2,2,60],"138":[2,2,190],"139":[2,2,118],"140":[4,2,72],"141":[2,2,11],"142":[2,2,223],"143":[2,2,28],"144":[1,2,103],"145":[1,2,109],"146":[1,2,24],"147":[1,2,60],"148":[1,2,25],"149":[1,2,21],"150":[1,2,87],"151":[1,2,69],"152":[1,2,76],"153":[1,2,3],"154":[1,2,4],"155":[1,1,1],"156":[1,1,1],"157":[5,2,67],"158":[3,2,80],"159":[1,1,1],"160":[4,2,55],"161":[5,2,13],"162":[4,2,13],"163":[3,1,77],"164":[2,1,70],"165":[1,1,6],"166":[1,1,1],"167":[4,1,39],"168":[5,1,21],"169":[6,1,22],"170":[2,1,5],"171":[1,1,6],"172":[1,1,1],"173":[1,1,80],"174":[2,1,81],"175":[2,3,80],"176":[4,3,27],"177":[2,3,29],"178":[1,3,16],"179":[2,3,10],"180":[2,3,10],"181":[2,1,49],"182":[1,3,37],"183":[1,4,59],"184":[1,4,63],"185":[1,3,23],"186":[1,1,74],"187":[1,1,121],"188":[1,1,6],"189":[2,1,24],"190":[4,2,107],"191":[1,2,5],"192":[1,2,6],"193":[1,1,20],"194":[1,1,108],"195":[1,1,76],"196":[1,1,14],"197":[3,1,63],"198":[5,1,8],"199":[3,6,20],"200":[2,6,30],"201":[1,6,83],"202":[1,6,21],"203":[1,6,30],"204":[1,1,67],"205":[1,2,15],"206":[3,2,21],"207":[2,2,37],"208":[3,2,55],"209":[2,1,75],"210":[1,1,5],"211":[2,1,22],"212":[1,2,20],"213":[4,2,41],"214":[5,2,69],"215":[1,2,6],"216":[6,1,13],"217":[2,7,108],"218":[2,7,94],"219":[3,7,75],"220":[4,7,41],"221":[3,7,1],"222":[6,1,15],"223":[3,7,56],"224":[6,7,59],"225":[4,7,27],"226":[2,7,50],"227":[3,7,1],"228":[6,1,38],"229":[3,6,63],"230":[2,6,91],"231":[5,6,41],"232":[4,6,74],"233":[2,6,44],"234":[2,6,54],"235":[3,8,1],"236":[5,1,70],"237":[3,6,1],"238":[1,1,1],"239":[1,1,1],"240":[6,1,35],"241":[5,7,165],"242":[3,7,59],"243":[3,7,33],"244":[5,7,35],"245":[3,7,1],"246":[6,1,34],"247":[5,7,163],"248":[3,7,55],"249":[3,7,33],"250":[5,7,35],"251":[3,7,1],"252":[6,1,13],"253":[4,7,131],"254":[3,7,1],"255":[5,1,14],"256":[6,6,82],"257":[4,6,82],"258":[3,6,1],"259":[6,1,1],"260":[1,7,10],"261":[2,7,6],"262":[3,7,1],"263":[6,1,1],"264":[1,7,74],"265":[3,7,102],"266":[2,7,111],"267":[6,1,88],"268":[1,7,111],"269":[3,7,1],"270":[6,1,36],"271":[3,7,1],"272":[6,1,25],"273":[2,7,51],"274":[3,7,1],"275":[6,1,40],"276":[2,7,22],"277":[2,7,44],"278":[3,7,1],"279":[6,1,1],"280":[13,7,21],"281":[9,7,72],"282":[2,7,42],"283":[2,7,34],"284":[3,7,1],"285":[6,1,35],"286":[2,7,92],"287":[3,7,1],"288":[6,1,28],"289":[2,7,69],"290":[3,7,1],"291":[6,1,41],"292":[2,7,84],"293":[4,7,45],"294":[2,7,58],"295":[1,7,18],"296":[3,7,1],"297":[5,1,57],"298":[2,6,84],"299":[4,6,45],"300":[2,6,58],"301":[1,6,18],"302":[3,6,1],"303":[6,1,80],"304":[3,7,1],"305":[5,1,36],"306":[3,6,1],"307":[6,1,22],"308":[2,7,143],"309":[3,7,132],"310":[3,7,1],"311":[6,1,35],"312":[2,7,143],"313":[3,7,132],"314":[3,7,1],"315":[6,1,37],"316":[3,7,1],"317":[6,1,6],"318":[7,7,59],"319":[4,7,47],"320":[4,7,71],"321":[2,7,44],"322":[3,7,1],"323":[6,1,1],"324":[4,7,48],"325":[7,7,59],"326":[4,7,47],"327":[4,7,71],"328":[2,7,44],"329":[3,7,1],"330":[1,1,17],"331":[1,1,4],"332":[1,1,5],"333":[2,1,15],"334":[1,2,230],"335":[1,2,22],"336":[1,2,152],"337":[1,2,107],"338":[1,2,58],"339":[1,2,46],"340":[1,2,5]},"averageFieldLength":[2.7302052785923756,3.325513196480936,43.87976539589443],"storedFields":{"0":{"title":"Magisk 中文文档","titles":[]},"1":{"title":"Magisk Manager 更新日志","titles":[]},"2":{"title":"v8.0.7","titles":["Magisk Manager 更新日志"]},"3":{"title":"v8.0.6","titles":["Magisk Manager 更新日志"]},"4":{"title":"v8.0.5","titles":["Magisk Manager 更新日志"]},"5":{"title":"v8.0.4","titles":["Magisk Manager 更新日志"]},"6":{"title":"v8.0.3","titles":["Magisk Manager 更新日志"]},"7":{"title":"v8.0.2","titles":["Magisk Manager 更新日志"]},"8":{"title":"v8.0.1","titles":["Magisk Manager 更新日志"]},"9":{"title":"v8.0.0","titles":["Magisk Manager 更新日志"]},"10":{"title":"v7.5.1","titles":["Magisk Manager 更新日志"]},"11":{"title":"v7.5.0","titles":["Magisk Manager 更新日志"]},"12":{"title":"v7.4.0","titles":["Magisk Manager 更新日志"]},"13":{"title":"v7.3.5","titles":["Magisk Manager 更新日志"]},"14":{"title":"v7.3.4","titles":["Magisk Manager 更新日志"]},"15":{"title":"v7.3.0/1/2","titles":["Magisk Manager 更新日志"]},"16":{"title":"v7.2.0","titles":["Magisk Manager 更新日志"]},"17":{"title":"v7.1.2","titles":["Magisk Manager 更新日志"]},"18":{"title":"v7.1.1","titles":["Magisk Manager 更新日志"]},"19":{"title":"v7.1.0","titles":["Magisk Manager 更新日志"]},"20":{"title":"v7.0.0","titles":["Magisk Manager 更新日志"]},"21":{"title":"v6.1.0","titles":["Magisk Manager 更新日志"]},"22":{"title":"v6.0.1","titles":["Magisk Manager 更新日志"]},"23":{"title":"v6.0.0","titles":["Magisk Manager 更新日志"]},"24":{"title":"v5.9.0/v5.9.1","titles":["Magisk Manager 更新日志"]},"25":{"title":"v5.8.3","titles":["Magisk Manager 更新日志"]},"26":{"title":"v5.8.1","titles":["Magisk Manager 更新日志"]},"27":{"title":"v5.8.0","titles":["Magisk Manager 更新日志"]},"28":{"title":"v5.7.0","titles":["Magisk Manager 更新日志"]},"29":{"title":"v5.6.4","titles":["Magisk Manager 更新日志"]},"30":{"title":"v5.6.3","titles":["Magisk Manager 更新日志"]},"31":{"title":"v5.6.2","titles":["Magisk Manager 更新日志"]},"32":{"title":"v5.6.1","titles":["Magisk Manager 更新日志"]},"33":{"title":"v5.6.0","titles":["Magisk Manager 更新日志"]},"34":{"title":"v5.5.5","titles":["Magisk Manager 更新日志"]},"35":{"title":"v5.5.4","titles":["Magisk Manager 更新日志"]},"36":{"title":"v5.5.3","titles":["Magisk Manager 更新日志"]},"37":{"title":"v5.5.2","titles":["Magisk Manager 更新日志"]},"38":{"title":"v5.5.1","titles":["Magisk Manager 更新日志"]},"39":{"title":"v5.5.0","titles":["Magisk Manager 更新日志"]},"40":{"title":"v5.4.3","titles":["Magisk Manager 更新日志"]},"41":{"title":"v5.4.2","titles":["Magisk Manager 更新日志"]},"42":{"title":"v5.4.0","titles":["Magisk Manager 更新日志"]},"43":{"title":"v5.3.5","titles":["Magisk Manager 更新日志"]},"44":{"title":"v5.3.0","titles":["Magisk Manager 更新日志"]},"45":{"title":"v5.2.0","titles":["Magisk Manager 更新日志"]},"46":{"title":"v5.1.1","titles":["Magisk Manager 更新日志"]},"47":{"title":"v5.1.0","titles":["Magisk Manager 更新日志"]},"48":{"title":"v5.0.6","titles":["Magisk Manager 更新日志"]},"49":{"title":"v5.0.5","titles":["Magisk Manager 更新日志"]},"50":{"title":"v5.0.4","titles":["Magisk Manager 更新日志"]},"51":{"title":"v5.0.3","titles":["Magisk Manager 更新日志"]},"52":{"title":"v5.0.2","titles":["Magisk Manager 更新日志"]},"53":{"title":"v5.0.1","titles":["Magisk Manager 更新日志"]},"54":{"title":"v5.0.0","titles":["Magisk Manager 更新日志"]},"55":{"title":"v4.3.3","titles":["Magisk Manager 更新日志"]},"56":{"title":"v4.3.2","titles":["Magisk Manager 更新日志"]},"57":{"title":"v4.3.1","titles":["Magisk Manager 更新日志"]},"58":{"title":"v4.3.0","titles":["Magisk Manager 更新日志"]},"59":{"title":"v4.2.7","titles":["Magisk Manager 更新日志"]},"60":{"title":"v4.2.6","titles":["Magisk Manager 更新日志"]},"61":{"title":"v4.2","titles":["Magisk Manager 更新日志"]},"62":{"title":"v4.1","titles":["Magisk Manager 更新日志"]},"63":{"title":"v4.0","titles":["Magisk Manager 更新日志"]},"64":{"title":"v3.1","titles":["Magisk Manager 更新日志"]},"65":{"title":"v3.0","titles":["Magisk Manager 更新日志"]},"66":{"title":"v2.5","titles":["Magisk Manager 更新日志"]},"67":{"title":"v2.1","titles":["Magisk Manager 更新日志"]},"68":{"title":"v2.0","titles":["Magisk Manager 更新日志"]},"69":{"title":"v1.0","titles":["Magisk Manager 更新日志"]},"70":{"title":"参考链接","titles":["Magisk Manager 更新日志"]},"71":{"title":"Android 引导诡计","titles":[]},"72":{"title":"术语","titles":["Android 引导诡计"]},"73":{"title":"引导方法","titles":["Android 引导诡计"]},"74":{"title":"讨论","titles":["Android 引导诡计","引导方法"]},"75":{"title":"一些历史","titles":["Android 引导诡计"]},"76":{"title":"将事物拼凑在一起","titles":["Android 引导诡计"]},"77":{"title":"参考链接","titles":["Android 引导诡计"]},"78":{"title":"构建和开发 Magisk","titles":[]},"79":{"title":"设置环境","titles":["构建和开发 Magisk"]},"80":{"title":"构建","titles":["构建和开发 Magisk"]},"81":{"title":"IDE 支持","titles":["构建和开发 Magisk"]},"82":{"title":"在 Android Studio 中开发 Rust","titles":["构建和开发 Magisk","IDE 支持"]},"83":{"title":"签名和分发","titles":["构建和开发 Magisk"]},"84":{"title":"Magisk 更新日志","titles":[]},"85":{"title":"v26.1","titles":["Magisk 更新日志"]},"86":{"title":"v26.0","titles":["Magisk 更新日志"]},"87":{"title":"v25.2","titles":["Magisk 更新日志"]},"88":{"title":"v25.1","titles":["Magisk 更新日志"]},"89":{"title":"v25.0","titles":["Magisk 更新日志"]},"90":{"title":"v24.3","titles":["Magisk 更新日志"]},"91":{"title":"v24.2","titles":["Magisk 更新日志"]},"92":{"title":"v24.1","titles":["Magisk 更新日志"]},"93":{"title":"v24.0","titles":["Magisk 更新日志"]},"94":{"title":"v23.0","titles":["Magisk 更新日志"]},"95":{"title":"v22.1","titles":["Magisk 更新日志"]},"96":{"title":"v22.0","titles":["Magisk 更新日志"]},"97":{"title":"v21.4","titles":["Magisk 更新日志"]},"98":{"title":"v21.3","titles":["Magisk 更新日志"]},"99":{"title":"v21.2","titles":["Magisk 更新日志"]},"100":{"title":"v21.1","titles":["Magisk 更新日志"]},"101":{"title":"v21.0","titles":["Magisk 更新日志"]},"102":{"title":"v20.4","titles":["Magisk 更新日志"]},"103":{"title":"v20.3","titles":["Magisk 更新日志"]},"104":{"title":"v20.2","titles":["Magisk 更新日志"]},"105":{"title":"v20.1","titles":["Magisk 更新日志"]},"106":{"title":"v20.0","titles":["Magisk 更新日志"]},"107":{"title":"v19.4","titles":["Magisk 更新日志"]},"108":{"title":"v19.3","titles":["Magisk 更新日志"]},"109":{"title":"v19.2","titles":["Magisk 更新日志"]},"110":{"title":"v19.1","titles":["Magisk 更新日志"]},"111":{"title":"v19.0","titles":["Magisk 更新日志"]},"112":{"title":"v18.1","titles":["Magisk 更新日志"]},"113":{"title":"v18.0","titles":["Magisk 更新日志"]},"114":{"title":"v17.3","titles":["Magisk 更新日志"]},"115":{"title":"v17.2","titles":["Magisk 更新日志"]},"116":{"title":"v17.0/17.1","titles":["Magisk 更新日志"]},"117":{"title":"v16.7","titles":["Magisk 更新日志"]},"118":{"title":"v16.6","titles":["Magisk 更新日志"]},"119":{"title":"v16.4","titles":["Magisk 更新日志"]},"120":{"title":"v16.3","titles":["Magisk 更新日志"]},"121":{"title":"v16.2","titles":["Magisk 更新日志"]},"122":{"title":"v16.1","titles":["Magisk 更新日志"]},"123":{"title":"v16.0","titles":["Magisk 更新日志"]},"124":{"title":"v15.4","titles":["Magisk 更新日志"]},"125":{"title":"v15.3","titles":["Magisk 更新日志"]},"126":{"title":"v15.2","titles":["Magisk 更新日志"]},"127":{"title":"v15.1","titles":["Magisk 更新日志"]},"128":{"title":"v15.0","titles":["Magisk 更新日志"]},"129":{"title":"v14.6 (1468)","titles":["Magisk 更新日志"]},"130":{"title":"v14.5 (1456)","titles":["Magisk 更新日志"]},"131":{"title":"v14.5 (1455)","titles":["Magisk 更新日志"]},"132":{"title":"v14.3 (1437)","titles":["Magisk 更新日志"]},"133":{"title":"v14.2","titles":["Magisk 更新日志"]},"134":{"title":"v14.1","titles":["Magisk 更新日志"]},"135":{"title":"v14.0","titles":["Magisk 更新日志"]},"136":{"title":"v13.3","titles":["Magisk 更新日志"]},"137":{"title":"v13.2","titles":["Magisk 更新日志"]},"138":{"title":"v13.1","titles":["Magisk 更新日志"]},"139":{"title":"v12.0","titles":["Magisk 更新日志"]},"140":{"title":"v11.5/11.6","titles":["Magisk 更新日志"]},"141":{"title":"v11.1","titles":["Magisk 更新日志"]},"142":{"title":"v11.0","titles":["Magisk 更新日志"]},"143":{"title":"v10.2","titles":["Magisk 更新日志"]},"144":{"title":"v10","titles":["Magisk 更新日志"]},"145":{"title":"v9","titles":["Magisk 更新日志"]},"146":{"title":"v8","titles":["Magisk 更新日志"]},"147":{"title":"v7","titles":["Magisk 更新日志"]},"148":{"title":"v6","titles":["Magisk 更新日志"]},"149":{"title":"v5","titles":["Magisk 更新日志"]},"150":{"title":"v4","titles":["Magisk 更新日志"]},"151":{"title":"v3","titles":["Magisk 更新日志"]},"152":{"title":"v2","titles":["Magisk 更新日志"]},"153":{"title":"v1","titles":["Magisk 更新日志"]},"154":{"title":"参考链接","titles":["Magisk 更新日志"]},"155":{"title":"内部细节","titles":[]},"156":{"title":"文档结构","titles":["内部细节"]},"157":{"title":"“Magisk tmpfs 目录”中的路径","titles":["内部细节","文档结构"]},"158":{"title":"/data 中的路径","titles":["内部细节","文档结构"]},"159":{"title":"Magisk引导过程","titles":["内部细节"]},"160":{"title":"预初始化(Pre-Init)","titles":["内部细节","Magisk引导过程"]},"161":{"title":"解密后(post-fs-data)","titles":["内部细节","Magisk引导过程"]},"162":{"title":"后期启动(late_start)","titles":["内部细节","Magisk引导过程"]},"163":{"title":"重置属性(Resetprop)","titles":["内部细节"]},"164":{"title":"SELinux 政策","titles":["内部细节"]},"165":{"title":"参考链接","titles":["内部细节"]},"166":{"title":"常见问题","titles":[]},"167":{"title":"Q: 我安装了一个模块,然后启动时卡在了开机动画。求助","titles":["常见问题"]},"168":{"title":"Q: 为什么 XXX应用会检测到 Root?","titles":["常见问题"]},"169":{"title":"Q: 在我隐藏 Magisk App 后,应用图标显示异常","titles":["常见问题"]},"170":{"title":"Q: 为什么这个文档很多错误或者不通顺的地方","titles":["常见问题"]},"171":{"title":"参考链接","titles":["常见问题"]},"172":{"title":"开发者指南","titles":[]},"173":{"title":"BusyBox","titles":["开发者指南"]},"174":{"title":"Magisk 模块","titles":["开发者指南"]},"175":{"title":"module.prop","titles":["开发者指南","Magisk 模块"]},"176":{"title":"Shell 脚本 (*.sh)","titles":["开发者指南","Magisk 模块"]},"177":{"title":"system 文件夹","titles":["开发者指南","Magisk 模块"]},"178":{"title":"zygisk","titles":["开发者指南","Magisk 模块"]},"179":{"title":"system.prop","titles":["开发者指南","Magisk 模块"]},"180":{"title":"sepolicy.rule","titles":["开发者指南","Magisk 模块"]},"181":{"title":"Magisk 模块安装程序","titles":["开发者指南"]},"182":{"title":"自定义","titles":["开发者指南","Magisk 模块安装程序"]},"183":{"title":"变量","titles":["开发者指南","Magisk 模块安装程序","自定义"]},"184":{"title":"函数","titles":["开发者指南","Magisk 模块安装程序","自定义"]},"185":{"title":"注意","titles":["开发者指南","Magisk 模块安装程序"]},"186":{"title":"启动脚本","titles":["开发者指南"]},"187":{"title":"根目录覆盖系统","titles":["开发者指南"]},"188":{"title":"参考链接","titles":["开发者指南"]},"189":{"title":"Magisk 中文文档","titles":[]},"190":{"title":"Magisk 许可(License)","titles":["Magisk 中文文档"]},"191":{"title":"相关链接","titles":["Magisk 中文文档"]},"192":{"title":"友情链接","titles":["Magisk 中文文档"]},"193":{"title":"安装","titles":[]},"194":{"title":"入门","titles":["安装"]},"195":{"title":"修补映像","titles":["安装"]},"196":{"title":"卸载","titles":["安装"]},"197":{"title":"Recovery 中的 Magisk","titles":["安装"]},"198":{"title":"三星 (System-as-root)","titles":["安装"]},"199":{"title":"安装 Magisk 之前","titles":["安装","三星 (System-as-root)"]},"200":{"title":"解锁 Bootloader","titles":["安装","三星 (System-as-root)"]},"201":{"title":"操作指南","titles":["安装","三星 (System-as-root)"]},"202":{"title":"系统更新","titles":["安装","三星 (System-as-root)"]},"203":{"title":"注意事项","titles":["安装","三星 (System-as-root)"]},"204":{"title":"华为","titles":["安装"]},"205":{"title":"获得官方映像","titles":["安装","华为"]},"206":{"title":"EMUI 5 及以下","titles":["安装","华为"]},"207":{"title":"EMUI 8","titles":["安装","华为"]},"208":{"title":"EMUI 9 或更高版本","titles":["安装","华为"]},"209":{"title":"第三方 Recovery","titles":["安装"]},"210":{"title":"参考链接","titles":["安装"]},"211":{"title":"OTA 升级指南","titles":[]},"212":{"title":"必要条件","titles":["OTA 升级指南"]},"213":{"title":"带 A/B 分区的设备","titles":["OTA 升级指南"]},"214":{"title":"“非 A/B” 设备","titles":["OTA 升级指南"]},"215":{"title":"参考链接","titles":["OTA 升级指南"]},"216":{"title":"2018.12.7 Magisk v18.0","titles":[null]},"217":{"title":"MagiskHide Improvements","titles":[null,"2018.12.7 Magisk v18.0"]},"218":{"title":"Path Changes","titles":[null,"2018.12.7 Magisk v18.0"]},"219":{"title":"Dropping Legacy Support","titles":[null,"2018.12.7 Magisk v18.0"]},"220":{"title":"Modern C++ Code Base","titles":[null,"2018.12.7 Magisk v18.0"]},"221":{"title":"Full Changelog:","titles":[null,"2018.12.7 Magisk v18.0"]},"222":{"title":"2019.2.4 Magisk v18.1","titles":[]},"223":{"title":"EMUI 9 Support","titles":["2019.2.4 Magisk v18.1",null]},"224":{"title":"Support Down to Android 4.2","titles":["2019.2.4 Magisk v18.1",null]},"225":{"title":"Major Magisk Manager Update","titles":["2019.2.4 Magisk v18.1",null]},"226":{"title":"Final Words","titles":["2019.2.4 Magisk v18.1",null]},"227":{"title":"Full Changelog:","titles":["2019.2.4 Magisk v18.1",null]},"228":{"title":"2019.3.28 Magisk v19.0","titles":[]},"229":{"title":"Magisk Module installer","titles":["2019.3.28 Magisk v19.0"]},"230":{"title":"Imageless Magisk","titles":["2019.3.28 Magisk v19.0"]},"231":{"title":"Native 64 Bit is Back","titles":["2019.3.28 Magisk v19.0"]},"232":{"title":"Zygote Ptrace Based MagiskHide","titles":["2019.3.28 Magisk v19.0"]},"233":{"title":"Android Q","titles":["2019.3.28 Magisk v19.0"]},"234":{"title":"Final Words","titles":["2019.3.28 Magisk v19.0"]},"235":{"title":"Full Changelog:","titles":["2019.3.28 Magisk v19.0","Final Words"]},"236":{"title":"2019.5.1 Magisk v19.1","titles":[]},"237":{"title":"Full Changelog:","titles":["2019.5.1 Magisk v19.1",null]},"238":{"title":"TODO","titles":[]},"239":{"title":"TODO","titles":[]},"240":{"title":"2019.9.19 Magisk v19.4","titles":[]},"241":{"title":"New System-as-root Implementation","titles":["2019.9.19 Magisk v19.4",null]},"242":{"title":"Android 10 Support","titles":["2019.9.19 Magisk v19.4",null]},"243":{"title":"Product Partition Support","titles":["2019.9.19 Magisk v19.4",null]},"244":{"title":"A-Only System-as-root","titles":["2019.9.19 Magisk v19.4",null]},"245":{"title":"Full Changelog:","titles":["2019.9.19 Magisk v19.4",null]},"246":{"title":"2019.10.11 Magisk v20.0","titles":[]},"247":{"title":"New System-as-root Implementation","titles":["2019.10.11 Magisk v20.0",null]},"248":{"title":"Android 10 Support","titles":["2019.10.11 Magisk v20.0",null]},"249":{"title":"Product Partition Support","titles":["2019.10.11 Magisk v20.0",null]},"250":{"title":"A-Only System-as-root","titles":["2019.10.11 Magisk v20.0",null]},"251":{"title":"Full Changelog:","titles":["2019.10.11 Magisk v20.0",null]},"252":{"title":"2019.11.2 Magisk v20.1","titles":[]},"253":{"title":"Updated Magisk Manager Hiding","titles":["2019.11.2 Magisk v20.1",null]},"254":{"title":"Full Changelog:","titles":["2019.11.2 Magisk v20.1",null]},"255":{"title":"2020.1.2 Magisk v20.2","titles":[]},"256":{"title":"Pre-Init sepolicy Patches for Modules","titles":["2020.1.2 Magisk v20.2",null]},"257":{"title":"New Module Installer Format","titles":["2020.1.2 Magisk v20.2",null]},"258":{"title":"Full Changelog:","titles":["2020.1.2 Magisk v20.2",null]},"259":{"title":"2020.1.10 Magisk v20.3","titles":[]},"260":{"title":"Magisk","titles":["2020.1.10 Magisk v20.3",null]},"261":{"title":"Magisk Manager","titles":["2020.1.10 Magisk v20.3",null]},"262":{"title":"Full Changelog:","titles":["2020.1.10 Magisk v20.3",null]},"263":{"title":"2020.3.23 Magisk v20.4","titles":[null]},"264":{"title":"Miscellaneous","titles":[null,"2020.3.23 Magisk v20.4"]},"265":{"title":"BusyBox Standalone Mode","titles":[null,"2020.3.23 Magisk v20.4"]},"266":{"title":"Magisk Changelog","titles":[null,"2020.3.23 Magisk v20.4"]},"267":{"title":"2020.10.3 Magisk v21.0","titles":[null]},"268":{"title":"Highlights","titles":[null,"2020.10.3 Magisk v21.0"]},"269":{"title":"Full Changelog:","titles":[null,"2020.10.3 Magisk v21.0"]},"270":{"title":"2020.11.13 Magisk v21.1","titles":[null]},"271":{"title":"Full Changelog:","titles":[null,"2020.11.13 Magisk v21.1"]},"272":{"title":"2020.12.28 Magisk v21.2","titles":[null]},"273":{"title":"v21.2","titles":[null,"2020.12.28 Magisk v21.2"]},"274":{"title":"Full Changelog:","titles":[null,"2020.12.28 Magisk v21.2"]},"275":{"title":"2021.1.17 Magisk v21.4","titles":[null]},"276":{"title":"v21.4","titles":[null,"2021.1.17 Magisk v21.4"]},"277":{"title":"v21.3","titles":[null,"2021.1.17 Magisk v21.4"]},"278":{"title":"Full Changelog:","titles":[null,"2021.1.17 Magisk v21.4"]},"279":{"title":"2021.2.23 Magisk v22.0","titles":[null]},"280":{"title":"RESTORE THE EXISTING MAGISK MANAGER BACK TO NORMAL BEFORE UPGRADING IF HIDDEN!","titles":[null,"2021.2.23 Magisk v22.0"]},"281":{"title":"Magisk Manager is dead.Long live the Magisk app!","titles":[null,"2021.2.23 Magisk v22.0"]},"282":{"title":"App Hiding","titles":[null,"2021.2.23 Magisk v22.0"]},"283":{"title":"Bug Fixes","titles":[null,"2021.2.23 Magisk v22.0"]},"284":{"title":"Full Changelog:","titles":[null,"2021.2.23 Magisk v22.0"]},"285":{"title":"2021.4.9 Magisk v22.1","titles":[null]},"286":{"title":"Bug Fixes","titles":[null,"2021.4.9 Magisk v22.1"]},"287":{"title":"Full Changelog:","titles":[null,"2021.4.9 Magisk v22.1"]},"288":{"title":"2021.5.12 Magisk v23.0","titles":[null]},"289":{"title":"Bug Fixes","titles":[null,"2021.5.12 Magisk v23.0"]},"290":{"title":"Full Changelog:","titles":[null,"2021.5.12 Magisk v23.0"]},"291":{"title":"2022.1.26 Magisk v24.0","titles":[null]},"292":{"title":"MagiskHide Removal","titles":[null,"2022.1.26 Magisk v24.0"]},"293":{"title":"Sunsetting Magisk-Modules-Repo","titles":[null,"2022.1.26 Magisk v24.0"]},"294":{"title":"Introducing Zygisk","titles":[null,"2022.1.26 Magisk v24.0"]},"295":{"title":"Documentation","titles":[null,"2022.1.26 Magisk v24.0"]},"296":{"title":"Full Changelog:","titles":[null,"2022.1.26 Magisk v24.0"]},"297":{"title":"2022.1.28 Magisk v24.1","titles":[null]},"298":{"title":"MagiskHide Removal","titles":[null,"2022.1.28 Magisk v24.1"]},"299":{"title":"Sunsetting Magisk-Modules-Repo","titles":[null,"2022.1.28 Magisk v24.1"]},"300":{"title":"Introducing Zygisk","titles":[null,"2022.1.28 Magisk v24.1"]},"301":{"title":"Documentation","titles":[null,"2022.1.28 Magisk v24.1"]},"302":{"title":"Full Changelog:","titles":[null,"2022.1.28 Magisk v24.1"]},"303":{"title":"2022.3.1 Magisk v24.2","titles":[null]},"304":{"title":"Full Changelog:","titles":[null,"2022.3.1 Magisk v24.2"]},"305":{"title":"2022.3.10 Magisk v24.3","titles":[null]},"306":{"title":"Full Changelog:","titles":[null,"2022.3.10 Magisk v24.3"]},"307":{"title":"2022.6.7 Magisk v25.0","titles":[null]},"308":{"title":"MagiskInit Rewrite","titles":[null,"2022.6.7 Magisk v25.0"]},"309":{"title":"MagiskSU Security Enhancements","titles":[null,"2022.6.7 Magisk v25.0"]},"310":{"title":"Full Changelog:","titles":[null,"2022.6.7 Magisk v25.0"]},"311":{"title":"2022.6.19 Magisk v25.1","titles":[null]},"312":{"title":"MagiskInit Rewrite","titles":[null,"2022.6.19 Magisk v25.1"]},"313":{"title":"MagiskSU Security Enhancements","titles":[null,"2022.6.19 Magisk v25.1"]},"314":{"title":"Full Changelog:","titles":[null,"2022.6.19 Magisk v25.1"]},"315":{"title":"2022.7.20 Magisk v25.2","titles":[null]},"316":{"title":"Full Changelog:","titles":[null,"2022.7.20 Magisk v25.2"]},"317":{"title":"2023.4.5 Magisk v26.0","titles":[null]},"318":{"title":"Bumping Minimum Android Version to 6.0","titles":[null,"2023.4.5 Magisk v26.0"]},"319":{"title":"New Magic Mount Implementation","titles":[null,"2023.4.5 Magisk v26.0"]},"320":{"title":"New sepolicy.rule Implementation","titles":[null,"2023.4.5 Magisk v26.0"]},"321":{"title":"Zygisk Updates","titles":[null,"2023.4.5 Magisk v26.0"]},"322":{"title":"Full Changelog:","titles":[null,"2023.4.5 Magisk v26.0"]},"323":{"title":"2023.4.11 Magisk v26.1","titles":[null]},"324":{"title":"Changes from v26.0","titles":[null,"2023.4.11 Magisk v26.1"]},"325":{"title":"Bumping Minimum Android Version to 6.0","titles":[null,"2023.4.11 Magisk v26.1"]},"326":{"title":"New Magic Mount Implementation","titles":[null,"2023.4.11 Magisk v26.1"]},"327":{"title":"New sepolicy.rule Implementation","titles":[null,"2023.4.11 Magisk v26.1"]},"328":{"title":"Zygisk Updates","titles":[null,"2023.4.11 Magisk v26.1"]},"329":{"title":"Full Changelog:","titles":[null,"2023.4.11 Magisk v26.1"]},"330":{"title":"发布日志","titles":[]},"331":{"title":"其他日志","titles":["发布日志"]},"332":{"title":"参考链接","titles":["发布日志"]},"333":{"title":"Magisk 工具","titles":[]},"334":{"title":"magiskboot","titles":["Magisk 工具"]},"335":{"title":"magiskinit","titles":["Magisk 工具"]},"336":{"title":"magiskpolicy","titles":["Magisk 工具"]},"337":{"title":"magisk","titles":["Magisk 工具"]},"338":{"title":"su","titles":["Magisk 工具"]},"339":{"title":"resetprop","titles":["Magisk 工具"]},"340":{"title":"参考链接","titles":["Magisk 工具"]}},"dirtCount":0,"index":[["写入属性",{"2":{"339":1}}],["向持久存储读取",{"2":{"339":1}}],["属性",{"2":{"339":3}}],["详细信息",{"2":{"339":1}}],["详情",{"2":{"204":1}}],["兼容",{"2":{"338":1}}],["兼容性列表",{"2":{"204":1}}],["尽管上面没有列出",{"2":{"338":1}}],["保护整个环境",{"2":{"338":1}}],["保护用户免受恶意和未经验证的",{"2":{"83":1}}],["伪装成一个登录",{"2":{"338":1}}],["入口点",{"2":{"338":1}}],["入门",{"0":{"194":1}}],["禁用拒绝列表强制",{"2":{"337":1}}],["返回强制的状态",{"2":{"337":1}}],["返回值为0或或运算以下值",{"2":{"334":1}}],["返回值",{"2":{"334":2}}],["拒绝列表配置",{"2":{"337":1}}],["拒绝并强制卸载任何不匹配的",{"2":{"83":1}}],["克隆",{"2":{"337":1}}],["克隆权限",{"2":{"337":1}}],["克隆源代码",{"2":{"79":1}}],["手动启动",{"2":{"337":1}}],["高级系统属性操作实用程序",{"2":{"339":1}}],["高级选项",{"2":{"337":1}}],["高级开发人员可以使用此工具修改",{"2":{"336":1}}],["移除所有",{"2":{"337":1}}],["移除所有模块并重新启动",{"2":{"337":1}}],["移动到",{"2":{"334":1}}],["列出所有可用的小程序",{"2":{"337":1}}],["默认为",{"2":{"336":1}}],["默认情况下将分别为",{"2":{"173":1}}],["默认情况下",{"2":{"163":1,"334":2}}],["唯一支持的操作是",{"2":{"336":1}}],["唯一的不同在于请勿使用最新版本的",{"2":{"206":1}}],["唯一的例外是",{"2":{"74":1}}],["唯一的区别是",{"2":{"72":1}}],["运算符",{"2":{"336":1}}],["运行",{"2":{"79":2}}],["运行版本",{"2":{"72":1}}],["多个条目由大括号",{"2":{"336":1}}],["立即将",{"2":{"336":1}}],["编译拆分的cil策略",{"2":{"336":1}}],["语句的格式为",{"2":{"336":1}}],["语句的帮助消息",{"2":{"336":1}}],["语言和框架",{"2":{"82":1}}],["显示此消息",{"2":{"339":1}}],["显示此帮助消息并退出",{"2":{"338":1}}],["显示版本号并退出",{"2":{"338":1}}],["显示版本名并退出",{"2":{"338":1}}],["显示",{"2":{"336":1}}],["及其所有分支",{"2":{"336":1}}],["及以下",{"0":{"206":1}}],["守护进程",{"2":{"337":1}}],["守护进程派生的所有进程",{"2":{"336":1}}],["守护程序和实用程序",{"2":{"333":1}}],["守护程序",{"2":{"161":1}}],["守护程序将使用对",{"2":{"83":1}}],["他们会直接修改",{"2":{"336":1}}],["策略声明",{"2":{"336":1}}],["策略源",{"2":{"336":1}}],["策略",{"2":{"336":2}}],["策略的设备上",{"2":{"160":1}}],["检测格式并将",{"2":{"334":1}}],["检查",{"2":{"167":1}}],["压缩为",{"2":{"334":1}}],["格式为",{"2":{"336":1}}],["格式",{"2":{"334":2}}],["输出所有属性",{"2":{"339":1}}],["输出文件",{"2":{"334":7}}],["输出bootimg",{"2":{"334":2}}],["输入文件",{"2":{"334":7}}],["清理当前工作目录",{"2":{"334":1}}],["校验和",{"2":{"334":1}}],["出",{"2":{"334":1}}],["拆分为",{"2":{"334":1}}],["节点",{"2":{"334":1}}],["备份恢复",{"2":{"334":1}}],["备份",{"2":{"334":1}}],["创建",{"2":{"334":1}}],["创建指向",{"2":{"334":1}}],["测试",{"2":{"334":2}}],["指定",{"2":{"334":2}}],["果当前目录中的组件文件已被压缩",{"2":{"334":1}}],["定",{"2":{"334":1}}],["参数",{"2":{"334":2,"336":2,"337":2,"338":1}}],["参考链接",{"0":{"70":1,"77":1,"154":1,"165":1,"171":1,"188":1,"210":1,"215":1,"332":1,"340":1}}],["十六进制修补二进制文件",{"2":{"334":1}}],["用法",{"2":{"337":1}}],["用",{"2":{"334":1}}],["用户",{"2":{"214":1}}],["用于支持模块安装",{"2":{"158":1}}],["就可以找到提取",{"2":{"214":1}}],["就好像您的设备的",{"2":{"194":1}}],["功能安装",{"2":{"214":1}}],["功能的开发者",{"2":{"173":1}}],["仍然保持不变",{"2":{"214":1}}],["非",{"0":{"214":1}}],["非a",{"2":{"72":1}}],["绕过任何可能的",{"2":{"213":1}}],["强制您的设备切换到更新的插槽",{"2":{"213":1}}],["强烈建议直接通过",{"2":{"193":1}}],["优化您的设备",{"2":{"213":1}}],["步骤2",{"2":{"213":1}}],["步骤1",{"2":{"213":1,"214":1}}],["带",{"0":{"213":1}}],["带有",{"2":{"74":1,"197":1}}],["需要原始",{"2":{"334":1}}],["需要执行此步骤",{"2":{"212":1}}],["需要完整的数据擦除",{"2":{"199":1}}],["前的块验证",{"2":{"212":1}}],["必要条件",{"0":{"212":1}}],["必须解锁设备的引导加载程序",{"2":{"194":1}}],["必须是整数",{"2":{"175":1}}],["必须匹配此正则表达式",{"2":{"175":1}}],["必须遵守的格式",{"2":{"175":1}}],["必须使用完整路径调用可执行文件",{"2":{"173":1}}],["升级后",{"2":{"214":1}}],["升级指南",{"0":{"211":1},"1":{"212":1,"213":1,"214":1,"215":1}}],["升级时请刷入",{"2":{"203":1}}],["盘等",{"2":{"209":1}}],["卡",{"2":{"209":1}}],["刷回",{"2":{"214":1}}],["刷入",{"2":{"209":1}}],["刷机包中提取所需文件",{"2":{"194":1}}],["刷机指南",{"2":{"192":1}}],["才能使用第三方",{"2":{"209":1}}],["荣耀",{"2":{"208":1}}],["荣耀畅玩6x",{"2":{"204":1}}],["荣耀畅玩4c",{"2":{"204":1}}],["正如在",{"2":{"208":1}}],["正常开机",{"2":{"197":1}}],["遵循入门的教程",{"2":{"206":1}}],["遵守更新的要求",{"2":{"74":1}}],["获取",{"2":{"339":1}}],["获取模块的基本目录路径",{"2":{"176":1}}],["获得官方映像",{"0":{"205":1}}],["没有这个问题",{"2":{"204":1}}],["没有什么办法检测到这一点",{"2":{"194":1}}],["会导致无法授权",{"2":{"204":1}}],["会在每次启动时随机生成一个不同的",{"2":{"187":1}}],["型号",{"2":{"204":1}}],["型设备",{"2":{"76":2}}],["名称",{"2":{"204":1}}],["搭配",{"2":{"204":1}}],["说明会略有不同",{"2":{"204":1}}],["更改并停止守护程序",{"2":{"337":1}}],["更多详细信息可以在",{"2":{"335":1}}],["更重要的是他们不遵循标准的",{"2":{"204":1}}],["更新的json的格式",{"2":{"175":1}}],["更新",{"2":{"163":1}}],["更新内部脚本",{"2":{"3":1}}],["更新日志",{"0":{"1":1,"84":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1},"2":{"189":1,"330":1,"331":1}}],["华为的内核似乎无法在早期启动时捕获按键事件",{"2":{"208":1}}],["华为设备进入",{"2":{"206":1}}],["华为不发布官方出厂映像以及",{"2":{"205":1}}],["华为畅享7",{"2":{"204":1}}],["华为",{"0":{"204":1},"1":{"205":1,"206":1,"207":1,"208":1}}],["始终在",{"2":{"203":1}}],["始终安装在引导映像的",{"2":{"76":1}}],["切勿出于上述原因直接使用原厂",{"2":{"203":1}}],["切换到系统",{"2":{"160":1}}],["切换到新的magisk模块仓库设置",{"2":{"6":1}}],["恢复到官方映像和其他映像后",{"2":{"214":1}}],["恢复官方映像后",{"2":{"213":1}}],["恢复映像",{"2":{"212":1}}],["恢复",{"2":{"203":1,"337":1}}],["永远不要只刷入",{"2":{"203":1}}],["永远不要尝试将",{"2":{"203":1}}],["永远",{"2":{"203":1}}],["原始bootimg",{"2":{"334":3}}],["原始文档版本",{"2":{"189":1}}],["原因在",{"2":{"201":1}}],["连同原始固件中的",{"2":{"201":1}}],["归档文件",{"2":{"201":1,"202":2,"203":1,"205":1}}],["归档文件复制到设备",{"2":{"201":1}}],["勾选",{"2":{"201":1}}],["固件",{"2":{"201":1}}],["确认",{"2":{"200":1}}],["确保使用",{"2":{"175":1}}],["跳过所有步骤",{"2":{"200":1}}],["完成刷机",{"2":{"201":1}}],["完成初始设置",{"2":{"200":1}}],["完整的规则可以在",{"2":{"164":1}}],["长按音量上限可解锁引导加载程序这将擦除数据并自动重新启动",{"2":{"200":1}}],["长按音量增大",{"2":{"197":1}}],["允许多重",{"2":{"336":1}}],["允许在解锁",{"2":{"200":1}}],["允许任何其他文件",{"2":{"174":1}}],["新引入的",{"2":{"200":1}}],["新域",{"2":{"164":1}}],["解压到",{"2":{"334":1}}],["解压缩到",{"2":{"334":1}}],["解压缩到其各个组件",{"2":{"334":1}}],["解压缩文件的工具",{"2":{"334":1}}],["解压缩",{"2":{"334":1}}],["解压缩固件并将",{"2":{"201":1}}],["解析",{"2":{"334":1}}],["解锁",{"0":{"200":1},"2":{"200":1}}],["解密后",{"0":{"161":1}}],["首先转到",{"2":{"212":1}}],["首次安装",{"2":{"199":1}}],["首选项",{"2":{"82":1}}],["三星",{"0":{"198":1},"1":{"199":1,"200":1,"201":1,"202":1,"203":1}}],["释放所有按钮",{"2":{"197":1}}],["释放所有按键即可启动",{"2":{"197":1}}],["→",{"2":{"197":7,"200":1,"209":1,"212":2,"213":4}}],["总之",{"2":{"197":1}}],["总是引导到",{"2":{"75":1}}],["屏幕",{"2":{"197":1}}],["直接对文件进行修改",{"2":{"334":1}}],["直接从三星服务器下载设备的最新",{"2":{"201":1}}],["直接安装",{"2":{"193":1}}],["直到看到",{"2":{"197":1}}],["搜索",{"2":{"197":2,"334":1}}],["百度搜索",{"2":{"197":1}}],["音量增大",{"2":{"197":2,"206":1}}],["电源",{"2":{"197":2,"206":1}}],["别无选择",{"2":{"197":1}}],["卸载",{"0":{"196":1},"2":{"196":1,"212":1}}],["瞧",{"2":{"195":1}}],["重新打包",{"2":{"334":1}}],["重新启动",{"2":{"213":1}}],["重新启动并检查是否已安装",{"2":{"209":1}}],["重新启动到下载模式",{"2":{"201":1}}],["重启到下载模式",{"2":{"200":1}}],["重启并启动",{"2":{"195":1}}],["重命名为",{"2":{"196":1}}],["重置属性",{"0":{"163":1}}],["你必须手动将",{"2":{"214":1}}],["你就不能再通过",{"2":{"202":1}}],["你可以将文件从资源管理器直接拖到终端中来获得文件绝对路径",{"2":{"195":1}}],["你应该已经收到了gnu通用公共许可证的副本以及这个程序",{"2":{"190":1}}],["按正常方式应用",{"2":{"213":1}}],["按照上面的引导映像修补说明进行操作",{"2":{"208":1}}],["按照上面的修补映像说明进行操作",{"2":{"207":1}}],["按键组合",{"2":{"197":2}}],["按钮",{"2":{"195":1,"201":1,"213":1}}],["按下",{"2":{"195":1,"201":1,"213":1}}],["主屏幕中的",{"2":{"195":1,"201":1}}],["主要内容",{"2":{"174":1}}],["复制到设备",{"2":{"195":1}}],["基于",{"2":{"194":1}}],["基于文件的加密",{"2":{"158":1}}],["快速回顾一下",{"2":{"194":1}}],["那么您的设备有一个单独的",{"2":{"194":2}}],["那么请联网搜索您的设备相对应的方法",{"2":{"194":1}}],["那么请尝试把命令更换为",{"2":{"194":1}}],["那么请查看",{"2":{"167":1}}],["那么请在电脑上直接运行以下命令",{"2":{"167":1}}],["接下来",{"2":{"194":1}}],["比如在",{"2":{"209":1}}],["比如华为设备",{"2":{"194":1}}],["比如红米",{"2":{"194":1}}],["比较流行的模块是",{"2":{"168":1}}],["所以如果您在",{"2":{"206":1}}],["所以大多数人可以忽略这条信息",{"2":{"194":1}}],["所有卸载操作",{"2":{"337":1}}],["所有者和",{"2":{"337":1}}],["所有者为",{"2":{"158":1}}],["所有值应以十六进制书写",{"2":{"336":1}}],["所有安装了",{"2":{"336":1}}],["所有部分将被压缩回原始格式",{"2":{"334":1}}],["所有启动脚本都将在",{"2":{"186":1}}],["所有模块将被禁用",{"2":{"167":1}}],["所有允许的",{"2":{"164":1}}],["所有与",{"2":{"158":1}}],["所有东西都必须存储在",{"2":{"158":1}}],["所有预初始化补丁文件都存储在这里绑定挂载",{"2":{"157":1}}],["所有使用引导方法",{"2":{"76":1}}],["所有",{"2":{"72":1}}],["据我们所知",{"2":{"194":1}}],["幸运的是",{"2":{"194":1}}],["即使将分区重新挂载到",{"2":{"211":1}}],["即使它不应该接受",{"2":{"194":1}}],["即可",{"2":{"194":1}}],["即可访问该文件夹",{"2":{"158":1}}],["信息",{"2":{"194":1}}],["年新设备",{"2":{"193":1}}],["资源分享",{"2":{"192":1}}],["系列",{"2":{"192":1}}],["系统",{"2":{"213":1}}],["系统属性",{"2":{"163":1}}],["系统更新了",{"2":{"202":1}}],["系统更新",{"0":{"202":1},"2":{"75":1,"213":1}}],["系统作为根",{"2":{"72":1}}],["友情链接",{"0":{"192":1}}],["英文原版",{"2":{"190":1}}],["甚至没有适销性或特定用途适用性",{"2":{"190":1}}],["分发此程序是希望它有用",{"2":{"190":1}}],["分区的情况下开始安装",{"2":{"214":1}}],["分区的设备",{"0":{"213":1}}],["分区且无外置存储设备",{"2":{"209":1}}],["分区上锁",{"2":{"209":1}}],["分区不再存在",{"2":{"208":1}}],["分区方案",{"2":{"204":1}}],["分区恢复到原样",{"2":{"203":1}}],["分区映像",{"2":{"157":1}}],["分区中是否有",{"2":{"194":1}}],["分区中",{"2":{"76":1,"209":1}}],["分区包含",{"2":{"76":1,"194":1}}],["分区和",{"2":{"75":1}}],["分区并将其用作新的",{"2":{"73":1}}],["分区作为",{"2":{"73":1}}],["分区将把我们带到",{"2":{"72":1}}],["分区",{"2":{"72":2,"75":1,"76":1,"194":5,"195":3,"197":1,"204":1,"208":1,"209":1}}],["任何更高版本重新分发和",{"2":{"190":1}}],["任何运行",{"2":{"74":1}}],["子模块都是自由软件",{"2":{"190":1}}],["许可证的第3版",{"2":{"190":1}}],["许可",{"0":{"190":1}}],["工具兼容",{"2":{"336":1}}],["工具",{"0":{"333":1},"1":{"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1},"2":{"189":1,"340":1}}],["工具链与名称",{"2":{"82":1}}],["工具链并将其设置为默认值",{"2":{"82":1}}],["工具链管理器",{"2":{"82":1}}],["工具链",{"2":{"82":1}}],["针对",{"2":{"189":1}}],["本文档涵盖了4个二进制文件和所有包含的小程序",{"2":{"333":1}}],["本文档翻译了",{"2":{"189":1}}],["本教程假设您了解如何使用",{"2":{"194":1}}],["本身",{"2":{"189":1}}],["本身上进行任何开发",{"2":{"83":1}}],["引用",{"2":{"187":1}}],["引导",{"2":{"76":2}}],["引导方式",{"2":{"76":1}}],["引导方法",{"0":{"73":1},"1":{"74":1}}],["引导到",{"2":{"75":1}}],["引导诡计",{"0":{"71":1},"1":{"72":1,"73":1,"74":1,"75":1,"76":1,"77":1},"2":{"189":1}}],["替换",{"2":{"187":1,"334":1}}],["条规则不适用于此文件夹中的任何内容",{"2":{"187":1}}],["现在在下载模式允许非官方映像",{"2":{"200":1}}],["现在我们可以将所有",{"2":{"76":1}}],["现有文件可以替换为位于相同相对路径的文件",{"2":{"187":1}}],["除外",{"2":{"187":1}}],["除非另有特别说明",{"2":{"74":1}}],["映像修改更简单",{"2":{"334":1}}],["映像后请将手机与电脑断开连接后再按下",{"2":{"206":1}}],["映像中没有",{"2":{"197":1}}],["映像中的",{"2":{"76":1,"195":1}}],["映像则改用",{"2":{"195":1}}],["映像刷入到您的设备",{"2":{"195":1}}],["映像",{"2":{"187":1,"195":3,"207":1,"208":1,"334":2}}],["覆盖文件应放在",{"2":{"187":1}}],["使开发者能够替换根目录中的文件或添加新的",{"2":{"187":1}}],["使用名称",{"2":{"334":1}}],["使用当前目录中的文件将启动映像组件重新打包到",{"2":{"334":1}}],["使用新版",{"2":{"204":1}}],["使用了麒麟处理器的华为设备与大多数常见设备的分区方式不同",{"2":{"204":1}}],["使用标志",{"2":{"163":1}}],["使用命令行选项切换",{"2":{"173":1}}],["使用命令",{"2":{"157":1}}],["使用",{"2":{"80":2,"163":1,"185":1,"186":1,"187":1,"189":1,"201":1,"204":1,"334":2,"338":1,"339":1}}],["使用您喜欢的软件包管理器安装",{"2":{"79":2}}],["放置在模块自己的文件夹中",{"2":{"186":1}}],["放置在",{"2":{"186":1}}],["种脚本",{"2":{"186":1}}],["种主要的不同方法",{"2":{"73":1}}],["还有",{"2":{"186":1}}],["还必须放宽一些",{"2":{"164":1}}],["建议大多数脚本在此阶段运行",{"2":{"186":1}}],["建议的选项是将环境变量",{"2":{"79":1}}],["秒前暂停",{"2":{"186":1}}],["末尾调用",{"2":{"185":1}}],["打印当前拒绝列表",{"2":{"337":1}}],["打印当前二进制版本",{"2":{"337":1}}],["打印正在运行的守护程序版本号",{"2":{"337":1}}],["打印正在运行的守护程序版本",{"2":{"337":1}}],["打印错误消息",{"2":{"184":1}}],["打印",{"2":{"184":1,"334":1,"337":1}}],["打开",{"2":{"81":1,"82":1}}],["函数",{"0":{"184":1}}],["找到所有",{"2":{"183":1}}],["安卓版本",{"2":{"183":1}}],["安装模块",{"2":{"337":1}}],["安装机制来升级您的系统",{"2":{"214":1}}],["安装完成后",{"2":{"213":1}}],["安装更新",{"2":{"213":1}}],["安装后可以保存",{"2":{"213":1}}],["安装工作无缝",{"2":{"213":1}}],["安装指南",{"2":{"210":1}}],["安装包",{"2":{"209":1}}],["安装您已经下载的",{"2":{"201":1}}],["安装说明",{"2":{"189":1}}],["安装的模块将存储在此处并将在下次重新启动时",{"2":{"158":1}}],["安装配置",{"2":{"157":1}}],["安装官方",{"2":{"82":1}}],["安装",{"0":{"193":1,"199":1},"1":{"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1},"2":{"79":3,"195":1,"199":1,"201":1,"209":1,"213":1}}],["安装到更新的插槽",{"2":{"213":1}}],["安装到更新的分区上",{"2":{"213":1}}],["安装到非活动插槽",{"2":{"213":2}}],["安装到",{"2":{"76":1}}],["值为",{"2":{"183":1}}],["架构",{"2":{"183":1}}],["变量进行配置",{"2":{"334":2}}],["变量",{"0":{"183":1},"2":{"334":1}}],["自定义",{"0":{"182":1},"1":{"183":1,"184":1}}],["自动生成",{"2":{"174":1}}],["稍后将详细介绍",{"2":{"181":1}}],["稍后提供更多信息",{"2":{"72":1}}],["补丁启动映像的",{"2":{"335":1}}],["补丁",{"2":{"180":1,"334":1}}],["组成",{"2":{"179":1}}],["每个命令都是一个参数",{"2":{"334":1}}],["每个命令都将直接使用",{"2":{"173":1}}],["每个组件将使用",{"2":{"334":1}}],["每个组件将保持不变",{"2":{"334":1}}],["每个组件将在写入输出文件之前即时自动解压缩",{"2":{"334":1}}],["每个组件到一个文件",{"2":{"334":1}}],["每个设备都有自己的启动到",{"2":{"197":1}}],["每次启用",{"2":{"197":1}}],["每行由",{"2":{"179":1}}],["真实",{"2":{"177":1}}],["真正的区别在于设备在完全启动时使用的是什么",{"2":{"74":1}}],["了解",{"2":{"176":1}}],["了解有关生成自己的密钥的更多详细信息",{"2":{"83":1}}],["部分找到",{"2":{"335":1}}],["部分设备依旧需要修补",{"2":{"208":1}}],["部分",{"2":{"176":1,"194":1}}],["部署了新的",{"2":{"164":1}}],["换行类型",{"2":{"175":1}}],["该选项被默默忽略",{"2":{"338":1}}],["该文件可用于",{"2":{"334":1}}],["该文件夹位于设备加密存储区中",{"2":{"158":1}}],["该工具还支持许多",{"2":{"334":1}}],["该脚本将由",{"2":{"182":1}}],["该",{"2":{"175":1}}],["示例",{"2":{"175":1,"336":1}}],["点击它并等待重启",{"2":{"195":1}}],["点",{"2":{"175":1}}],["数据库",{"2":{"337":1}}],["数据库存储设置和",{"2":{"158":1}}],["数字",{"2":{"175":1}}],["^attribute",{"2":{"336":1}}],["^type",{"2":{"336":3}}],["^",{"2":{"175":1,"336":3}}],["整数",{"2":{"175":1}}],["字符串",{"2":{"175":5}}],["其余的",{"2":{"187":1}}],["其他日志",{"0":{"331":1}}],["其他模块",{"2":{"174":1}}],["其他自定义",{"2":{"174":1}}],["其中包含正确的应用名称和图标",{"2":{"169":1}}],["其中没有任何内容",{"2":{"169":1}}],["状态标志",{"2":{"174":1}}],["库不兼容",{"2":{"174":1}}],["库",{"2":{"174":1}}],["└──",{"2":{"174":4,"181":4,"187":4}}],["│",{"2":{"174":71,"181":9,"187":13}}],["命名",{"2":{"174":1}}],["命令到",{"2":{"337":1}}],["命令",{"2":{"164":1,"207":1,"208":1,"334":2,"338":2}}],["|",{"2":{"174":3,"187":1}}],["├──",{"2":{"174":28,"181":5,"187":8}}],["结构如下",{"2":{"174":1}}],["独立模式",{"2":{"173":1,"182":1,"186":1}}],["小程序",{"2":{"173":1,"337":1}}],["像其他普通的刷机包一样刷入归档文件",{"2":{"209":1}}],["像",{"2":{"173":1}}],["无论是哪种方式",{"2":{"214":1}}],["无论设置为",{"2":{"173":1}}],["无",{"2":{"197":1}}],["无缝",{"2":{"75":1}}],["二进制",{"2":{"173":1}}],["二进制文件时",{"2":{"337":1}}],["二进制文件和小程序如下所示",{"2":{"333":1}}],["二进制文件标记为",{"2":{"164":1}}],["二进制文件",{"2":{"157":1,"158":1,"164":1,"336":1}}],["附带了一个完整的",{"2":{"173":1}}],["附加",{"2":{"82":1}}],["希望您可以向我们提交反馈",{"2":{"170":1}}],["后缀为匹配文件扩展名的另一个文件",{"2":{"334":1}}],["后验证",{"2":{"213":1}}],["后像其他普通的刷机包一样刷入",{"2":{"196":1}}],["后面为字母",{"2":{"175":1}}],["后",{"0":{"169":1},"2":{"182":1,"197":1}}],["后期启动",{"0":{"162":1}}],["警告",{"2":{"168":1,"186":1,"198":1,"208":1,"209":2}}],["哔哩哔哩",{"2":{"168":1}}],["酷安",{"2":{"168":1}}],["😉",{"2":{"168":1,"292":1,"298":1}}],["😃",{"2":{"63":1,"119":1,"148":1,"219":1,"225":1,"226":1,"232":1,"236":1,"255":1}}],["隐藏",{"2":{"168":1}}],["提供的出厂映像中恢复",{"2":{"214":1}}],["提供了一个覆盖系统",{"2":{"187":1}}],["提供了示例",{"2":{"80":1}}],["提示",{"2":{"167":1,"183":1,"195":1}}],["管理模块",{"2":{"167":1}}],["大多数现代",{"2":{"167":1}}],["大量的稳定性更改和小错误修复",{"2":{"5":1}}],["调试桥",{"2":{"167":1}}],["调试",{"2":{"167":1}}],["调用",{"2":{"80":1,"337":1}}],["求助",{"0":{"167":1}}],["我推荐使用",{"2":{"204":1}}],["我安装了一个模块",{"0":{"167":1}}],["我们直接修补二进制文件",{"2":{"336":1}}],["我们需要知道您的设备是否有单独的",{"2":{"194":1}}],["我们修补原始的",{"2":{"160":1}}],["我们将",{"2":{"160":1}}],["我们将使用",{"2":{"72":1}}],["我们提供了一个一般的经验法则",{"2":{"73":1}}],["我们称这些为a",{"2":{"72":1}}],["常见问题",{"0":{"166":1},"1":{"167":1,"168":1,"169":1,"170":1,"171":1},"2":{"189":1}}],["特定规则与其他策略分开",{"2":{"164":1}}],["域进程将文件归因于",{"2":{"164":1}}],["客户端域将通过使用",{"2":{"164":1}}],["客户端域都可以直接连接到",{"2":{"164":1}}],["沙盒中规则的放宽",{"2":{"164":1}}],["能够正常运行",{"2":{"164":1}}],["之间的区别",{"2":{"176":1}}],["之外使用",{"2":{"173":1}}],["之后安装它",{"2":{"194":1}}],["之后",{"2":{"164":1,"187":1}}],["之前的设备上",{"2":{"187":1}}],["之前",{"0":{"199":1},"2":{"164":1}}],["之类的命令向",{"2":{"163":1}}],["政策",{"0":{"164":1}}],["读取属性将从",{"2":{"163":1}}],["读取属性不会从持久存储中读取",{"2":{"163":1}}],["读取和写入文件夹",{"2":{"158":1}}],["持久属性",{"2":{"163":1}}],["则它",{"2":{"336":1}}],["则输出原始引导sha1",{"2":{"334":1}}],["则返回",{"2":{"334":1}}],["则将使用",{"2":{"334":1}}],["则将设置启动映像的",{"2":{"334":1}}],["则将跳过所有压缩操作",{"2":{"334":1}}],["则将跳过所有解压缩操作",{"2":{"334":1}}],["则不会对该特定组件执行任何附加压缩",{"2":{"334":1}}],["则不会触发在",{"2":{"163":1}}],["则启动映像标头信息将转储到文件",{"2":{"334":1}}],["则会立即解压缩",{"2":{"334":1}}],["则可以从以前的备份",{"2":{"214":1}}],["则可以使用以下命令修补",{"2":{"195":1}}],["则必须从固件中提取",{"2":{"208":1}}],["则必须从您的固件中提取",{"2":{"207":1}}],["则说明以下内容不适用于您的设备",{"2":{"198":1}}],["则默认值为",{"2":{"184":2}}],["则为",{"2":{"183":2,"334":1}}],["则该文件夹将直接替换实际系统中的文件夹",{"2":{"177":1}}],["则环境变量",{"2":{"176":1}}],["则",{"2":{"174":1,"334":2}}],["则无法使用此模块",{"2":{"168":1}}],["则有一个标志",{"2":{"163":1}}],["匹配",{"2":{"163":1}}],["操作指南",{"0":{"201":1}}],["操作能够以安全可靠的方式完成",{"2":{"164":1}}],["操作",{"2":{"163":1,"164":1,"334":3,"337":2}}],["发送请求来更改属性",{"2":{"163":1}}],["发布日志",{"0":{"330":1},"1":{"331":1,"332":1},"2":{"189":1}}],["发布",{"2":{"72":1}}],["托管",{"2":{"163":1}}],["由",{"2":{"163":1}}],["由于历史原因",{"2":{"185":1}}],["由于apk实际上是",{"2":{"169":1}}],["由于我们绕过了",{"2":{"163":1}}],["由于",{"2":{"82":2,"157":1,"187":1}}],["由于其",{"2":{"76":1}}],["由于存储大小问题",{"2":{"75":1}}],["被设计为仅由",{"2":{"163":1}}],["被解密和装载时会在",{"2":{"161":1}}],["模型",{"2":{"164":1}}],["模式中刷入",{"2":{"206":1}}],["模式则不能将手机连接到电脑",{"2":{"206":1}}],["模式需要将手机使用数据线连接电脑",{"2":{"206":1}}],["模式的按键组合",{"2":{"197":1}}],["模式运行",{"2":{"186":4}}],["模式",{"2":{"162":1,"186":3,"195":2,"197":3}}],["模块脚本",{"2":{"186":1}}],["模块不应在安装过程中添加常规脚本",{"2":{"186":1}}],["模块文件应安装的路径",{"2":{"183":1}}],["模块文件在挂载时无法安全修改",{"2":{"158":1}}],["模块的",{"2":{"209":1}}],["模块的压缩文件",{"2":{"183":1}}],["模块的其余文件",{"2":{"181":1}}],["模块的更多详细信息",{"2":{"178":1}}],["模块来说应该足够好了",{"2":{"181":1}}],["模块安装程序脚本必须在退出之前执行一些清理",{"2":{"185":1}}],["模块安装程序脚本会将",{"2":{"184":1}}],["模块安装程序脚本将会设置环境",{"2":{"181":1}}],["模块安装程序只是一个打包为",{"2":{"181":1}}],["模块安装程序是打包在",{"2":{"181":1}}],["模块安装程序",{"0":{"181":1},"1":{"182":1,"183":1,"184":1,"185":1}}],["模块示例",{"2":{"178":1}}],["模块发布后",{"2":{"175":1}}],["模块将在下次重新启动时删除",{"2":{"174":1}}],["模块将被禁用",{"2":{"174":1}}],["模块是放置在",{"2":{"174":1}}],["模块专门提供这些功能",{"2":{"168":1}}],["模块禁用状态持续",{"2":{"167":1}}],["模块",{"0":{"174":1},"1":{"175":1,"176":1,"177":1,"178":1,"179":1,"180":1},"2":{"158":2,"174":1,"177":1,"181":2}}],["执行与",{"2":{"334":1}}],["执行服务",{"2":{"162":1}}],["执行",{"2":{"161":1,"334":1,"337":1}}],["执行原始的",{"2":{"160":1}}],["取消阻止",{"2":{"160":1}}],["规则严格限制仅允许",{"2":{"164":1}}],["规则传输到",{"2":{"164":1}}],["规则",{"2":{"160":1,"174":1,"336":1}}],["尝试加载",{"2":{"160":1}}],["劫持",{"2":{"160":2,"197":1}}],["否则返回",{"2":{"334":1}}],["否则将卸载",{"2":{"212":1}}],["否则将替换现有文件",{"2":{"187":1}}],["否则您将进入的是",{"2":{"206":1}}],["否则",{"2":{"194":1,"203":1}}],["否则我们使用",{"2":{"160":1}}],["否则本文件后面提到的每一个",{"2":{"74":1}}],["加载属性",{"2":{"339":1}}],["加载或编译拆分的",{"2":{"336":1}}],["加载到内核中",{"2":{"160":1,"336":1}}],["加载",{"2":{"160":1,"336":2}}],["加上其他一些东西",{"2":{"72":1}}],["服务的入口点",{"2":{"337":1}}],["服务器管理员这样的常见场景中",{"2":{"336":1}}],["服务释放了引导加载程序",{"2":{"200":1}}],["服务会使",{"2":{"200":1}}],["服务中执行",{"2":{"174":1}}],["服务",{"2":{"162":1}}],["服务注入",{"2":{"160":1}}],["服务脚本的文件夹",{"2":{"158":1}}],["预初始化",{"0":{"160":1}}],["等待安装完成",{"2":{"213":1}}],["等待",{"2":{"160":1}}],["等待升级的",{"2":{"158":1}}],["等",{"2":{"158":1}}],["脚本设置",{"2":{"187":1}}],["脚本中永远不要硬编码",{"2":{"187":1}}],["脚本中的",{"2":{"187":1}}],["脚本中引用的其他文件",{"2":{"187":1}}],["脚本中注册的on",{"2":{"163":1}}],["脚本与引导过程的其余部分并行运行",{"2":{"186":1}}],["脚本在装入任何模块之前运行",{"2":{"186":1}}],["脚本在",{"2":{"182":1}}],["脚本提供",{"2":{"182":1}}],["脚本都将在启用独立模式",{"2":{"173":1}}],["脚本",{"0":{"176":1},"2":{"158":1,"161":1,"162":1,"187":1}}],["脚本的文件夹",{"2":{"158":1}}],["权限中添加",{"2":{"334":1}}],["权限下创建目录",{"2":{"334":1}}],["权限",{"2":{"158":1,"202":1}}],["合并到",{"2":{"158":1}}],["合并到boot中",{"2":{"75":1}}],["通用公共许可证的条款",{"2":{"190":1}}],["通用脚本",{"2":{"186":1}}],["通用脚本和模块脚本",{"2":{"186":1}}],["通常安装在设备的",{"2":{"204":1}}],["通常",{"2":{"163":1}}],["通过首先删除属性",{"2":{"163":1}}],["通过",{"2":{"158":1,"167":1}}],["通俗地说",{"2":{"74":1}}],["很少有进程有权与该",{"2":{"158":1}}],["标志",{"2":{"339":2}}],["标志设置为",{"2":{"337":1}}],["标有",{"2":{"336":2}}],["标记为",{"2":{"158":1}}],["标准的原因",{"2":{"74":1}}],["标准中的设备",{"2":{"73":1}}],["进程",{"2":{"164":1}}],["进程是只读的",{"2":{"163":1}}],["进程无法以任何可能的方式进入",{"2":{"158":1}}],["进行安装",{"2":{"209":1}}],["进行",{"2":{"202":1}}],["进行其他设置",{"2":{"182":1}}],["进行任何交互",{"2":{"158":1}}],["进行密钥签名的证书作为参考",{"2":{"83":1}}],["选择并修补一个文件",{"2":{"195":1,"201":1}}],["选项存在且呈灰色",{"2":{"200":1}}],["选项",{"2":{"195":2,"201":1,"336":2,"337":2,"338":3,"339":2}}],["选项1是首选方法",{"2":{"173":1}}],["选",{"2":{"158":1}}],["$",{"2":{"187":8}}],["$modpath",{"2":{"184":2}}],["$modid",{"2":{"174":4}}],["$arch",{"2":{"183":1}}],["$android",{"2":{"82":2}}],["$secure",{"2":{"158":5}}],["$internaldir",{"2":{"157":4}}],["未",{"2":{"214":1}}],["未执行",{"2":{"182":1}}],["未使用原始文件夹",{"2":{"157":1}}],["未找到",{"2":{"82":1}}],["挂载路径",{"2":{"337":1}}],["挂载早期所需的分区",{"2":{"160":1}}],["挂载标志",{"2":{"157":1}}],["挂载为",{"2":{"75":1}}],["`magisk",{"2":{"157":1}}],["开箱即用的",{"2":{"213":1}}],["开发",{"2":{"189":1}}],["开发者选项",{"2":{"200":1}}],["开发者指南",{"0":{"172":1},"1":{"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1},"2":{"188":1,"189":1}}],["开发者预览版中",{"2":{"73":1}}],["开头的属性",{"2":{"163":2}}],["开始安装",{"2":{"195":1,"201":1}}],["开始",{"2":{"157":1,"187":1}}],["从拒绝列表中删除目标",{"2":{"337":1}}],["从预编译的",{"2":{"336":1}}],["从关机开始",{"2":{"197":1}}],["从",{"2":{"157":1,"160":1,"187":1,"334":2,"336":1,"339":2}}],["从文档来看",{"2":{"74":1}}],["目录中",{"2":{"187":1}}],["目录来存储一些临时数据",{"2":{"157":1}}],["目录",{"0":{"157":1},"2":{"187":2}}],["内重新安装并重新启动",{"2":{"209":1}}],["内的文件夹",{"2":{"184":1}}],["内的文件",{"2":{"184":1}}],["内部",{"2":{"337":1}}],["内部使用的方法",{"2":{"173":1}}],["内部材料",{"2":{"157":1}}],["内部细节",{"0":{"155":1},"1":{"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1},"2":{"165":1,"189":1}}],["内核无法直接理解这种新的分区格式",{"2":{"75":1}}],["内核不需要",{"2":{"75":1}}],["内核直接挂载",{"2":{"73":1}}],["内核使用",{"2":{"73":2}}],["内核的",{"2":{"72":1}}],["内核将使用它作为rootfs",{"2":{"72":1}}],["quick",{"2":{"218":1,"236":1}}],["quite",{"2":{"216":1,"224":1,"232":1,"292":1,"294":1,"298":1,"300":1}}],["questions",{"2":{"171":1}}],["queue",{"2":{"138":1}}],["quot",{"2":{"14":2,"21":2,"22":2,"24":2,"67":2,"82":2,"91":2,"96":2,"105":2,"106":2,"113":4,"118":2,"129":2,"132":2,"142":4,"145":8,"175":8,"184":2,"223":2,"241":2,"242":4,"247":2,"248":4,"257":4,"292":2,"298":2,"303":2,"308":2,"309":4,"312":2,"313":4,"336":34}}],["q",{"0":{"167":1,"168":1,"169":1,"170":1,"233":1},"2":{"110":1,"111":2,"233":2}}],["qcdt",{"2":{"106":1}}],["🎉",{"2":{"101":1,"268":1}}],["zopfli",{"2":{"334":2}}],["z0",{"2":{"175":1}}],["za",{"2":{"175":2}}],["zenfone",{"2":{"126":1}}],["zeros",{"2":{"101":1}}],["z",{"2":{"102":1,"175":1,"266":1,"338":1}}],["zimage",{"2":{"134":2}}],["zimages",{"2":{"93":1}}],["zipfile",{"2":{"183":1}}],["zipurl",{"2":{"175":1}}],["zip",{"2":{"52":1,"61":1,"76":1,"181":4,"183":1,"185":1,"196":1,"201":1,"204":1,"209":3,"214":2,"257":1,"281":1,"337":2}}],["zips",{"2":{"45":1,"52":1}}],["zygote",{"0":{"232":1},"2":{"86":1,"91":2,"94":1,"100":1,"105":1,"107":1,"111":1,"144":1,"186":1,"232":1,"236":1,"289":1,"294":2,"300":2,"303":2,"337":1}}],["zygisk",{"0":{"178":1,"294":1,"300":1,"321":1,"328":1},"2":{"86":4,"88":1,"89":4,"90":1,"91":5,"93":3,"168":1,"174":2,"176":1,"178":4,"294":3,"295":1,"300":3,"301":1,"303":5,"305":1,"321":3,"328":3}}],["查看",{"2":{"83":1,"339":1}}],["查看您的选项",{"2":{"80":1}}],["要简单得多",{"2":{"211":1}}],["要将修补后的映像刷入您的设备",{"2":{"207":1,"208":1}}],["要从压缩包中的",{"2":{"205":1}}],["要使用新的固件升级您的设备",{"2":{"203":1}}],["要进行系统更新",{"2":{"202":1}}],["要求进行额外的设置",{"2":{"201":1}}],["要添加您在自定义",{"2":{"187":1}}],["要替换",{"2":{"177":1}}],["要强制命令不使用busybox",{"2":{"173":1}}],["要分发使用您自己的密钥签名的自己的",{"2":{"83":1}}],["要在",{"2":{"83":1}}],["要构建所有内容并创建最终的",{"2":{"80":1}}],["签名和分发",{"0":{"83":1}}],["横幅中选择",{"2":{"82":1}}],["插件",{"2":{"82":1}}],["插件的工作方式",{"2":{"82":1}}],["链接起来",{"2":{"82":1}}],["链接",{"2":{"82":1,"175":1}}],["项目",{"2":{"82":1,"178":1}}],["项目不需要配置工具链",{"2":{"82":1}}],["项目中的",{"2":{"81":1}}],["软件包",{"2":{"82":1}}],["代码库一起使用",{"2":{"82":1}}],["代码之前运行",{"2":{"81":1}}],["代码应该在",{"2":{"81":1}}],["支持格式",{"2":{"334":2}}],["支持的策略声明",{"2":{"336":1}}],["支持的命令",{"2":{"334":1}}],["支持的组件",{"2":{"334":1}}],["支持的操作",{"2":{"334":2}}],["支持的平台",{"2":{"79":1}}],["支持常见的压缩格式",{"2":{"334":1}}],["支持运行时可切换的",{"2":{"173":1}}],["支持",{"0":{"81":1},"1":{"82":1},"2":{"173":1}}],["配置构建",{"2":{"80":1}}],["让应用程序完成它的工作并自动重启设备",{"2":{"201":1}}],["让我们继续修补映像",{"2":{"194":1}}],["让我们回到",{"2":{"75":1}}],["让脚本下载并安装",{"2":{"79":1}}],["您将得到一个升级的",{"2":{"214":1}}],["您将看到一个询问修复环境的对话框",{"2":{"195":1}}],["您将看到一个用于占位的",{"2":{"195":1}}],["您都可以最终使用",{"2":{"214":1}}],["您也可以提供",{"2":{"209":1}}],["您也可以自己设置",{"2":{"79":1}}],["您正在刷入",{"2":{"207":1,"208":1}}],["您正在浏览的是",{"2":{"204":1}}],["您这样做会破坏您的设备",{"2":{"203":1}}],["您不能使用",{"2":{"197":1}}],["您不应更改它",{"2":{"175":1}}],["您应该已经知道并准备好了",{"2":{"194":1}}],["您应该看到",{"2":{"194":1}}],["您必须手动重新",{"2":{"214":1}}],["您必须手动下载新的固件归档文件并完成上一节中编写的相同",{"2":{"202":1}}],["您必须确保自己没有以任何方式修改只读分区",{"2":{"211":1}}],["您必须使用",{"2":{"205":1}}],["您必须按照说明进行操作",{"2":{"194":1}}],["您必须进行一些额外的设置才能使",{"2":{"82":1}}],["您的体验可能会有所不同",{"2":{"208":1}}],["您的设备有一个名为",{"2":{"207":1}}],["您的设备应该会自动重启",{"2":{"201":1}}],["您的设备没有单独的",{"2":{"194":1}}],["您的设备足够现代",{"2":{"74":1}}],["您的",{"2":{"182":1,"200":1}}],["您下载",{"2":{"181":1}}],["您还可以通过将设备连接到",{"2":{"194":1}}],["您还可以在变量名称",{"2":{"184":1}}],["您还可以手动要求应用在应用设置中创建图标",{"2":{"169":1}}],["您还可以构建特定的子组件",{"2":{"80":1}}],["您可以有几种选择",{"2":{"214":1}}],["您可以从官方固件包或第三方",{"2":{"194":1}}],["您可以根据自由软件基金会发布的",{"2":{"190":1}}],["您可以以两种不同的模式运行启动脚本",{"2":{"186":1}}],["您可以在",{"2":{"168":1,"183":1}}],["您可以通过使用诸如",{"2":{"163":1}}],["构建",{"0":{"80":1},"2":{"83":1}}],["构建脚本将自动查找并使用捆绑的",{"2":{"79":1}}],["构建和开发",{"0":{"78":1},"1":{"79":1,"80":1,"81":1,"82":1,"83":1},"2":{"189":1}}],["包括所有",{"2":{"190":1}}],["包括完整的",{"2":{"173":1}}],["包括",{"2":{"158":1,"164":1,"334":1,"336":1}}],["包含一个完全独立的",{"2":{"82":1}}],["包含极简的",{"2":{"75":1}}],["包",{"2":{"79":1}}],["添加到",{"2":{"79":1}}],["将详细输出打印到",{"2":{"339":1}}],["将命令传递给调用的",{"2":{"338":1}}],["将新目标添加到拒绝列表",{"2":{"337":1}}],["将所有块设备的",{"2":{"337":1}}],["将扩展到",{"2":{"336":1}}],["将从当前活动策略",{"2":{"336":1}}],["将整体策略转储到",{"2":{"336":1}}],["将被视为",{"2":{"336":1}}],["将被替换为",{"2":{"334":1}}],["将被启动",{"2":{"161":1}}],["将覆盖第三方",{"2":{"208":1}}],["将安装到",{"2":{"208":1}}],["将安装一个",{"2":{"157":1}}],["将设备关机",{"2":{"200":1}}],["将设置为",{"2":{"176":1}}],["将熔断",{"2":{"199":1}}],["将简单地替换为",{"2":{"187":1}}],["将其注入",{"2":{"187":1}}],["将读取并连接",{"2":{"187":1}}],["将导致启动过程死锁",{"2":{"186":1}}],["将强制替换为最新的",{"2":{"185":1}}],["将负责自行安装所有内容",{"2":{"182":1}}],["将模块文件从",{"2":{"181":1}}],["将透明地处理这些分区是否位于单独的分区中",{"2":{"177":1}}],["将此文件中的属性作为系统属性加载",{"2":{"174":1}}],["将执行此脚本",{"2":{"174":1}}],["将不会挂载您的",{"2":{"174":1}}],["将挂载此文件夹",{"2":{"174":1}}],["将挂载到此处",{"2":{"157":1}}],["将检测到安全模式被激活",{"2":{"167":1}}],["将修补好的",{"2":{"195":1}}],["将修补现成的",{"2":{"164":1}}],["将修补的归档文件复制到您的电脑",{"2":{"201":1}}],["将修补的映像复制到您的电脑",{"2":{"195":1}}],["将修补的",{"2":{"160":1}}],["将触发类",{"2":{"162":1}}],["将第二阶段的",{"2":{"160":1}}],["将替换为另一个文件",{"2":{"334":1}}],["将替换",{"2":{"160":1}}],["将在其中运行的内容",{"2":{"164":1}}],["将在",{"2":{"157":1}}],["将选择该文件夹",{"2":{"157":1}}],["将环境变量",{"2":{"79":1,"173":1}}],["将",{"2":{"79":1,"82":2,"160":2,"195":1,"201":1,"209":1,"213":2,"334":5,"338":1}}],["将事物拼凑在一起",{"0":{"76":1}}],["请为每个命令添加引号",{"2":{"334":1}}],["请考虑使用",{"2":{"214":1}}],["请转到",{"2":{"213":1}}],["请不要擦除",{"2":{"209":1}}],["请直接在",{"2":{"209":1}}],["请手动安装",{"2":{"209":1}}],["请先阅读",{"2":{"208":1}}],["请注意",{"2":{"207":1,"208":1}}],["请立即重新启动到",{"2":{"201":1}}],["请同意",{"2":{"201":1}}],["请长按音量增大",{"2":{"197":1}}],["请选中",{"2":{"195":2}}],["请获取",{"2":{"194":2}}],["请参见",{"2":{"190":1}}],["请参阅gnu通用公共许可证",{"2":{"190":1}}],["请以英文原版为准",{"2":{"190":1}}],["请改用",{"2":{"186":1}}],["请勿使用最新版本的",{"2":{"204":1}}],["请勿在模块",{"2":{"185":1}}],["请勿手动创建或修改",{"2":{"174":1}}],["请避免使用",{"2":{"184":2}}],["请将",{"2":{"196":1}}],["请将它们添加到",{"2":{"187":1}}],["请将这些规则添加到此文件中",{"2":{"180":1}}],["请将手机连接到",{"2":{"167":1}}],["请查看相应部分",{"2":{"193":2}}],["请查看",{"2":{"178":1,"180":1}}],["请分别将它们放在",{"2":{"177":1}}],["请使用正确的修补映像方法",{"2":{"209":1}}],["请使用",{"2":{"176":1,"207":1,"208":1,"209":2,"214":2}}],["请阅读",{"2":{"176":1}}],["请重新启动到安全模式",{"2":{"167":1}}],["请进入",{"2":{"167":1}}],["请在开发人员选项中禁用自动系统更新",{"2":{"212":1}}],["请在继续之前备份您的数据",{"2":{"199":1}}],["请在继续之前阅读",{"2":{"194":1}}],["请在安装",{"2":{"194":1}}],["请在安装过程中选择",{"2":{"79":1}}],["请在网络上查找它们",{"2":{"168":1}}],["请在",{"2":{"83":1,"182":1}}],["请切换到",{"2":{"83":1}}],["请运行",{"2":{"80":1}}],["请确保在安装过程前",{"2":{"79":1}}],["请尽量采用",{"2":{"0":1}}],["启用拒绝列表强制",{"2":{"337":1}}],["启用开发者选项",{"2":{"200":1}}],["启用开发者模式",{"2":{"79":1}}],["启用符号链接",{"2":{"79":1}}],["启动第三方",{"2":{"214":1}}],["启动屏幕",{"2":{"197":2}}],["启动之前",{"2":{"186":1}}],["启动过程在执行完成",{"2":{"186":1}}],["启动脚本",{"0":{"186":1},"2":{"176":1}}],["启动可以大致分为",{"2":{"73":1}}],["启动",{"2":{"72":1,"74":1,"209":1}}],["启动映像",{"2":{"72":1}}],["启动映像中的一个部分",{"2":{"72":1}}],["仅当您的设备启动",{"2":{"209":1}}],["仅当脚本设置为可执行文件时才执行",{"2":{"186":1}}],["仅限",{"2":{"199":1,"205":1}}],["仅在lg上使用",{"2":{"334":1}}],["仅在启用模块时执行",{"2":{"186":1}}],["仅在必要时在此模式下运行脚本",{"2":{"186":1}}],["仅",{"2":{"79":1,"199":1}}],["设计的应用程序进行",{"2":{"338":1}}],["设置它来实现",{"2":{"163":1}}],["设置",{"2":{"79":1,"213":1,"339":2}}],["设置中找到",{"2":{"79":1}}],["设置为允许每个域",{"2":{"164":1}}],["设置为钩住",{"2":{"160":1}}],["设置为工具链位置",{"2":{"82":1}}],["设置为默认",{"2":{"82":1}}],["设置为",{"2":{"79":2,"173":1,"334":1}}],["设置环境",{"0":{"79":1}}],["设备将在重启后自动给",{"2":{"209":1}}],["设备就会显示启动屏幕",{"2":{"197":1}}],["设备是否有单独的",{"2":{"194":1}}],["设备是否有启动",{"2":{"194":1}}],["设备的",{"2":{"183":2}}],["设备都支持在启动时按特殊键组合键以进入安全模式作为紧急选项",{"2":{"167":1}}],["设备上是只读的",{"2":{"187":1}}],["设备上协助劫持",{"2":{"160":1}}],["设备上",{"2":{"160":2}}],["设备中",{"2":{"158":1}}],["设备分类为以下不同类型",{"2":{"76":1}}],["设备卡在方法",{"2":{"74":1}}],["设备",{"0":{"214":1},"2":{"73":1,"74":1,"76":2,"208":1,"214":1}}],["设备过去启动的方式",{"2":{"73":1}}],["设备当前运行的",{"2":{"72":1}}],["设备首次上市时预装的",{"2":{"72":1}}],["设备推出时使用的安卓版本",{"2":{"72":1}}],["设备使用",{"2":{"72":1}}],["如节大小和校验和",{"2":{"334":1}}],["如ro",{"2":{"163":1}}],["如果既没有指定",{"2":{"336":1}}],["如果以前已在",{"2":{"334":1}}],["如果提供了",{"2":{"334":1}}],["如果提供",{"2":{"334":2}}],["如果需要",{"2":{"334":1}}],["如果需要自定义模块安装过程",{"2":{"182":1}}],["如果支持",{"2":{"214":1}}],["如果可能",{"2":{"211":1}}],["如果未指",{"2":{"334":1}}],["如果未指定",{"2":{"184":2,"334":3}}],["如果未自动安装",{"2":{"209":1}}],["如果重命名文件扩展名时遇到问题",{"2":{"209":1}}],["如果被要求恢复出厂设置",{"2":{"201":1}}],["如果刚刚修补的是",{"2":{"195":1}}],["如果找到",{"2":{"194":1}}],["如果还是报错",{"2":{"194":1}}],["如果没有",{"2":{"190":1}}],["如果在任何部分中检测到压缩",{"2":{"334":1}}],["如果在根目录中不存在",{"2":{"187":1}}],["如果在开发人员选项中启用了usb调试",{"2":{"167":1}}],["如果模块在",{"2":{"183":1}}],["如果要修补",{"2":{"195":1}}],["如果要完全控制和自定义安装过程",{"2":{"182":1}}],["如果要替换",{"2":{"177":1}}],["如果启用了zygisk",{"2":{"176":1}}],["如果存在",{"2":{"174":4,"194":1,"334":1}}],["如果",{"2":{"174":1,"183":1,"334":2}}],["如果你使用的是",{"2":{"168":1}}],["如果您想经常接收官方",{"2":{"214":1}}],["如果您有官方映像转储的副本",{"2":{"214":1}}],["如果您决定在不接触",{"2":{"214":1}}],["如果您决定引导到实际的",{"2":{"197":1}}],["如果您安装了第三方",{"2":{"214":1}}],["如果您遇到任何问题",{"2":{"209":1}}],["如果您遇到如",{"2":{"194":1}}],["如果您不打算使用第三方",{"2":{"207":1,"208":1}}],["如果您不知道什么是",{"2":{"167":1}}],["如果您打算使用第三方",{"2":{"207":1,"208":1}}],["如果您坚持使用第三方",{"2":{"196":1}}],["如果您清除数据",{"2":{"195":1}}],["如果您的三星设备未安装",{"2":{"198":1}}],["如果您的官方固件包包含",{"2":{"194":1}}],["如果您的设备在",{"2":{"197":1}}],["如果您的设备有单独的",{"2":{"195":1}}],["如果您的设备有启动",{"2":{"194":1}}],["如果您的设备没有单独的",{"2":{"195":1}}],["如果您的设备没有启动",{"2":{"194":2,"201":2}}],["如果您的模块需要基于设备",{"2":{"182":1}}],["如果您的模块需要一些额外的",{"2":{"180":1}}],["如果您还计划安装第三方内核",{"2":{"194":1}}],["如果您还不知道什么是",{"2":{"167":1}}],["如果您使用的是搭载",{"2":{"193":1}}],["如果您在使用运行着",{"2":{"193":1}}],["如果您已经安装了",{"2":{"193":1}}],["如果您将名为",{"2":{"177":1}}],["如果您只需要运行引导脚本",{"2":{"176":1}}],["如果您发现了这些错误或者不通顺的地方",{"2":{"170":1}}],["如果您没有启用",{"2":{"167":1}}],["如果您需要此特殊行为",{"2":{"163":1}}],["如果检测到了设备",{"2":{"167":1}}],["如果属性更改未通过",{"2":{"163":1}}],["如果我们使用",{"2":{"160":1}}],["如果使用",{"2":{"75":1}}],["如",{"2":{"157":1,"163":1,"181":1,"211":1,"334":1}}],["如何实现其引导加载程序",{"2":{"76":1}}],["访问守护进程的唯一方法是通过",{"2":{"164":1}}],["访问帮助",{"2":{"80":1}}],["访问",{"2":{"76":1,"164":1}}],["相同",{"2":{"336":1}}],["相同的格式",{"2":{"179":1}}],["相关的操作",{"2":{"334":1}}],["相关的二进制文件",{"2":{"158":1}}],["相关链接",{"0":{"191":1}}],["相反",{"2":{"76":1,"187":1,"213":1}}],["相比有几个区别",{"2":{"75":1}}],["修改已到位",{"2":{"334":1}}],["修改的分区从安装时的生成备份恢复到官方",{"2":{"212":1}}],["修补过程",{"2":{"202":1}}],["修补映像",{"0":{"195":1},"2":{"209":1,"214":1}}],["修补",{"2":{"160":1,"195":1,"334":2}}],["修补引导映像来轻松安装",{"2":{"76":1}}],["修复sepolicy规则复制",{"2":{"4":1}}],["修复升级时的sepolicy规则迁移",{"2":{"2":1}}],["关于",{"2":{"76":1}}],["同时也是第一个",{"2":{"76":1}}],["旧版",{"2":{"76":1}}],["好的旧传统",{"2":{"76":1}}],["类设备的引导加载程序仍然会接受并提供手动添加到内核",{"2":{"76":1}}],["类设备的更多详细信息",{"2":{"76":1}}],["类设备用户必须始终重新启动到",{"2":{"76":1}}],["类",{"2":{"76":6}}],["类型",{"2":{"76":1}}],["混合",{"2":{"76":1}}],["year",{"2":{"222":1,"255":1,"267":1}}],["yet",{"2":{"111":1,"145":1,"224":1,"242":1,"264":1}}],["yes",{"2":{"76":1,"217":1,"308":1,"312":1}}],["youtube",{"2":{"184":2}}],["yourself",{"2":{"219":1}}],["your",{"2":{"41":1,"151":1,"152":1,"183":1,"190":1,"229":1,"230":2,"234":1,"236":2,"256":1,"257":1,"268":1,"308":1,"309":3,"312":1,"313":3}}],["you",{"2":{"41":1,"44":2,"45":1,"47":1,"61":1,"65":2,"66":1,"142":1,"150":1,"190":2,"226":1,"233":1,"234":1,"241":3,"247":3,"253":3,"265":2,"268":1,"294":1,"300":1,"309":1,"313":1}}],["里的",{"2":{"76":1}}],["有效的触发器",{"2":{"337":1}}],["有一些注意事项",{"2":{"200":1}}],["有一些例外情况",{"2":{"194":1}}],["有一个特殊的机制允许您实际进入到",{"2":{"197":1}}],["有一个用于修复和升级设备的极简自带",{"2":{"72":1}}],["有关详细信息",{"2":{"190":1}}],["有关如何格式化策略语句的更多详细信息",{"2":{"180":1}}],["有关",{"2":{"178":1}}],["有两种方法可以启用它",{"2":{"173":1}}],["有大量",{"2":{"168":1}}],["有了上面的所有知识",{"2":{"76":1}}],["存根",{"2":{"169":1}}],["存储在",{"2":{"163":1}}],["存储在单独的分区中时",{"2":{"75":1}}],["存储常规",{"2":{"158":2}}],["存在的标志",{"2":{"158":1}}],["存在",{"2":{"75":1,"334":1}}],["处理其余的引导",{"2":{"75":1}}],["因此长按音量增大不会在我的设备上不会启动到",{"2":{"208":1}}],["因此唯一可以确定的方法就是实际尝试",{"2":{"194":1}}],["因此在引用这些附加文件时",{"2":{"187":1}}],["因此它不包含",{"2":{"169":1}}],["因此需要注意一些",{"2":{"163":1}}],["因此一旦数据正确装载到",{"2":{"158":1}}],["因此非",{"2":{"158":1}}],["因此不能作为",{"2":{"158":1}}],["因此",{"2":{"157":1,"187":1}}],["因此单独构建",{"2":{"82":1}}],["因此可以通过",{"2":{"76":1}}],["因此无法直接将",{"2":{"75":1}}],["因为每个设备的程序可能有所不同",{"2":{"211":1}}],["因为其设备上的",{"2":{"204":1}}],["因为我们正在执行升级",{"2":{"202":1}}],["因为我们要清除数据",{"2":{"201":1}}],["因为数据将在后面的步骤中再次擦除",{"2":{"200":1}}],["因为某些设备的引导加载程序会接受",{"2":{"194":1}}],["因为某些生成的代码仅在构建过程中创建",{"2":{"81":1}}],["因为它不再相应",{"2":{"338":1}}],["因为它不会显示在第三方",{"2":{"184":1}}],["因为它通常涉及",{"2":{"214":1}}],["因为它可能会损坏大型文件",{"2":{"201":1}}],["因为它可能会损坏大文件",{"2":{"195":1}}],["因为它会跳过终止清理步骤",{"2":{"184":1}}],["因为它还将充当将二进制文件注入",{"2":{"157":1}}],["因为环境变量向下继承到子进程",{"2":{"173":1}}],["因为这是",{"2":{"163":1}}],["因为需要支持符号链接",{"2":{"79":1}}],["因为谷歌每年都强制所有",{"2":{"74":1}}],["因为",{"2":{"74":1,"75":2,"187":1}}],["到控制台并终止安装",{"2":{"184":1}}],["到控制台",{"2":{"184":1}}],["到",{"2":{"75":1,"337":1}}],["然后按下设备的下载模式键组合",{"2":{"200":1}}],["然后选择",{"2":{"195":1,"201":1}}],["然后完成安装过程",{"2":{"181":1}}],["然后再进行专业化和运行",{"2":{"178":1}}],["然后重启回到正常模式",{"2":{"167":1}}],["然后启动时卡在了开机动画",{"0":{"167":1}}],["然后启动守护程序",{"2":{"160":1}}],["然后通过",{"2":{"163":1}}],["然后在",{"2":{"82":1}}],["然后让内核根据引导加载程序的信息选择要使用的任何根目录",{"2":{"75":1}}],["然而机器翻译的正确率有待提高",{"2":{"170":1}}],["然而",{"2":{"74":1,"76":1,"338":1}}],["删除其文件格式文件扩展名",{"2":{"334":1}}],["删除您的模块时",{"2":{"174":1}}],["删除属性将同时删除",{"2":{"163":1}}],["删除属性不会将其从持久存储中删除",{"2":{"163":1}}],["删除",{"2":{"75":1,"334":1,"339":1}}],["塞入",{"2":{"75":1}}],["只能劫持",{"2":{"197":1}}],["只能引导到",{"2":{"76":1}}],["只有部分小米设备具有此属性",{"2":{"194":1}}],["只有使用方法b的设备才被正式视为",{"2":{"74":1}}],["只需更改必要的内容",{"2":{"334":1}}],["只需按照第三方",{"2":{"207":1,"208":1}}],["只需下载",{"2":{"194":1}}],["只需将",{"2":{"75":1}}],["当使用名称",{"2":{"337":1}}],["当ota可用时",{"2":{"212":1}}],["当在",{"2":{"173":1}}],["当您打开隐藏的",{"2":{"169":1}}],["当隐藏",{"2":{"169":1}}],["当前安装的magisk的版本代码",{"2":{"183":1}}],["当前安装的",{"2":{"183":1}}],["当前",{"2":{"157":1}}],["当",{"2":{"75":1,"161":1,"174":1,"187":1,"197":1}}],["当时只有引导方法",{"2":{"75":1}}],["当谷歌发布第一代",{"2":{"75":1}}],["第一次设计",{"2":{"75":1}}],["第三方",{"0":{"209":1},"2":{"74":1,"197":1}}],["它作为一个实用工具",{"2":{"337":1}}],["它最初是为支持以",{"2":{"335":1}}],["它解析标头并提取映像中的所有部分",{"2":{"334":1}}],["它不会安装",{"2":{"212":1}}],["它应该显示一个对话框",{"2":{"201":1}}],["它通常命名为",{"2":{"201":1}}],["它们将直接复制到magisk",{"2":{"187":1}}],["它们仅限于将",{"2":{"76":1}}],["它允许高级模块开发人员在每个",{"2":{"178":1}}],["它将显示一个让您重新安装的对话框",{"2":{"209":1}}],["它将为您提供在主屏幕中创建快捷方式的选项",{"2":{"169":1}}],["它将安装一个",{"2":{"169":1}}],["它将具有所有只读分区的2个插槽",{"2":{"72":1}}],["它是现代安卓系统上的一个现有文件夹",{"2":{"158":1}}],["它还推出了",{"2":{"75":1}}],["一个策略声明应被视为一个参数",{"2":{"336":1}}],["一个用于解压缩",{"2":{"334":1}}],["一旦完成",{"2":{"214":1}}],["一旦下载了",{"2":{"214":1}}],["一旦你的三星设备获得了",{"2":{"202":1}}],["一旦你按下组合键",{"2":{"197":1}}],["一旦",{"2":{"201":1}}],["一起刷入",{"2":{"201":1}}],["一起安装的软件包",{"2":{"82":1}}],["一样",{"2":{"194":1}}],["一些二进制文件和文件应存储在",{"2":{"158":1}}],["一些",{"2":{"76":1}}],["一些使用带有",{"2":{"75":1}}],["一些历史",{"0":{"75":1}}],["一加",{"2":{"73":1}}],["应的文件名",{"2":{"334":1}}],["应为",{"2":{"195":1}}],["应只包含字符串",{"2":{"181":1}}],["应该取决于您的设备",{"2":{"195":1}}],["应该足够好了",{"2":{"176":1}}],["应该指向一个",{"2":{"175":1}}],["应该与平台绑定",{"2":{"74":1}}],["应用内置",{"2":{"336":1}}],["应用程序中修补",{"2":{"203":1}}],["应用程序",{"2":{"194":1,"195":2,"196":1,"201":1,"209":2}}],["应用程序的",{"2":{"193":1}}],["应用程序的进程中直接运行代码",{"2":{"178":1}}],["应用程序下载模块时",{"2":{"185":1}}],["应用程序或第三方recovery",{"2":{"181":1}}],["应用程序日志和magisk日志",{"2":{"5":1}}],["应用图标显示异常",{"0":{"169":1}}],["应用",{"2":{"83":1,"204":1,"206":1,"214":1,"334":1,"336":1}}],["是可选的",{"2":{"336":2}}],["是用于解压缩组件的原始启动映像",{"2":{"334":1}}],["是一种新的文件类型",{"2":{"164":1}}],["是有效的",{"2":{"164":1}}],["是通过从",{"2":{"163":1}}],["是这种类型的第一个设备",{"2":{"76":1}}],["是",{"2":{"74":1,"178":1,"183":1}}],["对",{"2":{"334":2}}],["对设备进行了改造以适应新方法",{"2":{"74":1}}],["对于重新打包",{"2":{"334":1}}],["对于解包",{"2":{"334":1}}],["对于运行",{"2":{"207":1}}],["对于这些设备",{"2":{"197":1}}],["对于大多数设备",{"2":{"195":1}}],["对于大多数模块开发人员来说",{"2":{"176":1}}],["对于想在",{"2":{"173":1}}],["对于与第三方开发人员相关的内容",{"2":{"173":1}}],["对于带有",{"2":{"157":1}}],["对于每个操作",{"2":{"80":1}}],["对于所有其他类型的设备",{"2":{"76":1}}],["对于",{"2":{"74":1,"76":1,"184":2,"187":1,"208":1}}],["对于支持无缝系统更新的设备",{"2":{"72":1}}],["可用的小程序",{"2":{"337":1}}],["可能会缩小",{"2":{"203":1}}],["可能还会振动",{"2":{"197":1}}],["可执行文件位于",{"2":{"173":1}}],["可选地",{"2":{"214":1}}],["可选文件",{"2":{"174":1}}],["可选",{"2":{"79":1,"175":1,"181":1}}],["可以是",{"2":{"334":2}}],["可以将",{"2":{"213":1}}],["可以很容易地获得这些信息",{"2":{"197":1}}],["可以重启到",{"2":{"195":1}}],["可以临时存储文件的地方",{"2":{"183":1}}],["可以选择在安装程序中创建名为",{"2":{"182":1}}],["可以在一个命令中提供多个策略语句",{"2":{"336":1}}],["可以在",{"2":{"181":1}}],["可以更新模块",{"2":{"175":1}}],["可以禁用它",{"2":{"163":1}}],["可以根据引导加载程序的信息启动到",{"2":{"76":1}}],["可以使用",{"2":{"74":1}}],["可帮助您更精确地定义设备的",{"2":{"72":1}}],["实例都将参考",{"2":{"74":1}}],["但该选项仍然存在",{"2":{"338":1}}],["但该工具被扩展为支持所有设备",{"2":{"335":1}}],["但另外支持",{"2":{"336":1}}],["但在",{"2":{"336":1}}],["但",{"2":{"214":1}}],["但使用",{"2":{"207":1,"208":1}}],["但大多数固件压缩包可以从华为固件下载站下载",{"2":{"205":1}}],["但没有任何保证",{"2":{"190":1}}],["但实际上是",{"2":{"175":1}}],["但实施方式不同",{"2":{"74":1}}],["但仍然禁止更改只读属性",{"2":{"163":1}}],["但是华为设备没有这个分区",{"2":{"204":1}}],["但是",{"2":{"82":1}}],["但本指南不包含说明",{"2":{"79":1}}],["但许多设备不接受",{"2":{"76":1}}],["但例外情况单独列出",{"2":{"73":1}}],["讨论",{"0":{"74":1}}],["不错的旧",{"2":{"338":1}}],["不修改大多数只读分区",{"2":{"211":1}}],["不建议在新的设备上通过第三方",{"2":{"209":1}}],["不可通过官方途径解锁",{"2":{"204":1}}],["不可写",{"2":{"157":1}}],["不再正式支持较新的华为设备",{"2":{"204":1}}],["不再处理",{"2":{"168":1}}],["不是",{"2":{"201":1}}],["不幸的是",{"2":{"194":1,"214":1}}],["不要按",{"2":{"213":1}}],["不要重新启动",{"2":{"212":1}}],["不要使用mtp",{"2":{"201":1}}],["不要使用",{"2":{"195":1,"202":1}}],["不要在",{"2":{"185":1}}],["不要在脚本中硬编码模块路径",{"2":{"176":1}}],["不要尝试在",{"2":{"185":1}}],["不存在",{"2":{"174":1,"187":1}}],["不允许直接连接到",{"2":{"164":1}}],["不受限制的文件上下文",{"2":{"164":1}}],["不包括已在使用方法",{"2":{"73":1}}],["不属于方法",{"2":{"73":1}}],["最佳实践",{"2":{"214":1}}],["最简单的",{"2":{"181":1}}],["最新的版本",{"2":{"79":1}}],["最相关的是删除",{"2":{"75":1}}],["最后执行",{"2":{"73":1}}],["最终根目录",{"2":{"73":1}}],["负责挂载",{"2":{"73":1}}],["也没有指定",{"2":{"336":1}}],["也会篡改块验证",{"2":{"211":1}}],["也就是开头必须为字母",{"2":{"175":1}}],["也就是说",{"2":{"72":2,"177":1}}],["也以独立模式运行",{"2":{"173":1}}],["也许一些",{"2":{"73":1}}],["时会触发引导循环并直接重启至",{"2":{"204":1}}],["时的数据擦除",{"2":{"199":1}}],["时都必须重新启动至",{"2":{"197":1}}],["时",{"2":{"73":2,"75":1,"169":2,"187":1,"197":1,"209":1}}],["谷歌的标准正式支持这一点",{"2":{"75":1}}],["谷歌推出了动态分区",{"2":{"75":1}}],["谷歌对",{"2":{"74":1}}],["谷歌",{"2":{"73":2}}],["的小程序",{"2":{"338":1,"339":1}}],["的参数与",{"2":{"336":1}}],["的参数可以接受一个或多个条目",{"2":{"336":1}}],["的关键部分",{"2":{"335":1}}],["的所有内容以进行调试",{"2":{"334":1}}],["的状态",{"2":{"334":2}}],["的概念是使",{"2":{"334":1}}],["的方法",{"2":{"214":1}}],["的更新",{"2":{"214":1}}],["的说明进行操作即可",{"2":{"207":1,"208":1}}],["的地方",{"2":{"207":1}}],["的分区",{"2":{"207":1}}],["的系统",{"2":{"197":2}}],["的系统上使用的规则都可以被视为官方的",{"2":{"336":1}}],["的系统上",{"2":{"157":1}}],["的最简单方法是直接通过",{"2":{"196":1}}],["的报错",{"2":{"194":1}}],["的副本",{"2":{"194":2}}],["的结果确定您的设备在",{"2":{"194":1}}],["的隐含保证",{"2":{"190":1}}],["的开发人员",{"2":{"189":1}}],["的示例",{"2":{"187":2}}],["的内部",{"2":{"187":1}}],["的控制台中",{"2":{"184":1}}],["的版本字符串",{"2":{"183":1}}],["的脚本以",{"2":{"186":1}}],["的脚本",{"2":{"182":1}}],["的一切",{"2":{"186":1}}],["的一项功能",{"2":{"178":1}}],["的一种形式",{"2":{"74":1}}],["的文件",{"2":{"185":1}}],["的文件放在任何文件夹中",{"2":{"177":1}}],["的文档",{"2":{"83":1,"180":1}}],["的符号链接",{"2":{"174":3,"334":1}}],["的情况下",{"2":{"173":1}}],["的图标资源",{"2":{"169":1}}],["的行为",{"2":{"163":1}}],["的默认设置属性行为与",{"2":{"163":1}}],["的覆盖层",{"2":{"157":1}}],["的侵害",{"2":{"83":1}}],["的存储库可以作为一个项目直接使用",{"2":{"81":1}}],["的安装路径",{"2":{"79":1}}],["的现代设备还带有",{"2":{"75":1}}],["的",{"2":{"75":1,"82":1,"83":1,"164":2,"173":4,"182":1,"183":1,"186":1,"187":4,"194":1,"197":1,"213":1,"214":1,"334":1,"336":1}}],["的流逝",{"2":{"75":1}}],["的时候",{"2":{"75":2}}],["的标准有点复杂",{"2":{"74":1}}],["的定义",{"2":{"74":1}}],["的定义只考虑了内核如何引导设备",{"2":{"74":1}}],["的设备而创建的",{"2":{"335":1}}],["的设备特别友好",{"2":{"209":1}}],["的设备通常是这样的",{"2":{"194":1}}],["的设备都是",{"2":{"76":1}}],["的设备都将自动使用方法",{"2":{"74":1}}],["的设备上运行",{"2":{"74":1}}],["的设备",{"2":{"73":4,"207":1,"214":2}}],["的启动方式",{"2":{"72":1}}],["具有许多助手函数和几个",{"2":{"337":1}}],["具有以下补丁",{"2":{"336":1}}],["具有",{"2":{"73":3}}],["此标志仅影响",{"2":{"339":2}}],["此工具别名为",{"2":{"336":1}}],["此操作可能清除您的数据",{"2":{"195":1}}],["此操作仅为提供代码高亮",{"2":{"175":1}}],["此时",{"2":{"194":1}}],["此功能主要为第三方内核开发者设计",{"2":{"187":1}}],["此阶段为非阻塞",{"2":{"186":1}}],["此阶段会阻塞",{"2":{"186":1}}],["此函数是以下psuedo代码的简写",{"2":{"184":1}}],["此函数是以下命令的简写",{"2":{"184":1}}],["此脚本将来源于",{"2":{"181":1}}],["此脚本将在",{"2":{"174":2}}],["此外还有以下文件",{"2":{"181":1}}],["此文件将被",{"2":{"187":1}}],["此文件将被忽略",{"2":{"187":1}}],["此文件将被注入到",{"2":{"187":1}}],["此文件将替换",{"2":{"187":1}}],["此文件中的每一行都将被视为策略语句",{"2":{"180":1}}],["此文件遵循与",{"2":{"179":1}}],["此文件夹将以递归方式合并到真正的",{"2":{"177":1}}],["此文件夹包含模块的",{"2":{"174":1}}],["此文件存储模块的元数据",{"2":{"174":1}}],["此路径中的每个目录都将装载其目录名的分区",{"2":{"157":1}}],["此路径可以在",{"2":{"79":1}}],["此方法首次出现在",{"2":{"73":2}}],["此仓库分别存在",{"2":{"0":1}}],["来进入",{"2":{"206":1}}],["来安装或升级",{"2":{"197":1}}],["来说是个坏消息",{"2":{"75":1}}],["来说",{"2":{"74":1}}],["来引导",{"2":{"73":3,"75":1}}],["来表示",{"2":{"72":1}}],["作为策略语句逐行读取和分析",{"2":{"336":1}}],["作为解决方法",{"2":{"208":1}}],["作为第一个运行的程序",{"2":{"160":1}}],["作为",{"2":{"73":2,"201":1,"334":1}}],["作为rootdir",{"2":{"72":1}}],["过去的美好时光",{"2":{"73":1}}],["传统",{"2":{"73":2}}],["初始化触发器上的回调",{"2":{"337":1}}],["初始根目录",{"2":{"73":1}}],["初始版本",{"2":{"69":1}}],["方法进行升级",{"2":{"193":1}}],["方法",{"2":{"73":4,"74":3,"160":1}}],["并重新编译",{"2":{"336":1}}],["并重启设备",{"2":{"214":1}}],["并成为",{"2":{"335":1}}],["并删除",{"2":{"334":1}}],["并安装",{"2":{"214":1}}],["并没有真正好的方法",{"2":{"214":1}}],["并补充后的版本",{"2":{"204":1}}],["并补充了很多内容",{"2":{"189":1}}],["并补充了一些内容",{"2":{"0":1}}],["并改用它",{"2":{"203":1}}],["并使用以下命令刷入",{"2":{"195":1}}],["并使用",{"2":{"195":1,"201":1}}],["并遵循以下规则",{"2":{"187":1}}],["并启用",{"2":{"186":1}}],["并启用了",{"2":{"182":1}}],["并启动该应用程序",{"2":{"201":1}}],["并启动",{"2":{"162":1}}],["并通过",{"2":{"167":1}}],["并将其替换为",{"2":{"334":1}}],["并将其用作基本文件夹",{"2":{"157":1}}],["并将该脚本重命名或复制为",{"2":{"181":1}}],["并将",{"2":{"164":1}}],["并与守护进程建立连接",{"2":{"164":1}}],["并进行了修补",{"2":{"163":1}}],["并神奇地安装模块文件",{"2":{"161":1}}],["并退出守护进程",{"2":{"160":1}}],["并在当前目录中具有相",{"2":{"334":1}}],["并在安装后保留",{"2":{"211":1}}],["并在",{"2":{"160":1}}],["并执行它为我们装载分区",{"2":{"160":1}}],["并按照说明进行初始设置",{"2":{"79":1}}],["并让",{"2":{"75":1,"213":1}}],["并且在这种情况下无需将",{"2":{"209":1}}],["并且可以用很小的工作量来维护",{"2":{"209":1}}],["并且从中恢复的唯一方法是清除数据并进行完整的",{"2":{"203":1}}],["并且无论在哪个",{"2":{"173":1}}],["并且执行",{"2":{"164":1}}],["并且对非",{"2":{"163":1}}],["并且",{"2":{"73":1}}],["并运行以下命令进行检查",{"2":{"194":1}}],["并运行命令",{"2":{"167":1}}],["并运行",{"2":{"72":1}}],["随机字符",{"2":{"195":4}}],["随着时间从",{"2":{"75":1}}],["随",{"2":{"72":1}}],["xz",{"2":{"334":3}}],["xda",{"2":{"234":1}}],["x",{"2":{"195":3}}],["xposed",{"2":{"150":2}}],["xperm",{"2":{"138":1,"336":4}}],["xperia",{"2":{"89":1}}],["xxx应用会检测到",{"0":{"168":1}}],["xxx",{"2":{"118":1}}],["xiaomi",{"2":{"102":1,"131":1,"266":1}}],["x86",{"2":{"102":1,"134":1,"174":2,"183":1,"266":1}}],["x64",{"2":{"79":3,"183":2}}],["xl",{"2":{"72":1,"116":1,"131":1,"233":1}}],["xml",{"2":{"32":1}}],["例如几乎所有的小米设备均为",{"2":{"197":1}}],["例如三星",{"2":{"76":1}}],["例如一些小米手机",{"2":{"76":1}}],["例如",{"2":{"72":1,"80":1,"157":1,"173":1,"183":3,"184":1,"209":1}}],["级别和",{"2":{"72":1}}],["级别",{"2":{"72":1,"183":2}}],["推出版本",{"2":{"72":1}}],["版本对应的",{"2":{"183":1}}],["版本上运行",{"2":{"173":1}}],["版本之间的映射可以在",{"2":{"72":1}}],["版本",{"2":{"72":3,"79":1,"194":1,"204":3}}],["以了解更多背景信息",{"2":{"339":1}}],["以与",{"2":{"336":1}}],["以作为",{"2":{"334":2}}],["以仅打印",{"2":{"334":1}}],["以递归删除",{"2":{"334":1}}],["以原始格式转储",{"2":{"334":1}}],["以应用",{"2":{"211":1}}],["以启用",{"2":{"201":1}}],["以及使用多种算法压缩",{"2":{"334":1}}],["以及",{"2":{"197":1}}],["以前是",{"2":{"187":1}}],["以跳过所有默认安装步骤",{"2":{"182":1}}],["以提供信息",{"2":{"175":1}}],["以下教程不会保留",{"2":{"214":1}}],["以下教程仅针对初始安装",{"2":{"193":1}}],["以下是几种不同类型的设备的教程",{"2":{"211":1}}],["以下是一些参数",{"2":{"72":1}}],["以下只是一些一般性指导",{"2":{"204":1}}],["以下部分面向开发者",{"2":{"189":1}}],["以下变量和函数可用",{"2":{"182":1}}],["以下代码块虽然标注为",{"2":{"175":1}}],["以方便您使用",{"2":{"169":1}}],["以便与为",{"2":{"338":1}}],["以便可以使用原始标头",{"2":{"334":1}}],["以便通过",{"2":{"212":1}}],["以便检查更新",{"2":{"175":1}}],["以便",{"2":{"164":1,"175":1}}],["以获得远程",{"2":{"164":1}}],["以确保",{"2":{"164":1}}],["以确定您的设备最有可能使用哪种方法",{"2":{"73":1}}],["以",{"2":{"163":1,"186":2}}],["以允许直接修改属性区域或",{"2":{"163":1}}],["以允许第三方仓库",{"2":{"6":1}}],["以ro",{"2":{"163":1}}],["以继续启动过程",{"2":{"160":1}}],["以关闭签名检查",{"2":{"83":1}}],["以安装",{"2":{"79":1}}],["以保持",{"2":{"76":1}}],["两阶段初始化",{"2":{"72":1}}],["环境",{"2":{"72":1,"75":1}}],["而不经过",{"2":{"339":1}}],["而不是默认的",{"2":{"338":1}}],["而不是初始安装",{"2":{"202":1}}],["而不是合并其内容",{"2":{"177":1}}],["而不是",{"2":{"72":1,"175":1,"207":1,"208":2}}],["而进入",{"2":{"206":1}}],["而是使用",{"2":{"202":1}}],["而是直接调用内部",{"2":{"173":1}}],["而无需通过",{"2":{"163":1}}],["而言",{"2":{"74":1,"76":1}}],["而",{"2":{"72":1,"186":1}}],["都在上下文",{"2":{"336":1}}],["都将替换为",{"2":{"187":1}}],["都始终具有完整的命令集",{"2":{"173":1}}],["都是",{"2":{"74":1}}],["都是包含",{"2":{"72":1}}],["都存储在",{"2":{"72":1}}],["这只是一个通用指南",{"2":{"211":1}}],["这种安装方法已被弃用",{"2":{"209":1}}],["这种独立模式的意思是",{"2":{"173":1}}],["这不是拼写错误",{"2":{"208":1}}],["这不包括在解锁",{"2":{"199":1}}],["这部分现已从官方文档中移除",{"2":{"204":1}}],["这两个文件将被复制到",{"2":{"187":1}}],["这两个实际上非常相似",{"2":{"72":1}}],["这几乎意味着是",{"2":{"186":1}}],["这允许模块开发人员在安装模块之前动态调整其模块",{"2":{"186":1}}],["这里唯一的区别在于odin刷入步骤",{"2":{"202":1}}],["这里",{"2":{"183":1}}],["这样在未经您确认的情况下",{"2":{"212":1}}],["这样",{"2":{"182":1}}],["这样的命令将不使用",{"2":{"173":1}}],["这用于对比版本",{"2":{"175":1}}],["这包括所有启动脚本和模块安装脚本",{"2":{"173":1}}],["这包括决定是否启动到",{"2":{"75":1}}],["这确保脚本始终在可预测的环境中运行",{"2":{"173":1}}],["这将需要通过电脑",{"2":{"214":1}}],["这将使用您设备的官方映像",{"2":{"214":1}}],["这将使",{"2":{"212":1}}],["这将非常有用",{"2":{"182":1}}],["这将删除所有模块并自动重新启动设备",{"2":{"167":1}}],["这将触发事件",{"2":{"163":1}}],["这就是",{"2":{"164":1}}],["这完全取决于",{"2":{"76":1}}],["这些只是",{"2":{"214":1}}],["这些更改使我们能够保持沙盒完好无损",{"2":{"164":1}}],["这些二进制文件将直接在",{"2":{"157":1}}],["这些类型按首次可用时的时间顺序排序",{"2":{"76":1}}],["这些设备将只使用",{"2":{"75":1}}],["这些参数将为",{"2":{"72":1}}],["这对于不能正常解密",{"2":{"209":1}}],["这对于大多数简单的",{"2":{"181":1}}],["这对于交换整个文件夹非常方便",{"2":{"177":1}}],["这对",{"2":{"75":1}}],["这也是方法",{"2":{"74":1}}],["这意味着每个策略声明都应该用引号括起来",{"2":{"336":1}}],["这意味着它不依赖于外部工具",{"2":{"334":1}}],["这意味着应用官方",{"2":{"211":1}}],["这意味着",{"2":{"200":1}}],["这意味着该属性将在下次重新启动后恢复",{"2":{"163":1}}],["这意味着当这是",{"2":{"157":1}}],["这意味着我们可以很聪明",{"2":{"75":1}}],["这意味着就",{"2":{"74":1}}],["这意味着从谷歌的角度来看",{"2":{"74":1}}],["这个二进制文件将替换",{"2":{"335":1}}],["这个阶段发生在",{"2":{"186":1}}],["这个文件应该只包含字符串",{"2":{"181":1}}],["这个文档本质上还是机器翻译的",{"2":{"170":1}}],["这个存根应用程序的唯一功能是将完整的",{"2":{"169":1}}],["这个",{"2":{"73":1}}],["这是将要安装",{"2":{"207":1}}],["这是模块的唯一标识符",{"2":{"175":1}}],["这是",{"2":{"173":1,"175":1,"187":1}}],["这是迄今为止最糟糕的一种设备类型",{"2":{"76":1}}],["这是他们想出引导方法",{"2":{"75":1}}],["这是所有",{"2":{"73":1}}],["这是由",{"2":{"0":1}}],["和构建",{"2":{"178":1}}],["和减号",{"2":{"175":1}}],["和所有",{"2":{"164":1}}],["和所有小程序的符号链接直接存储",{"2":{"157":1}}],["和持久存储中读取",{"2":{"163":1}}],["和删除属性",{"2":{"163":1}}],["和方法",{"2":{"74":1}}],["和",{"2":{"72":3,"73":4,"74":2,"76":1,"81":1,"158":1,"163":2,"164":1,"173":2,"176":1,"177":1,"184":1,"186":1,"194":1,"201":1,"213":1,"334":3,"339":1}}],["人们也可以使用术语",{"2":{"72":1}}],["或运行时策略",{"2":{"336":1}}],["或将所有条目解压到当前目录",{"2":{"334":1}}],["或使用",{"2":{"204":1}}],["或更高版本",{"0":{"208":1},"2":{"198":1}}],["或更高版本的三星设备",{"2":{"193":1}}],["或更高版本的华为设备",{"2":{"193":1}}],["或修改它",{"2":{"190":1}}],["或过",{"2":{"186":1}}],["或第三方",{"2":{"76":1}}],["或者第三方",{"2":{"209":1}}],["或者不写",{"2":{"195":1}}],["或者您需要为某些模块文件设置特殊权限",{"2":{"182":1}}],["或者您在使用方法",{"2":{"74":1}}],["或者",{"2":{"168":1,"194":1,"197":1,"199":1}}],["或者他们正式称之为",{"2":{"75":1}}],["或",{"2":{"72":1,"75":2,"76":1,"175":1,"177":1,"183":2,"186":1,"190":1,"194":2,"195":5,"201":1,"211":1,"336":1,"337":1}}],["下面是如何使用自定义",{"2":{"187":1}}],["下载支持您设备的",{"2":{"199":1}}],["下载并安装最新的",{"2":{"194":1}}],["下载最新的",{"2":{"181":1}}],["下载",{"2":{"175":1,"204":2,"209":1,"214":1}}],["下载到其内部存储并动态加载",{"2":{"169":1}}],["下划线",{"2":{"175":1}}],["下随机创建一个文件夹",{"2":{"157":1}}],["下",{"2":{"72":1,"177":1,"213":1}}],["中备份",{"2":{"334":1}}],["中存储的",{"2":{"334":1}}],["中检测到的相应格式自动压缩",{"2":{"334":1}}],["中所述的方法",{"2":{"214":1}}],["中提取映像",{"2":{"205":1}}],["中提取出与系统属性相关的源代码来实现的",{"2":{"163":1}}],["中说明",{"2":{"201":1}}],["中添加名为",{"2":{"185":1}}],["中添加任何自定义逻辑",{"2":{"185":1}}],["中列出的文件夹中",{"2":{"184":1}}],["中运行",{"2":{"182":1,"186":1,"336":1}}],["中运行时",{"2":{"173":1}}],["中声明要替换的文件夹列表",{"2":{"184":1}}],["中声明",{"2":{"182":1}}],["中刷入",{"2":{"181":1}}],["中执行",{"2":{"173":1,"174":1}}],["中搜索",{"2":{"168":1,"334":1}}],["中找到",{"2":{"164":1}}],["中安全且不可检测的地方",{"2":{"158":1}}],["中安装",{"2":{"82":1,"183":1,"197":1}}],["中的空格分隔列表组成",{"2":{"336":1}}],["中的规则",{"2":{"336":1}}],["中的所有禁用标志",{"2":{"334":1}}],["中的重新启动按钮",{"2":{"213":1}}],["中的每个",{"2":{"187":1}}],["中的脚本以",{"2":{"186":1}}],["中的新文件将被添加到真实",{"2":{"177":1}}],["中的文件管理功能重命名文件",{"2":{"209":1}}],["中的文件",{"2":{"177":1}}],["中的文件替换",{"2":{"177":1}}],["中的文件夹",{"2":{"174":1}}],["中的现有文件将被模块",{"2":{"177":1}}],["中的内容",{"2":{"173":1}}],["中的",{"0":{"197":1},"2":{"173":1,"194":1,"201":1,"208":1,"335":2}}],["中的属性",{"2":{"163":1}}],["中的节点",{"2":{"160":1}}],["中的非易失性存储中",{"2":{"158":1}}],["中的路径",{"0":{"157":1,"158":1}}],["中的刷入",{"2":{"76":1}}],["中设置您的签名配置",{"2":{"83":1}}],["中开发",{"0":{"82":1}}],["中得到开箱即用的适当支持",{"2":{"81":1}}],["中",{"2":{"75":1,"76":1,"82":1,"157":1,"158":1,"163":1,"177":2,"186":2,"187":2}}],["中非常重要的一部分",{"2":{"74":1}}],["中使用",{"2":{"73":1}}],["中看到",{"2":{"72":1}}],["中或挂载在",{"2":{"72":1}}],["中文汉化版许可仅供参考",{"2":{"190":1}}],["中文技术文档写作规范",{"2":{"0":1}}],["中文文档",{"0":{"0":1,"189":1},"1":{"190":1,"191":1,"192":1}}],["文可能存储在",{"2":{"209":1}}],["文档结构",{"0":{"156":1},"1":{"157":1,"158":1}}],["文档链接",{"2":{"0":1}}],["文件上的",{"2":{"337":1}}],["文件资源管理器中默认不显示文件扩展名",{"2":{"209":1}}],["文件扩展名重命名为",{"2":{"209":2}}],["文件而不是",{"2":{"207":1,"208":1}}],["文件系统的大小",{"2":{"203":1}}],["文件系统可以是",{"2":{"72":1}}],["文件创建到",{"2":{"184":1}}],["文件提取到正确的位置",{"2":{"181":1}}],["文件的",{"2":{"181":1}}],["文件中的",{"2":{"181":1}}],["文件类型",{"2":{"164":1}}],["文件重定向到",{"2":{"160":1}}],["文件夹可能不再存在",{"2":{"187":1}}],["文件夹可能不存在",{"2":{"157":1}}],["文件夹中",{"2":{"187":1}}],["文件夹以模块的",{"2":{"174":1}}],["文件夹的权限默认为",{"2":{"158":1}}],["文件夹的设备",{"2":{"157":1}}],["文件夹是因为其具有以下优点",{"2":{"158":1}}],["文件夹",{"0":{"177":1},"2":{"79":1,"158":1,"174":2,"187":2}}],["文件夹或文件系统",{"2":{"72":1}}],["文件",{"2":{"72":1,"187":2,"195":1,"196":1,"334":7,"336":1,"337":1}}],["根目录覆盖系统",{"0":{"187":1}}],["根目录修补程序文件",{"2":{"157":1}}],["根目录",{"2":{"72":1}}],["根据您的设备运行的",{"2":{"204":1}}],["根据您的选择",{"2":{"190":1}}],["根据",{"2":{"0":1}}],["术语",{"0":{"72":1}}],["官方的",{"2":{"214":1}}],["官方仓库",{"2":{"191":1}}],["官方调试版本并重新安装",{"2":{"83":1}}],["官方",{"2":{"70":1,"77":1,"154":1,"165":1,"171":1,"188":1,"210":1,"215":1,"332":1,"340":1}}],["官方文档",{"2":{"0":2,"189":1,"191":1}}],["=格式",{"2":{"334":1}}],["=",{"2":{"62":1,"72":2,"73":5,"74":1,"179":1}}],["+x",{"2":{"186":1}}],["+$",{"2":{"175":1}}],["+",{"2":{"27":1,"82":1,"93":1,"197":3,"203":3,"206":1,"334":1}}],["8+",{"2":{"79":1}}],["8",{"0":{"25":1,"26":1,"27":1,"207":1},"2":{"101":1,"164":2,"193":1,"204":2,"207":1,"268":1,"308":1,"312":1}}],["essential",{"2":{"243":1,"249":1}}],["especially",{"2":{"139":1}}],["edde",{"2":{"192":1}}],["edge",{"2":{"128":1}}],["either",{"2":{"190":1,"218":1}}],["echo",{"2":{"184":1}}],["efforts",{"2":{"226":1}}],["effort",{"2":{"220":1}}],["efficient",{"2":{"129":1}}],["effective",{"2":{"217":1,"264":1,"292":1,"298":1}}],["effectively",{"2":{"217":1}}],["effect",{"2":{"96":1,"283":1}}],["everlasting",{"2":{"292":1,"298":1}}],["ever",{"2":{"281":1,"292":1,"298":1,"308":1,"309":1,"312":1,"313":1}}],["everyone",{"2":{"253":1}}],["every",{"2":{"142":1,"256":1,"265":1,"268":1,"294":1,"300":1,"308":1,"312":1}}],["everything",{"2":{"119":1,"132":1,"140":1,"142":1,"147":1,"281":1}}],["events",{"2":{"232":2}}],["eventually",{"2":{"219":1,"224":1}}],["even",{"2":{"119":1,"190":1,"218":1,"223":1,"232":2,"241":1,"247":1,"320":1,"327":1}}],["eliminate",{"2":{"145":1}}],["eliminates",{"2":{"118":1}}],["elsewhere",{"2":{"96":1}}],["emmc",{"2":{"138":2}}],["empty",{"2":{"122":1,"169":1}}],["embed",{"2":{"135":1}}],["embedded",{"2":{"118":1}}],["embryo",{"2":{"116":1}}],["emulator",{"2":{"116":1,"318":2,"325":2}}],["emui",{"0":{"206":1,"207":1,"208":1,"223":1},"2":{"108":1,"112":1,"117":1,"193":1,"204":5,"207":1,"208":1}}],["erecovery",{"2":{"204":1,"206":1}}],["erofs",{"2":{"108":1,"241":1,"247":1}}],["error",{"2":{"27":1,"41":1,"43":1,"86":1,"91":1,"105":1,"303":1,"334":2}}],["errors",{"2":{"24":1,"94":2,"117":2,"289":2}}],["etc",{"2":{"93":1,"102":1,"144":1,"266":1}}],["easy",{"2":{"257":1}}],["easier",{"2":{"220":1}}],["easily",{"2":{"24":1,"241":1,"247":1}}],["each",{"2":{"138":1}}],["early",{"2":{"91":1,"108":1,"111":1,"114":2,"117":1,"135":1,"187":2,"248":1,"303":1,"308":1,"312":1}}],["e",{"2":{"27":1,"29":1,"45":1,"89":1,"100":1,"110":1,"115":1,"119":1,"126":1,"219":1,"241":1,"247":1,"256":1,"265":1}}],["ensure",{"2":{"309":1,"313":1}}],["enhancements",{"0":{"309":1,"313":1}}],["enhanced",{"2":{"217":1}}],["enjoy",{"2":{"236":1,"253":1}}],["enough",{"2":{"232":1}}],["entry",{"2":{"124":1,"146":1,"334":13}}],["entering",{"2":{"22":1}}],["encourages",{"2":{"229":1}}],["encoder",{"2":{"137":1}}],["encoded",{"2":{"135":1}}],["encode",{"2":{"119":1}}],["encryption",{"2":{"43":1,"87":1,"95":1,"114":1,"128":1,"134":1,"158":1,"286":1,"315":1}}],["env",{"2":{"93":1,"334":3}}],["environment",{"2":{"26":1,"27":1,"45":1,"129":2,"265":3,"320":1,"327":1,"338":1}}],["enforced",{"2":{"142":1,"229":1,"241":1,"247":1}}],["enforce",{"2":{"88":1,"89":1,"139":1,"140":1,"219":1,"309":1,"313":1,"336":1}}],["end",{"2":{"46":1,"220":1,"230":1,"267":1}}],["enable",{"2":{"23":1,"102":1,"116":1,"135":1,"266":1,"337":1}}],["enabled",{"2":{"19":1,"22":1,"102":1,"138":1,"152":1,"176":1,"224":1,"264":2,"265":1,"266":1,"294":1,"300":1}}],["example",{"2":{"187":2,"308":1,"312":1}}],["exit",{"2":{"184":1,"185":1}}],["existence",{"2":{"230":1}}],["exists",{"2":{"101":1,"111":1,"113":1,"334":1}}],["exist",{"2":{"43":1,"134":1,"268":1,"308":1,"312":1}}],["existing",{"0":{"280":1},"2":{"8":1,"24":1,"86":1,"95":1,"218":1,"229":3,"230":1,"236":1,"241":2,"247":2,"282":1,"286":1,"292":1,"298":1,"319":1,"326":1}}],["exynos",{"2":{"151":1}}],["exceptions",{"2":{"129":1}}],["except",{"2":{"129":1}}],["excessive",{"2":{"23":1}}],["extremely",{"2":{"228":1,"232":2}}],["extreme",{"2":{"111":1,"145":1}}],["extractor",{"2":{"205":1}}],["extract",{"2":{"135":2,"151":1,"334":1}}],["extracting",{"2":{"134":1}}],["extraction",{"2":{"89":1}}],["extra",{"2":{"101":1,"113":1,"118":1,"229":1,"334":1}}],["ext",{"2":{"93":1,"157":1,"174":2,"177":2}}],["ext4",{"2":{"85":1,"111":1,"116":1,"118":1,"121":1,"138":1,"230":2,"241":1,"247":1,"324":1}}],["external",{"2":{"42":2,"45":1,"138":1,"265":1,"308":1,"312":1}}],["extension",{"2":{"24":1,"42":1,"94":1,"289":1}}],["executed",{"2":{"125":1,"142":1}}],["execute",{"2":{"105":1}}],["executing",{"2":{"100":1,"130":1}}],["execution",{"2":{"91":1,"303":1}}],["exec",{"2":{"73":3,"135":1,"164":2,"337":1}}],["expected",{"2":{"248":1,"257":1}}],["expect",{"2":{"219":1,"234":1}}],["experienced",{"2":{"257":1}}],["experience",{"2":{"21":1,"38":1,"225":1,"280":1}}],["exposes",{"2":{"217":1}}],["exported",{"2":{"88":1}}],["expanding",{"2":{"64":1,"272":1}}],["k60pro",{"2":{"194":1}}],["ko",{"2":{"187":3}}],["kotlin",{"2":{"14":1,"81":1}}],["k",{"2":{"144":1}}],["knox",{"2":{"139":2,"199":1}}],["know",{"2":{"47":1,"217":1}}],["kitkat",{"2":{"224":1,"285":1,"288":1}}],["kinds",{"2":{"138":1,"308":1,"312":1}}],["kill",{"2":{"116":1}}],["killed",{"2":{"105":1}}],["kirin",{"2":{"109":1,"112":1}}],["kmsg",{"2":{"104":1}}],["key",{"2":{"179":1,"264":1}}],["keys",{"2":{"12":1,"253":1,"309":1,"313":1}}],["kernel",{"2":{"93":2,"98":1,"100":2,"101":1,"102":1,"117":1,"118":1,"122":1,"135":1,"137":1,"139":2,"147":1,"194":1,"217":1,"230":1,"241":1,"247":1,"266":1,"268":1,"275":1,"277":1,"334":4}}],["kernels",{"2":{"89":2,"116":1,"139":2,"308":1,"312":1}}],["keeps",{"2":{"268":1}}],["keepforceencrypt",{"2":{"39":1,"334":1}}],["keepverity",{"2":{"39":1,"116":1,"334":2}}],["numerous",{"2":{"256":1}}],["number",{"2":{"244":1,"250":1}}],["numbers",{"2":{"72":1}}],["null",{"2":{"117":1}}],["nslookup",{"2":{"265":1}}],["ns",{"2":{"117":1}}],["n",{"2":{"76":1,"163":1,"186":1,"334":4,"339":1}}],["ndk",{"2":{"72":1,"79":2,"82":4,"123":1,"130":1}}],["never",{"2":{"318":1,"325":1}}],["necessarily",{"2":{"281":1}}],["necessary",{"2":{"43":1,"95":1,"241":1,"247":1,"286":1}}],["near",{"2":{"219":1}}],["nearly",{"2":{"142":2,"150":1}}],["next",{"2":{"219":1,"242":1,"294":1,"300":1}}],["needs",{"2":{"281":1}}],["need",{"2":{"102":1,"266":1}}],["needed",{"2":{"42":1,"44":1,"45":1}}],["net",{"2":{"65":1,"145":1}}],["newer",{"2":{"88":1,"126":1}}],["newline",{"2":{"46":1,"99":1,"273":1}}],["newly",{"2":{"21":1,"223":1}}],["new",{"0":{"241":1,"247":1,"257":1,"319":1,"320":1,"326":1,"327":1},"2":{"11":1,"14":2,"15":1,"18":1,"19":1,"21":2,"22":1,"23":1,"24":2,"27":2,"28":1,"39":2,"41":1,"42":1,"47":1,"54":1,"61":1,"63":1,"86":3,"88":1,"89":1,"90":1,"93":2,"101":2,"107":3,"110":2,"111":2,"113":2,"115":1,"116":1,"118":2,"122":3,"126":1,"129":1,"131":1,"132":3,"134":1,"135":1,"138":3,"140":1,"142":1,"144":1,"145":2,"147":1,"148":1,"152":1,"187":2,"218":3,"222":2,"229":5,"232":3,"241":2,"242":1,"244":1,"247":2,"248":1,"250":1,"252":1,"253":2,"255":2,"256":1,"257":3,"268":1,"270":1,"305":1,"308":1,"309":1,"312":1,"313":1,"319":1,"320":1,"321":5,"326":1,"327":1,"328":5,"334":1}}],["nature",{"2":{"320":1,"327":1}}],["native",{"0":{"231":1},"2":{"20":1,"32":1,"47":1,"81":1,"82":1,"111":1,"113":1,"135":1,"138":1,"174":2,"231":2,"236":1}}],["natively",{"2":{"20":1,"113":1}}],["nasty",{"2":{"130":1,"131":1}}],["naive",{"2":{"124":1}}],["nand",{"2":{"102":1,"266":1}}],["naming",{"2":{"102":1,"266":1}}],["name=",{"2":{"175":1}}],["names",{"2":{"66":1,"72":1,"95":1,"106":1,"113":2,"115":1,"118":1,"124":1,"217":4,"286":1}}],["namespace",{"2":{"45":1,"53":1,"93":1,"98":1,"101":1,"108":1,"118":2,"138":1,"144":2,"277":1}}],["name",{"2":{"12":1,"13":1,"21":2,"33":1,"66":1,"94":1,"105":1,"131":1,"142":1,"186":1,"194":2,"217":3,"218":1,"253":1,"289":1,"336":6,"339":6}}],["navigation",{"2":{"93":1}}],["nosuid",{"2":{"157":1}}],["nook",{"2":{"122":1,"124":1}}],["nougat",{"2":{"113":1,"152":1}}],["none",{"2":{"218":1,"318":1,"325":1}}],["non",{"2":{"106":1,"111":1,"113":1,"116":1,"123":1,"126":1}}],["nodes",{"2":{"102":1,"110":1,"266":1}}],["normal",{"0":{"280":1},"2":{"47":1,"282":1}}],["noticed",{"2":{"318":1,"325":1}}],["notify",{"2":{"109":1}}],["notification",{"2":{"46":1}}],["notifications",{"2":{"21":1,"24":1,"46":1,"49":1,"60":1,"61":1,"63":1}}],["notable",{"2":{"246":1}}],["nothing",{"2":{"140":1,"220":1}}],["notorious",{"2":{"132":1}}],["notes",{"2":{"102":1,"246":1,"266":1,"270":1,"272":1,"275":1,"285":1,"297":1,"311":1,"324":1,"332":1}}],["note",{"2":{"58":1,"76":1,"140":1,"147":1,"253":1,"257":1,"285":1,"288":1}}],["not",{"2":{"18":1,"23":1,"26":1,"34":1,"57":1,"60":1,"63":1,"66":1,"67":1,"88":1,"93":1,"96":1,"100":1,"106":1,"110":1,"113":1,"118":2,"119":2,"126":1,"134":3,"138":2,"139":1,"142":2,"144":1,"145":1,"146":1,"149":1,"150":1,"151":1,"152":1,"190":1,"218":1,"219":1,"224":1,"229":1,"232":1,"234":1,"241":7,"242":1,"247":7,"253":2,"257":1,"265":1,"267":1,"280":1,"283":1,"292":1,"298":1,"308":2,"309":3,"312":2,"313":3,"320":1,"327":1}}],["no",{"2":{"15":1,"20":1,"21":1,"24":1,"46":1,"67":1,"76":1,"82":1,"96":1,"101":1,"107":2,"108":1,"111":1,"114":1,"119":1,"135":1,"142":2,"144":2,"146":1,"151":1,"194":1,"218":3,"226":1,"230":1,"241":3,"247":3,"256":1,"257":1,"264":3,"265":2,"267":1,"268":2,"281":1,"291":1,"297":1,"308":1,"312":1,"317":1,"318":1,"324":1,"325":1,"339":1}}],["now",{"2":{"14":1,"22":1,"24":1,"27":1,"33":1,"41":1,"42":3,"44":1,"45":1,"60":1,"61":2,"65":1,"66":2,"93":1,"96":1,"101":1,"107":1,"111":2,"113":1,"119":1,"135":1,"137":1,"138":1,"139":2,"142":6,"144":2,"145":3,"150":1,"152":4,"224":1,"225":1,"230":2,"231":1,"234":1,"241":1,"243":2,"247":2,"248":1,"249":2,"253":1,"257":1,"268":1,"282":1,"291":1,"293":1,"297":1,"299":1,"321":1,"328":1}}],["9+",{"2":{"208":1}}],["960",{"2":{"112":1}}],["9",{"0":{"24":2,"208":1,"223":1,"240":1,"285":1},"1":{"241":1,"242":1,"243":1,"244":1,"245":1,"286":1,"287":1},"2":{"12":1,"96":1,"108":1,"111":1,"112":1,"175":1,"193":1,"198":1,"244":1,"250":1,"253":3,"282":1}}],["http",{"2":{"190":2}}],["https",{"2":{"0":2,"72":1,"79":1}}],["huawei",{"2":{"107":1,"123":1,"150":1,"205":1,"223":4,"256":1}}],["hugely",{"2":{"108":1}}],["huge",{"2":{"15":1,"16":1,"118":1,"230":1,"244":1,"250":1}}],["heard",{"2":{"294":1,"300":1}}],["heavily",{"2":{"240":1,"253":1}}],["head",{"2":{"308":1,"312":1,"321":1,"328":1}}],["headache",{"2":{"230":1}}],["headers",{"2":{"95":1,"105":1,"113":2,"118":1,"122":1,"131":1,"139":1,"286":1}}],["header",{"2":{"93":1,"98":2,"99":2,"100":1,"105":1,"108":1,"114":1,"124":1,"273":2,"277":2,"334":2}}],["heimdall",{"2":{"199":1}}],["hexpattern2",{"2":{"334":2}}],["hexpattern1",{"2":{"334":2}}],["hexpatch",{"2":{"114":1,"116":1,"139":1,"334":1}}],["hex",{"2":{"147":1}}],["here",{"2":{"142":1,"216":1,"232":1,"236":1,"267":1,"268":5}}],["hey",{"2":{"142":1,"223":1,"317":1,"324":1}}],["helpers",{"2":{"147":1}}],["help",{"2":{"101":1,"308":1,"312":1,"336":1,"338":1,"339":1}}],["h",{"2":{"80":2,"334":2,"338":1,"339":1}}],["hats",{"2":{"309":1,"313":1}}],["half",{"2":{"267":1}}],["happy",{"2":{"255":1,"275":1}}],["happen",{"2":{"145":1}}],["happening",{"2":{"47":1}}],["had",{"2":{"223":1,"267":1,"308":1,"312":1}}],["hack",{"2":{"142":1}}],["has",{"2":{"142":1,"147":1,"220":1,"223":1,"230":1,"241":2,"247":2,"264":1,"267":2,"291":1,"292":1,"297":2,"298":1,"308":2,"309":1,"312":2,"313":1,"318":1,"319":1,"320":2,"321":1,"325":1,"326":1,"327":2,"328":1}}],["hardware",{"2":{"264":1,"318":1,"325":1}}],["hardlink",{"2":{"117":1}}],["hardlinking",{"2":{"41":1}}],["hardened",{"2":{"101":1}}],["handshake",{"2":{"118":1}}],["handful",{"2":{"108":1}}],["handled",{"2":{"150":1}}],["handle",{"2":{"39":1,"54":1,"63":1,"97":1,"104":1,"118":1,"119":1,"132":1,"144":1,"276":1}}],["handling",{"2":{"33":1,"91":1,"121":1,"131":1,"303":1}}],["hanging",{"2":{"46":1}}],["have",{"2":{"21":1,"107":1,"140":1,"190":1,"217":1,"219":1,"223":1,"224":2,"241":1,"244":2,"247":1,"250":2,"253":2,"264":1,"265":1,"292":1,"298":1,"318":1,"325":1}}],["hot",{"2":{"275":1,"308":1,"312":1}}],["hotfix",{"2":{"149":1}}],["host",{"2":{"152":1}}],["hosts",{"2":{"21":1,"113":2,"137":1,"142":1}}],["hope",{"2":{"151":1,"190":1}}],["hopefully",{"2":{"108":1}}],["hook",{"2":{"321":2,"328":2}}],["hooking",{"2":{"89":1}}],["hood",{"2":{"27":1,"33":1,"112":1,"213":1}}],["however",{"2":{"219":1,"226":1,"231":1,"233":1,"240":1,"241":1,"247":1,"256":1,"267":1,"318":1,"325":1}}],["how",{"2":{"41":1,"96":1,"150":1,"241":1,"247":1,"257":1,"265":2,"268":1,"308":1,"312":1,"319":1,"326":1}}],["home",{"2":{"9":1,"129":1,"201":1,"202":1,"203":1}}],["history",{"2":{"231":1,"267":1}}],["hit",{"2":{"138":1,"240":1}}],["hi6250",{"2":{"109":1}}],["hijacking",{"2":{"118":1}}],["hijack",{"2":{"88":1}}],["highly",{"2":{"292":1,"298":1}}],["highlights",{"0":{"268":1},"2":{"236":1}}],["highlight",{"2":{"9":1}}],["higher",{"2":{"224":1,"285":1,"288":1}}],["highest",{"2":{"45":1,"151":1}}],["high",{"2":{"122":1,"129":1,"336":1}}],["highcomp",{"2":{"39":1}}],["hiding",{"0":{"253":1,"282":1},"2":{"12":1,"21":2,"39":1,"41":1,"96":1,"98":1,"100":1,"119":1,"131":1,"138":1,"144":1,"226":1,"253":2,"277":1,"282":1,"292":2,"298":2}}],["hide",{"2":{"12":1,"44":2,"58":1,"66":2,"67":1,"94":1,"113":1,"137":1,"138":1,"139":1,"144":3,"145":1,"146":1,"217":2,"241":1,"247":1,"253":2,"282":1,"289":1}}],["hidden",{"0":{"280":1},"2":{"11":1,"12":1,"27":2,"94":2,"118":2,"119":1,"131":1,"253":1,"282":1,"289":2}}],["job",{"2":{"256":1}}],["jump",{"2":{"226":1,"291":1,"297":1}}],["justice",{"2":{"228":1}}],["just",{"2":{"47":1,"93":1,"138":1,"150":1,"230":1,"281":1}}],["jellybean",{"2":{"224":2,"285":1,"288":1}}],["jesse205",{"2":{"0":2}}],["json",{"2":{"175":2}}],["jsid=",{"2":{"175":1}}],["js",{"2":{"175":1,"201":1}}],["jsdelivr",{"2":{"8":1}}],["jdk",{"2":{"79":3}}],["java",{"2":{"33":1,"47":1,"81":1,"217":1}}],["jni",{"2":{"33":1}}],["riru",{"2":{"294":1,"300":1}}],["right",{"2":{"291":1,"297":1}}],["rid",{"2":{"130":1}}],["rw",{"2":{"211":1,"241":2,"247":2}}],["rm",{"2":{"173":2,"265":1,"334":1,"337":1}}],["rkp",{"2":{"139":1}}],["r10e",{"2":{"130":1}}],["r",{"2":{"119":2,"142":1,"158":1,"184":2,"334":2,"336":1}}],["rc",{"2":{"86":1,"111":1,"135":1,"146":2,"160":1,"163":1,"187":12}}],["rv",{"2":{"72":3,"73":3}}],["robust",{"2":{"100":1}}],["ro",{"2":{"95":1,"139":1,"140":5,"145":3,"286":1}}],["rom",{"2":{"74":1,"128":1,"194":1}}],["roms",{"2":{"57":1,"102":1,"116":1,"151":1,"266":1}}],["rock",{"2":{"41":1}}],["rooted",{"2":{"268":1}}],["rootfs",{"2":{"72":2,"73":4,"87":1,"101":1,"241":2,"247":2,"315":1}}],["rootdir",{"2":{"72":3,"73":4,"74":1,"75":2,"157":1}}],["root",{"0":{"168":1,"198":1,"241":1,"244":1,"247":1,"250":1},"1":{"199":1,"200":1,"201":1,"202":1,"203":1},"2":{"22":1,"23":1,"26":1,"33":1,"38":1,"44":1,"47":1,"54":1,"60":1,"65":1,"67":1,"72":1,"79":1,"82":2,"83":1,"85":1,"93":1,"97":1,"99":1,"101":1,"104":1,"107":6,"109":1,"110":2,"111":1,"116":3,"118":1,"119":1,"142":3,"143":1,"144":6,"147":3,"150":1,"151":3,"152":1,"157":1,"158":3,"160":2,"163":2,"164":4,"168":1,"187":1,"202":1,"214":4,"217":1,"224":1,"236":1,"240":1,"241":9,"242":2,"244":1,"247":9,"248":2,"250":1,"273":1,"276":1,"292":2,"298":2,"309":6,"313":6,"324":1,"335":1,"336":1}}],["rather",{"2":{"280":1}}],["rate",{"2":{"151":1}}],["raw",{"2":{"113":1}}],["rampant",{"2":{"309":1,"313":1}}],["ramdis",{"2":{"208":2}}],["ramdisk",{"2":{"72":2,"73":2,"75":4,"76":9,"88":1,"107":1,"111":1,"124":1,"125":1,"127":1,"129":1,"135":1,"144":2,"150":1,"151":1,"187":1,"194":8,"197":1,"201":2,"207":5,"208":4,"209":1,"334":6,"335":1}}],["ram",{"2":{"39":1}}],["range",{"2":{"219":1}}],["randomly",{"2":{"268":1}}],["randomize",{"2":{"115":1}}],["random",{"2":{"12":1,"33":1,"107":2,"187":4,"201":1}}],["ran",{"2":{"8":1}}],["rule",{"0":{"180":1,"320":1,"327":1},"2":{"94":1,"95":1,"100":1,"140":1,"142":1,"174":1,"209":1,"256":1,"257":1,"286":1,"289":1,"320":1,"327":1,"336":1}}],["rules",{"2":{"19":1,"86":2,"87":1,"94":1,"101":1,"102":1,"113":2,"119":1,"122":1,"123":1,"126":1,"138":1,"139":1,"164":1,"229":1,"266":1,"268":2,"289":1,"315":1}}],["rustup",{"2":{"82":3}}],["rust",{"0":{"82":1},"2":{"82":9,"87":1,"315":1}}],["run",{"2":{"111":1,"116":1,"119":1,"135":1,"138":1,"139":1,"142":1,"145":1,"147":1,"152":1,"218":1,"232":1,"253":1,"265":1,"294":2,"300":2,"318":1,"325":1}}],["runcon",{"2":{"102":1,"266":1}}],["runs",{"2":{"93":1,"142":1,"231":1,"308":1,"312":1}}],["runtime",{"2":{"44":1}}],["running",{"2":{"26":1,"89":2,"91":1,"95":1,"139":1,"142":1,"224":1,"242":1,"253":1,"286":1,"303":1}}],["reinstall",{"2":{"230":1,"236":1}}],["rename",{"2":{"140":1}}],["renamed",{"2":{"138":1,"281":1}}],["render",{"2":{"20":1,"45":1}}],["reject",{"2":{"106":1}}],["regarding",{"2":{"257":1}}],["regardless",{"2":{"253":1}}],["region",{"2":{"102":1,"266":1}}],["regressions",{"2":{"95":1,"285":1,"286":1,"288":1}}],["regression",{"2":{"85":1,"275":1,"318":1,"324":1,"325":1}}],["reverted",{"2":{"264":1}}],["reverts",{"2":{"241":1,"247":1}}],["revert",{"2":{"93":1,"241":1,"247":1}}],["revoking",{"2":{"85":1,"324":1}}],["reuse",{"2":{"89":1,"309":1,"313":1}}],["refining",{"2":{"270":1}}],["refined",{"2":{"60":1,"61":1,"321":1,"328":1}}],["refuse",{"2":{"230":1}}],["refer",{"2":{"96":1,"187":1}}],["refactoring",{"2":{"321":1,"328":1}}],["refactor",{"2":{"68":1,"129":1}}],["refresh",{"2":{"42":1}}],["refreshing",{"2":{"28":1}}],["relied",{"2":{"308":1,"312":1}}],["relies",{"2":{"253":1}}],["reliable",{"2":{"45":1,"265":1}}],["rely",{"2":{"241":1,"247":1,"253":1,"308":1,"312":1,"318":1,"325":1}}],["related",{"2":{"113":1,"118":2,"265":1}}],["relevant",{"2":{"100":1,"142":1}}],["released",{"2":{"111":1,"264":1,"281":1}}],["releases",{"2":{"72":1,"234":1,"270":1,"272":1,"275":1,"285":1}}],["release",{"2":{"58":1,"86":1,"102":1,"140":1,"153":1,"216":1,"226":1,"228":2,"232":1,"233":1,"236":2,"240":2,"246":1,"255":1,"264":1,"266":1,"267":2,"270":1,"272":1,"275":1,"280":1,"281":1,"282":1,"285":2,"288":1,"291":1,"297":2,"303":1,"307":1,"311":2,"315":1,"320":1,"324":1,"327":1,"332":1}}],["rewritten",{"2":{"47":1,"101":2,"145":2,"267":1,"308":1,"312":1}}],["rewrite",{"0":{"308":1,"312":1},"2":{"9":1,"44":1,"45":1,"46":1,"52":1,"86":3,"95":1,"129":2,"150":1,"286":1,"319":1,"326":1}}],["reasons",{"2":{"267":1,"320":1,"327":1}}],["reason",{"2":{"242":1,"265":1}}],["ready",{"2":{"108":1,"264":1}}],["readlinkat",{"2":{"102":1,"266":1}}],["read",{"2":{"61":1,"97":1,"138":1,"140":1,"229":1,"241":1,"247":1,"257":1,"276":1}}],["reading",{"2":{"46":1,"99":1,"142":1,"273":1}}],["readme",{"2":{"45":1,"61":1}}],["realize",{"2":{"309":1,"313":1}}],["really",{"2":{"307":1,"309":1,"311":1,"313":1}}],["realme",{"2":{"93":1}}],["real",{"2":{"42":1,"93":1}}],["recap",{"2":{"218":1}}],["recently",{"2":{"217":1}}],["received",{"2":{"190":1}}],["receive",{"2":{"44":1}}],["recursive",{"2":{"184":2}}],["recurse",{"2":{"79":1}}],["recyclerview",{"2":{"47":1}}],["recompression",{"2":{"107":1}}],["recommended",{"2":{"39":1,"241":1,"247":1}}],["recoveries",{"2":{"47":1,"52":1}}],["recovery或",{"2":{"203":1}}],["recovery模式",{"2":{"201":1}}],["recovery",{"0":{"197":1,"209":1},"2":{"14":1,"72":2,"75":8,"76":5,"87":1,"88":1,"102":1,"105":3,"110":3,"114":1,"118":1,"142":1,"184":1,"194":3,"195":7,"196":1,"197":10,"201":2,"206":3,"207":3,"208":13,"209":4,"214":5,"244":1,"250":1,"265":1,"266":1,"281":2,"315":1,"320":2,"327":2,"334":1}}],["reconstructing",{"2":{"27":1}}],["remounting",{"2":{"241":1,"247":1}}],["remount",{"2":{"241":1,"247":1}}],["remounts",{"2":{"241":1,"247":1}}],["removal",{"0":{"292":1,"298":1},"2":{"105":1,"131":1,"145":1}}],["removing",{"2":{"67":1,"136":1}}],["removes",{"2":{"102":1,"266":1}}],["removed",{"2":{"24":1,"61":1,"93":2,"142":2,"152":1,"229":1,"293":1,"299":1}}],["remove",{"2":{"22":1,"27":1,"29":1,"33":1,"41":1,"43":1,"45":2,"66":1,"94":2,"100":1,"105":1,"107":2,"111":1,"113":4,"114":1,"116":2,"119":4,"120":1,"131":1,"134":2,"136":1,"138":4,"139":1,"143":1,"145":1,"147":2,"152":1,"167":2,"174":1,"289":2,"337":1}}],["remain",{"2":{"27":1,"308":1,"312":1}}],["research",{"2":{"234":1}}],["resetprop",{"0":{"163":1,"339":1},"2":{"42":1,"93":1,"95":1,"115":1,"119":1,"122":1,"132":1,"134":1,"136":1,"138":3,"142":1,"145":3,"163":2,"174":1,"186":1,"224":1,"286":1,"333":1,"337":1,"339":2}}],["reset",{"2":{"27":1,"100":1,"142":1}}],["res",{"2":{"187":4}}],["resize2fs",{"2":{"132":1,"230":1}}],["resizing",{"2":{"132":1,"230":2}}],["respawn",{"2":{"118":1}}],["response",{"2":{"24":1}}],["results",{"2":{"265":1}}],["result",{"2":{"98":1,"132":1,"145":1,"277":1}}],["resolve",{"2":{"95":1,"96":1,"286":1}}],["resources",{"2":{"118":1}}],["resource",{"2":{"39":1}}],["restart",{"2":{"337":1}}],["restarted",{"2":{"132":1}}],["restarts",{"2":{"89":1,"132":1}}],["restrictions",{"2":{"111":1,"135":1,"309":1,"313":1}}],["restorecon",{"2":{"132":1,"337":1}}],["restore",{"0":{"280":1},"2":{"24":1,"33":1,"44":1,"85":1,"93":1,"131":1,"144":1,"253":1,"282":1,"324":1,"334":1}}],["restoring",{"2":{"21":1,"135":1}}],["re",{"2":{"24":1,"51":1,"54":1,"55":1,"96":1,"119":1,"137":1,"142":1,"253":1,"308":1,"312":1,"320":1,"327":1}}],["represent",{"2":{"257":1}}],["replacement",{"2":{"253":1}}],["replaces",{"2":{"229":1}}],["replaced",{"2":{"119":1,"218":1}}],["replace",{"2":{"118":1,"145":1,"177":1,"184":5,"241":1,"247":1}}],["replacing",{"2":{"86":1,"107":1,"142":1}}],["repack",{"2":{"334":1}}],["repackaged",{"2":{"27":1,"118":1,"253":2}}],["repackaging",{"2":{"19":1,"21":2,"33":1,"39":1,"41":1,"90":1,"305":1}}],["repair",{"2":{"113":1}}],["reported",{"2":{"119":1}}],["reporting",{"2":{"118":1}}],["repo",{"0":{"293":1,"299":1},"2":{"25":1,"28":1,"30":1,"42":2,"47":1,"52":1,"61":1,"64":2,"93":1,"138":1,"293":2,"299":2}}],["repository",{"2":{"321":1,"328":1}}],["repos",{"2":{"23":1,"37":1,"41":1,"48":1,"56":1,"66":1}}],["requiring",{"2":{"139":1}}],["required",{"2":{"93":1,"139":1,"142":1,"229":1,"320":1,"327":1}}],["require",{"2":{"42":1,"217":1,"265":1}}],["requirement",{"2":{"28":1,"33":1,"135":1}}],["requires",{"2":{"22":1,"217":1,"248":1,"257":1}}],["request",{"2":{"39":1,"42":1,"44":1,"91":1,"104":1,"138":2,"303":1}}],["requests",{"2":{"33":1,"35":1,"63":1}}],["requesting",{"2":{"7":1,"109":1}}],["redistribute",{"2":{"190":1}}],["reduces",{"2":{"101":1}}],["reduce",{"2":{"20":1,"62":1,"101":1,"118":1,"119":1,"138":1,"142":1,"144":1}}],["redesigned",{"2":{"264":1,"267":1,"268":1}}],["redesign",{"2":{"20":1}}],["reboots",{"2":{"142":1}}],["reboot",{"2":{"15":2,"27":1,"39":1,"43":1,"87":1,"111":1,"253":2,"268":1,"315":1}}],["ln",{"2":{"334":1}}],["ll",{"2":{"267":1}}],["l",{"2":{"194":2,"338":1}}],["lf",{"2":{"175":1}}],["ls",{"2":{"173":2,"194":2,"337":1}}],["lzma",{"2":{"137":3,"334":3}}],["lzma2",{"2":{"111":1}}],["lz4",{"2":{"86":1,"91":2,"96":1,"100":2,"103":1,"132":1,"139":2,"260":1,"283":1,"303":2,"334":8}}],["ld",{"2":{"100":1,"118":1,"160":1}}],["lg",{"2":{"91":1,"96":1,"100":1,"132":1,"283":1,"303":1,"334":2}}],["lt",{"2":{"73":2,"91":1,"113":3,"173":2,"174":16,"175":14,"181":3,"184":16,"186":2,"187":6,"190":2,"214":1,"217":2,"218":4,"303":1,"334":27,"336":1}}],["lv",{"2":{"72":3,"73":4,"74":1}}],["let",{"2":{"255":1,"291":1,"292":1,"297":1,"298":1}}],["leaving",{"2":{"318":1,"325":1}}],["leads",{"2":{"139":1,"256":1,"281":1}}],["leaked",{"2":{"217":1}}],["leaks",{"2":{"62":1}}],["leak",{"2":{"46":1}}],["length",{"2":{"107":1}}],["level",{"2":{"102":1,"266":1}}],["levels",{"2":{"72":1}}],["legacy",{"0":{"219":1},"2":{"86":1,"88":1,"91":1,"99":1,"100":2,"103":1,"132":1,"139":1,"142":1,"147":1,"219":1,"260":1,"273":1,"303":1,"334":3}}],["less",{"2":{"62":1,"118":1,"225":1,"268":1}}],["licenses",{"2":{"190":2}}],["license",{"0":{"190":1},"2":{"190":4}}],["live",{"0":{"281":1},"2":{"139":1,"150":1,"230":1,"256":2,"321":1,"328":1,"336":1}}],["liveboot",{"2":{"138":1}}],["life",{"2":{"138":1}}],["limited",{"2":{"119":1}}],["limitations",{"2":{"51":1}}],["libfoo",{"2":{"187":3}}],["lib",{"2":{"145":1}}],["libs",{"2":{"144":1}}],["libselinux",{"2":{"138":1}}],["libsepol",{"2":{"128":1,"138":1}}],["libsqlite",{"2":{"96":1,"100":1,"102":1,"138":1,"266":1,"283":1}}],["libraries",{"2":{"107":1}}],["library",{"2":{"23":1,"86":1,"100":1}}],["libc",{"2":{"94":1,"138":1,"289":1}}],["lines",{"2":{"114":1}}],["lineage",{"2":{"102":1,"266":1}}],["line",{"2":{"86":1,"142":1}}],["linux",{"2":{"72":3,"75":2,"79":1,"129":2,"139":1,"199":1,"217":1,"275":1,"336":1}}],["links",{"2":{"267":1}}],["linker",{"2":{"130":1}}],["linked",{"2":{"114":1,"268":1}}],["linking",{"2":{"100":1,"137":1}}],["link",{"2":{"61":2,"82":1,"138":1,"144":1}}],["lists",{"2":{"114":1}}],["list",{"2":{"27":1,"41":1,"63":1,"64":1,"66":1,"113":1,"138":1,"145":1,"217":2,"242":1,"337":1}}],["little",{"2":{"23":1,"39":1,"225":1}}],["likely",{"2":{"253":1}}],["like",{"2":{"8":1,"47":1,"131":2,"150":1,"218":1,"281":1,"308":1,"312":1}}],["lack",{"2":{"293":1,"299":1}}],["layman",{"2":{"232":1}}],["lazy",{"2":{"151":1}}],["later",{"2":{"190":1}}],["late",{"0":{"162":1},"2":{"139":1,"144":1,"158":1,"162":1,"174":1,"186":4}}],["latest",{"2":{"23":1,"138":1,"150":1}}],["latter",{"2":{"137":1}}],["languages",{"2":{"45":1,"82":1}}],["language",{"2":{"45":1,"220":1}}],["largest",{"2":{"267":1}}],["large",{"2":{"45":1,"61":1}}],["larger",{"2":{"41":1}}],["last",{"2":{"37":1,"285":1,"288":1,"291":1,"297":1}}],["launch",{"2":{"21":1}}],["lovers",{"2":{"281":1}}],["lovely",{"2":{"236":1}}],["love",{"2":{"223":1}}],["lol",{"2":{"138":1,"224":1}}],["lollipop",{"2":{"34":1,"135":1,"318":5,"325":5}}],["lost",{"2":{"230":1,"236":1,"292":1,"298":1}}],["loss",{"2":{"118":1,"144":1}}],["lose",{"2":{"19":1}}],["long",{"0":{"281":1},"2":{"110":1,"139":1,"241":1,"247":1,"267":1,"291":1,"297":1,"308":1,"312":1,"317":1,"324":1}}],["longer",{"2":{"21":1,"96":1,"108":1,"135":1,"146":1,"218":2,"241":3,"247":3,"256":1,"257":1,"264":1,"268":2,"308":1,"312":1}}],["located",{"2":{"146":1}}],["location",{"2":{"65":1,"129":1,"134":1,"218":1}}],["locked",{"2":{"145":1}}],["lock",{"2":{"109":1,"309":1,"313":1}}],["locking",{"2":{"109":1}}],["lot",{"2":{"98":1,"138":1,"224":1,"277":1,"281":1,"307":1,"311":1}}],["lots",{"2":{"63":1,"252":1}}],["load",{"2":{"93":1,"96":1,"99":1,"102":1,"144":1,"160":1,"253":1,"266":1,"273":1,"283":1,"336":4}}],["loader",{"2":{"86":1,"124":1}}],["loading",{"2":{"30":1,"39":1,"42":2,"86":2,"91":2,"93":3,"96":1,"124":1,"303":2,"321":1,"328":1}}],["login",{"2":{"338":1}}],["logical",{"2":{"111":1,"233":1,"234":1}}],["logic",{"2":{"30":1,"43":1,"94":1,"101":1,"122":1,"138":1,"229":1,"289":1}}],["logname",{"2":{"129":1}}],["logd",{"2":{"119":1,"121":1,"124":1,"135":1}}],["logcat",{"2":{"99":1,"114":1,"117":1,"118":1,"119":1,"124":1,"126":1,"129":3,"132":1,"139":1,"232":1,"273":1}}],["logging",{"2":{"63":1,"87":1,"91":1,"104":1,"109":1,"119":1,"135":1,"303":1,"315":1}}],["log",{"2":{"20":1,"47":1,"95":1,"99":1,"113":1,"117":1,"126":1,"273":1,"286":1}}],["logs",{"2":{"15":1,"41":1,"63":1,"94":1,"289":1}}],["lower",{"2":{"20":1,"22":1,"58":1,"96":1,"282":1}}],["low",{"2":{"8":1,"336":1}}],["loop",{"2":{"8":1,"12":1,"118":2,"124":1,"230":2}}],["ux",{"2":{"309":1,"313":1}}],["utilized",{"2":{"220":1}}],["util",{"2":{"135":1,"138":1}}],["url",{"2":{"93":1,"175":5,"293":1,"299":1}}],["urls",{"2":{"25":1}}],["umask",{"2":{"91":1,"303":1}}],["u",{"2":{"86":2,"119":2,"142":1,"158":1,"184":2,"209":1,"336":1}}],["unmodified",{"2":{"309":1,"313":1,"319":1,"326":1}}],["unmount",{"2":{"138":1,"151":2}}],["unmounting",{"2":{"113":1,"138":1,"144":1}}],["unofficial",{"2":{"309":1,"313":1}}],["unaware",{"2":{"291":1,"297":1}}],["unable",{"2":{"105":1,"152":1,"230":1}}],["unfortunate",{"2":{"244":1,"250":1}}],["unpack",{"2":{"145":1,"334":1}}],["unpacking",{"2":{"96":1,"122":1,"283":1}}],["unreliable",{"2":{"138":1,"232":1}}],["untested",{"2":{"118":1}}],["unblock",{"2":{"107":1}}],["undefined",{"2":{"94":1,"289":1}}],["underlying",{"2":{"309":1,"313":1}}],["under",{"2":{"27":1,"33":1,"112":1,"144":1,"190":1}}],["unused",{"2":{"89":1,"142":1}}],["unsupported",{"2":{"88":1,"334":1}}],["unlabeled",{"2":{"132":1}}],["unlinking",{"2":{"93":1}}],["unlimited",{"2":{"56":1}}],["unloaded",{"2":{"174":1}}],["unloading",{"2":{"86":1,"89":1,"321":1,"328":1}}],["unlocks",{"2":{"223":1}}],["unlock",{"2":{"11":1,"138":1,"223":1,"337":1}}],["universal",{"2":{"132":1,"144":1}}],["unix",{"2":{"79":2,"175":1}}],["unified",{"2":{"54":1}}],["unicode",{"2":{"45":1}}],["uninstallation",{"2":{"135":1,"142":1}}],["uninstalled",{"2":{"41":1}}],["uninstaller",{"2":{"27":1,"46":1,"109":1,"136":1,"142":1,"145":1,"149":1,"150":1}}],["uninstall",{"2":{"27":1,"43":1,"54":1,"59":1,"63":1,"105":1,"149":1,"150":1,"174":1,"196":1}}],["unnecessary",{"2":{"24":1,"94":1,"119":1,"142":1,"289":1}}],["upcoming",{"2":{"234":1}}],["upper",{"2":{"118":1}}],["upstream",{"2":{"115":1,"128":1,"138":1}}],["updating",{"2":{"95":1,"286":1}}],["updater",{"2":{"181":2}}],["updatejson",{"2":{"175":1,"293":1,"295":1,"299":1,"301":1}}],["updatejson=",{"2":{"175":1}}],["updates",{"0":{"321":1,"328":1},"2":{"44":1,"62":1,"95":1,"131":1,"216":1,"242":1,"253":1,"286":1,"293":1,"299":1}}],["update",{"0":{"225":1},"2":{"10":1,"22":2,"23":1,"24":1,"25":1,"33":1,"36":2,"37":1,"39":1,"40":1,"41":3,"43":1,"44":1,"46":2,"49":3,"51":1,"54":1,"56":1,"57":1,"59":2,"60":1,"64":1,"86":1,"89":1,"90":1,"93":3,"94":3,"100":1,"101":1,"104":1,"114":1,"115":1,"122":1,"126":1,"128":1,"129":1,"134":1,"135":1,"136":1,"138":1,"140":1,"149":1,"151":2,"158":1,"181":4,"182":1,"185":2,"205":2,"222":1,"240":1,"264":1,"270":1,"272":1,"275":1,"289":3,"291":1,"297":1,"305":1}}],["updated",{"0":{"253":1},"2":{"8":1,"67":1,"101":1,"113":1,"138":4,"142":1,"148":1,"150":1,"226":1,"229":1,"244":1,"250":1,"257":1,"267":1,"268":1,"281":1,"295":1,"301":1}}],["upgrade",{"2":{"54":1,"91":1,"215":1,"219":3,"229":2,"241":1,"247":1,"253":3,"303":1,"307":1,"311":1}}],["upgrading",{"0":{"280":1},"2":{"27":1,"143":1,"147":1,"150":1,"282":1}}],["up",{"2":{"18":1,"38":1,"43":1,"47":1,"109":1,"110":1,"119":1,"135":1,"142":1,"217":1,"256":1,"265":1,"267":1,"308":1,"312":1,"320":1,"327":1}}],["us",{"2":{"318":1,"319":1,"325":1,"326":1}}],["usable",{"2":{"224":1}}],["usage",{"2":{"56":1,"111":1,"134":1}}],["usages",{"2":{"20":1}}],["usb",{"2":{"163":1,"167":1}}],["using",{"2":{"11":1,"15":1,"18":1,"29":1,"42":1,"58":1,"89":1,"90":1,"91":1,"113":1,"116":1,"119":1,"126":1,"139":2,"151":1,"152":1,"230":1,"236":1,"253":1,"294":1,"300":1,"303":1,"305":1,"309":2,"313":2,"318":1,"319":1,"320":1,"325":1,"326":1,"327":1}}],["useful",{"2":{"190":1}}],["used",{"2":{"87":2,"96":2,"101":1,"108":1,"120":1,"131":1,"132":1,"138":1,"217":1,"218":3,"232":1,"241":2,"247":2,"256":1,"315":2}}],["uses",{"2":{"21":1,"75":1,"138":1,"144":1,"152":1,"230":1,"231":1,"253":1,"268":2}}],["userdata",{"2":{"98":1,"277":1}}],["userspace",{"2":{"75":1}}],["users",{"2":{"38":1,"42":1,"100":1,"101":1,"109":1,"139":1,"268":2}}],["user",{"2":{"9":1,"21":1,"43":1,"93":2,"129":1,"220":1,"225":1,"241":1,"247":1,"267":1,"280":1,"338":1}}],["use",{"2":{"8":1,"22":1,"23":1,"24":1,"32":1,"39":1,"45":2,"86":1,"93":2,"94":1,"101":1,"102":1,"110":2,"111":4,"113":1,"118":3,"121":1,"126":1,"129":1,"131":1,"137":1,"138":2,"144":3,"147":1,"150":2,"151":3,"187":1,"217":1,"229":2,"232":1,"233":2,"253":3,"256":1,"265":3,"266":1,"268":1,"282":1,"289":1,"293":1,"299":1,"309":1,"313":1}}],["uids",{"2":{"89":1}}],["uid",{"2":{"41":1,"89":2,"91":2,"116":1,"303":2,"309":1,"313":1}}],["ui",{"2":{"8":1,"12":1,"16":1,"19":1,"20":1,"21":1,"30":1,"41":2,"225":1}}],["csc",{"2":{"201":2,"202":2,"203":1}}],["cts",{"2":{"136":1,"138":1,"264":1}}],["current",{"2":{"142":1}}],["currently",{"2":{"142":1}}],["cutting",{"2":{"128":1}}],["customize",{"2":{"181":1,"182":4,"185":1,"253":2}}],["customizing",{"2":{"12":1}}],["custom",{"2":{"41":1,"47":1,"52":1,"57":1,"66":2,"113":1,"114":1,"116":1,"118":1,"128":1,"139":1,"145":1,"151":1,"187":2,"241":1,"247":1,"256":1,"265":1,"268":1,"281":2,"308":1,"309":1,"312":1,"313":1,"320":3,"327":3}}],["cp",{"2":{"201":1,"203":1}}],["cpp",{"2":{"164":1}}],["cpu",{"2":{"108":1,"183":1}}],["cpio",{"2":{"87":2,"107":1,"113":1,"129":1,"315":2,"334":6}}],["cgroup",{"2":{"95":1,"286":1}}],["certain",{"2":{"253":1}}],["certificate",{"2":{"89":1}}],["celebrate",{"2":{"222":1}}],["centralized",{"2":{"93":1,"293":1,"299":1}}],["cil",{"2":{"93":1,"128":1,"336":1}}],["cmds",{"2":{"337":1}}],["cmdline",{"2":{"100":1,"113":1}}],["cmd",{"2":{"91":1,"303":1}}],["c++",{"0":{"220":1},"2":{"81":1,"94":1,"113":1,"220":2,"289":1}}],["c",{"2":{"73":3,"74":4,"75":1,"76":2,"81":1,"91":1,"97":1,"132":1,"138":1,"142":3,"220":1,"276":1,"303":1,"337":1,"338":1}}],["cn",{"2":{"72":1,"140":1,"142":1}}],["critical",{"2":{"308":1,"312":1}}],["cr",{"2":{"175":1}}],["cr+lf",{"2":{"175":1}}],["crc32",{"2":{"137":1}}],["crc64",{"2":{"137":1}}],["crappy",{"2":{"132":1,"225":1}}],["crash",{"2":{"48":1,"49":1,"67":1,"89":1}}],["crashing",{"2":{"25":1,"37":1,"85":1,"86":1,"135":1,"144":1,"260":1,"324":1}}],["crashes",{"2":{"22":1,"23":1,"28":1,"32":1,"34":1,"39":1,"40":1,"41":1,"58":1,"60":2,"64":1,"67":1,"95":2,"98":1,"108":1,"140":1,"143":1,"277":1,"286":2}}],["creating",{"2":{"257":2}}],["creation",{"2":{"107":1,"111":1,"232":1}}],["creates",{"2":{"241":1,"247":1}}],["created",{"2":{"106":1,"110":1,"218":1,"223":1,"268":1,"319":1,"326":1}}],["create",{"2":{"45":1,"134":1,"256":1}}],["cross",{"2":{"102":1,"266":1}}],["client",{"2":{"114":2,"164":2}}],["cli",{"2":{"113":1,"129":1,"337":1,"338":1}}],["class",{"2":{"217":1,"336":19}}],["claiming",{"2":{"109":1}}],["clang",{"2":{"82":1}}],["cloning",{"2":{"135":1,"145":1}}],["clone",{"2":{"79":1,"111":1,"133":1,"319":1,"326":1,"337":2}}],["closer",{"2":{"101":1}}],["close",{"2":{"45":1}}],["cleaned",{"2":{"47":1}}],["cleanup",{"2":{"31":1,"334":1}}],["clearly",{"2":{"308":1,"312":1}}],["clear",{"2":{"41":1}}],["chromeos",{"2":{"334":1}}],["chm",{"2":{"204":1}}],["chmod",{"2":{"173":2,"184":1,"186":1}}],["chown",{"2":{"184":1}}],["choose",{"2":{"65":1}}],["chcon",{"2":{"102":1,"140":1,"184":1,"266":1}}],["chinese",{"2":{"45":1,"222":1,"253":1}}],["challenge",{"2":{"242":1,"248":1}}],["character",{"2":{"102":1,"266":1}}],["characters",{"2":{"45":2}}],["chances",{"2":{"230":1,"236":1}}],["channel",{"2":{"23":1,"25":1,"41":1,"44":1,"226":1,"232":1,"253":1,"264":1}}],["changelogs",{"2":{"267":1}}],["changelog",{"0":{"221":1,"227":1,"235":1,"237":1,"245":1,"251":1,"254":1,"258":1,"262":1,"266":1,"269":1,"271":1,"274":1,"278":1,"284":1,"287":1,"290":1,"296":1,"302":1,"304":1,"306":1,"310":1,"314":1,"316":1,"322":1,"329":1},"2":{"61":1,"70":1,"154":1,"175":1,"305":1}}],["changed",{"2":{"24":1,"41":1,"223":1,"267":2}}],["change",{"2":{"21":1,"61":1,"62":1,"64":1,"88":1,"113":1,"121":1,"137":1,"138":1,"139":2,"140":1,"142":1,"145":1,"218":1,"246":1,"264":1,"265":2,"282":1,"336":1}}],["changes",{"0":{"218":1,"324":1},"2":{"9":1,"15":1,"16":1,"94":1,"107":1,"131":1,"146":1,"219":1,"228":1,"240":1,"267":2,"268":1,"289":1,"305":1,"307":1,"309":1,"311":1,"313":1,"319":1,"326":1}}],["checkout",{"2":{"270":1,"272":1,"275":1}}],["check",{"2":{"54":1,"64":1,"65":1,"101":1,"118":3,"119":1,"124":1,"126":1,"129":1,"137":2,"140":1,"144":1,"242":1,"243":1,"244":1,"248":1,"249":1,"250":1,"281":1,"285":1,"293":1,"299":1,"305":1,"321":1,"328":1}}],["checksum",{"2":{"98":1,"108":1,"277":1}}],["checksums",{"2":{"24":1}}],["checks",{"2":{"42":1}}],["checking",{"2":{"39":1,"95":1,"286":1}}],["cat",{"2":{"292":1,"298":1}}],["capable",{"2":{"292":1,"298":1}}],["came",{"2":{"241":1,"247":1}}],["caveat",{"2":{"223":1}}],["cases",{"2":{"145":1,"248":1}}],["case",{"2":{"118":1,"230":1,"236":1,"265":1,"309":1,"313":1}}],["caching",{"2":{"114":1,"118":1}}],["cache",{"2":{"61":1,"128":1,"209":2}}],["calculation",{"2":{"108":1,"118":1,"120":1}}],["callback",{"2":{"257":1}}],["calling",{"2":{"138":1,"228":1}}],["calls",{"2":{"135":1}}],["called",{"2":{"118":1,"142":1,"256":1}}],["call",{"2":{"102":1,"265":1,"266":1}}],["carefully",{"2":{"229":1}}],["cargo",{"2":{"82":3}}],["card",{"2":{"64":1}}],["cards",{"2":{"61":1}}],["cardview",{"2":{"22":1}}],["canary",{"2":{"226":1,"232":1,"264":1}}],["cannot",{"2":{"99":1,"125":1,"128":1,"139":2,"142":1,"233":1,"273":1,"294":1,"300":1,"309":1,"313":1,"320":1,"327":1}}],["can",{"2":{"24":1,"41":1,"44":2,"45":1,"61":1,"65":2,"66":1,"67":1,"135":1,"142":2,"190":1,"217":1,"234":1,"243":1,"249":1,"253":2,"282":1,"293":1,"294":1,"295":1,"299":1,"300":1,"301":1,"309":1,"313":1}}],["caused",{"2":{"95":1,"96":1,"283":1,"286":1}}],["cause",{"2":{"26":1,"101":1,"106":1,"108":1,"114":1,"139":1,"149":1,"241":1,"247":1,"275":1}}],["causes",{"2":{"18":1,"19":1,"38":1,"94":1,"123":1,"127":1,"138":1,"289":1}}],["causing",{"2":{"21":1,"113":1,"135":1,"230":1}}],["copied",{"2":{"297":1}}],["copy",{"2":{"94":1,"190":1,"289":1}}],["cool",{"2":{"252":1}}],["couldn",{"2":{"137":1}}],["could",{"2":{"95":1,"114":1,"119":1,"286":1}}],["correctly",{"2":{"142":1,"145":1}}],["corrupted",{"2":{"8":1,"41":1}}],["core",{"2":{"58":1,"113":2,"131":2,"134":1,"135":1,"137":1,"218":5,"280":1,"281":1}}],["convoluted",{"2":{"257":1}}],["convenient",{"2":{"44":1}}],["consistent",{"2":{"265":2}}],["considerations",{"2":{"231":1}}],["consider",{"2":{"142":1}}],["consequences",{"2":{"241":1,"247":1}}],["constantly",{"2":{"308":1,"312":1}}],["constant",{"2":{"232":1}}],["construct",{"2":{"134":1}}],["console",{"2":{"118":1}}],["conditions",{"2":{"111":1,"144":1}}],["confusion",{"2":{"281":1}}],["confusing",{"2":{"218":1}}],["confused",{"2":{"57":1}}],["conflicts",{"2":{"119":1}}],["confident",{"2":{"232":1}}],["configuration",{"2":{"93":1}}],["configurations",{"2":{"93":1}}],["configure",{"2":{"93":1}}],["configured",{"2":{"35":1}}],["config",{"2":{"80":2,"83":1,"88":1,"127":1,"157":1,"163":1}}],["confirmed",{"2":{"60":1}}],["continue",{"2":{"264":1}}],["context",{"2":{"85":1,"122":1,"132":1,"137":1,"142":2,"184":8,"324":1,"336":1,"338":1}}],["contentprovider",{"2":{"11":1}}],["contributes",{"2":{"131":1}}],["contributors",{"2":{"56":1,"308":1,"312":1}}],["controls",{"2":{"63":1}}],["contains",{"2":{"142":2}}],["contain",{"2":{"23":1}}],["colorama",{"2":{"79":2}}],["colors",{"2":{"60":1}}],["color",{"2":{"22":1}}],["code",{"0":{"220":1},"2":{"15":1,"42":1,"72":1,"86":2,"89":1,"93":1,"112":1,"113":1,"127":1,"150":1,"183":1,"220":2,"232":1,"294":1,"300":1,"321":1,"328":1}}],["comfortable",{"2":{"318":1,"325":1}}],["combat",{"2":{"309":1,"313":1}}],["combos",{"2":{"127":1}}],["come",{"2":{"230":1}}],["comes",{"2":{"216":1,"232":1,"267":1,"309":1,"313":1,"321":1,"328":1}}],["community",{"2":{"219":1,"292":1,"298":1}}],["communicate",{"2":{"115":1,"253":1}}],["communication",{"2":{"9":1,"11":1,"23":1,"101":1,"104":1,"105":1,"115":1,"142":1,"253":1}}],["commands",{"2":{"117":1,"138":1,"142":2}}],["commandline",{"2":{"91":1,"303":1}}],["command",{"2":{"86":1,"91":1,"99":1,"100":1,"107":1,"113":1,"114":1,"119":1,"142":3,"265":3,"268":1,"273":1,"303":1,"338":1}}],["com",{"2":{"79":1,"100":1,"118":1,"181":1}}],["complicated",{"2":{"308":1,"312":1,"320":2,"327":2}}],["complex",{"2":{"308":1,"312":1}}],["complexity",{"2":{"281":1}}],["complete",{"2":{"142":1,"265":1,"337":1}}],["completely",{"2":{"27":1,"101":1,"229":1,"267":2,"268":1,"308":1,"312":1}}],["compile",{"2":{"336":2}}],["compiler",{"2":{"123":2}}],["compilations",{"2":{"128":1}}],["computing",{"2":{"118":1}}],["companion",{"2":{"281":1}}],["compared",{"2":{"246":1}}],["compare",{"2":{"118":1}}],["compatible",{"2":{"150":1,"241":1,"247":1}}],["compatibility",{"2":{"23":1,"89":1,"100":1,"110":1,"120":1,"138":1,"140":2,"152":1,"219":1,"230":1,"241":1,"247":1,"253":1,"272":1,"320":1,"327":1}}],["compat",{"2":{"93":1,"241":2,"247":2}}],["compromised",{"2":{"268":1}}],["compromises",{"2":{"101":1}}],["compress",{"2":{"334":1}}],["compressed",{"2":{"96":1,"101":1,"111":1,"135":1,"283":1}}],["compression",{"2":{"86":1,"91":1,"122":1,"129":1,"137":1,"139":1,"151":1,"303":1}}],["component",{"2":{"19":1,"105":1,"111":1,"113":1,"217":2,"261":1}}],["components",{"2":{"10":1,"45":1,"281":1}}],["coming",{"2":{"15":1,"16":1,"270":1,"272":1,"275":1,"285":1,"297":1,"305":1}}],["cdn",{"2":{"7":1,"8":1}}],["www",{"2":{"190":2}}],["want",{"2":{"257":1}}],["was",{"2":{"220":1,"224":1,"230":1,"231":1,"232":1,"236":1,"293":1,"299":1,"308":1,"312":1}}],["warranty",{"2":{"190":2}}],["warning",{"2":{"130":1,"190":1,"195":1,"229":1,"230":1}}],["warn",{"2":{"96":1}}],["wake",{"2":{"113":1}}],["wait",{"2":{"108":1,"294":1,"300":1}}],["ways",{"2":{"292":1,"298":1}}],["way",{"2":{"41":1,"142":1,"144":2,"150":1,"222":1,"248":1,"253":1,"264":1,"292":1,"298":1}}],["well",{"2":{"319":1,"326":1}}],["welcome",{"2":{"223":1}}],["were",{"2":{"236":1,"240":1,"308":1,"312":1}}],["weirdly",{"2":{"119":1}}],["weird",{"2":{"107":1,"118":1,"135":1,"308":1,"312":1}}],["weirdness",{"2":{"99":1,"273":1}}],["we",{"2":{"96":1,"217":1,"228":1,"318":2,"325":2}}],["webview",{"2":{"20":1}}],["wrap",{"2":{"267":1}}],["wrapper",{"2":{"102":1,"118":1,"266":1}}],["wrong",{"2":{"41":1}}],["write",{"2":{"97":1,"138":1,"142":1,"217":1,"276":1}}],["writer",{"2":{"95":1,"286":1}}],["written",{"2":{"14":1,"138":1}}],["writing",{"2":{"8":1,"241":1,"247":1}}],["would",{"2":{"125":1,"228":1}}],["worries",{"2":{"281":1}}],["words",{"0":{"226":1,"234":1},"1":{"235":1}}],["world",{"2":{"101":1}}],["working",{"2":{"142":1,"232":1,"234":1,"248":1,"291":1,"297":1}}],["worker",{"2":{"132":1}}],["work",{"2":{"100":1,"101":1,"119":1,"129":1,"138":1,"139":2,"142":1,"144":1,"152":1,"218":1,"230":2,"241":2,"247":2,"319":1,"326":1}}],["workflow",{"2":{"90":1,"305":1}}],["workarounds",{"2":{"223":1}}],["workaround",{"2":{"89":1,"91":1,"102":2,"111":1,"116":1,"117":1,"123":1,"135":1,"266":2,"275":1,"303":1}}],["works",{"2":{"41":1,"142":1,"224":1}}],["won",{"2":{"33":1,"37":1,"134":1}}],["why",{"2":{"224":1,"242":1,"267":1,"292":1,"298":1}}],["whitelist",{"2":{"143":1}}],["while",{"2":{"137":1,"232":1,"291":1,"292":1,"297":1,"298":1,"318":1,"325":1}}],["which",{"2":{"38":1,"45":1,"102":1,"119":1,"127":1,"134":1,"217":3,"230":1,"241":1,"242":1,"247":1,"248":1,"253":1,"266":1,"292":1,"298":1,"308":1,"309":1,"312":1,"313":1}}],["whole",{"2":{"63":1,"87":1,"140":1,"219":1,"280":1,"308":2,"309":1,"312":2,"313":1,"315":1}}],["what",{"2":{"47":1,"142":1,"222":1,"234":1,"294":1,"300":1}}],["whether",{"2":{"93":1,"118":2,"126":1,"132":1,"253":1}}],["where",{"2":{"42":1,"114":1,"129":1,"142":1}}],["when",{"2":{"8":1,"12":1,"13":1,"20":1,"22":2,"23":1,"27":1,"28":1,"39":1,"41":2,"42":1,"43":1,"44":1,"45":1,"46":1,"48":1,"49":1,"51":1,"58":1,"60":1,"61":1,"67":3,"85":2,"87":2,"91":1,"93":1,"94":3,"95":2,"96":2,"99":1,"100":2,"101":2,"102":1,"109":1,"114":1,"116":1,"118":1,"125":2,"130":1,"131":1,"135":1,"142":1,"143":1,"241":1,"247":1,"260":1,"266":1,"273":1,"281":1,"283":2,"286":2,"289":3,"294":1,"300":1,"303":1,"315":2,"324":2}}],["wip",{"2":{"233":1,"264":1}}],["wipe",{"2":{"118":1}}],["wiped",{"2":{"93":1}}],["wide",{"2":{"219":1}}],["widespread",{"2":{"217":1}}],["window",{"2":{"129":1}}],["windows",{"2":{"79":5,"99":1,"175":1,"199":1,"205":1,"209":1,"273":1}}],["will",{"2":{"9":1,"42":2,"43":1,"45":1,"52":1,"57":1,"95":1,"101":2,"105":2,"118":1,"119":2,"129":3,"132":2,"135":1,"139":1,"140":1,"142":4,"145":2,"151":1,"152":2,"190":1,"217":2,"218":2,"219":2,"224":2,"228":1,"229":1,"230":2,"236":1,"241":7,"244":1,"247":7,"250":1,"253":6,"256":1,"264":1,"265":4,"268":1,"285":1,"286":1,"293":1,"294":1,"299":1,"300":1,"308":1,"312":1,"320":1,"327":1}}],["without",{"2":{"44":1,"61":1,"105":1,"107":1,"126":1,"190":2,"291":1,"297":1,"309":1,"313":1,"318":2,"325":2}}],["within",{"2":{"27":1,"45":1,"118":1,"134":1,"142":1,"143":1,"230":1,"281":1}}],["with",{"2":{"7":1,"11":1,"12":1,"23":1,"24":1,"27":1,"32":1,"33":1,"36":1,"37":1,"44":1,"46":2,"55":1,"86":2,"89":1,"91":1,"96":1,"101":3,"102":1,"106":1,"107":1,"109":3,"111":1,"113":1,"115":1,"116":1,"118":3,"119":1,"122":1,"123":1,"130":1,"131":1,"132":1,"135":3,"138":1,"139":2,"140":1,"141":1,"142":4,"144":1,"145":1,"148":1,"150":1,"151":2,"190":1,"216":1,"217":1,"218":1,"220":1,"230":1,"232":1,"233":1,"241":4,"242":1,"246":1,"247":3,"248":1,"253":5,"255":1,"256":1,"260":1,"265":4,"266":1,"267":1,"268":1,"275":1,"303":1,"308":1,"312":1,"318":2,"319":1,"321":1,"325":2,"326":1,"328":1}}],["bzip2",{"2":{"334":3}}],["b64xz",{"2":{"135":1}}],["brand",{"2":{"320":1,"327":1}}],["brute",{"2":{"132":1}}],["breakthrough",{"2":{"282":1}}],["breaking",{"2":{"151":1,"253":1}}],["breakage",{"2":{"133":1,"144":1}}],["break",{"2":{"119":1,"218":1}}],["breakdown",{"2":{"116":1}}],["bring",{"2":{"116":1}}],["broaden",{"2":{"100":1}}],["broadcasting",{"2":{"118":1}}],["broadcasts",{"2":{"113":1,"253":1}}],["broadcast",{"2":{"51":1,"111":1}}],["broken",{"2":{"97":1,"113":1,"135":1,"230":1,"268":1,"276":1,"318":1,"325":1}}],["broke",{"2":{"97":1,"276":1}}],["blkroset",{"2":{"337":1}}],["bln",{"2":{"204":1}}],["bl",{"2":{"201":1,"203":1}}],["bloatware",{"2":{"184":2}}],["blocked",{"2":{"223":1,"224":1}}],["blocks",{"2":{"134":1,"337":1}}],["block",{"2":{"99":1,"102":1,"118":2,"134":1,"138":1,"194":2,"253":1,"266":1,"273":1}}],["blocking",{"2":{"91":1,"303":1}}],["blobs",{"2":{"101":1}}],["blob",{"2":{"98":1,"124":1,"277":1}}],["black",{"2":{"142":1}}],["blacklisted",{"2":{"29":1}}],["blastula",{"2":{"107":1}}],["blanket",{"2":{"309":1,"313":1}}],["blank",{"2":{"42":1}}],["b设备将称为a",{"2":{"72":1}}],["b设备",{"2":{"72":1}}],["big",{"2":{"294":1,"300":1}}],["biggest",{"2":{"242":1,"248":1}}],["bixby",{"2":{"197":1}}],["bit",{"0":{"231":1},"2":{"93":3,"111":2,"119":2,"231":3,"236":1}}],["bing",{"2":{"197":1}}],["bind",{"2":{"118":1,"142":1,"144":1,"145":1}}],["binaries",{"2":{"100":1,"119":2,"121":1,"130":1,"135":1,"139":1,"231":3}}],["binary",{"2":{"54":1,"80":1,"81":1,"88":1,"101":1,"105":1,"111":1,"118":1,"124":1,"134":2,"135":3,"138":4,"142":3,"143":1,"181":4,"182":1,"185":2,"231":2,"333":4}}],["bin",{"2":{"73":1,"82":1,"114":1,"145":1,"173":3,"265":1,"338":1}}],["biometricprompt",{"2":{"11":1}}],["battle",{"2":{"292":1,"298":1}}],["bandwagon",{"2":{"226":1}}],["banking",{"2":{"131":1}}],["bad",{"2":{"223":1}}],["backdoor",{"2":{"309":1,"313":1}}],["backward",{"2":{"219":1}}],["backwards",{"2":{"23":1,"120":1,"230":1,"241":1,"247":1}}],["backing",{"2":{"135":1}}],["back",{"0":{"231":1,"280":1},"2":{"116":1,"139":1,"144":2,"151":1,"241":1,"247":1,"282":1}}],["background",{"2":{"109":1,"138":1}}],["backups",{"2":{"135":1}}],["backup",{"2":{"88":1,"104":1,"113":1,"131":1,"134":1,"334":1}}],["backend",{"2":{"86":1}}],["bar",{"2":{"67":1,"93":1,"187":2}}],["bash",{"2":{"82":1,"107":1}}],["bashgit",{"2":{"79":1}}],["basically",{"2":{"224":1}}],["basic",{"2":{"54":1}}],["based",{"0":{"232":1},"2":{"43":1,"102":1,"110":1,"116":1,"117":1,"134":1,"138":1,"158":1,"236":1,"241":1,"247":1,"264":1,"266":1}}],["base",{"0":{"220":1},"2":{"15":1,"112":1,"113":1,"220":1}}],["b",{"0":{"213":1,"214":1},"2":{"20":1,"24":1,"43":1,"72":1,"73":4,"74":4,"75":5,"76":6,"93":1,"105":1,"106":1,"107":1,"116":2,"119":1,"126":1,"134":1,"194":1,"195":1}}],["buy",{"2":{"223":1}}],["bundled",{"2":{"138":1}}],["buffers",{"2":{"126":2}}],["buffer",{"2":{"91":1,"303":1}}],["building",{"2":{"295":1,"301":1}}],["builds",{"2":{"66":1,"117":1,"309":1,"313":1}}],["build",{"2":{"55":2,"72":1,"79":1,"80":3,"81":1,"82":1,"93":1,"130":1,"139":1,"140":3,"163":1,"179":1,"309":1,"313":1}}],["built",{"2":{"21":1,"113":1,"139":1,"144":1}}],["but",{"2":{"42":1,"118":1,"119":1,"142":3,"190":1,"218":1,"231":1,"232":1,"234":1,"241":2,"247":2,"257":1,"280":1,"307":1,"309":1,"311":1,"313":1,"318":1,"325":1}}],["buttons",{"2":{"61":1}}],["button",{"2":{"15":1,"63":2}}],["bumping",{"0":{"318":1,"325":1}}],["bump",{"2":{"28":1,"86":1}}],["busybox",{"0":{"173":1,"265":1},"2":{"26":1,"45":3,"57":2,"89":1,"91":1,"93":1,"94":1,"102":2,"135":5,"138":1,"142":2,"147":1,"158":1,"173":9,"182":1,"186":1,"218":2,"265":7,"266":2,"289":1,"303":1}}],["bugs",{"2":{"240":1,"270":1,"272":1,"285":1,"288":1,"311":1}}],["buggy",{"2":{"20":1,"21":1,"275":1}}],["bug",{"0":{"283":1,"286":1,"289":1},"2":{"18":1,"19":1,"21":1,"26":1,"27":1,"50":1,"53":1,"64":1,"86":1,"94":1,"96":2,"98":1,"102":1,"106":2,"113":1,"120":1,"123":1,"125":1,"128":1,"129":1,"134":1,"135":1,"142":1,"217":3,"236":1,"246":1,"252":1,"264":1,"266":1,"275":1,"277":1,"283":2,"289":1}}],["boy",{"2":{"223":1}}],["board",{"2":{"223":1}}],["bool",{"2":{"183":2}}],["boots",{"2":{"256":1,"308":1,"312":1}}],["bootsigner",{"2":{"23":1}}],["bootdevice",{"2":{"194":1}}],["bootloaders",{"2":{"223":1}}],["bootloader",{"0":{"200":1},"2":{"194":1,"199":1,"200":4,"204":1,"223":1}}],["bootloop",{"2":{"101":1,"102":2,"118":1,"130":1,"241":1,"247":1,"266":2}}],["bootloops",{"2":{"8":1,"95":1,"98":1,"108":1,"109":1,"114":1,"123":1,"126":1,"127":1,"268":1,"275":1,"277":1,"286":1}}],["bootmode",{"2":{"183":1}}],["bootimg",{"2":{"151":1,"334":2}}],["booting",{"2":{"77":1,"101":1,"320":1,"327":1,"335":1}}],["bootup",{"2":{"150":1}}],["bootconfig",{"2":{"93":1}}],["bootargs",{"2":{"93":1}}],["boot",{"2":{"20":1,"22":1,"24":1,"35":1,"41":1,"44":4,"51":1,"60":1,"65":1,"72":2,"75":3,"76":3,"86":3,"93":3,"95":3,"96":1,"100":3,"101":1,"102":1,"105":2,"107":2,"110":1,"113":3,"114":1,"116":1,"117":1,"118":2,"122":1,"126":2,"131":2,"134":2,"135":4,"138":1,"139":1,"140":1,"142":1,"145":5,"150":2,"151":2,"152":1,"187":1,"194":6,"195":9,"197":1,"203":1,"204":1,"207":2,"208":2,"209":1,"214":1,"218":2,"230":1,"248":1,"256":1,"265":1,"266":1,"268":1,"270":1,"283":1,"286":3,"308":1,"312":1,"334":4,"337":1}}],["both",{"2":{"102":1,"144":1,"147":1,"266":1}}],["bottom",{"2":{"15":1,"93":1}}],["bypass",{"2":{"136":1,"145":1,"146":1}}],["by",{"2":{"13":1,"57":2,"66":1,"95":1,"102":1,"124":1,"132":1,"138":1,"152":1,"190":1,"194":2,"264":1,"266":1,"286":1,"294":1,"300":1,"308":1,"312":1,"320":1,"327":1}}],["become",{"2":{"308":1,"312":1}}],["because",{"2":{"138":1,"224":1}}],["beneficial",{"2":{"292":1,"298":1}}],["benefit",{"2":{"139":1}}],["been",{"2":{"291":1,"292":1,"297":1,"298":1,"308":2,"312":2,"318":1,"320":2,"325":1,"327":2}}],["beefed",{"2":{"265":1}}],["behind",{"2":{"265":1}}],["behaviors",{"2":{"94":1,"135":1,"289":1,"308":1,"312":1}}],["behavior",{"2":{"35":1,"46":1,"97":1,"276":1}}],["being",{"2":{"88":1,"91":1,"105":1,"303":1,"308":1,"312":1,"318":1,"325":1}}],["be",{"2":{"24":2,"41":1,"43":1,"52":1,"57":1,"88":1,"93":1,"95":1,"96":1,"108":1,"119":1,"125":1,"129":3,"132":1,"139":1,"142":4,"190":1,"217":1,"218":1,"219":1,"223":1,"226":1,"228":1,"229":1,"230":3,"236":1,"241":1,"247":1,"253":1,"264":2,"265":2,"267":1,"268":1,"286":1,"295":1,"301":1,"309":1,"313":1,"320":2,"327":2}}],["betas",{"2":{"226":1}}],["beta",{"2":{"25":1,"44":1,"110":1,"228":1,"233":1,"240":1,"246":1}}],["between",{"2":{"23":1,"104":1,"118":1}}],["better",{"2":{"13":1,"17":1,"21":1,"87":1,"93":2,"101":1,"102":1,"110":1,"114":1,"222":1,"266":1,"268":1,"292":1,"298":1,"315":1}}],["below",{"2":{"9":1}}],["beforehand",{"2":{"22":1}}],["before",{"0":{"280":1},"2":{"8":1,"19":1,"22":1,"24":1,"95":1,"119":1,"124":1,"149":1,"150":1,"232":1,"240":2,"253":1,"282":1,"286":1,"308":1,"312":1}}],["s2",{"2":{"336":3}}],["s21",{"2":{"96":1,"283":1}}],["s1",{"2":{"336":3}}],["s10",{"2":{"8":1,"76":1,"197":1,"234":1}}],["sql",{"2":{"337":2}}],["sqlite",{"2":{"32":1,"337":1}}],["squashing",{"2":{"264":1}}],["squashed",{"2":{"240":1}}],["sla",{"2":{"204":1}}],["slowing",{"2":{"142":1}}],["slot",{"2":{"24":1,"43":1,"93":1,"116":1,"123":1,"126":2,"134":1}}],["skeleton",{"2":{"134":1,"145":1}}],["skips",{"2":{"309":1,"313":1}}],["skipunzip=1",{"2":{"182":1}}],["skip",{"2":{"93":2,"111":1,"123":1,"126":1,"134":2,"174":2}}],["skipped",{"2":{"88":1}}],["smaller",{"2":{"150":1}}],["small",{"2":{"120":1,"131":1,"150":1}}],["s0",{"2":{"119":2,"142":1,"158":1,"184":2,"336":1}}],["s9+",{"2":{"118":1}}],["s9",{"2":{"118":1}}],["spotty",{"2":{"320":1,"327":1}}],["spawned",{"2":{"217":2}}],["spawn",{"2":{"129":1,"138":1}}],["spaces",{"2":{"142":2}}],["space",{"2":{"118":1,"151":2}}],["split",{"2":{"111":1,"126":1,"128":1,"334":1,"336":4}}],["specific",{"2":{"126":1,"248":1,"257":1,"308":1,"312":1}}],["specify",{"2":{"93":1,"293":1,"299":1}}],["special",{"2":{"102":1,"132":1,"223":1,"253":1,"266":1}}],["speed",{"2":{"42":1,"138":1,"142":1}}],["sbin",{"2":{"101":1,"105":1,"107":1,"110":1,"111":1,"113":2,"118":1,"119":1,"124":1,"131":2,"137":1,"144":2,"157":3,"187":6,"218":5,"268":2}}],["src",{"2":{"82":1,"337":3}}],["sd",{"2":{"209":1}}],["sdk",{"2":{"79":2,"82":2,"113":1}}],["sdcard",{"2":{"24":1,"195":1,"201":1}}],["similar",{"2":{"294":1,"300":1}}],["simply",{"2":{"241":1,"247":1}}],["simple",{"2":{"119":1}}],["simplify",{"2":{"118":1,"135":1}}],["since",{"2":{"139":1,"148":1,"149":1,"223":1,"230":1,"232":1,"234":1,"241":2,"247":2,"264":1,"281":1,"291":1,"292":1,"297":1,"298":1,"308":2,"309":1,"312":2,"313":1,"318":1,"325":1}}],["single",{"2":{"93":1,"142":1,"265":1}}],["silent",{"2":{"125":1}}],["silicon",{"2":{"79":1}}],["situations",{"2":{"114":1}}],["sideload",{"2":{"209":1}}],["side",{"2":{"114":1,"118":1}}],["sigstop",{"2":{"144":1}}],["sigwinch",{"2":{"113":1}}],["signed",{"2":{"52":1}}],["signals",{"2":{"107":1}}],["signal",{"2":{"95":1,"286":1}}],["signapk",{"2":{"39":1}}],["signature",{"2":{"12":1,"89":1,"95":1,"253":1,"286":1,"309":2,"313":2}}],["significant",{"2":{"308":1,"312":1}}],["significantly",{"2":{"20":1,"42":1,"89":1,"100":1,"101":1,"119":1,"138":1,"265":1}}],["signing",{"2":{"20":1,"41":1,"52":1,"309":1,"313":1}}],["sign",{"2":{"12":1,"131":1,"253":1}}],["size",{"2":{"101":2,"105":1,"120":1,"129":1,"138":1,"150":1,"231":1}}],["syntax",{"2":{"142":1,"268":1}}],["sync",{"2":{"36":1,"281":1}}],["sys",{"2":{"139":1,"140":2,"163":1,"187":2,"336":1}}],["sysfs",{"2":{"118":1}}],["syscall",{"2":{"90":1,"305":1}}],["systemless",{"2":{"21":1,"113":2,"137":1,"152":1}}],["system",{"0":{"177":1,"179":1,"198":1,"241":1,"244":1,"247":1,"250":1},"1":{"199":1,"200":1,"201":1,"202":1,"203":1},"2":{"14":1,"21":1,"45":1,"53":1,"72":3,"73":6,"75":3,"86":1,"89":1,"91":1,"93":2,"99":1,"102":2,"107":4,"110":2,"111":2,"114":1,"115":1,"116":3,"118":1,"121":1,"132":1,"135":1,"138":1,"144":4,"145":3,"148":1,"151":1,"157":3,"160":1,"173":3,"174":8,"177":10,"184":6,"187":1,"211":1,"236":1,"241":13,"242":2,"243":1,"244":1,"247":13,"248":2,"249":1,"250":1,"265":2,"266":2,"273":1,"303":1,"309":2,"313":2,"319":1,"326":1,"335":1,"338":1}}],["symlinks",{"2":{"120":1,"142":2,"144":1,"218":1}}],["symlink",{"2":{"87":1,"315":1}}],["sustainable",{"2":{"308":1,"312":1}}],["sunsetting",{"0":{"293":1,"299":1}}],["such",{"2":{"194":1}}],["sukernel",{"2":{"144":1}}],["suid",{"2":{"144":1}}],["subsequent",{"2":{"320":1,"327":1}}],["substantial",{"2":{"307":1,"311":1}}],["subshell",{"2":{"135":1}}],["subject",{"2":{"292":1,"298":1}}],["subfolder",{"2":{"150":1}}],["subfolders",{"2":{"124":1}}],["sub",{"2":{"119":1}}],["submodules",{"2":{"79":1,"190":1}}],["surface",{"2":{"307":1,"311":1}}],["survival",{"2":{"138":1}}],["survive",{"2":{"100":1}}],["sure",{"2":{"99":1,"105":1,"118":1,"142":2,"256":1,"273":1,"309":1,"313":1}}],["suffix",{"2":{"100":1,"123":1}}],["sudb",{"2":{"37":1}}],["su",{"0":{"338":1},"2":{"33":1,"41":1,"50":1,"91":2,"97":1,"109":1,"114":1,"118":1,"119":1,"129":2,"138":1,"139":1,"142":7,"151":1,"164":3,"276":1,"303":2,"333":1,"337":1,"338":2}}],["supplement",{"2":{"293":1,"299":1}}],["supposedly",{"2":{"217":1}}],["supposed",{"2":{"142":1}}],["supports",{"2":{"86":1,"93":1,"137":1,"288":1}}],["supported",{"2":{"86":1,"144":1,"145":2,"231":1,"241":1,"242":1,"247":1,"248":1,"253":1,"320":1,"327":1}}],["supporting",{"2":{"39":1,"219":1,"318":1,"325":1}}],["support",{"0":{"219":1,"223":1,"224":1,"242":1,"243":1,"248":1,"249":1},"2":{"9":2,"11":2,"13":1,"17":1,"19":2,"20":3,"21":1,"22":1,"23":2,"24":1,"27":1,"31":1,"37":1,"39":2,"41":6,"43":1,"45":1,"54":2,"56":1,"60":1,"61":2,"66":1,"86":4,"89":3,"91":1,"93":12,"94":1,"96":2,"100":5,"101":5,"102":6,"104":2,"105":2,"106":5,"107":6,"108":1,"109":1,"110":2,"111":6,"112":3,"113":2,"114":2,"115":1,"116":1,"117":2,"118":4,"119":1,"122":4,"123":1,"124":4,"126":3,"128":2,"129":1,"131":7,"132":1,"134":6,"136":1,"138":8,"139":2,"142":4,"144":1,"145":1,"146":1,"147":3,"150":2,"152":3,"219":2,"224":1,"233":1,"234":2,"236":2,"242":1,"246":1,"256":1,"266":6,"267":1,"268":1,"270":1,"283":1,"285":2,"288":1,"289":1,"303":1,"309":1,"313":1,"318":3,"320":1,"325":3,"327":1}}],["supolicy",{"2":{"142":1,"147":1,"150":1,"151":1,"152":1,"333":1,"336":1}}],["superior",{"2":{"147":1}}],["supersu",{"2":{"139":1,"144":2,"145":1,"146":2,"147":2,"150":1,"152":1,"336":1,"338":1}}],["superuser",{"2":{"22":1,"35":1,"38":1,"39":1,"42":1,"63":3,"91":1,"142":3,"147":1,"152":1,"303":1,"309":1,"313":1}}],["say",{"2":{"218":1,"228":1}}],["sandbox",{"2":{"101":1,"217":1,"268":1}}],["safe",{"2":{"101":2,"129":1,"268":2}}],["safety",{"2":{"65":1,"145":1}}],["safetynet",{"2":{"29":1,"39":1,"42":1,"54":1,"64":1,"94":1,"138":1,"139":1,"146":1,"264":2,"289":1}}],["samloader",{"2":{"201":1}}],["samfirm",{"2":{"201":1}}],["same",{"2":{"96":1,"116":2,"129":1,"142":2,"246":1,"309":1,"311":1,"313":1,"324":1}}],["sample",{"2":{"80":1,"321":1,"328":1}}],["samsung",{"2":{"8":1,"9":1,"17":1,"58":1,"60":1,"86":1,"91":1,"105":1,"114":1,"116":1,"118":2,"119":1,"124":1,"126":1,"132":1,"135":2,"139":7,"140":1,"144":1,"151":4,"234":1,"236":1,"303":1}}],["sarcompat",{"2":{"107":1}}],["sar",{"2":{"72":1,"73":2,"74":5,"75":2,"76":1,"88":1,"99":1,"100":1,"107":1,"273":1}}],["saving",{"2":{"41":1}}],["save",{"2":{"33":1,"41":1,"101":1,"336":1}}],["shift",{"2":{"308":1,"312":1}}],["shine",{"2":{"292":1,"298":1}}],["shipped",{"2":{"318":1,"325":1}}],["ship",{"2":{"241":1,"247":1}}],["ships",{"2":{"230":1}}],["shreplace=",{"2":{"184":1}}],["sh",{"0":{"176":1},"2":{"105":1,"113":1,"135":1,"138":1,"173":3,"174":3,"176":3,"181":3,"182":4,"185":3,"186":3,"187":5,"257":1,"338":1}}],["shamiko",{"2":{"168":1}}],["sha1",{"2":{"135":1,"334":3}}],["shadowed",{"2":{"124":1}}],["shared",{"2":{"89":1}}],["shareduserid",{"2":{"89":1,"309":1,"313":1}}],["shall",{"2":{"47":1,"98":1,"119":1,"139":1,"145":1,"265":1,"277":1}}],["shenanigans",{"2":{"77":1}}],["shellfastboot",{"2":{"195":2,"207":1,"208":1}}],["shellui",{"2":{"184":1}}],["shelladb",{"2":{"167":1,"194":1,"195":1,"201":1}}],["shellsecure",{"2":{"158":1}}],["shells",{"2":{"107":1,"116":1}}],["shell",{"0":{"176":1},"2":{"26":1,"45":2,"47":2,"93":1,"107":1,"116":1,"129":1,"135":2,"138":2,"142":2,"157":1,"164":3,"167":3,"173":4,"182":1,"186":1,"194":2,"265":1,"336":1,"338":6}}],["short",{"2":{"138":1}}],["shortcuts",{"2":{"28":1}}],["should",{"2":{"35":1,"41":1,"93":1,"95":1,"108":2,"118":1,"119":1,"125":2,"126":2,"130":1,"132":3,"133":1,"137":2,"139":2,"142":1,"143":1,"144":1,"147":1,"151":2,"152":1,"190":1,"218":2,"219":1,"229":1,"230":1,"267":1,"286":1}}],["shows",{"2":{"292":1,"298":1}}],["show",{"2":{"42":2}}],["shown",{"2":{"27":1}}],["showing",{"2":{"18":1,"45":1}}],["snet",{"2":{"24":1,"94":1,"289":1}}],["scenarios",{"2":{"308":1,"312":1}}],["scenario",{"2":{"139":1}}],["scan",{"2":{"105":1}}],["scheme",{"2":{"23":1,"115":1}}],["scratch",{"2":{"95":1,"101":2,"145":2,"267":1,"286":1,"308":1,"312":1}}],["scripting",{"2":{"265":1}}],["script",{"2":{"43":1,"46":1,"116":4,"118":1,"125":1,"131":2,"134":4,"135":7,"138":2,"142":1,"145":1,"146":1,"173":2,"181":2,"186":1,"256":1}}],["scripts",{"2":{"20":1,"36":1,"43":1,"59":1,"95":1,"99":1,"100":1,"102":4,"104":1,"111":1,"113":2,"114":2,"117":1,"118":4,"126":2,"135":4,"138":6,"141":1,"143":1,"144":1,"152":1,"218":3,"256":1,"265":4,"266":4,"273":1,"286":1}}],["screen",{"2":{"9":1,"10":1,"42":1,"142":1}}],["stderr",{"2":{"339":1}}],["stdout",{"2":{"334":2}}],["stdin",{"2":{"334":2}}],["step",{"2":{"232":1}}],["straightforward",{"2":{"257":1}}],["strategy",{"2":{"95":1,"286":1}}],["structural",{"2":{"219":1}}],["structure",{"2":{"134":1,"257":1}}],["structures",{"2":{"95":1,"286":1}}],["strengthened",{"2":{"117":1}}],["stripped",{"2":{"142":1,"308":1,"312":1}}],["strip",{"2":{"95":1,"101":1,"286":1}}],["strings",{"2":{"107":1,"201":1}}],["string",{"2":{"66":1,"175":6,"183":2}}],["stuff",{"2":{"267":1}}],["stupid",{"2":{"218":1}}],["stuck",{"2":{"139":1}}],["studio",{"0":{"82":1},"2":{"79":4,"81":2,"82":2}}],["stubs",{"2":{"253":2}}],["stub",{"2":{"11":1,"12":1,"86":1,"87":2,"89":1,"91":1,"94":2,"96":1,"105":1,"118":1,"253":4,"289":2,"303":1,"315":2}}],["stick",{"2":{"37":1}}],["still",{"2":{"23":1,"142":2,"218":2,"223":1,"230":1,"231":1,"232":1,"233":1,"234":1,"236":1,"241":1,"247":1,"257":1}}],["stay",{"2":{"142":1,"226":1,"233":1,"242":1}}],["stage",{"2":{"107":1,"113":2,"119":1,"218":3,"242":2,"248":2}}],["standalone=1",{"2":{"173":1}}],["standalone",{"0":{"265":1},"2":{"102":1,"173":3,"265":2,"266":1}}],["standard",{"2":{"93":1}}],["standards",{"2":{"34":1}}],["stability",{"2":{"92":1,"264":1}}],["stable",{"2":{"23":1,"25":1,"41":1,"55":1,"216":1,"226":1,"236":1,"240":1}}],["starts",{"2":{"232":1}}],["starting",{"2":{"217":2,"231":1,"233":1,"241":1,"253":1,"265":1,"281":1}}],["started",{"2":{"119":1,"135":1,"142":1}}],["start",{"0":{"162":1},"2":{"72":1,"113":1,"119":1,"124":1,"135":1,"139":2,"141":1,"158":1,"162":1,"174":1,"186":4,"187":2,"247":1,"255":1}}],["startup",{"2":{"62":1,"119":1}}],["state",{"2":{"121":1,"128":1,"139":1}}],["statement",{"2":{"101":1}}],["states",{"2":{"96":1,"139":1}}],["static",{"2":{"62":1,"231":1}}],["status",{"2":{"42":1,"54":1,"65":3,"113":1,"138":1,"139":2,"337":1}}],["stopped",{"2":{"113":1}}],["stopping",{"2":{"96":1,"283":1}}],["stop",{"2":{"90":1,"109":1,"113":1,"219":1,"305":1,"337":1}}],["storing",{"2":{"218":1}}],["stored",{"2":{"113":1,"230":2,"256":1,"257":1}}],["store",{"2":{"43":1,"65":1,"218":1}}],["storage",{"2":{"22":1,"42":1,"43":1,"44":1,"132":1,"241":1,"247":1}}],["stock",{"2":{"22":1,"44":1,"101":1,"104":1,"134":1,"135":4,"139":1,"147":1,"151":1}}],["s",{"2":{"22":1,"89":3,"91":1,"101":1,"107":1,"142":1,"150":1,"151":1,"152":2,"183":1,"187":1,"232":1,"241":1,"242":1,"247":1,"248":1,"255":1,"265":2,"267":1,"268":1,"291":1,"297":1,"303":1,"309":2,"313":2,"318":1,"325":1,"338":1}}],["solving",{"2":{"308":1,"312":1}}],["sole",{"2":{"242":1}}],["solely",{"2":{"218":1}}],["solution",{"2":{"224":1,"233":1}}],["solutions",{"2":{"147":2,"234":1}}],["software",{"2":{"190":2,"308":2,"312":2}}],["socket",{"2":{"124":1}}],["sockets",{"2":{"97":1,"116":1,"129":1,"164":1,"276":1}}],["soon",{"2":{"89":1}}],["sony",{"2":{"89":1,"93":1,"334":1}}],["source",{"2":{"72":1,"135":1,"138":1,"147":1,"150":2,"334":2,"336":10}}],["so",{"2":{"47":1,"96":1,"100":1,"102":1,"138":2,"142":1,"174":4,"218":1,"219":1,"223":1,"224":1,"228":1,"232":1,"264":1,"266":1,"267":1,"283":1,"292":2,"298":2,"308":1,"312":1}}],["somewhere",{"2":{"256":1}}],["sometimes",{"2":{"241":2,"247":2,"308":1,"312":1}}],["some",{"2":{"18":1,"22":1,"34":1,"38":1,"41":1,"46":1,"93":4,"94":1,"102":1,"105":1,"107":1,"109":1,"111":1,"119":1,"125":2,"126":2,"127":1,"151":2,"152":1,"217":1,"230":1,"234":1,"236":1,"252":1,"253":1,"256":1,"266":1,"267":1,"268":1,"270":1,"281":1,"289":1,"297":1,"308":2,"309":1,"311":1,"312":2,"313":1,"321":1,"328":1}}],["sorted",{"2":{"66":1}}],["sorting",{"2":{"37":1}}],["sort",{"2":{"13":1}}],["sw",{"2":{"201":1}}],["sweet",{"2":{"15":1,"16":1}}],["switched",{"2":{"231":1}}],["switching",{"2":{"54":1,"131":1}}],["switch",{"2":{"8":1,"41":1,"45":1,"93":1,"114":1,"119":1,"139":1,"241":1,"247":1}}],["seen",{"2":{"309":1,"313":1}}],["seems",{"2":{"264":1}}],["seemingly",{"2":{"234":1}}],["see",{"2":{"190":2,"267":1,"291":1,"294":1,"297":1,"300":1,"317":1,"324":1}}],["segfault",{"2":{"137":1}}],["segmentation",{"2":{"125":1}}],["seamlessly",{"2":{"132":1}}],["search",{"2":{"67":1}}],["send",{"2":{"114":1,"144":1}}],["separately",{"2":{"281":1}}],["separates",{"2":{"268":1}}],["separate",{"2":{"118":1,"140":1,"144":1,"145":1}}],["separated",{"2":{"98":1,"118":1,"277":1}}],["sepolicy",{"0":{"180":1,"256":1,"320":1,"327":1},"2":{"86":1,"87":1,"89":1,"94":2,"95":1,"100":1,"102":1,"104":1,"111":1,"113":1,"116":1,"119":1,"124":1,"139":1,"140":1,"141":1,"142":3,"147":1,"150":2,"151":2,"152":1,"160":5,"164":1,"174":2,"180":1,"209":1,"256":4,"257":1,"266":1,"286":1,"289":2,"308":1,"312":1,"315":1,"320":1,"327":1,"336":7}}],["sepolicies",{"2":{"28":1,"126":1}}],["serialized",{"2":{"115":1}}],["series",{"2":{"96":1,"283":1}}],["services",{"2":{"111":1,"119":1,"217":2,"223":1}}],["service",{"2":{"111":1,"115":1,"116":1,"125":1,"135":1,"139":1,"142":1,"158":1,"162":1,"163":5,"174":1,"176":2,"186":7,"187":2,"217":1,"218":1,"337":1,"339":1}}],["server",{"2":{"41":1,"89":1}}],["sessions",{"2":{"95":1,"286":1}}],["selabel",{"2":{"135":1}}],["selinuxfs",{"2":{"160":1}}],["selinux",{"0":{"164":1},"2":{"101":1,"102":1,"132":1,"137":1,"138":1,"139":2,"140":3,"147":2,"152":1,"164":1,"173":1,"265":1,"266":1,"268":1,"308":1,"312":1,"318":1,"320":2,"325":1,"327":2,"336":3,"337":2}}],["selected",{"2":{"93":1}}],["selection",{"2":{"60":1}}],["selecting",{"2":{"58":1,"85":1,"324":1}}],["self",{"2":{"43":1,"89":1,"110":1}}],["sever",{"2":{"42":1}}],["several",{"2":{"8":1,"11":1,"19":1,"32":1,"42":1,"45":1,"94":1,"119":1,"130":1,"131":1,"234":1,"241":2,"246":1,"247":2,"289":1,"308":1,"312":1}}],["secure",{"2":{"140":1,"309":1,"313":1}}],["security",{"0":{"309":1,"313":1},"2":{"101":1,"119":1,"124":1,"160":1,"268":1,"291":1,"297":1}}],["seccomp",{"2":{"117":1}}],["secontext",{"2":{"116":1,"158":2,"182":2}}],["seconds",{"2":{"99":1,"101":2,"273":1}}],["second",{"2":{"43":1,"334":1}}],["secondary",{"2":{"42":1,"100":1}}],["sections",{"2":{"67":1,"118":1}}],["section",{"2":{"22":2,"39":1,"60":1,"63":2,"65":2,"66":1,"68":1}}],["setprop",{"2":{"163":2,"186":1,"187":2,"339":1}}],["set",{"2":{"67":1,"91":1,"93":1,"105":1,"118":2,"126":1,"129":1,"137":1,"152":1,"184":5,"303":1,"336":8}}],["setups",{"2":{"244":1,"250":1,"308":1,"312":1}}],["setup",{"2":{"41":1,"72":1,"101":2,"106":1,"110":1,"111":1,"241":1,"247":1,"265":1,"268":1}}],["setting",{"2":{"38":1,"135":1}}],["settings",{"2":{"14":1,"19":1,"21":1,"24":4,"32":2,"37":1,"39":1,"42":1,"44":1,"45":1,"60":1,"63":1,"67":1,"91":1,"138":1,"142":1,"303":1}}],["gzip",{"2":{"334":4}}],["game",{"2":{"292":1,"298":1}}],["gained",{"2":{"268":1}}],["galaxy",{"2":{"8":1,"96":1,"197":1,"283":1}}],["giving",{"2":{"319":1,"326":1}}],["gives",{"2":{"309":1,"313":1}}],["give",{"2":{"257":1,"292":1,"298":1}}],["given",{"2":{"217":1}}],["git",{"2":{"79":4,"190":2}}],["gitee",{"2":{"0":3}}],["github",{"2":{"0":5,"56":1,"79":1}}],["gnu",{"2":{"190":6}}],["guaranteed",{"2":{"265":1}}],["guarded",{"2":{"24":1}}],["guide",{"2":{"244":1,"250":1,"281":1}}],["guides",{"2":{"188":1,"215":1,"257":1}}],["gsi",{"2":{"118":1}}],["gkis",{"2":{"89":1}}],["greatly",{"2":{"138":1}}],["green",{"2":{"124":1}}],["group",{"2":{"85":1,"184":6,"324":1}}],["granularity",{"2":{"19":1}}],["gt",{"2":{"73":3,"74":1,"82":2,"91":1,"113":3,"173":2,"175":14,"184":16,"186":2,"190":2,"214":1,"217":2,"218":4,"303":1,"333":3,"334":27,"336":1}}],["glitch",{"2":{"54":1}}],["global",{"2":{"41":1,"45":1,"138":1}}],["g",{"2":{"27":1,"29":1,"45":1,"89":1,"100":1,"110":1,"115":1,"119":1,"126":1,"219":1,"241":1,"247":1,"256":1,"265":1}}],["gen",{"2":{"233":1}}],["genfscon",{"2":{"102":1,"266":1,"336":1}}],["general",{"2":{"85":1,"86":2,"87":2,"88":1,"90":1,"91":1,"93":4,"94":4,"95":3,"96":1,"97":1,"99":4,"100":4,"101":4,"102":3,"104":1,"105":2,"107":2,"109":2,"110":2,"111":7,"112":4,"113":6,"114":1,"116":1,"118":2,"119":1,"120":1,"121":1,"129":1,"137":1,"138":5,"139":4,"190":3,"218":1,"266":3,"273":4,"276":1,"286":3,"289":4,"303":1,"305":1,"315":2,"324":1}}],["generate",{"2":{"12":1,"253":1}}],["getprop",{"2":{"163":1,"339":1}}],["getrandom",{"2":{"90":1,"305":1}}],["get",{"2":{"24":1,"109":1,"130":1,"223":1,"230":1,"236":1,"268":1}}],["gone",{"2":{"319":1,"321":1,"326":1,"328":1}}],["got",{"2":{"308":1,"312":1}}],["goal",{"2":{"241":1,"247":1,"309":1,"313":1}}],["good",{"2":{"219":1,"220":1,"241":1,"247":1}}],["goodbye",{"2":{"218":1}}],["google",{"2":{"24":1,"72":1,"74":1,"75":1,"83":1,"136":1,"181":1,"197":1,"233":1,"234":1,"241":1,"247":1,"264":2,"291":1,"297":1,"318":1,"325":1}}],["going",{"2":{"113":1}}],["go",{"2":{"15":1,"29":1,"73":1,"89":1,"132":1,"228":1}}],["aimed",{"2":{"226":1}}],["aware",{"2":{"226":1,"234":1,"241":1,"247":1,"264":1,"308":1,"312":1}}],["ago",{"2":{"292":1,"298":1}}],["against",{"2":{"308":1,"312":1}}],["again",{"2":{"219":1,"223":1,"292":1,"298":1}}],["aggressive",{"2":{"151":1,"226":1}}],["agnostic",{"2":{"105":1}}],["at",{"2":{"139":1,"142":1,"190":1,"230":2,"231":1,"291":1,"297":1,"307":1,"308":1,"311":1,"312":1}}],["attr",{"2":{"337":1}}],["attribute",{"2":{"336":4}}],["attributes",{"2":{"101":1,"111":1,"133":1,"135":1}}],["attestation",{"2":{"264":1}}],["attention",{"2":{"229":1,"267":1}}],["attack",{"2":{"309":1,"313":1}}],["attacks",{"2":{"89":1}}],["attach",{"2":{"82":1}}],["affecting",{"2":{"132":1,"217":1}}],["after",{"2":{"8":1,"21":2,"27":1,"33":1,"39":1,"99":1,"100":1,"105":2,"113":1,"117":1,"118":1,"142":3,"150":1,"273":1,"308":1,"312":1,"320":1,"327":1}}],["a1",{"2":{"131":1}}],["auditallowxperm",{"2":{"336":1}}],["auditallow",{"2":{"336":1}}],["auditdeny",{"2":{"113":1}}],["author=",{"2":{"175":1}}],["authenticate",{"2":{"51":1}}],["authentications",{"2":{"24":1}}],["authentication",{"2":{"22":1,"35":1,"54":1}}],["automatically",{"2":{"229":1}}],["auto",{"2":{"21":1,"111":1,"147":2}}],["able",{"2":{"232":1,"241":1,"247":1,"253":1}}],["abused",{"2":{"217":1}}],["above",{"2":{"131":1}}],["about",{"2":{"96":1,"219":1,"295":1,"301":1,"309":1,"313":1}}],["abort",{"2":{"88":1,"151":1,"184":1}}],["abi",{"2":{"182":1}}],["ability",{"2":{"93":1}}],["abis",{"2":{"93":1}}],["abrupt",{"2":{"15":1}}],["ambitious",{"2":{"228":1}}],["am",{"2":{"139":1,"234":1,"291":1,"292":1,"297":1,"298":1,"309":1,"313":1}}],["amonet",{"2":{"86":1}}],["amount",{"2":{"56":1,"118":1,"119":1}}],["amp",{"2":{"82":1,"142":1}}],["args",{"2":{"336":1,"337":1}}],["arguments",{"2":{"339":1}}],["argument",{"2":{"86":1}}],["around",{"2":{"264":1}}],["article",{"2":{"217":1}}],["arbitrarily",{"2":{"217":1}}],["arm",{"2":{"183":1}}],["armeabi",{"2":{"174":1}}],["arm64",{"2":{"79":1,"174":1,"183":2}}],["architecture",{"2":{"308":1,"312":1}}],["archive",{"2":{"91":1,"303":1}}],["arch",{"2":{"135":1,"183":1}}],["arrives",{"2":{"95":1,"286":1}}],["aren",{"2":{"224":1,"307":1,"311":1}}],["area",{"2":{"163":4}}],["are",{"2":{"24":1,"27":1,"41":1,"93":1,"111":1,"113":1,"119":1,"142":1,"150":3,"190":1,"218":2,"223":2,"225":1,"226":3,"229":1,"230":3,"231":1,"234":2,"236":2,"241":2,"243":1,"246":1,"247":2,"249":1,"253":2,"257":2,"267":2,"268":2,"281":1,"292":1,"297":1,"298":1,"309":1,"311":1,"313":1,"319":1,"320":1,"326":1,"327":1}}],["av",{"2":{"113":1}}],["avoid",{"2":{"98":1,"277":1}}],["available",{"2":{"61":1,"67":1,"126":1,"150":1,"264":1,"265":1}}],["avb",{"2":{"41":1,"95":1,"101":1,"131":2,"241":1,"247":1,"286":1,"308":2,"312":2,"334":1}}],["achieve",{"2":{"294":1,"300":1}}],["across",{"2":{"219":1}}],["ack",{"2":{"114":1}}],["accurate",{"2":{"309":1,"313":1,"319":1,"326":1}}],["accordingly",{"2":{"129":1}}],["acclaim",{"2":{"122":1}}],["acct",{"2":{"105":1}}],["accept",{"2":{"151":1}}],["accepted",{"2":{"66":1}}],["accessible",{"2":{"256":1}}],["access",{"2":{"21":1,"42":1,"132":1,"142":2,"309":1,"313":1}}],["actual",{"2":{"119":1,"132":1,"241":2,"247":2,"253":1,"318":1,"325":1}}],["actually",{"2":{"47":1,"118":1,"241":2,"247":2,"257":2,"307":1,"311":1}}],["active",{"2":{"318":1,"325":1}}],["activity",{"2":{"47":1,"232":1}}],["action",{"2":{"111":1,"132":1,"142":1}}],["although",{"2":{"220":1,"230":1,"236":1,"241":1,"247":1,"264":1}}],["alternative",{"2":{"241":1,"247":1}}],["alter",{"2":{"132":1}}],["al10",{"2":{"204":1}}],["al00",{"2":{"204":1}}],["algorithm",{"2":{"148":1}}],["already",{"2":{"119":1,"253":1}}],["along",{"2":{"118":1,"131":1,"190":1,"246":1,"256":1}}],["aligned",{"2":{"61":1}}],["alert",{"2":{"61":1}}],["allocated",{"2":{"142":1}}],["allowxperm",{"2":{"336":1}}],["allows",{"2":{"220":1,"309":1,"313":1,"320":1,"327":1}}],["allowing",{"2":{"98":1,"277":1,"294":1,"300":1}}],["allowed",{"2":{"42":1}}],["allow",{"2":{"12":1,"42":1,"91":1,"93":1,"107":1,"110":2,"113":1,"140":1,"142":1,"217":1,"256":3,"303":1,"336":7}}],["all",{"2":{"56":1,"63":1,"80":1,"93":1,"94":1,"101":2,"107":2,"113":3,"116":3,"118":2,"119":2,"126":1,"129":4,"131":2,"132":2,"135":2,"138":5,"139":1,"142":2,"143":1,"145":1,"147":2,"150":2,"151":1,"152":2,"190":1,"217":3,"218":1,"219":1,"224":3,"228":1,"229":3,"230":3,"231":2,"232":1,"253":1,"265":2,"268":1,"289":1,"295":1,"301":1,"308":2,"312":2,"336":5}}],["always",{"2":{"45":1,"85":1,"86":1,"88":1,"95":1,"116":1,"217":1,"219":1,"241":1,"247":1,"265":1,"268":1,"281":1,"286":1,"324":1}}],["also",{"2":{"43":1,"107":1,"118":1,"119":1,"142":2,"219":1,"224":1,"225":1,"230":1,"233":1,"234":1,"253":1,"265":1,"268":1,"282":1,"309":1,"313":1,"318":1,"321":1,"325":1,"328":1}}],["aosp",{"2":{"34":1,"115":1,"119":1,"138":1,"163":1}}],["aside",{"2":{"225":1}}],["ash",{"2":{"173":4,"182":1,"186":1,"265":2}}],["ash独立外壳模式",{"2":{"173":1}}],["asap",{"2":{"119":1,"144":1,"218":1,"219":2,"229":2,"241":1,"247":1}}],["asus",{"2":{"98":1,"124":1,"277":1}}],["asynctasks",{"2":{"46":1}}],["asynchronous",{"2":{"41":1}}],["as",{"0":{"198":1,"241":1,"244":1,"247":1,"250":1},"1":{"199":1,"200":1,"201":1,"202":1,"203":1},"2":{"23":2,"72":1,"75":1,"89":2,"91":1,"94":1,"96":1,"98":1,"101":1,"107":4,"111":1,"113":1,"116":1,"118":1,"119":3,"129":1,"135":2,"138":1,"142":3,"157":1,"160":1,"187":1,"190":1,"218":1,"224":1,"226":2,"236":1,"241":8,"242":3,"244":1,"246":1,"247":8,"248":3,"250":1,"253":2,"256":1,"257":1,"277":1,"289":1,"293":1,"299":1,"303":1,"311":1,"324":1,"335":1}}],["asked",{"2":{"171":1}}],["ask",{"2":{"19":1,"22":1}}],["assist",{"2":{"9":1}}],["adequate",{"2":{"318":1,"325":1}}],["ado",{"2":{"291":1,"297":1}}],["adventurous",{"2":{"226":1}}],["advanced",{"2":{"14":1,"37":1,"65":1,"96":1,"268":1,"282":1}}],["adblock",{"2":{"152":1}}],["adbd",{"2":{"118":1}}],["adb",{"2":{"107":1,"113":1,"116":1,"117":1,"128":1,"129":1,"142":3,"157":1,"158":3,"167":5,"173":3,"174":2,"186":2,"194":2,"195":1,"201":1,"209":1,"218":1}}],["adjust",{"2":{"60":1,"240":1}}],["adjusted",{"2":{"52":1}}],["adjustments",{"2":{"28":1,"36":1,"41":1,"131":1,"135":1,"267":1}}],["adapt",{"2":{"51":1,"142":1}}],["adapters",{"2":{"47":1}}],["adaptive",{"2":{"41":1}}],["adds",{"2":{"275":2}}],["addressing",{"2":{"270":1,"272":1}}],["address",{"2":{"256":1}}],["addon",{"2":{"102":1,"116":2,"118":2,"138":1,"158":1,"266":1}}],["addition",{"2":{"142":3,"309":1,"313":1}}],["additional",{"2":{"101":1}}],["adding",{"2":{"90":1,"110":1,"144":3,"145":1,"148":1,"217":1,"236":1,"246":1,"270":1,"305":1}}],["added",{"2":{"45":1,"132":1,"135":1,"138":2,"145":1,"225":1}}],["add",{"2":{"9":1,"14":1,"21":2,"28":1,"31":1,"33":1,"35":1,"39":3,"40":1,"41":2,"43":1,"44":4,"45":1,"53":1,"54":3,"58":1,"60":1,"61":1,"63":4,"65":2,"66":2,"67":2,"79":1,"88":1,"89":1,"93":1,"100":2,"101":1,"102":3,"107":2,"109":1,"111":1,"113":4,"116":2,"118":2,"119":1,"122":2,"123":1,"125":1,"126":1,"128":1,"131":5,"132":3,"134":2,"135":2,"138":6,"139":3,"140":1,"141":1,"142":3,"144":1,"145":2,"146":1,"147":4,"151":1,"152":3,"256":1,"266":3,"309":1,"313":1,"334":1,"337":1}}],["a",{"0":{"213":1,"214":1,"244":1,"250":1},"2":{"8":1,"18":1,"20":1,"24":1,"26":1,"27":2,"42":1,"43":1,"45":1,"47":1,"53":1,"72":2,"73":2,"74":1,"75":5,"76":9,"85":1,"87":1,"89":1,"93":2,"94":1,"96":1,"98":2,"101":1,"102":2,"105":1,"106":2,"107":1,"108":1,"111":1,"113":2,"114":1,"116":2,"118":3,"119":1,"120":1,"124":1,"126":2,"129":2,"134":3,"135":4,"138":2,"140":1,"142":4,"144":3,"148":1,"152":1,"175":6,"190":2,"194":1,"195":1,"216":2,"217":3,"219":2,"220":1,"222":2,"224":2,"228":1,"229":1,"230":3,"232":3,"233":1,"236":1,"240":1,"241":3,"242":2,"244":2,"247":3,"248":1,"250":2,"253":6,"255":1,"256":1,"257":3,"265":2,"266":2,"267":2,"268":2,"270":1,"272":1,"275":1,"277":2,"281":3,"283":1,"289":1,"291":2,"292":1,"293":1,"294":1,"297":2,"298":1,"299":1,"300":1,"307":2,"308":5,"309":3,"311":2,"312":5,"313":3,"315":1,"318":2,"319":2,"320":3,"321":2,"324":1,"325":2,"326":2,"327":3,"328":2}}],["apex",{"2":{"96":1,"100":1,"107":1,"283":1}}],["apis",{"2":{"337":1}}],["api",{"2":{"15":1,"24":1,"56":1,"72":3,"86":1,"90":1,"94":1,"102":1,"145":1,"147":1,"150":1,"178":1,"183":3,"229":1,"266":1,"289":1,"305":1,"321":3,"328":3}}],["apks",{"2":{"12":1}}],["apk",{"2":{"11":1,"23":1,"45":1,"55":1,"80":1,"83":2,"93":1,"94":1,"96":1,"105":1,"118":1,"119":1,"169":2,"194":1,"196":1,"204":1,"209":4,"253":2,"281":2,"289":1,"309":1,"313":1}}],["appearance",{"2":{"267":1}}],["appended",{"2":{"134":1}}],["apparently",{"2":{"142":1}}],["approach",{"2":{"86":1,"151":1,"230":1,"232":1}}],["apply",{"2":{"336":2}}],["applying",{"2":{"44":1}}],["applied",{"2":{"142":1}}],["applications",{"2":{"217":1}}],["application",{"2":{"19":1,"21":1,"54":2,"91":1,"104":1,"111":1,"217":1,"303":1}}],["applet",{"2":{"118":1,"173":1}}],["applets",{"2":{"102":1,"266":1}}],["apple",{"2":{"79":1}}],["appspecializeargs",{"2":{"90":1,"305":1}}],["apps",{"2":{"27":1,"29":1,"66":1,"89":2,"97":1,"100":1,"109":1,"118":2,"119":2,"131":2,"138":1,"139":1,"142":1,"143":1,"152":1,"217":2,"218":1,"226":1,"241":1,"247":1,"276":1,"294":1,"300":1}}],["app",{"0":{"169":1,"281":1,"282":1},"2":{"9":1,"10":1,"12":1,"14":1,"21":2,"25":1,"28":1,"41":3,"43":2,"44":2,"51":1,"76":1,"85":1,"86":2,"88":2,"89":4,"90":2,"91":4,"92":1,"93":7,"94":6,"95":2,"96":7,"109":2,"119":1,"142":3,"143":1,"158":2,"167":1,"169":4,"173":1,"175":1,"183":1,"184":4,"205":1,"209":1,"212":1,"213":4,"214":1,"217":1,"225":1,"240":1,"253":5,"261":1,"281":4,"282":2,"286":2,"289":6,"293":1,"297":1,"299":1,"303":4,"305":2,"309":6,"313":6,"320":1,"324":1,"327":1}}],["ap",{"2":{"8":2,"9":1,"17":1,"201":4,"202":1,"203":4}}],["announcement",{"2":{"292":1,"298":1}}],["annoying",{"2":{"94":1,"289":1}}],["ancient",{"2":{"142":1}}],["angela",{"2":{"124":1}}],["another",{"2":{"118":1,"218":1,"280":1,"282":1,"307":1,"311":1}}],["anymore",{"2":{"264":1}}],["anything",{"2":{"144":1,"257":1}}],["any",{"2":{"24":1,"66":1,"76":3,"95":1,"144":2,"190":2,"218":1,"265":1,"286":1,"309":2,"313":2,"320":1,"327":1}}],["analysis",{"2":{"23":1}}],["and",{"2":{"20":1,"21":1,"23":1,"25":1,"27":2,"34":1,"39":2,"41":2,"43":1,"45":2,"46":1,"47":2,"52":1,"54":1,"61":1,"65":2,"66":1,"68":1,"72":1,"86":1,"88":2,"89":2,"91":1,"93":1,"94":1,"95":2,"96":3,"98":1,"100":3,"101":5,"102":2,"104":1,"108":1,"109":1,"111":1,"114":2,"118":3,"119":3,"124":1,"127":1,"128":1,"129":1,"131":2,"132":2,"134":2,"135":5,"136":1,"137":1,"138":2,"142":4,"144":3,"145":1,"147":3,"148":1,"190":1,"217":1,"218":1,"220":1,"223":2,"224":4,"225":1,"229":2,"230":1,"232":1,"234":1,"240":1,"241":2,"242":1,"243":1,"247":2,"248":2,"249":1,"252":1,"253":7,"256":2,"257":2,"264":2,"265":3,"266":2,"267":2,"268":4,"270":2,"272":1,"277":1,"281":3,"285":3,"286":2,"288":3,"289":1,"292":2,"293":3,"294":1,"295":1,"298":2,"299":3,"300":1,"301":1,"303":1,"308":4,"309":5,"312":4,"313":5,"321":3,"328":3}}],["androidboot",{"2":{"100":1}}],["androidx",{"2":{"23":1}}],["android",{"0":{"71":1,"82":1,"224":1,"233":1,"242":1,"248":1,"318":1,"325":1},"1":{"72":1,"73":1,"74":1,"75":1,"76":1,"77":1},"2":{"7":1,"12":1,"20":2,"24":1,"28":1,"31":1,"49":1,"51":3,"72":13,"73":4,"74":3,"75":5,"76":3,"77":1,"79":6,"81":2,"82":2,"86":4,"89":3,"93":1,"94":1,"96":2,"100":2,"101":4,"102":2,"106":1,"107":4,"110":1,"111":3,"112":1,"117":1,"119":2,"121":1,"122":3,"131":1,"137":1,"138":4,"149":1,"157":1,"164":3,"167":2,"173":2,"178":1,"181":1,"183":2,"186":1,"187":2,"189":1,"193":1,"194":1,"198":1,"202":1,"204":5,"209":1,"217":5,"224":1,"233":1,"241":2,"242":3,"243":1,"244":1,"246":1,"247":2,"248":2,"249":1,"250":1,"253":3,"256":1,"266":2,"267":2,"268":4,"282":1,"285":1,"288":1,"289":1,"291":1,"294":1,"297":1,"300":1,"308":2,"312":2,"318":4,"325":4,"336":1}}],["an",{"2":{"7":1,"38":1,"42":1,"93":1,"109":1,"123":1,"135":1,"142":2,"230":2,"241":2,"243":1,"247":2,"249":1,"253":1,"293":1,"299":1}}],["f",{"2":{"334":2}}],["fbe",{"2":{"118":1,"158":1}}],["fgo",{"2":{"115":1,"131":1}}],["fs",{"0":{"161":1},"2":{"99":1,"101":1,"107":1,"111":1,"113":1,"119":2,"125":1,"135":2,"139":1,"140":2,"142":1,"145":2,"158":2,"161":2,"174":2,"176":1,"186":7,"218":2,"273":1,"336":3,"337":1}}],["fstabs",{"2":{"126":1,"308":1,"312":1}}],["fstab",{"2":{"93":1,"100":1,"101":1,"106":1,"117":1,"127":1,"134":1,"248":1,"334":3}}],["fc",{"2":{"51":1}}],["feel",{"2":{"318":1,"325":1}}],["few",{"2":{"216":1,"219":1,"230":1,"253":1,"308":1,"312":1}}],["feasible",{"2":{"109":1}}],["features",{"2":{"93":1,"102":1,"220":1,"224":1,"252":1,"265":1,"266":1,"268":1,"321":1,"328":1}}],["feature",{"2":{"27":1,"44":3,"54":1,"88":1,"93":2,"142":2,"253":3,"294":1,"300":1,"319":1,"326":1}}],["fetching",{"2":{"42":1}}],["frozen",{"2":{"293":1,"299":1}}],["from",{"0":{"324":1},"2":{"41":1,"42":1,"44":1,"48":1,"52":1,"66":1,"85":1,"93":6,"95":1,"101":6,"111":3,"113":1,"117":1,"118":1,"119":1,"124":1,"131":1,"132":1,"135":2,"137":1,"138":5,"143":1,"145":2,"151":1,"217":3,"218":1,"225":1,"229":1,"231":1,"236":1,"243":1,"249":1,"252":1,"265":1,"267":1,"268":1,"270":2,"272":1,"275":1,"281":2,"285":1,"286":1,"292":1,"293":1,"297":2,"298":1,"299":1,"305":1,"308":2,"309":1,"312":2,"313":1,"324":1}}],["frija",{"2":{"201":1}}],["frequently",{"2":{"171":1}}],["freedom",{"2":{"257":1}}],["free",{"2":{"118":1,"190":2}}],["freezes",{"2":{"114":1}}],["frameworks",{"2":{"82":1}}],["fragment",{"2":{"27":1,"54":3}}],["f2fs",{"2":{"32":1,"85":1,"98":1,"230":1,"275":2,"277":1,"324":1}}],["faq",{"2":{"264":1}}],["fastboot",{"2":{"194":1,"195":3,"206":2,"207":1,"208":1,"209":1,"214":1}}],["faster",{"2":{"42":2,"45":1}}],["fake",{"2":{"139":1}}],["family",{"2":{"134":1}}],["faulty",{"2":{"127":1}}],["fault",{"2":{"119":1,"125":1}}],["false",{"2":{"118":1}}],["fallback",{"2":{"102":1,"118":1,"266":1}}],["fatal",{"2":{"117":1}}],["fail",{"2":{"94":1,"96":1,"114":1,"283":1,"289":1}}],["failures",{"2":{"114":1,"125":1}}],["failure",{"2":{"45":1,"135":1}}],["failed",{"2":{"31":1}}],["fact",{"2":{"233":1,"267":1}}],["factory",{"2":{"27":1,"100":1}}],["face",{"2":{"11":1}}],["foil",{"2":{"309":1,"313":1}}],["foo",{"2":{"187":2}}],["foo=bar",{"2":{"163":1}}],["four",{"2":{"129":1}}],["foundation",{"2":{"190":1}}],["found",{"2":{"82":1,"295":1,"301":1}}],["focuses",{"2":{"309":1,"313":1}}],["focused",{"2":{"264":1,"285":1,"288":1}}],["focus",{"2":{"109":1,"234":2,"280":1,"292":1,"298":1}}],["foss",{"2":{"42":1}}],["folder",{"2":{"43":1,"101":1,"110":1,"113":1,"134":1,"142":1,"218":2}}],["folders",{"2":{"31":1,"110":1,"134":1}}],["follow",{"2":{"35":1,"142":1,"229":1,"241":1,"247":1}}],["following",{"2":{"27":1,"34":1,"246":1,"268":1,"297":1,"311":1,"324":1}}],["forward",{"2":{"219":1}}],["forget",{"2":{"148":1,"219":1}}],["forgot",{"2":{"42":1}}],["fork",{"2":{"135":1,"138":1,"142":1,"232":1}}],["forced",{"2":{"265":1}}],["force",{"2":{"42":1,"45":1,"101":1,"113":1,"121":1,"124":1,"132":1}}],["formats",{"2":{"98":1,"104":1,"277":1}}],["format",{"0":{"257":1},"2":{"18":1,"19":1,"101":1,"102":1,"104":1,"127":1,"132":1,"135":1,"139":1,"217":1,"229":3,"257":2,"260":1,"266":1,"270":1}}],["for",{"0":{"256":1},"2":{"8":2,"19":1,"20":2,"21":2,"24":2,"28":2,"31":1,"32":1,"35":1,"39":3,"41":1,"42":1,"44":1,"45":1,"52":1,"54":1,"61":1,"63":1,"66":1,"86":1,"87":1,"89":1,"93":6,"98":1,"99":1,"100":2,"101":5,"102":2,"105":1,"107":4,"108":3,"109":1,"110":2,"111":2,"113":1,"114":2,"116":3,"118":3,"120":1,"122":1,"123":1,"126":1,"129":1,"131":1,"132":1,"134":1,"135":2,"138":6,"139":1,"140":4,"142":2,"144":2,"145":2,"147":3,"148":1,"149":1,"150":2,"151":3,"152":3,"190":2,"218":1,"224":1,"226":2,"229":1,"230":1,"232":3,"233":1,"234":1,"236":2,"240":1,"241":4,"242":2,"243":1,"244":1,"246":1,"247":4,"248":1,"249":1,"250":1,"253":2,"256":1,"257":1,"264":2,"265":1,"266":2,"267":1,"268":3,"270":1,"273":1,"275":1,"277":1,"281":1,"291":1,"292":1,"294":1,"295":1,"297":2,"298":1,"300":1,"301":1,"305":2,"308":4,"309":2,"312":4,"313":2,"315":1,"318":3,"325":3}}],["flourishing",{"2":{"292":1,"298":1}}],["flow",{"2":{"91":1,"303":1}}],["floating",{"2":{"15":1}}],["flawed",{"2":{"292":1,"298":1}}],["flag",{"2":{"113":1,"125":1,"132":1,"137":1}}],["flags",{"2":{"39":1,"40":1,"93":1,"95":1,"118":1,"286":1}}],["flashable",{"2":{"281":1}}],["flashfire",{"2":{"142":1}}],["flash",{"2":{"47":1,"138":1,"145":1,"195":4,"207":1,"208":1}}],["flashing",{"2":{"8":1,"45":1,"47":1,"105":1,"118":1,"147":1}}],["further",{"2":{"242":1,"291":1,"297":1}}],["fundamentally",{"2":{"232":1,"319":1,"326":1}}],["fun",{"2":{"224":1}}],["functioning",{"2":{"242":1}}],["functions",{"2":{"134":1,"135":1,"138":3,"257":1}}],["function",{"2":{"89":1,"135":1,"138":1,"321":2,"328":2}}],["functionally",{"2":{"294":1,"300":1}}],["functionality",{"2":{"145":1,"150":1,"218":1,"293":1,"299":1,"309":1,"313":1,"320":1,"327":1}}],["functional",{"2":{"9":1,"219":1}}],["future",{"2":{"15":1,"16":1,"107":1,"150":1,"219":1,"226":1}}],["fully",{"2":{"14":1,"135":1,"142":1,"147":1,"217":1,"219":1,"242":2,"244":1,"248":1,"250":1,"253":1,"264":2}}],["full",{"0":{"221":1,"227":1,"235":1,"237":1,"245":1,"251":1,"254":1,"258":1,"262":1,"269":1,"271":1,"274":1,"278":1,"284":1,"287":1,"290":1,"296":1,"302":1,"304":1,"306":1,"310":1,"314":1,"316":1,"322":1,"329":1},"2":{"9":1,"42":1,"118":1,"217":1,"219":1,"224":1,"233":1,"234":1,"253":2,"264":1,"265":1,"267":2,"270":1,"272":1,"275":1,"305":1,"308":1,"312":1}}],["fighting",{"2":{"292":1,"298":1,"308":1,"312":1}}],["figured",{"2":{"138":1}}],["fit",{"2":{"267":1}}],["fitness",{"2":{"190":1}}],["fifo",{"2":{"160":1}}],["first",{"2":{"101":1,"241":1,"247":1,"281":1}}],["firmware",{"2":{"17":1,"86":1}}],["fields",{"2":{"90":1,"305":1}}],["fine",{"2":{"230":1}}],["final",{"0":{"226":1,"234":1},"1":{"235":1}}],["finally",{"2":{"60":1,"225":1,"236":1,"243":1,"249":1}}],["fingerprint",{"2":{"12":1,"19":1,"22":2,"24":3,"35":1,"95":1,"286":1}}],["filepermission",{"2":{"184":2}}],["file",{"2":{"24":1,"43":1,"44":2,"93":1,"99":1,"111":1,"132":1,"134":2,"138":1,"142":1,"145":1,"158":2,"164":1,"184":3,"187":2,"194":1,"256":2,"257":1,"273":1,"320":1,"327":1,"336":6,"339":3}}],["filesystem",{"2":{"145":1,"319":2,"326":2}}],["filesystems",{"2":{"116":1}}],["files",{"2":{"7":1,"8":5,"13":1,"24":1,"43":1,"46":1,"85":1,"86":2,"94":1,"99":1,"107":1,"110":1,"118":1,"122":1,"129":1,"132":1,"138":1,"142":2,"144":1,"148":1,"241":1,"243":2,"247":1,"249":2,"273":1,"289":1,"324":1}}],["fixing",{"2":{"95":1,"285":1,"286":1,"288":1,"303":1,"315":1}}],["fixed",{"2":{"60":1,"66":1,"142":2,"148":1}}],["fixes",{"0":{"283":1,"286":1,"289":1},"2":{"8":1,"19":1,"27":1,"43":1,"64":1,"86":1,"94":2,"118":1,"236":1,"246":1,"252":1,"275":1,"289":2,"311":1}}],["fix",{"2":{"7":1,"8":1,"10":1,"11":1,"12":1,"13":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":2,"26":1,"28":1,"30":1,"32":1,"33":1,"34":1,"35":1,"37":1,"38":1,"39":1,"41":2,"42":1,"43":1,"45":1,"46":2,"48":1,"49":2,"50":1,"51":1,"53":1,"54":1,"58":1,"60":1,"64":2,"67":2,"85":1,"86":1,"87":3,"88":3,"89":6,"91":7,"93":1,"94":3,"95":2,"96":3,"97":1,"98":2,"99":2,"102":1,"103":1,"104":1,"105":2,"106":2,"107":1,"108":1,"109":3,"113":1,"117":3,"118":2,"119":2,"120":1,"121":1,"122":1,"124":1,"125":4,"126":3,"127":1,"128":1,"129":1,"130":1,"131":2,"132":3,"133":1,"134":3,"135":5,"137":3,"139":3,"140":2,"142":2,"143":3,"144":1,"147":1,"151":4,"152":2,"260":1,"261":1,"266":1,"273":2,"276":1,"277":2,"283":3,"286":2,"289":3,"303":7,"315":3,"324":1}}],["pkg",{"2":{"337":2}}],["png",{"2":{"187":4}}],["pc上magisk",{"2":{"195":4}}],["pc",{"2":{"167":1,"194":1,"201":1}}],["phhusson",{"2":{"151":1}}],["phh",{"2":{"142":2,"143":1,"144":2,"147":2,"151":1,"152":1}}],["pseudo",{"2":{"138":1,"142":1}}],["people",{"2":{"148":1,"223":1,"240":1,"292":1,"298":1,"308":1,"312":1}}],["penalty",{"2":{"119":1}}],["performed",{"2":{"309":1,"313":1,"320":1,"327":1}}],["performance",{"2":{"20":1,"41":1,"101":1,"138":1,"225":1}}],["personal",{"2":{"291":1,"297":1}}],["persist",{"2":{"119":1,"132":2,"134":1,"136":2,"163":2}}],["perm",{"2":{"184":5,"336":4}}],["permissive",{"2":{"138":2,"139":3,"151":1,"152":2,"336":1}}],["permissions",{"2":{"22":2,"85":1,"139":2,"140":1,"324":1,"336":4}}],["permission",{"2":{"7":1,"44":2,"117":1,"148":1,"184":2,"309":1,"313":1}}],["per",{"2":{"19":1,"111":1}}],["pzizz",{"2":{"118":1}}],["ppid",{"2":{"118":1}}],["ptrace",{"0":{"232":1},"2":{"232":1,"236":1}}],["ptracing",{"2":{"111":1}}],["pts",{"2":{"116":2}}],["plt",{"2":{"321":2,"328":2}}],["plus",{"2":{"292":1,"298":1}}],["plug",{"2":{"132":1}}],["plenty",{"2":{"142":1}}],["please",{"2":{"101":1,"113":1,"140":1,"150":1,"218":1,"219":3,"233":1,"234":1,"241":1,"243":1,"244":1,"247":1,"249":1,"250":1,"257":1,"264":1,"265":1}}],["planning",{"2":{"308":1,"312":1}}],["plain",{"2":{"220":1}}],["placing",{"2":{"126":1}}],["placed",{"2":{"118":1}}],["place",{"2":{"65":1,"134":1,"144":1}}],["places",{"2":{"42":1,"218":1}}],["platforms",{"2":{"131":1,"318":1,"325":1}}],["platform",{"2":{"72":1,"291":1,"297":1}}],["play",{"2":{"65":1,"132":1}}],["pxa",{"2":{"95":1,"106":1,"124":1,"286":1}}],["py",{"2":{"79":1,"80":3,"81":1,"82":1}}],["python3",{"2":{"79":1}}],["python",{"2":{"79":5}}],["piece",{"2":{"308":1,"312":1}}],["pipe",{"2":{"97":1,"276":1}}],["pip",{"2":{"79":1}}],["picked",{"2":{"43":1}}],["pixels",{"2":{"233":1}}],["pixel3",{"2":{"73":1}}],["pixel",{"2":{"35":1,"72":1,"73":4,"74":1,"75":1,"76":1,"89":1,"93":1,"100":2,"107":1,"114":1,"116":1,"131":1,"132":1,"134":1,"233":1,"241":1,"247":1,"270":1}}],["put",{"2":{"309":1,"313":1}}],["push",{"2":{"219":1}}],["pull",{"2":{"195":1,"201":1}}],["pulling",{"2":{"42":1}}],["published",{"2":{"190":1}}],["public",{"2":{"190":3,"226":1,"228":1,"232":1,"240":2,"267":1,"291":1,"297":1}}],["purpose",{"2":{"138":1,"190":1}}],["pure",{"2":{"33":1,"124":1}}],["pass",{"2":{"264":1}}],["passes",{"2":{"138":1,"139":1}}],["paired",{"2":{"253":1}}],["paid",{"2":{"223":1}}],["paves",{"2":{"150":1}}],["pause",{"2":{"144":1}}],["pay",{"2":{"139":1,"229":1,"234":1,"267":1}}],["pad",{"2":{"101":1}}],["packaging",{"2":{"96":1,"122":1}}],["packages",{"2":{"113":1,"309":1,"313":1}}],["package",{"2":{"33":1,"89":1,"94":1,"96":1,"100":1,"131":1,"217":1,"289":1,"309":1,"313":1}}],["paradigm",{"2":{"308":1,"312":1}}],["parallel",{"2":{"95":1,"111":1,"286":1}}],["parse",{"2":{"114":1,"138":1}}],["parsing",{"2":{"86":1,"118":1}}],["parent",{"2":{"101":1}}],["partname",{"2":{"117":1}}],["particular",{"2":{"190":1,"267":1}}],["partial",{"2":{"95":1,"286":1,"336":1}}],["partitioning",{"2":{"308":1,"312":1}}],["partitions",{"2":{"85":1,"108":1,"111":1,"126":1,"140":1,"223":1,"233":1,"241":1,"247":1,"319":1,"324":1,"326":1}}],["partition",{"0":{"243":1,"249":1},"2":{"43":1,"72":1,"85":1,"102":1,"104":1,"110":1,"111":1,"140":1,"144":1,"145":1,"150":1,"151":2,"234":1,"241":2,"243":1,"244":1,"247":2,"249":1,"250":1,"266":1,"320":1,"324":1,"327":1}}],["part",{"2":{"52":1,"142":1,"231":1,"243":1,"249":1,"294":1,"300":1}}],["page",{"2":{"42":1,"223":1}}],["patterns",{"2":{"139":1}}],["pattern",{"2":{"114":1}}],["path`",{"2":{"157":1}}],["path",{"0":{"218":1},"2":{"45":1,"79":2,"100":2,"113":1,"131":1,"135":1,"142":1,"146":1,"157":3,"173":2,"183":3,"207":1,"208":1,"218":1,"265":2,"268":2,"336":1,"337":1}}],["paths",{"2":{"39":1,"41":1,"88":1,"96":1,"147":1,"218":4,"219":1,"283":1}}],["patches",{"0":{"256":1},"2":{"116":1,"126":1,"127":1,"140":1,"147":1,"152":1,"256":3,"265":1,"308":1,"312":1,"320":1,"327":1}}],["patched",{"2":{"93":1,"195":5,"201":2,"207":1,"208":1}}],["patchvbmetaflag",{"2":{"93":1,"334":1}}],["patch",{"2":{"44":3,"95":1,"104":1,"138":1,"139":1,"144":1,"145":2,"150":2,"151":2,"152":2,"217":1,"286":1,"308":1,"312":1,"334":2}}],["patching",{"2":{"8":1,"9":1,"13":1,"17":1,"22":1,"35":1,"86":3,"93":3,"94":1,"102":1,"104":1,"106":3,"113":1,"117":1,"118":1,"125":1,"134":1,"138":1,"140":1,"149":1,"248":1,"266":1,"289":1,"320":1,"327":1}}],["p",{"2":{"24":1,"31":1,"117":1,"119":2,"121":1,"122":3,"132":1,"163":1,"338":1,"339":1}}],["policies",{"2":{"138":1,"150":1}}],["policy",{"2":{"101":4,"128":1,"139":1,"140":1,"149":1,"160":1,"336":2}}],["poorly",{"2":{"138":1}}],["pool",{"2":{"107":1}}],["power",{"2":{"116":1,"118":1}}],["points",{"2":{"113":1,"146":1}}],["point",{"2":{"106":1,"119":1,"231":1,"241":1,"247":1,"267":1,"308":1,"312":1}}],["popup",{"2":{"46":1}}],["portion",{"2":{"45":1,"308":1,"312":1}}],["pokemon",{"2":{"29":1}}],["post",{"0":{"161":1},"2":{"20":1,"99":1,"101":1,"107":1,"111":1,"113":1,"119":2,"125":1,"135":2,"142":1,"145":2,"158":2,"161":2,"174":2,"176":1,"186":7,"218":2,"273":1,"337":1}}],["possible",{"2":{"8":1,"23":1,"45":1,"89":1,"95":2,"102":1,"118":1,"135":1,"142":1,"144":1,"145":1,"151":1,"224":1,"226":1,"241":1,"247":1,"266":1,"286":2}}],["potentially",{"2":{"137":1,"309":1,"313":1}}],["potential",{"2":{"13":1,"46":1,"64":1,"87":1,"102":2,"125":1,"266":2,"315":1}}],["prime",{"2":{"264":1}}],["print",{"2":{"184":1,"334":1}}],["private",{"2":{"253":1}}],["priv",{"2":{"143":1}}],["priority",{"2":{"45":1}}],["prune",{"2":{"89":1}}],["practical",{"2":{"63":1}}],["pretty",{"2":{"257":1,"318":1,"320":1,"325":1,"327":1}}],["prepared",{"2":{"230":1,"236":1}}],["preload",{"2":{"160":1}}],["precise",{"2":{"118":1}}],["preserving",{"2":{"116":1}}],["preserved",{"2":{"140":1}}],["preserve",{"2":{"95":1,"129":2,"142":1,"286":1,"338":1}}],["pressing",{"2":{"110":1}}],["previous",{"2":{"150":1,"220":1}}],["previously",{"2":{"142":1}}],["preview",{"2":{"86":1,"152":1}}],["prevents",{"2":{"94":1,"289":1}}],["preventing",{"2":{"64":1}}],["prevent",{"2":{"8":2,"12":1,"21":1,"23":2,"24":3,"25":1,"37":1,"39":1,"40":1,"41":1,"46":1,"67":1,"86":1,"89":1,"91":1,"95":4,"99":1,"105":1,"109":1,"113":1,"114":3,"115":1,"116":1,"118":3,"119":1,"124":3,"132":1,"135":1,"138":2,"140":1,"144":2,"253":1,"273":1,"286":4,"303":1}}],["prefer",{"2":{"85":1,"324":1}}],["preferences",{"2":{"82":1}}],["pre",{"0":{"160":1,"256":1},"2":{"13":1,"85":1,"94":1,"104":1,"116":1,"256":1,"289":1,"320":1,"324":1,"327":1,"335":1}}],["problem",{"2":{"308":1,"312":1}}],["problems",{"2":{"149":1,"230":2}}],["program",{"2":{"138":1,"190":2}}],["progress",{"2":{"41":1,"42":2}}],["protected",{"2":{"217":1}}],["protection",{"2":{"113":1}}],["protobuf",{"2":{"119":1}}],["protocol",{"2":{"9":1,"101":1}}],["product",{"0":{"243":1,"249":1},"2":{"106":1,"107":1,"163":1,"174":2,"177":2,"243":2,"249":2}}],["providing",{"2":{"101":1,"116":1,"309":1,"313":1}}],["provides",{"2":{"268":1}}],["provided",{"2":{"229":1,"230":1}}],["provide",{"2":{"96":1,"234":1,"241":1,"247":1,"320":1,"327":1}}],["profile",{"2":{"100":1}}],["procfs",{"2":{"113":1,"217":1}}],["proc",{"2":{"93":1,"117":1,"139":1,"337":2}}],["process",{"2":{"94":1,"95":1,"101":1,"106":1,"108":1,"110":1,"113":1,"138":2,"144":1,"217":5,"230":1,"232":3,"236":1,"257":2,"281":1,"286":1,"289":1,"294":1,"300":1,"335":1}}],["processes",{"2":{"91":1,"93":1,"98":1,"111":1,"116":1,"129":1,"142":1,"217":2,"277":1,"294":1,"300":1,"303":1}}],["processed",{"2":{"41":1}}],["processing",{"2":{"61":1}}],["projects",{"2":{"82":1}}],["project",{"2":{"74":1,"107":1,"294":1,"300":1,"308":1,"312":1}}],["prompt",{"2":{"43":1,"104":1}}],["propfile",{"2":{"144":1}}],["props",{"2":{"95":1,"132":1,"134":2,"136":2,"138":2,"139":1,"286":1,"339":1}}],["prop",{"0":{"175":1,"179":1},"2":{"21":1,"80":2,"83":1,"138":1,"139":1,"142":2,"144":1,"163":4,"174":2,"175":2,"179":1,"186":2}}],["property",{"2":{"121":1,"122":1,"163":8,"339":1}}],["properties",{"2":{"93":1,"95":1,"101":1,"102":1,"115":1,"119":1,"163":1,"266":1,"286":1}}],["proper",{"2":{"15":1,"27":1,"44":1,"57":1,"89":1,"94":1,"95":1,"105":1,"108":1,"110":1,"116":1,"126":1,"129":1,"134":2,"135":2,"137":1,"138":1,"144":1,"145":2,"286":1,"289":1}}],["properly",{"2":{"8":1,"39":1,"42":1,"45":1,"52":1,"54":1,"61":1,"88":1,"89":1,"95":1,"97":1,"100":1,"102":1,"104":1,"108":1,"113":2,"119":1,"128":1,"131":1,"132":1,"136":1,"137":1,"138":1,"140":1,"145":1,"230":1,"243":1,"249":1,"266":1,"276":1,"286":1,"309":1,"313":1}}],["v",{"2":{"337":2,"338":2,"339":1}}],["volatile",{"2":{"241":1,"247":1}}],["volume",{"2":{"110":1}}],["visible",{"2":{"307":1,"311":1}}],["view",{"2":{"208":1}}],["video",{"2":{"109":1}}],["v9",{"0":{"145":1}}],["ve",{"2":{"294":1,"300":1}}],["vendor",{"2":{"100":1,"101":1,"110":1,"111":1,"116":1,"140":1,"144":3,"145":2,"157":1,"174":2,"177":2,"211":1,"265":1,"309":1,"313":1}}],["verification",{"2":{"195":1,"253":1,"309":2,"313":2}}],["verifiedbootstate",{"2":{"145":1}}],["verify",{"2":{"24":1,"89":1,"253":1}}],["verifying",{"2":{"20":1}}],["veritymode",{"2":{"145":1}}],["verity",{"2":{"100":1,"126":2,"131":1,"152":1,"195":1,"241":2,"247":2,"334":1}}],["ver",{"2":{"74":1,"183":2,"201":1}}],["versioncode",{"2":{"175":2}}],["versioncode=",{"2":{"175":1}}],["version=",{"2":{"175":1}}],["versions",{"2":{"72":1,"89":1,"137":1,"149":1,"150":1,"217":1,"219":1}}],["version",{"0":{"318":1,"325":1},"2":{"22":1,"58":1,"61":1,"66":1,"67":1,"86":2,"150":1,"175":1,"190":2,"240":1,"285":1,"288":1,"338":1}}],["very",{"2":{"8":1,"39":1,"61":1,"119":1,"217":1,"219":1,"257":1,"265":1}}],["various",{"2":{"303":1,"315":1}}],["variables",{"2":{"129":2}}],["variable",{"2":{"93":1,"265":1}}],["vaultkeeper",{"2":{"200":2}}],["valid",{"2":{"118":1,"241":1,"247":1,"334":2}}],["validation",{"2":{"94":1,"289":1}}],["values",{"2":{"142":1}}],["value",{"2":{"106":1,"179":1,"186":1,"336":1,"339":2}}],["v20",{"0":{"102":1,"103":1,"104":1,"105":1,"106":1,"246":1,"252":1,"255":1,"259":1,"263":1},"1":{"247":1,"248":1,"249":1,"250":1,"251":1,"253":1,"254":1,"256":1,"257":1,"258":1,"260":1,"261":1,"262":1,"264":1,"265":1,"266":1},"2":{"183":1,"204":2,"252":1,"253":2,"256":1,"265":1,"330":5}}],["v22",{"0":{"95":1,"96":1,"279":1,"285":1},"1":{"280":1,"281":1,"282":1,"283":1,"284":1,"286":1,"287":1},"2":{"281":1,"285":2,"288":1,"330":2}}],["v23",{"0":{"94":1,"288":1},"1":{"289":1,"290":1},"2":{"204":1,"285":1,"288":1,"330":1}}],["v24",{"0":{"90":1,"91":1,"92":1,"93":1,"291":1,"297":1,"303":1,"305":1},"1":{"292":1,"293":1,"294":1,"295":1,"296":1,"298":1,"299":1,"300":1,"301":1,"302":1,"304":1,"306":1},"2":{"293":1,"297":3,"299":1,"305":2,"330":4}}],["v25",{"0":{"87":1,"88":1,"89":1,"307":1,"311":1,"315":1},"1":{"308":1,"309":1,"310":1,"312":1,"313":1,"314":1,"316":1},"2":{"204":1,"209":2,"307":1,"309":1,"311":4,"313":1,"330":3}}],["v26+",{"2":{"320":1,"327":1}}],["v26",{"0":{"85":1,"86":1,"317":1,"323":1,"324":1},"1":{"318":1,"319":1,"320":1,"321":1,"322":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1},"2":{"85":1,"324":2,"330":2}}],["v2",{"0":{"66":1,"67":1,"68":1,"152":1},"2":{"102":1,"108":1,"116":1,"118":1,"266":1}}],["v21",{"0":{"97":1,"98":1,"99":1,"100":1,"101":1,"267":1,"270":1,"272":1,"273":1,"275":1,"276":1,"277":1},"1":{"268":1,"269":1,"271":1,"273":1,"274":1,"276":1,"277":1,"278":1},"2":{"9":1,"267":1,"270":3,"272":2,"275":3,"330":4}}],["v3",{"0":{"64":1,"65":1,"151":1},"2":{"90":1,"99":1,"100":1,"150":1,"273":1,"305":1}}],["v4",{"0":{"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"150":1},"2":{"86":1,"93":1,"321":1,"328":1}}],["v5",{"0":{"24":2,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"149":1}}],["v6",{"0":{"21":1,"22":1,"23":1,"148":1}}],["v10",{"0":{"143":1,"144":1}}],["v11",{"0":{"140":1,"141":1,"142":1}}],["v12",{"0":{"139":1}}],["v13",{"0":{"136":1,"137":1,"138":1},"2":{"137":1}}],["v19",{"0":{"107":1,"108":1,"109":1,"110":1,"111":1,"228":1,"236":1,"240":1},"1":{"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"237":1,"241":1,"242":1,"243":1,"244":1,"245":1},"2":{"228":1,"231":1,"236":2,"241":1,"246":2,"330":5}}],["v19+",{"2":{"19":1}}],["v1",{"0":{"69":1,"153":1},"2":{"102":1,"113":1,"114":1,"142":1,"150":1,"266":1}}],["v14",{"0":{"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1},"2":{"39":1,"41":2}}],["v16",{"0":{"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1},"2":{"28":1}}],["v17",{"0":{"114":1,"115":1,"116":1},"2":{"23":1}}],["v15",{"0":{"124":1,"125":1,"126":1,"127":1,"128":1},"2":{"22":1}}],["v18+",{"2":{"219":1}}],["v18",{"0":{"112":1,"113":1,"216":1,"222":1},"1":{"217":1,"218":1,"219":1,"220":1,"221":1,"223":1,"224":1,"225":1,"226":1,"227":1},"2":{"20":1,"21":1,"217":1,"226":1,"228":1,"236":1,"330":2}}],["v7a",{"2":{"174":1}}],["v7",{"0":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"147":1},"2":{"204":2,"253":1}}],["vbmeta",{"2":{"8":1,"89":1,"93":2,"105":1,"194":9,"195":6,"203":1,"334":1}}],["v8a",{"2":{"174":1}}],["v8",{"0":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"146":1}}],["19",{"0":{"240":1,"311":1},"1":{"241":1,"242":1,"243":1,"244":1,"245":1,"312":1,"313":1,"314":1}}],["1st",{"2":{"229":1}}],["1示例",{"2":{"173":1}}],["1437",{"0":{"132":1}}],["1455",{"0":{"131":1}}],["1456",{"0":{"130":1}}],["1468",{"0":{"129":1}}],["11",{"0":{"140":1,"246":1,"252":1,"270":1,"323":1},"1":{"247":1,"248":1,"249":1,"250":1,"251":1,"253":1,"254":1,"271":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1},"2":{"100":1,"101":2,"157":1,"187":2,"267":2,"268":2}}],["123456",{"2":{"175":1}}],["123456789",{"2":{"187":1}}],["123456789原版示例",{"2":{"187":1}}],["1234567",{"2":{"175":1}}],["12",{"0":{"216":1,"272":1,"288":1},"1":{"217":1,"218":1,"219":1,"220":1,"221":1,"273":1,"274":1,"289":1,"290":1},"2":{"89":1,"93":1}}],["13",{"0":{"270":1},"1":{"271":1},"2":{"89":1,"194":1}}],["17",{"0":{"116":1,"275":1},"1":{"276":1,"277":1,"278":1},"2":{"79":1,"136":1}}],["1500",{"2":{"28":1}}],["1+",{"2":{"28":1,"253":1}}],["1",{"0":{"8":1,"10":1,"15":1,"17":1,"18":2,"19":1,"21":1,"22":1,"24":1,"26":1,"32":1,"38":1,"46":2,"47":1,"53":1,"57":1,"62":1,"64":1,"67":1,"85":1,"88":1,"92":1,"95":1,"100":1,"105":1,"110":1,"112":1,"116":1,"122":1,"127":1,"134":1,"138":1,"141":1,"222":1,"236":2,"252":1,"255":1,"259":1,"270":1,"275":1,"285":1,"291":1,"297":2,"303":1,"311":1,"323":1},"1":{"223":1,"224":1,"225":1,"226":1,"227":1,"237":2,"253":1,"254":1,"256":1,"257":1,"258":1,"260":1,"261":1,"262":1,"271":1,"276":1,"277":1,"278":1,"286":1,"287":1,"292":1,"293":1,"294":1,"295":1,"296":1,"298":2,"299":2,"300":2,"301":2,"302":2,"304":1,"312":1,"313":1,"314":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1},"2":{"20":1,"41":1,"72":1,"73":2,"75":1,"76":1,"93":2,"108":1,"131":1,"137":1,"175":1,"176":1,"194":1,"204":3,"224":1,"226":1,"233":1,"236":1,"253":1,"270":1,"297":1,"305":1,"311":1,"330":8,"334":3}}],["101",{"2":{"175":1}}],["10+",{"2":{"72":1,"74":3,"102":2,"266":2}}],["100",{"2":{"9":1,"23":1,"42":1,"86":1,"108":1,"214":1,"224":1,"232":1,"265":1,"281":1}}],["10",{"0":{"242":1,"246":1,"248":1,"259":1,"267":1,"305":1},"1":{"247":1,"248":1,"249":1,"250":1,"251":1,"260":1,"261":1,"262":1,"268":1,"269":1,"306":1},"2":{"7":1,"72":1,"73":1,"75":1,"76":1,"101":1,"106":1,"107":3,"186":1,"208":1,"241":2,"242":3,"243":1,"246":1,"247":2,"248":2,"249":1}}],["drowning",{"2":{"292":1,"298":1}}],["dropping",{"0":{"219":1}}],["drop",{"2":{"20":1,"219":1,"318":1,"325":1}}],["drivers",{"2":{"275":1}}],["driver",{"2":{"230":1}}],["dr",{"2":{"217":1}}],["dp3",{"2":{"138":1}}],["dt",{"2":{"106":1}}],["dtbs",{"2":{"248":1}}],["dtbh",{"2":{"106":1}}],["dtb",{"2":{"88":1,"93":1,"102":1,"104":1,"106":1,"118":2,"122":1,"126":2,"134":2,"145":1,"266":1,"334":9}}],["dtbo",{"2":{"35":2,"104":1,"131":2,"334":1}}],["dm",{"2":{"100":1,"126":1,"241":1,"247":1}}],["dhtb",{"2":{"98":1,"124":1,"277":1}}],["dsu",{"2":{"93":1}}],["duh",{"2":{"223":1}}],["dummy",{"2":{"134":1,"145":2,"148":1}}],["dumps",{"2":{"135":1}}],["dump",{"2":{"99":1,"101":1,"273":1}}],["during",{"2":{"88":1}}],["due",{"2":{"23":1,"228":1,"231":1,"233":1,"240":1,"267":1,"282":1,"293":1,"299":1,"320":2,"327":2}}],["d",{"2":{"86":1,"102":1,"107":1,"113":2,"116":2,"118":2,"125":2,"135":2,"138":1,"142":2,"158":3,"186":4,"187":6,"218":3,"241":2,"247":2,"266":1,"268":1}}],["docs",{"2":{"229":1,"268":1}}],["documentations",{"2":{"241":1,"243":1,"247":1,"249":1,"267":1}}],["documentation",{"0":{"295":1,"301":1},"2":{"101":1,"295":1,"301":1,"321":1,"328":1}}],["domain",{"2":{"147":1,"151":2,"336":1}}],["dontauditxperm",{"2":{"336":1}}],["dontaudit",{"2":{"336":1}}],["done",{"2":{"220":1,"223":1,"226":1}}],["don",{"2":{"142":1,"219":1,"318":1,"325":1}}],["donation",{"2":{"61":1}}],["double",{"2":{"126":1}}],["does",{"2":{"96":1,"126":1,"138":1,"142":1,"229":1,"257":1,"283":1}}],["doesn",{"2":{"43":1,"142":1,"228":1,"319":1,"326":1}}],["do",{"2":{"93":1,"110":1,"140":1,"151":1,"220":1,"228":1,"234":1,"256":2,"257":1}}],["down",{"0":{"224":1},"2":{"20":1,"42":1,"112":1,"142":1}}],["downloaded",{"2":{"24":1,"41":1,"52":1}}],["downloads",{"2":{"24":1,"67":1}}],["downloading",{"2":{"14":1,"17":1,"21":1,"42":1,"48":1,"93":1,"281":1}}],["download",{"2":{"7":1,"21":1,"27":1,"41":1,"42":1,"45":1,"60":2,"61":2,"68":1,"150":1,"195":1,"201":1,"253":2,"293":2,"299":2}}],["db",{"2":{"41":1,"158":1}}],["dynamically",{"2":{"102":1,"253":1,"266":1}}],["dynamic",{"2":{"39":1,"131":1,"138":1}}],["dangerous",{"2":{"241":1,"247":1}}],["danger",{"2":{"204":2}}],["date",{"2":{"143":1}}],["databin=$secure",{"2":{"158":1}}],["database",{"2":{"24":1,"32":1,"33":1,"38":1,"41":2,"61":1,"113":2,"138":1}}],["data",{"0":{"158":1,"161":1},"2":{"41":1,"62":1,"87":1,"95":1,"99":1,"101":1,"107":1,"109":1,"111":1,"113":2,"114":2,"119":1,"125":1,"128":2,"129":1,"135":2,"139":1,"142":5,"157":2,"158":7,"161":3,"163":2,"173":3,"174":4,"176":1,"186":9,"203":1,"209":1,"218":3,"230":1,"253":1,"273":1,"286":1,"315":1,"337":1}}],["daemon",{"2":{"86":1,"104":1,"105":1,"108":1,"111":1,"114":3,"116":1,"117":2,"118":7,"119":8,"122":1,"124":3,"125":2,"126":1,"128":3,"129":4,"131":1,"132":6,"134":2,"135":4,"138":2,"139":1,"142":1,"145":1,"253":1,"256":1,"294":1,"300":1,"309":1,"313":1,"337":1}}],["dark",{"2":{"22":1,"39":1,"60":1,"61":1}}],["differently",{"2":{"309":1,"313":1}}],["different",{"2":{"294":1,"300":1}}],["dirpermission",{"2":{"184":3}}],["dir",{"2":{"158":7,"184":1,"241":1,"247":1}}],["dir=",{"2":{"158":1}}],["directory",{"2":{"107":1,"142":2,"184":4,"187":1,"194":1,"241":2,"247":2,"268":1}}],["directly",{"2":{"99":1,"111":1,"119":1,"134":1,"138":1,"230":1,"257":1,"273":1,"294":1,"300":1}}],["direct",{"2":{"44":1}}],["ditched",{"2":{"138":1}}],["discussion",{"2":{"234":1}}],["discovered",{"2":{"217":1}}],["disconnected",{"2":{"118":1}}],["distributed",{"2":{"190":1}}],["distributors",{"2":{"309":1,"313":1}}],["distributor",{"2":{"89":1}}],["distinguish",{"2":{"100":1}}],["disappear",{"2":{"143":1}}],["disallow",{"2":{"96":1}}],["disable",{"2":{"60":1,"63":1,"101":1,"102":1,"113":1,"121":1,"140":1,"142":2,"151":1,"152":1,"174":1,"195":2,"266":1,"337":1}}],["disabled",{"2":{"51":1,"121":1,"224":1,"268":1}}],["display",{"2":{"20":1,"61":1}}],["dialog",{"2":{"61":1}}],["dialogs",{"2":{"39":1}}],["diareuse",{"2":{"15":1}}],["dedup",{"2":{"241":1,"247":1}}],["dedicated",{"2":{"118":1,"217":1}}],["dest",{"2":{"334":2,"337":3}}],["description=",{"2":{"175":1}}],["designed",{"2":{"219":1,"241":1,"247":1,"256":1,"309":1,"313":1,"320":1,"327":1}}],["design",{"2":{"68":1,"119":1}}],["dead",{"0":{"281":1}}],["deadlocks",{"2":{"95":1,"286":1}}],["deadlock",{"2":{"94":1,"95":1,"286":1,"289":1}}],["dealing",{"2":{"260":1}}],["deal",{"2":{"144":1,"268":1}}],["debuggable",{"2":{"140":1}}],["debugging",{"2":{"113":1}}],["debug",{"2":{"117":1,"124":1,"309":1,"313":1}}],["defex",{"2":{"114":1,"116":1}}],["default",{"2":{"45":1,"57":1,"82":1,"102":1,"138":1,"148":1,"152":1,"264":1,"266":1,"336":3}}],["deny",{"2":{"336":1}}],["denylist",{"2":{"89":2,"91":1,"93":1,"303":1,"337":2}}],["denies",{"2":{"113":1,"114":1}}],["depending",{"2":{"218":1}}],["depends",{"2":{"218":1}}],["dependency",{"2":{"147":1}}],["dependencies",{"2":{"45":1}}],["deprecate",{"2":{"113":1}}],["deprecated",{"2":{"107":1}}],["delprop",{"2":{"339":1}}],["delta",{"2":{"168":1,"191":1}}],["delay",{"2":{"107":1}}],["delete",{"2":{"95":1,"134":1,"286":1,"339":1}}],["deleted",{"2":{"93":1}}],["deleting",{"2":{"19":1}}],["decided",{"2":{"233":1,"240":1,"264":1}}],["decoupling",{"2":{"292":1,"298":1}}],["decouples",{"2":{"229":1}}],["decompress",{"2":{"134":1,"334":1}}],["decompression",{"2":{"103":1}}],["decode",{"2":{"119":1}}],["declaring",{"2":{"101":1}}],["development",{"2":{"309":1,"313":1}}],["developers",{"2":{"219":1,"229":2,"240":1,"243":1,"249":1,"256":1,"257":2,"267":1,"268":2,"293":1,"294":2,"295":1,"299":1,"300":2,"301":1,"308":1,"312":1,"318":1,"325":1}}],["developer",{"2":{"119":1,"152":1,"188":1,"257":1,"268":1,"309":1,"313":1}}],["devs",{"2":{"229":1,"256":1}}],["dev",{"2":{"100":1,"102":1,"116":1,"117":1,"118":1,"157":1,"194":2,"266":1}}],["devpts",{"2":{"93":1}}],["device",{"2":{"8":1,"9":1,"15":1,"89":1,"95":1,"101":2,"109":1,"110":1,"116":1,"117":1,"135":1,"144":1,"151":2,"152":1,"201":1,"256":1,"257":1,"268":1,"272":1,"286":1,"308":2,"309":1,"312":2,"313":1}}],["devices",{"2":{"7":1,"8":1,"20":1,"22":1,"24":1,"34":1,"35":1,"39":1,"43":1,"58":1,"86":1,"87":1,"88":1,"89":3,"93":5,"96":1,"99":1,"101":1,"102":3,"105":2,"107":2,"108":1,"109":1,"111":1,"112":1,"116":2,"118":4,"119":2,"123":1,"125":1,"126":4,"130":1,"131":1,"132":1,"134":3,"135":1,"137":1,"138":2,"139":2,"140":1,"145":1,"150":2,"151":3,"152":1,"167":1,"217":2,"224":2,"230":3,"231":1,"236":1,"241":4,"242":1,"244":2,"246":1,"247":4,"248":1,"250":2,"253":2,"256":1,"266":3,"273":1,"275":2,"282":1,"308":1,"312":1,"315":1,"320":2,"327":2}}],["de",{"2":{"43":1}}],["determined",{"2":{"292":1,"298":1}}],["detectable",{"2":{"102":1,"266":1}}],["detecting",{"2":{"93":1,"118":2,"119":1}}],["detection",{"2":{"21":1,"35":1,"44":1,"57":1,"87":1,"88":1,"89":1,"100":1,"101":1,"113":1,"114":1,"115":1,"118":1,"122":1,"124":1,"138":1,"145":1,"253":1,"268":1,"315":1,"320":2,"327":2}}],["detections",{"2":{"12":1,"23":1,"118":1,"124":1}}],["detect",{"2":{"42":1,"88":1,"96":1,"99":1,"102":1,"117":1,"128":1,"134":1,"149":1,"151":1,"217":2,"226":1,"266":1,"273":1}}],["detected",{"2":{"27":1,"45":1,"60":1,"113":1,"139":1,"144":1,"241":1,"247":1}}],["detail",{"2":{"308":1,"312":1}}],["details",{"2":{"101":1,"102":1,"165":1,"190":1,"223":1,"241":1,"242":1,"243":1,"244":1,"247":1,"248":1,"249":1,"250":1,"257":1,"266":1,"268":3,"270":1,"295":1,"301":1}}],["detailed",{"2":{"9":1,"41":1}}],["mm",{"2":{"338":1}}],["mv",{"2":{"334":1}}],["mkdir",{"2":{"334":1}}],["mke2fs",{"2":{"122":1}}],["m",{"2":{"226":1,"232":1,"338":2}}],["mtp",{"2":{"195":1}}],["mtk",{"2":{"122":1,"131":1,"139":2,"209":1}}],["msg",{"2":{"184":4}}],["ms",{"2":{"125":1}}],["myself",{"2":{"308":1,"312":1}}],["myservice",{"2":{"187":4}}],["myscript",{"2":{"187":3}}],["my",{"2":{"119":1,"147":1,"228":1,"234":1,"292":2,"298":2,"308":1,"312":1}}],["mnt",{"2":{"106":1,"117":1}}],["md5",{"2":{"201":1}}],["md",{"2":{"45":1,"61":1}}],["multirom",{"2":{"140":1}}],["multi",{"2":{"135":1}}],["multiple",{"2":{"91":1,"95":1,"96":1,"105":1,"138":1,"286":1,"303":1}}],["multithreading",{"2":{"42":1}}],["multiuser",{"2":{"41":1,"54":1,"91":1,"135":1,"138":1,"303":1}}],["much",{"2":{"17":1,"45":1,"68":1,"267":1,"292":2,"298":2,"309":1,"313":1}}],["micsk",{"2":{"335":1}}],["microloader",{"2":{"86":1}}],["missing",{"2":{"141":1}}],["miscellaneous",{"0":{"264":1}}],["misc",{"2":{"130":1,"131":1}}],["might",{"2":{"119":2,"145":1,"152":1,"308":1,"309":1,"312":1,"313":1}}],["migrated",{"2":{"129":1}}],["migrate",{"2":{"113":1,"135":1,"218":1,"220":1}}],["migration",{"2":{"32":1,"39":1,"95":1,"230":1,"236":1,"286":1}}],["mirroring",{"2":{"144":1}}],["mirrors",{"2":{"110":1,"116":1,"144":1,"319":1,"326":1}}],["mirror",{"2":{"85":1,"106":1,"110":1,"145":1,"157":1,"324":1}}],["minimum",{"0":{"318":1,"325":1},"2":{"86":1}}],["minimal",{"2":{"28":1,"145":2,"150":1,"152":1}}],["minor",{"2":{"36":1,"46":1,"86":1,"98":1,"268":1,"277":1,"297":1,"311":1}}],["minmagisk",{"2":{"28":1}}],["meaning",{"2":{"229":1}}],["means",{"2":{"217":1,"241":1,"247":1,"253":1,"268":1,"308":1,"312":1,"320":1,"327":1}}],["me",{"2":{"220":1,"234":1,"267":1,"292":1,"298":1}}],["medium",{"2":{"217":1}}],["merchantability",{"2":{"190":1}}],["merging",{"2":{"128":1,"147":1}}],["merged",{"2":{"47":1,"54":1,"96":1}}],["merge",{"2":{"44":1,"128":1,"138":1}}],["member",{"2":{"113":1,"336":1}}],["memory",{"2":{"8":1,"20":1,"23":1,"46":1,"62":1,"93":1,"101":1,"134":1,"142":1}}],["messages",{"2":{"141":1}}],["messaging",{"2":{"91":1,"303":1}}],["messed",{"2":{"109":1}}],["meizu",{"2":{"93":1,"134":1}}],["menu",{"2":{"39":1}}],["meta",{"2":{"181":1}}],["metadata",{"2":{"23":1,"174":1}}],["methods",{"2":{"21":1,"118":1}}],["method",{"2":{"11":1,"22":1,"27":1,"33":1,"43":1,"44":1,"102":1,"118":1,"151":1,"152":1,"232":2,"256":2,"266":1}}],["mechanisms",{"2":{"321":1,"328":1}}],["mechanism",{"2":{"17":1,"24":1,"89":1,"91":2,"138":1,"145":1,"303":2,"308":1,"312":1,"320":2,"327":2}}],["mouse",{"2":{"292":1,"298":1}}],["mountinfo",{"2":{"145":1}}],["mounting",{"2":{"86":1,"95":1,"98":1,"99":1,"101":1,"109":1,"114":1,"118":1,"125":1,"135":1,"138":1,"140":2,"241":1,"247":1,"273":1,"277":1,"286":1}}],["mounts",{"2":{"137":1,"144":1,"145":1}}],["mountpoint",{"2":{"131":1,"133":1,"218":1}}],["mounted",{"2":{"107":1,"114":1,"135":1,"142":1,"218":1,"230":2}}],["mount",{"0":{"319":1,"326":1},"2":{"86":1,"93":1,"98":1,"101":1,"108":2,"111":2,"113":1,"117":1,"118":2,"119":1,"125":1,"134":1,"135":1,"138":3,"140":1,"142":2,"143":1,"144":6,"145":4,"174":2,"224":2,"241":1,"247":1,"248":1,"277":1,"308":1,"312":1,"319":1,"326":1,"338":1}}],["months",{"2":{"292":1,"298":1,"308":1,"312":1}}],["monolithic",{"2":{"160":1}}],["monitoring",{"2":{"111":1,"118":1,"145":1}}],["monitor",{"2":{"108":1,"129":3,"132":1,"138":1,"217":1,"232":1}}],["motorola",{"2":{"145":1}}],["motorolla",{"2":{"102":1,"266":1}}],["mostly",{"2":{"236":1,"246":1,"270":1,"272":1}}],["most",{"2":{"139":2,"145":1,"228":1,"231":1,"241":1,"246":1,"247":1,"253":1,"308":1,"312":1}}],["moved",{"2":{"113":1,"131":1,"134":1,"138":2,"218":1,"243":1,"249":1}}],["move",{"2":{"24":1,"87":1,"105":1,"111":1,"116":1,"129":1,"139":2,"144":1,"145":1,"315":1}}],["modded",{"2":{"309":1,"313":1}}],["modding",{"2":{"248":1}}],["moddir=$",{"2":{"176":1}}],["modpath",{"2":{"183":1}}],["modifications",{"2":{"152":1}}],["modify",{"2":{"106":1,"113":1,"190":1,"241":1,"243":1,"247":1,"249":1,"319":1,"326":1}}],["modifying",{"2":{"95":1,"241":1,"247":1,"286":1}}],["mods",{"2":{"150":4,"309":1,"313":1}}],["module",{"0":{"175":1,"229":1,"257":1},"2":{"17":1,"19":1,"21":2,"22":1,"28":1,"41":1,"42":1,"67":1,"68":1,"85":1,"99":1,"101":1,"113":2,"121":1,"133":1,"135":1,"147":2,"148":1,"174":1,"175":7,"181":2,"183":1,"185":1,"219":1,"229":5,"230":2,"236":1,"243":1,"249":1,"256":2,"257":4,"265":1,"268":1,"273":1,"293":2,"294":2,"299":2,"300":2,"321":1,"324":1,"328":1,"337":1}}],["modules",{"0":{"256":1,"293":1,"299":1},"2":{"13":1,"18":1,"21":1,"25":1,"39":1,"41":1,"48":1,"58":1,"61":3,"66":1,"86":1,"93":3,"100":1,"101":2,"104":1,"105":1,"107":2,"113":1,"145":2,"150":1,"157":2,"158":3,"167":2,"174":2,"218":1,"224":1,"229":5,"230":5,"236":2,"256":2,"257":2,"268":2,"292":1,"293":3,"295":1,"298":1,"299":3,"301":1,"319":1,"320":1,"326":1,"327":1,"337":1}}],["model",{"2":{"201":1}}],["mode",{"0":{"265":1},"2":{"14":1,"41":1,"44":1,"53":1,"54":1,"58":1,"88":1,"101":3,"102":1,"110":1,"118":1,"122":1,"129":1,"132":2,"135":1,"137":1,"138":3,"142":1,"145":1,"152":1,"173":1,"241":2,"247":2,"253":1,"265":2,"266":1,"268":2,"334":4}}],["modernization",{"2":{"15":1,"112":1}}],["modern",{"0":{"220":1},"2":{"9":1,"217":1,"220":1}}],["more",{"2":{"7":1,"15":2,"16":1,"20":1,"24":1,"68":1,"99":1,"100":1,"101":2,"102":2,"107":1,"114":2,"122":1,"129":2,"138":1,"139":1,"140":1,"145":1,"151":1,"190":1,"220":1,"226":2,"243":1,"244":1,"246":1,"249":1,"250":1,"266":2,"268":3,"273":1,"275":1,"281":1,"292":1,"298":1,"309":1,"313":1,"319":1,"320":1,"326":1,"327":1}}],["malicious",{"2":{"309":1,"313":1}}],["malware",{"2":{"118":1}}],["making",{"2":{"281":1,"309":1,"313":1}}],["makes",{"2":{"142":1,"220":1,"257":1}}],["make",{"2":{"7":1,"86":1,"99":1,"100":2,"101":1,"105":1,"116":1,"118":1,"138":1,"256":1,"273":1,"309":1,"313":1,"319":1,"326":1}}],["macintosh",{"2":{"175":1}}],["macos",{"2":{"79":2}}],["maximum",{"2":{"152":1}}],["master",{"2":{"138":1,"338":1}}],["massive",{"2":{"33":1,"39":1,"46":1,"68":1,"119":1,"129":1,"133":1,"150":1,"228":1,"240":1,"241":1,"247":1,"267":1}}],["maintenance",{"2":{"270":1,"272":1,"293":1,"299":1,"303":1,"315":1}}],["maintaining",{"2":{"308":1,"312":1}}],["maintain",{"2":{"220":1}}],["mainly",{"2":{"264":1}}],["mainline",{"2":{"107":1}}],["main",{"2":{"111":1,"231":1,"234":1,"267":1}}],["matter",{"2":{"265":2}}],["matching",{"2":{"142":1}}],["matches",{"2":{"142":1,"217":1}}],["match",{"2":{"88":1,"89":1,"95":1,"101":1,"286":1,"336":1}}],["material",{"2":{"68":1}}],["magic™🌈",{"2":{"281":1}}],["magicmount",{"2":{"106":1,"107":1,"110":3,"111":1,"133":1,"134":1}}],["magic",{"0":{"319":1,"326":1},"2":{"86":1,"91":1,"114":1,"135":1,"138":1,"140":1,"142":2,"143":1,"144":5,"145":3,"224":2,"303":1,"319":1,"326":1}}],["magisktmp",{"2":{"187":8}}],["magisktmp=$",{"2":{"157":1}}],["magisk引导过程",{"0":{"159":1},"1":{"160":1,"161":1,"162":1}}],["magisklogd",{"2":{"118":2}}],["magiskdb=$secure",{"2":{"158":1}}],["magiskd",{"2":{"88":1,"89":1,"118":1,"119":1,"161":1,"164":3}}],["magiskpolicy",{"0":{"336":1},"2":{"86":2,"93":1,"94":1,"101":4,"102":1,"111":1,"113":2,"119":2,"122":1,"123":1,"126":1,"137":2,"138":4,"140":3,"164":1,"180":1,"256":1,"266":1,"268":1,"289":1,"333":2,"336":2}}],["magiskboot",{"0":{"334":1},"2":{"86":2,"88":2,"89":1,"91":2,"93":4,"95":3,"96":1,"98":1,"99":1,"100":3,"101":2,"102":1,"103":1,"104":1,"105":1,"106":4,"107":2,"108":1,"113":3,"114":1,"118":1,"120":1,"122":4,"124":4,"125":1,"126":1,"127":1,"129":2,"131":2,"132":2,"134":3,"135":1,"137":1,"138":2,"139":2,"140":1,"260":1,"266":1,"273":1,"277":1,"283":1,"286":3,"303":2,"334":3}}],["magiskinit",{"0":{"308":1,"312":1,"335":1},"2":{"85":1,"86":2,"87":3,"88":1,"89":4,"93":6,"95":1,"96":1,"98":1,"99":1,"100":2,"101":4,"102":2,"104":1,"105":1,"106":1,"107":5,"108":2,"109":1,"110":2,"111":3,"115":1,"116":1,"117":1,"118":2,"119":2,"123":1,"124":2,"126":1,"129":2,"130":1,"131":4,"134":1,"157":1,"160":2,"187":1,"256":1,"266":2,"273":1,"277":1,"283":1,"286":1,"308":2,"312":2,"315":3,"324":1,"333":1}}],["magiskmanager",{"2":{"24":1,"43":1,"204":1}}],["magisksu",{"0":{"309":1,"313":1},"2":{"11":1,"63":2,"89":5,"91":4,"93":2,"96":1,"97":1,"100":1,"101":3,"104":1,"105":1,"107":1,"108":1,"109":1,"111":1,"113":2,"114":3,"115":1,"116":1,"118":2,"129":1,"131":1,"134":1,"135":1,"138":7,"140":2,"142":9,"224":1,"276":1,"283":1,"303":4,"338":1}}],["magiskhide",{"0":{"217":1,"232":1,"292":1,"298":1},"2":{"10":1,"19":1,"22":1,"27":1,"41":1,"42":1,"62":1,"63":1,"93":1,"94":2,"95":2,"96":2,"98":1,"100":2,"101":1,"102":5,"105":1,"106":1,"107":2,"108":1,"111":2,"113":6,"114":1,"116":1,"117":1,"118":1,"119":2,"121":1,"126":1,"131":2,"135":1,"136":1,"137":2,"138":9,"139":4,"140":3,"141":2,"142":1,"217":1,"224":1,"226":1,"232":1,"236":1,"241":1,"242":1,"247":1,"248":1,"261":1,"264":1,"266":5,"277":1,"283":2,"286":2,"289":2,"292":2,"298":2}}],["magiskchinesedocument",{"2":{"0":1}}],["magisk",{"0":{"0":1,"1":1,"78":1,"84":1,"157":1,"169":1,"174":1,"181":1,"189":1,"190":1,"197":1,"199":1,"216":1,"222":1,"225":1,"228":1,"229":1,"230":1,"236":1,"240":1,"246":1,"252":1,"253":1,"255":1,"259":1,"260":1,"261":1,"263":1,"266":1,"267":1,"270":1,"272":1,"275":1,"279":1,"280":1,"281":2,"285":1,"288":1,"291":1,"293":1,"297":1,"299":1,"303":1,"305":1,"307":1,"311":1,"315":1,"317":1,"323":1,"333":1,"337":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"79":1,"80":1,"81":1,"82":1,"83":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"182":1,"183":1,"184":1,"185":1,"190":1,"191":1,"192":1,"217":1,"218":1,"219":1,"220":1,"221":1,"223":1,"224":1,"225":1,"226":1,"227":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"237":1,"241":1,"242":1,"243":1,"244":1,"245":1,"247":1,"248":1,"249":1,"250":1,"251":1,"253":1,"254":1,"256":1,"257":1,"258":1,"260":1,"261":1,"262":1,"264":1,"265":1,"266":1,"268":1,"269":1,"271":1,"273":1,"274":1,"276":1,"277":1,"278":1,"280":1,"281":1,"282":1,"283":1,"284":1,"286":1,"287":1,"289":1,"290":1,"292":1,"293":1,"294":1,"295":1,"296":1,"298":1,"299":1,"300":1,"301":1,"302":1,"304":1,"306":1,"308":1,"309":1,"310":1,"312":1,"313":1,"314":1,"316":1,"318":1,"319":1,"320":1,"321":1,"322":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1,"334":1,"335":1,"336":1,"337":1,"338":1,"339":1,"340":1},"2":{"0":2,"9":1,"12":3,"15":1,"20":3,"21":2,"22":1,"23":2,"24":2,"27":4,"33":2,"36":1,"37":1,"39":2,"41":2,"43":1,"44":2,"45":1,"46":1,"49":1,"54":2,"57":1,"61":1,"65":1,"66":3,"67":2,"70":1,"74":3,"76":7,"77":1,"79":1,"80":1,"81":1,"82":8,"83":7,"88":1,"89":1,"93":5,"96":6,"99":1,"100":3,"101":1,"104":1,"105":1,"109":1,"110":1,"111":3,"113":5,"115":2,"116":1,"118":5,"119":3,"123":1,"124":1,"125":1,"128":3,"130":1,"131":3,"132":1,"135":3,"136":1,"137":1,"138":2,"139":1,"142":4,"143":1,"144":3,"145":3,"146":1,"147":3,"149":1,"150":3,"152":3,"154":2,"157":7,"158":9,"160":1,"162":1,"164":13,"165":2,"167":4,"168":3,"169":3,"171":1,"173":9,"174":3,"175":1,"177":1,"178":1,"181":8,"182":1,"183":4,"185":1,"186":2,"187":6,"188":2,"189":6,"191":3,"192":1,"193":2,"194":4,"195":4,"196":3,"197":8,"199":2,"201":6,"203":1,"204":10,"206":1,"207":2,"208":4,"209":7,"210":2,"211":2,"212":3,"213":7,"214":8,"215":1,"217":3,"218":7,"219":4,"220":1,"222":1,"223":1,"226":1,"229":3,"230":1,"231":2,"236":1,"241":4,"243":1,"244":1,"247":4,"249":1,"250":1,"253":13,"255":1,"256":3,"257":1,"264":2,"265":3,"267":3,"268":5,"273":1,"280":3,"281":7,"282":2,"285":2,"288":2,"292":2,"293":2,"294":3,"298":2,"299":2,"300":3,"308":5,"309":8,"312":5,"313":8,"318":2,"320":3,"325":2,"327":3,"330":1,"331":1,"332":1,"333":4,"334":1,"335":2,"336":7,"337":11,"338":1,"339":1,"340":2}}],["maybe",{"2":{"145":1}}],["may",{"2":{"33":1,"98":1,"101":1,"129":1,"229":1,"268":1,"275":1,"277":1}}],["manufacturers",{"2":{"253":1}}],["manually",{"2":{"43":1,"64":1,"65":1}}],["manpage",{"2":{"129":1}}],["manipulating",{"2":{"119":1}}],["manipulate",{"2":{"101":1}}],["manage",{"2":{"150":1}}],["managed",{"2":{"91":1,"303":1}}],["management",{"2":{"54":1,"63":1,"68":1,"89":1,"147":1,"309":2,"313":2}}],["manager",{"0":{"1":1,"225":1,"253":1,"261":1,"280":1,"281":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1},"2":{"12":3,"21":3,"23":1,"24":1,"27":2,"33":2,"37":1,"39":2,"41":1,"44":1,"46":1,"49":1,"53":1,"70":1,"96":2,"101":1,"109":1,"113":3,"115":1,"118":3,"119":1,"123":1,"131":2,"136":1,"142":2,"143":1,"147":2,"149":1,"150":1,"152":1,"204":1,"219":2,"232":1,"253":9,"264":3,"267":2,"268":1,"281":2,"282":1,"309":1,"313":1,"331":1}}],["many",{"2":{"21":1,"43":1,"95":1,"97":1,"102":1,"131":1,"137":1,"217":1,"220":1,"230":1,"241":2,"243":1,"247":2,"248":1,"249":1,"266":1,"275":1,"276":1,"286":1,"292":1,"298":1,"308":2,"309":1,"312":2,"313":1,"320":1,"327":1}}],["markdown",{"2":{"20":1,"45":1}}],["major",{"0":{"225":1},"2":{"20":1,"91":1,"112":1,"216":1,"218":1,"225":1,"280":1,"282":1,"285":1,"288":1,"303":1,"307":1,"311":1,"319":1,"321":1,"326":1,"328":1}}],["t2",{"2":{"336":3}}],["t1",{"2":{"336":3}}],["tuned",{"2":{"226":1,"233":1,"242":1}}],["turn",{"2":{"152":1}}],["tl",{"2":{"217":1}}],["tl00h",{"2":{"204":1}}],["tmpdir",{"2":{"183":1}}],["tmpfs",{"0":{"157":1},"2":{"109":1,"118":1,"119":1,"133":1,"134":1,"145":1,"157":1,"187":6,"268":2,"337":1}}],["tweeted",{"2":{"242":1,"248":1}}],["twitter",{"2":{"242":1,"248":1,"292":1,"298":1}}],["twice",{"2":{"114":1}}],["twrp",{"2":{"181":1}}],["txt用法",{"2":{"334":1,"336":1,"337":1,"338":1,"339":1}}],["txtmagiskboot",{"2":{"333":1}}],["txtmagisk",{"2":{"190":2}}],["txtramdisk",{"2":{"187":1}}],["txt模块module",{"2":{"181":1}}],["txt",{"2":{"174":1}}],["tin",{"2":{"309":1,"313":1}}],["tip",{"2":{"209":1}}],["tiback",{"2":{"142":1}}],["times",{"2":{"105":1,"139":1}}],["timeout",{"2":{"50":1,"101":1,"138":1}}],["time",{"2":{"42":1,"216":1,"228":1,"232":1,"241":1,"247":1,"256":1,"264":2,"267":1,"280":1,"291":1,"292":1,"293":1,"297":1,"298":1,"299":1,"308":1,"312":1,"317":1,"324":1}}],["typo",{"2":{"131":1,"134":1,"135":1}}],["typeattribute",{"2":{"336":1}}],["type",{"2":{"113":2,"140":1,"164":1,"336":28}}],["types",{"2":{"101":1}}],["team",{"2":{"291":1,"297":1}}],["tend",{"2":{"148":1}}],["temporarily",{"2":{"224":2,"264":1}}],["temporary",{"2":{"131":1}}],["template",{"2":{"58":1,"144":1,"148":1,"229":1,"230":1,"257":3}}],["textfile",{"2":{"113":1}}],["tegra",{"2":{"102":1,"266":1}}],["te",{"2":{"101":1,"336":1}}],["techniques",{"2":{"226":1}}],["technique",{"2":{"96":1,"282":1}}],["terms",{"2":{"190":1}}],["terminal",{"2":{"116":1}}],["term",{"2":{"96":1,"232":1}}],["testing",{"2":{"264":1,"318":2,"325":2}}],["tested",{"2":{"138":1,"139":1,"230":1,"232":1,"236":1,"240":1}}],["test",{"2":{"91":1,"303":1,"334":2}}],["tampering",{"2":{"241":1,"247":1}}],["tags",{"2":{"140":1}}],["tasker",{"2":{"119":1}}],["take",{"2":{"96":1,"283":1}}],["tab",{"2":{"63":1}}],["targeted",{"2":{"217":1}}],["target",{"2":{"116":1,"142":1,"144":1,"184":4,"232":1,"334":2,"336":10}}],["targeting",{"2":{"91":1,"303":1}}],["targets",{"2":{"19":1,"111":1,"113":1,"119":1}}],["tar",{"2":{"8":1,"9":1,"13":1,"94":1,"201":3,"289":1}}],["t",{"2":{"33":1,"37":1,"43":1,"134":1,"137":1,"142":4,"219":1,"224":2,"228":1,"264":1,"281":1,"307":1,"311":1,"318":1,"319":1,"325":1,"326":1}}],["trusted",{"2":{"309":1,"313":1}}],["true",{"2":{"183":2,"334":1}}],["truncate",{"2":{"8":1}}],["try",{"2":{"113":1}}],["trying",{"2":{"49":1,"124":1}}],["treats",{"2":{"309":1,"313":1}}],["treated",{"2":{"142":1}}],["tree",{"2":{"101":1,"117":1,"145":1}}],["treble",{"2":{"74":1,"123":1,"308":1,"312":1}}],["trigger",{"2":{"337":1}}],["triggered",{"2":{"64":1}}],["tricky",{"2":{"232":1}}],["trim",{"2":{"99":1,"273":1}}],["traversal",{"2":{"145":1}}],["transition",{"2":{"164":1,"336":1}}],["transfer",{"2":{"142":1}}],["translation",{"2":{"62":1}}],["translations",{"2":{"10":1,"36":1,"40":1,"49":1,"54":1,"56":1,"59":1,"64":1}}],["tracking",{"2":{"91":1,"303":1,"309":1,"313":1}}],["trash",{"2":{"67":1}}],["todo",{"0":{"238":1,"239":1}}],["torture",{"2":{"219":1}}],["took",{"2":{"267":1}}],["too",{"2":{"144":1,"267":1}}],["toolchains",{"2":{"82":2}}],["toolchain",{"2":{"82":1}}],["tools",{"2":{"55":1,"340":1}}],["tool",{"2":{"42":1,"122":1,"135":1,"140":1,"145":1,"150":2,"152":1,"256":1}}],["toggles",{"2":{"261":1}}],["toggle",{"2":{"132":1,"147":1}}],["toggling",{"2":{"10":1,"22":1}}],["toml",{"2":{"82":1}}],["tons",{"2":{"27":1,"38":1,"63":1,"64":1,"137":1,"217":1,"220":1,"225":1,"234":1,"240":1,"241":1,"246":1,"247":1,"257":1,"267":1}}],["top",{"2":{"27":1}}],["topjohnwu",{"2":{"0":1,"79":1,"118":1}}],["to",{"0":{"224":1,"280":1,"318":1,"325":1},"2":{"8":2,"9":1,"12":2,"14":1,"15":2,"19":1,"20":1,"21":3,"22":2,"23":4,"24":8,"28":1,"33":1,"38":1,"39":2,"40":2,"41":3,"42":5,"43":4,"44":1,"45":3,"46":1,"49":1,"51":1,"56":2,"60":1,"61":1,"63":1,"64":1,"79":1,"86":2,"87":1,"88":2,"89":2,"90":2,"93":6,"94":2,"96":3,"99":2,"100":2,"101":6,"102":2,"105":3,"107":2,"108":1,"109":1,"110":2,"111":4,"112":1,"113":8,"114":5,"115":4,"116":4,"118":8,"119":5,"121":1,"124":3,"126":1,"128":2,"129":3,"131":5,"132":3,"133":1,"134":4,"135":6,"136":1,"137":2,"138":10,"139":5,"140":2,"142":6,"144":9,"145":5,"146":1,"147":2,"148":1,"149":1,"150":1,"151":6,"152":2,"187":2,"207":1,"208":1,"217":7,"218":4,"219":4,"220":5,"222":1,"223":2,"226":2,"228":1,"229":2,"230":4,"231":2,"232":6,"233":2,"234":1,"236":1,"240":3,"241":13,"243":1,"244":1,"246":1,"247":14,"249":1,"250":1,"253":9,"256":9,"257":2,"264":3,"265":3,"266":2,"267":7,"268":3,"273":2,"281":1,"282":3,"283":1,"285":1,"288":1,"289":2,"292":2,"293":3,"294":2,"298":2,"299":3,"300":2,"305":2,"308":1,"309":6,"312":1,"313":6,"315":1,"318":2,"320":4,"321":2,"325":2,"327":4,"328":2}}],["thing",{"2":{"242":1,"294":1,"300":1}}],["things",{"2":{"240":1,"241":2,"247":2}}],["this",{"2":{"8":1,"85":1,"86":1,"94":1,"95":1,"98":1,"101":2,"105":1,"109":1,"118":2,"119":1,"139":3,"142":4,"150":1,"152":1,"190":2,"216":1,"217":2,"219":2,"220":2,"226":1,"228":2,"229":2,"230":1,"232":2,"233":1,"236":1,"240":1,"241":4,"242":1,"243":1,"247":4,"248":1,"249":1,"253":2,"256":4,"264":2,"265":1,"267":1,"268":2,"275":1,"277":1,"280":1,"281":1,"282":2,"285":1,"286":1,"288":1,"289":1,"292":2,"294":1,"298":2,"300":1,"308":4,"309":1,"312":4,"313":1,"320":4,"324":1,"327":4}}],["thread",{"2":{"242":1,"248":1}}],["threads",{"2":{"132":1,"138":1,"234":1}}],["through",{"2":{"7":1,"44":1,"45":1,"113":1,"132":2,"138":1,"229":1,"232":1,"281":1,"319":1,"320":1,"321":1,"326":1,"327":1,"328":1}}],["those",{"2":{"129":1,"236":1,"242":1,"248":1,"253":1,"291":1,"292":1,"297":2,"298":1,"305":1}}],["though",{"2":{"20":1,"223":1,"294":1,"300":1}}],["that",{"2":{"18":1,"19":1,"26":1,"33":1,"37":1,"93":1,"94":2,"95":1,"96":1,"97":1,"106":2,"111":1,"118":1,"119":1,"123":1,"125":2,"128":1,"137":1,"140":1,"142":3,"145":1,"152":1,"190":1,"223":3,"226":1,"229":1,"230":3,"232":1,"233":1,"236":3,"241":2,"242":1,"247":2,"253":1,"257":1,"264":2,"265":2,"267":1,"268":3,"276":1,"282":1,"283":1,"286":1,"289":2,"292":1,"293":1,"294":1,"298":1,"299":1,"300":1,"308":4,"312":4,"319":1,"320":1,"326":1,"327":1}}],["thanks",{"2":{"15":1,"42":2,"56":1,"118":1,"151":1}}],["than",{"2":{"7":1,"20":1,"22":1,"41":1,"45":1,"58":1,"88":1,"96":1,"99":1,"139":1,"222":1,"236":1,"242":1,"267":1,"273":1,"282":1,"292":2,"298":2}}],["their",{"2":{"147":1,"150":1,"217":1,"256":1,"257":1,"292":1,"293":1,"298":1,"299":1,"319":1,"326":1}}],["they",{"2":{"139":2,"142":1,"218":1,"257":1}}],["these",{"2":{"129":1,"217":1,"218":2,"230":1,"234":1,"244":1,"250":1,"267":1}}],["them",{"2":{"119":1,"148":1,"223":1,"308":1,"312":1}}],["theme",{"2":{"22":1,"39":1,"54":1,"60":1,"61":1,"189":1}}],["there",{"2":{"119":1,"223":1,"226":1,"230":1,"234":1,"236":1,"253":1,"264":1}}],["then",{"2":{"101":1,"253":3,"294":1,"300":1}}],["the",{"0":{"280":1,"281":1},"2":{"12":1,"15":1,"16":1,"19":2,"21":1,"24":1,"25":2,"26":1,"27":3,"28":1,"29":1,"33":4,"41":1,"42":1,"43":1,"44":2,"45":1,"54":1,"65":1,"85":1,"87":1,"88":1,"89":2,"93":4,"94":2,"96":5,"97":1,"98":1,"99":1,"101":3,"102":1,"109":1,"112":1,"113":1,"116":3,"117":1,"118":3,"119":4,"125":1,"128":1,"129":2,"130":1,"132":3,"135":1,"139":3,"140":1,"142":15,"144":1,"145":1,"146":1,"148":2,"150":5,"151":1,"152":1,"190":8,"217":7,"218":6,"219":4,"220":3,"223":2,"225":2,"226":1,"228":1,"229":5,"230":5,"231":2,"232":5,"233":3,"236":1,"240":1,"241":8,"242":4,"244":2,"246":3,"247":8,"248":2,"250":2,"253":12,"256":2,"257":7,"264":4,"265":9,"266":1,"267":5,"268":4,"270":1,"272":1,"273":1,"275":1,"276":1,"277":1,"280":2,"281":8,"282":3,"285":2,"288":1,"289":2,"291":2,"292":3,"293":4,"294":3,"295":1,"297":3,"298":3,"299":4,"300":3,"301":1,"305":1,"307":2,"308":4,"309":8,"311":4,"312":4,"313":8,"315":1,"318":2,"319":4,"320":4,"321":4,"324":3,"325":2,"326":4,"327":4,"328":4}}],["osm0sis",{"2":{"265":1}}],["obsolete",{"2":{"257":1}}],["obvious",{"2":{"225":1}}],["object",{"2":{"158":1,"184":2,"336":2}}],["obtaining",{"2":{"142":1}}],["obb",{"2":{"118":1}}],["obfuscate",{"2":{"124":2}}],["obfuscated",{"2":{"23":1,"253":2}}],["obfuscation",{"2":{"23":1,"219":1}}],["our",{"2":{"118":1,"280":1}}],["outside",{"2":{"265":1}}],["outright",{"2":{"241":1,"247":1,"256":1}}],["output",{"2":{"118":1}}],["outofmemory",{"2":{"95":1,"286":1}}],["outofmemoryerror",{"2":{"23":1}}],["out",{"2":{"93":1,"95":1,"101":1,"111":1,"142":1,"143":1,"218":1,"241":1,"247":1,"267":1,"281":1,"286":1,"308":1,"312":1,"321":1,"328":1,"334":2}}],["oos",{"2":{"116":1}}],["opinion",{"2":{"292":1,"298":1}}],["op",{"2":{"150":1}}],["operation",{"2":{"336":3}}],["operations",{"2":{"118":1,"129":1,"138":1}}],["open",{"2":{"147":1,"150":1}}],["opens",{"2":{"135":1}}],["opt",{"2":{"111":2,"253":1}}],["optimization",{"2":{"116":1}}],["optimize",{"2":{"23":1,"32":1,"101":1}}],["option",{"2":{"33":1,"58":1,"102":1,"113":1,"129":1,"138":2,"140":2,"142":5,"144":1,"190":1,"266":1,"318":1,"325":1}}],["options",{"2":{"32":1,"53":1,"65":1,"114":1,"142":1}}],["opportunity",{"2":{"219":1}}],["oppo",{"2":{"93":1}}],["oculus",{"2":{"89":1}}],["occurs",{"2":{"45":1}}],["odin",{"2":{"86":1,"94":1,"199":1,"201":2,"203":2,"289":1}}],["overcome",{"2":{"118":1}}],["overflow",{"2":{"91":1,"95":1,"286":1,"303":1}}],["overlays",{"2":{"319":1,"326":1}}],["overlay",{"2":{"86":1,"107":3,"110":1,"111":1,"118":1,"119":1,"124":1,"187":6,"241":6,"247":6,"268":1}}],["overlayfs",{"2":{"86":1,"319":1,"326":1}}],["over",{"2":{"85":1,"97":1,"267":1,"276":1,"311":1,"321":1,"324":1,"328":1}}],["overhaul",{"2":{"16":1,"225":1}}],["oems",{"2":{"253":1,"319":1,"326":1}}],["oem解锁",{"2":{"200":1}}],["oem",{"2":{"74":1,"76":1,"111":1,"200":1,"214":1,"308":1,"312":1}}],["o",{"2":{"49":1,"51":3,"138":4,"173":1}}],["other",{"2":{"45":1,"93":1,"118":1,"139":1,"217":1,"218":1,"234":1,"236":1,"242":2,"248":1,"267":1}}],["otas",{"2":{"24":1,"44":1,"116":1}}],["ota",{"0":{"211":1},"1":{"212":1,"213":1,"214":1,"215":1},"2":{"20":1,"53":1,"202":1,"205":1,"211":3,"212":2,"213":5,"214":6,"215":1}}],["owner",{"2":{"85":1,"91":1,"184":6,"303":1,"324":1}}],["own",{"2":{"41":1,"118":1,"147":3,"150":1,"234":1,"256":1,"309":1,"313":1}}],["org",{"2":{"190":2}}],["organizing",{"2":{"22":1}}],["origindocumentdate",{"2":{"189":1}}],["original",{"2":{"101":1,"111":1,"268":1}}],["orig",{"2":{"144":1,"334":2}}],["order",{"2":{"138":1,"253":1}}],["oreo",{"2":{"116":1,"126":1}}],["or",{"2":{"41":1,"88":1,"101":1,"110":1,"135":1,"144":1,"190":3,"194":1,"218":1,"226":1,"241":1,"247":1,"253":1,"265":1}}],["old",{"2":{"39":1,"89":2,"107":1,"117":1,"118":1,"131":1,"135":1,"137":1,"218":1,"219":1,"220":1,"229":1,"241":2,"247":2,"257":2}}],["older",{"2":{"7":1,"89":1,"137":1,"149":1,"270":1,"272":1,"275":1,"285":1,"318":1,"325":1}}],["off",{"2":{"337":1}}],["offer",{"2":{"265":1}}],["officially",{"2":{"144":1,"223":1}}],["official",{"2":{"138":1,"230":1,"309":1,"313":1,"318":1,"325":1}}],["offline",{"2":{"86":1,"281":1}}],["offload",{"2":{"43":1}}],["of",{"2":{"27":2,"33":1,"38":1,"41":1,"42":1,"45":1,"47":1,"56":2,"63":2,"64":1,"93":2,"98":1,"108":1,"111":2,"113":3,"116":1,"117":1,"118":3,"119":2,"130":1,"134":1,"137":1,"138":3,"142":4,"143":1,"145":1,"150":1,"151":1,"152":2,"190":4,"217":3,"218":3,"219":1,"220":2,"224":1,"225":1,"228":2,"230":1,"232":1,"234":2,"236":1,"240":1,"241":2,"242":1,"244":1,"246":1,"247":2,"248":1,"250":1,"252":1,"253":1,"257":1,"265":1,"267":1,"277":1,"281":1,"292":1,"293":1,"294":2,"298":1,"299":1,"300":2,"307":1,"308":6,"309":3,"311":1,"312":6,"313":3,"318":2,"319":1,"320":3,"321":1,"325":2,"326":1,"327":3,"328":1,"336":4}}],["once",{"2":{"308":1,"312":1}}],["ondk",{"2":{"82":3}}],["oneshot",{"2":{"187":2}}],["oneplus",{"2":{"93":1,"124":1}}],["one",{"2":{"65":1,"118":1,"125":1,"138":1,"142":1,"219":1,"223":1,"228":1,"231":1,"241":1,"247":1,"265":3}}],["online",{"2":{"22":1,"23":1,"25":1,"28":1,"37":1,"42":2,"56":1,"61":3,"64":1}}],["only",{"0":{"244":1,"250":1},"2":{"19":1,"20":1,"41":1,"44":1,"58":1,"60":1,"72":2,"76":3,"93":1,"102":1,"111":1,"114":1,"117":1,"118":1,"119":1,"125":1,"135":1,"137":2,"138":1,"140":1,"142":3,"152":1,"219":1,"224":1,"231":1,"241":2,"242":2,"244":1,"247":2,"250":1,"266":1,"285":1,"288":1,"297":1}}],["on",{"2":{"7":1,"8":1,"12":1,"19":1,"22":1,"24":3,"27":1,"28":1,"32":1,"34":1,"35":2,"41":2,"43":1,"49":1,"51":3,"58":1,"65":1,"86":2,"89":3,"93":3,"95":1,"96":3,"99":1,"100":2,"102":3,"105":1,"107":1,"108":1,"109":1,"113":1,"116":3,"117":3,"118":2,"119":4,"121":1,"122":1,"126":1,"130":1,"135":3,"137":1,"138":1,"139":3,"152":1,"187":2,"217":2,"218":2,"223":2,"224":1,"226":1,"229":1,"230":1,"231":1,"233":2,"234":3,"241":4,"242":1,"246":1,"247":4,"253":4,"256":1,"257":1,"264":2,"265":1,"266":3,"268":3,"273":1,"275":1,"280":1,"285":1,"286":1,"288":1,"291":1,"292":3,"297":1,"298":3,"308":3,"309":2,"312":3,"313":2,"318":2,"325":2}}],["id",{"2":{"174":2,"175":1}}],["ide",{"0":{"81":1},"1":{"82":1}}],["ize",{"2":{"147":1}}],["i18n",{"2":{"100":1}}],["iv",{"2":{"76":5}}],["iii",{"2":{"76":6}}],["ii",{"2":{"76":2}}],["i",{"2":{"76":2,"217":1,"219":2,"226":1,"228":1,"232":1,"234":1,"242":1,"248":1,"264":1,"267":1,"291":1,"292":2,"294":1,"297":1,"298":2,"300":1,"309":1,"313":1}}],["icons",{"2":{"41":1}}],["icon",{"2":{"41":1,"67":1}}],["its",{"2":{"147":1,"253":1,"256":2,"267":1,"309":2,"313":2}}],["itself",{"2":{"101":1,"119":1,"253":1,"281":2}}],["items",{"2":{"145":1}}],["it",{"2":{"24":1,"86":1,"93":1,"96":3,"98":1,"101":2,"119":2,"138":1,"142":3,"145":1,"149":1,"152":3,"190":3,"217":1,"218":2,"224":2,"228":2,"232":4,"233":1,"240":1,"241":2,"247":2,"253":2,"257":1,"265":2,"267":1,"277":1,"281":1,"291":2,"297":2,"308":1,"309":1,"312":1,"313":1,"318":1,"321":1,"325":1,"328":1}}],["impossible",{"2":{"241":1,"247":1}}],["importantly",{"2":{"241":1,"247":1}}],["important",{"2":{"150":1,"231":1,"309":1,"313":1}}],["implicitly",{"2":{"308":1,"312":1}}],["implies",{"2":{"241":1,"247":1}}],["implied",{"2":{"190":1}}],["implementaton",{"2":{"321":1,"328":1}}],["implementations",{"2":{"308":1,"312":1}}],["implementation",{"0":{"241":1,"247":1,"319":1,"320":1,"326":1,"327":1},"2":{"44":1,"47":1,"86":2,"89":3,"95":1,"100":1,"107":2,"108":1,"129":2,"241":1,"242":1,"247":1,"248":1,"280":1,"286":1,"292":1,"294":1,"298":1,"300":1,"309":1,"313":1,"319":2,"321":1,"326":2,"328":1}}],["implemented",{"2":{"119":1,"142":2}}],["implement",{"2":{"108":1,"142":1,"257":1,"309":1,"313":1}}],["improving",{"2":{"280":1,"292":1,"298":1}}],["improved",{"2":{"91":1,"138":1,"264":1,"303":1}}],["improvements",{"0":{"217":1},"2":{"27":1,"39":1,"41":1,"63":1,"91":1,"92":1,"225":1,"226":1,"232":1,"297":1,"303":1}}],["improve",{"2":{"20":1,"45":1,"46":1,"56":1,"90":1,"91":2,"101":1,"108":1,"144":1,"146":1,"303":2,"305":1}}],["improper",{"2":{"21":1,"91":1,"303":1}}],["imageless",{"0":{"230":1},"2":{"236":1}}],["images",{"2":{"41":1,"44":1,"86":1,"95":2,"96":1,"99":1,"100":1,"101":1,"102":1,"105":1,"107":1,"113":1,"118":1,"121":1,"124":4,"131":1,"135":1,"266":1,"273":1,"283":1,"286":2}}],["image",{"2":{"20":1,"22":1,"44":3,"60":1,"65":1,"86":1,"93":2,"98":1,"104":1,"105":1,"113":1,"114":1,"116":1,"117":1,"118":1,"122":2,"131":2,"132":1,"134":1,"135":1,"138":1,"140":1,"145":2,"147":1,"150":1,"230":2,"248":1,"270":1,"277":1,"318":1,"325":1,"334":1}}],["img的路径",{"2":{"195":4}}],["imgtool",{"2":{"118":4}}],["img",{"2":{"8":1,"86":1,"111":1,"113":1,"125":1,"128":2,"131":3,"135":2,"139":1,"194":7,"195":3,"207":3,"208":5,"214":1,"218":8,"334":1}}],["if",{"0":{"280":1},"2":{"19":1,"27":1,"31":1,"41":2,"42":1,"45":3,"93":2,"95":1,"98":1,"109":1,"111":1,"118":2,"121":1,"134":1,"139":3,"142":2,"144":3,"190":1,"218":1,"226":1,"241":1,"247":1,"253":1,"265":2,"268":1,"270":1,"272":1,"275":1,"277":1,"282":1,"285":1,"286":1,"294":1,"300":1}}],["is64bit",{"2":{"183":1}}],["isn",{"2":{"142":2,"224":1,"264":1,"281":1}}],["isolate",{"2":{"101":1}}],["isolated",{"2":{"93":2,"98":1,"101":1,"277":1}}],["isolation",{"2":{"101":1,"108":1}}],["is",{"0":{"231":1,"281":1},"2":{"14":1,"22":1,"33":1,"41":2,"42":2,"45":2,"47":1,"51":1,"60":1,"61":1,"66":1,"67":2,"85":1,"87":2,"93":3,"94":1,"96":2,"98":1,"101":2,"102":1,"107":1,"109":1,"113":2,"114":2,"116":1,"118":3,"119":4,"121":1,"126":1,"131":2,"132":1,"135":2,"138":2,"139":2,"142":3,"144":1,"145":3,"152":2,"190":1,"217":1,"218":7,"219":2,"222":1,"223":1,"224":2,"225":1,"226":1,"228":1,"229":1,"230":2,"232":4,"233":2,"236":1,"240":2,"241":8,"242":5,"243":1,"246":1,"247":8,"248":2,"249":1,"253":1,"256":3,"257":3,"264":5,"265":4,"266":1,"267":1,"268":2,"270":1,"272":1,"277":1,"280":1,"281":1,"282":1,"285":2,"288":2,"289":1,"292":2,"293":1,"294":5,"298":2,"299":1,"300":5,"307":1,"308":3,"309":3,"311":1,"312":3,"313":3,"315":2,"320":1,"321":1,"324":2,"327":1,"328":1}}],["issues",{"2":{"11":1,"13":1,"38":1,"46":1,"54":1,"62":1,"64":1,"86":1,"94":1,"109":1,"130":1,"135":2,"137":1,"138":1,"139":1,"140":2,"142":2,"145":1,"147":1,"151":2,"152":1,"234":2,"241":1,"247":1,"256":1,"289":1,"303":1,"315":1}}],["issue",{"2":{"7":1,"33":1,"37":1,"38":1,"41":1,"64":1,"87":1,"97":1,"118":1,"135":1,"142":1,"143":2,"144":1,"256":1,"276":1,"315":1}}],["inapplicable",{"2":{"256":1}}],["inaccessible",{"2":{"64":1}}],["inactive",{"2":{"24":1,"116":1}}],["inspired",{"2":{"294":1,"300":1}}],["insmod",{"2":{"187":2}}],["insufficient",{"2":{"151":1}}],["instruction",{"2":{"223":1}}],["instructions",{"2":{"96":1,"223":1,"268":1}}],["instance",{"2":{"265":1}}],["instantly",{"2":{"142":1}}],["installer",{"0":{"229":1,"257":1},"2":{"151":1,"181":2,"185":1,"229":1,"256":1,"257":3}}],["installed",{"2":{"13":1,"21":1,"57":1,"89":1,"100":1,"118":1,"150":1,"223":1,"268":1}}],["install",{"2":{"44":1,"49":1,"54":2,"65":1,"79":1,"93":2,"99":1,"116":1,"118":1,"147":1,"185":1,"244":1,"250":1,"257":1,"273":1,"293":1,"299":1,"337":1}}],["installing",{"2":{"24":1,"41":1,"43":1,"48":1,"61":1,"281":1}}],["installation",{"2":{"9":1,"31":1,"37":1,"39":1,"88":2,"90":1,"94":2,"95":1,"100":1,"119":1,"121":1,"125":1,"132":1,"135":2,"138":1,"139":1,"183":1,"210":1,"224":1,"229":2,"230":1,"244":1,"250":1,"257":1,"265":1,"281":2,"286":1,"289":2,"305":1,"320":2,"327":2}}],["instead",{"2":{"41":1,"42":1,"93":1,"111":1,"113":3,"119":1,"138":3,"151":1,"217":1,"220":1,"241":1,"247":1,"268":1,"292":1,"298":1}}],["independently",{"2":{"150":1}}],["independent",{"2":{"142":1}}],["indefinite",{"2":{"91":1,"303":1}}],["involves",{"2":{"248":1}}],["invoking",{"2":{"142":1}}],["invocation",{"2":{"142":2}}],["invincible",{"2":{"118":1,"129":1,"132":1}}],["invalid",{"2":{"24":1,"25":1,"96":1}}],["inherit",{"2":{"101":1}}],["injecting",{"2":{"319":1,"326":1}}],["injection",{"2":{"86":1,"89":1,"147":1,"150":1,"151":1,"308":1,"312":1}}],["inject",{"2":{"106":1,"111":1,"140":1,"141":1,"142":3}}],["injected",{"2":{"86":1}}],["initial",{"2":{"153":1}}],["initialize",{"2":{"129":1}}],["initialized",{"2":{"100":1}}],["initializer",{"2":{"26":1}}],["initialization",{"2":{"63":1}}],["init",{"0":{"160":1,"256":1},"2":{"73":5,"85":1,"86":1,"93":1,"101":1,"104":1,"107":1,"111":2,"116":1,"132":1,"134":1,"144":1,"146":1,"160":7,"163":2,"187":6,"194":2,"195":4,"242":2,"248":2,"256":1,"320":1,"324":1,"327":1,"335":2,"337":1}}],["initramfs",{"2":{"72":1,"73":2,"75":2,"76":1,"93":1,"107":1,"123":1,"126":1,"131":1,"134":2,"187":1,"241":1,"247":1}}],["incpio",{"2":{"334":3}}],["increasingly",{"2":{"308":1,"312":1}}],["increase",{"2":{"89":1,"101":1,"119":1,"138":1}}],["including",{"2":{"129":1,"144":2,"190":1,"265":1,"308":1,"312":1,"320":1,"321":1,"327":1,"328":1}}],["includes",{"2":{"281":1}}],["include",{"2":{"113":1,"119":1,"150":1,"256":1}}],["included",{"2":{"45":1,"152":1,"265":1}}],["incompatible",{"2":{"253":1,"282":1}}],["incomplete",{"2":{"21":1,"23":1,"320":1,"327":1}}],["incorrect",{"2":{"88":1,"96":1,"283":1}}],["incorrectly",{"2":{"67":1,"88":1}}],["intact",{"2":{"308":1,"312":1}}],["introducing",{"0":{"294":1,"300":1}}],["introduction",{"2":{"232":1,"309":1,"313":1}}],["introduced",{"2":{"85":1,"233":1,"253":1,"305":1,"308":2,"312":2,"324":1}}],["introduce",{"2":{"21":2,"47":1,"89":1,"93":2,"102":1,"118":1,"134":1,"138":2,"266":1}}],["int",{"2":{"175":2,"183":2}}],["integration",{"2":{"144":1,"146":1}}],["integrity",{"2":{"54":1}}],["integer",{"2":{"95":1,"286":1}}],["intellij",{"2":{"82":2}}],["intel",{"2":{"79":1}}],["interest",{"2":{"292":1,"298":1}}],["interested",{"2":{"242":1,"248":1}}],["interface",{"2":{"47":1,"145":1,"150":1}}],["internet",{"2":{"45":1}}],["internally",{"2":{"294":1,"300":1}}],["internaldir=$magisktmp",{"2":{"157":1}}],["internal",{"2":{"36":1,"45":2,"46":1,"131":1,"165":1,"218":2,"253":1,"265":1,"268":1}}],["intent",{"2":{"40":1,"111":1}}],["into",{"2":{"8":1,"41":1,"43":1,"54":1,"86":1,"87":1,"96":1,"101":1,"129":1,"135":2,"138":2,"139":1,"244":1,"250":1,"253":1,"268":1,"291":1,"297":1,"308":1,"312":1,"315":1,"319":1,"326":1}}],["infile",{"2":{"334":2}}],["infinite",{"2":{"12":1,"129":1}}],["inf",{"2":{"181":1}}],["infrastructure",{"2":{"87":1,"315":1}}],["information",{"2":{"217":1}}],["info",{"2":{"9":1,"42":1,"114":1,"118":1,"129":1,"140":1,"281":1}}],["in",{"2":{"9":1,"10":1,"14":1,"15":2,"16":1,"21":3,"22":1,"25":1,"26":1,"27":1,"36":1,"38":1,"39":2,"43":1,"45":2,"47":1,"50":1,"53":1,"57":1,"60":1,"61":1,"63":1,"65":1,"67":1,"85":1,"86":3,"88":1,"89":1,"91":1,"93":2,"94":2,"95":2,"98":1,"100":1,"101":1,"102":4,"104":2,"105":1,"106":1,"107":3,"108":1,"109":1,"110":2,"111":3,"113":5,"114":2,"116":3,"117":1,"118":6,"119":2,"121":1,"124":2,"125":1,"126":1,"127":2,"131":3,"134":3,"135":5,"138":3,"139":2,"142":3,"144":1,"145":3,"146":1,"147":3,"150":3,"152":3,"190":1,"217":2,"218":1,"219":1,"223":1,"226":1,"230":3,"231":2,"232":2,"233":1,"234":1,"236":2,"241":2,"242":1,"243":2,"247":2,"248":4,"249":2,"253":2,"256":2,"257":2,"264":1,"265":7,"266":4,"267":1,"277":1,"281":1,"282":1,"286":2,"289":2,"292":4,"293":2,"294":3,"295":1,"298":4,"299":2,"300":3,"301":1,"303":1,"305":1,"308":3,"309":4,"312":3,"313":4,"320":2,"324":1,"327":2}}],["ioctl",{"2":{"164":1,"336":1}}],["io",{"2":{"0":2}}],["22",{"2":{"204":1}}],["23",{"0":{"263":1,"279":1},"1":{"264":1,"265":1,"266":1,"280":1,"281":1,"282":1,"283":1,"284":1},"2":{"183":1}}],["26",{"0":{"291":1},"1":{"292":1,"293":1,"294":1,"295":1,"296":1},"2":{"142":1}}],["24+",{"2":{"113":1}}],["20",{"0":{"315":1},"1":{"316":1}}],["2023",{"0":{"317":1,"323":1},"1":{"318":1,"319":1,"320":1,"321":1,"322":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1}}],["2022",{"0":{"291":1,"297":1,"303":1,"305":1,"307":1,"311":1,"315":1},"1":{"292":1,"293":1,"294":1,"295":1,"296":1,"298":1,"299":1,"300":1,"301":1,"302":1,"304":1,"306":1,"308":1,"309":1,"310":1,"312":1,"313":1,"314":1,"316":1}}],["2020",{"0":{"255":1,"259":1,"263":1,"267":1,"270":1,"272":1},"1":{"256":1,"257":1,"258":1,"260":1,"261":1,"262":1,"264":1,"265":1,"266":1,"268":1,"269":1,"271":1,"273":1,"274":1},"2":{"255":1}}],["2021",{"0":{"275":1,"279":1,"285":1,"288":1},"1":{"276":1,"277":1,"278":1,"280":1,"281":1,"282":1,"283":1,"284":1,"286":1,"287":1,"289":1,"290":1},"2":{"204":1,"275":1}}],["20000",{"2":{"183":1}}],["2018",{"0":{"216":1},"1":{"217":1,"218":1,"219":1,"220":1,"221":1}}],["2018年末",{"2":{"76":1}}],["2019",{"0":{"222":1,"228":1,"236":1,"240":1,"246":1,"252":1},"1":{"223":1,"224":1,"225":1,"226":1,"227":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"237":1,"241":1,"242":1,"243":1,"244":1,"245":1,"247":1,"248":1,"249":1,"250":1,"251":1,"253":1,"254":1},"2":{"193":1,"229":1}}],["2019年仅限a级的设备就",{"2":{"76":1}}],["2017",{"2":{"136":1}}],["20mb",{"2":{"41":1}}],["28",{"0":{"228":1,"272":1,"297":1},"1":{"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"273":1,"274":1,"298":1,"299":1,"300":1,"301":1,"302":1},"2":{"73":3}}],["29",{"2":{"72":1,"73":4}}],["25",{"2":{"72":1}}],["2si",{"2":{"72":1,"73":1,"75":1,"76":1,"89":1,"99":1,"101":3,"102":1,"106":1,"107":1,"160":2,"266":1,"273":1}}],["21",{"2":{"32":1}}],["2",{"0":{"7":1,"15":1,"16":1,"17":1,"31":1,"37":1,"41":1,"45":1,"52":1,"56":1,"59":1,"60":1,"61":1,"87":1,"91":1,"99":1,"104":1,"109":1,"115":1,"121":1,"126":1,"133":1,"137":1,"143":1,"222":1,"224":1,"252":1,"255":2,"272":1,"273":1,"279":1,"303":1,"315":1},"1":{"223":1,"224":1,"225":1,"226":1,"227":1,"253":1,"254":1,"256":2,"257":2,"258":2,"273":1,"274":1,"280":1,"281":1,"282":1,"283":1,"284":1,"304":1,"316":1},"2":{"20":1,"23":1,"35":1,"73":1,"95":1,"107":1,"110":1,"112":1,"116":1,"131":1,"142":1,"186":1,"204":2,"209":2,"228":1,"242":2,"248":2,"256":1,"272":1,"286":1,"305":1,"330":5,"334":1}}],["稳定性更改和错误修复",{"2":{"6":1}}],["在全局装载命名空间中强制运行",{"2":{"338":1}}],["在隔离的挂载命名空间中执行命令并执行",{"2":{"337":1}}],["在像",{"2":{"336":1}}],["在重新打包期间修改标头配置",{"2":{"334":1}}],["在不接触恢复分区的情况下刷入",{"2":{"214":1}}],["在线转储或",{"2":{"214":1}}],["在这些设备上应用",{"2":{"214":1}}],["在这种情况下",{"2":{"187":1,"194":1,"197":1}}],["在执行以下步骤之前",{"2":{"212":1}}],["在按照以下说明操作之前",{"2":{"208":1}}],["在您的",{"2":{"201":1}}],["在设置过程中将设备连接到互联网",{"2":{"200":1}}],["在某些情况下拒绝任何非官方分区",{"2":{"200":1}}],["在较新三星设备上解锁",{"2":{"200":1}}],["在方式中选择",{"2":{"195":1,"201":1}}],["在出厂时搭载",{"2":{"194":1}}],["在主屏幕中",{"2":{"194":1}}],["在你开始之前",{"2":{"194":1}}],["在magisk中",{"2":{"186":1}}],["在提取所有文件并设置默认权限和",{"2":{"182":1}}],["在模块的所有脚本中",{"2":{"176":1}}],["在我隐藏",{"0":{"169":1}}],["在此模式下",{"2":{"162":1}}],["在此路径中",{"2":{"157":1}}],["在稍后的引导过程中",{"2":{"162":1}}],["在使用",{"2":{"160":1}}],["在已停产",{"2":{"160":1}}],["在发布版本中",{"2":{"83":1}}],["在处理原生",{"2":{"81":1}}],["在官方网站上下载并安装最新的",{"2":{"79":1}}],["在官方网站上下载并安装",{"2":{"79":1}}],["在正常启动时无法运行",{"2":{"76":1}}],["在",{"0":{"82":1},"2":{"72":1,"73":1,"75":1,"76":1,"79":5,"82":2,"157":1,"160":1,"164":2,"173":2,"186":1,"187":3,"197":1,"200":1,"213":1,"334":3}}],["在超级用户请求对话框中添加抽头劫持保护",{"2":{"6":1}}],["在日志菜单中保存日志时",{"2":{"5":1}}],["3rd",{"2":{"233":1}}],["39",{"2":{"187":1}}],["35",{"2":{"99":1,"273":1}}],["34",{"2":{"93":1}}],["32",{"2":{"93":2,"119":1,"231":2}}],["3a",{"2":{"73":2,"74":1}}],["3",{"0":{"6":1,"13":1,"14":1,"15":1,"25":1,"30":1,"36":1,"40":1,"43":1,"44":1,"51":1,"55":2,"56":1,"57":1,"58":1,"90":1,"98":1,"103":1,"108":1,"114":1,"120":1,"125":1,"132":1,"136":1,"228":1,"259":1,"263":1,"267":1,"277":1,"303":1,"305":2},"1":{"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"260":1,"261":1,"262":1,"264":1,"265":1,"266":1,"268":1,"269":1,"304":1,"306":2},"2":{"32":1,"58":1,"73":3,"74":1,"79":1,"107":1,"114":1,"187":1,"190":1,"233":1,"275":1,"330":3}}],["收集设备属性",{"2":{"5":1}}],["40",{"2":{"101":1}}],["4a",{"2":{"100":2,"270":1}}],["4+",{"2":{"28":1}}],["4",{"0":{"5":1,"12":1,"14":1,"29":1,"35":1,"40":1,"41":1,"42":1,"50":1,"97":1,"102":1,"107":1,"119":1,"124":1,"222":1,"224":1,"240":1,"263":1,"275":1,"276":1,"285":1,"317":1,"323":1},"1":{"223":1,"224":1,"225":1,"226":1,"227":1,"241":1,"242":1,"243":1,"244":1,"245":1,"264":1,"265":1,"266":1,"276":1,"277":1,"278":1,"286":1,"287":1,"318":1,"319":1,"320":1,"321":1,"322":1,"324":1,"325":1,"326":1,"327":1,"328":1,"329":1},"2":{"20":2,"86":1,"112":1,"126":1,"204":3,"224":1,"241":1,"246":2,"253":1,"265":1,"275":1,"330":3}}],["5g",{"2":{"100":2,"270":1}}],["5+",{"2":{"41":1}}],["5",{"0":{"4":1,"10":1,"11":1,"13":1,"34":2,"35":1,"36":1,"37":1,"38":1,"39":1,"43":1,"49":1,"66":1,"130":1,"131":1,"140":1,"206":1,"236":1,"288":1,"317":1},"1":{"237":1,"289":1,"290":1,"318":1,"319":1,"320":1,"321":1,"322":1},"2":{"13":1,"41":1,"94":1,"96":2,"100":2,"131":1,"138":1,"152":1,"204":3,"270":1,"285":1,"288":1,"289":1}}],["轻微的ui更改",{"2":{"3":1}}],["64",{"0":{"231":1},"2":{"93":1,"111":2,"119":1,"145":1,"174":1,"231":2,"236":1}}],["6",{"0":{"3":1,"29":1,"30":1,"31":1,"32":1,"33":1,"48":1,"60":1,"118":1,"129":1,"140":1,"307":1,"311":1,"318":1,"325":1},"1":{"308":1,"309":1,"310":1,"312":1,"313":1,"314":1},"2":{"39":1,"73":1,"86":1,"89":1,"93":1,"183":1,"204":1}}],["700",{"2":{"158":1}}],["7",{"0":{"2":1,"28":1,"59":1,"117":1,"216":1,"307":1,"315":1},"1":{"217":1,"218":1,"219":1,"220":1,"221":1,"308":1,"309":1,"310":1,"316":1},"2":{"28":1,"72":1,"73":1,"75":1,"136":1,"147":1,"204":1,"217":1}}],["0xffff",{"2":{"336":1}}],["0x4",{"2":{"334":1}}],["0x2",{"2":{"334":1}}],["0x1",{"2":{"334":1}}],["0x0000",{"2":{"336":1}}],["0x0",{"2":{"139":1}}],["03",{"2":{"204":1}}],["0+",{"2":{"12":1,"32":1,"96":2,"101":1,"217":1,"253":3,"268":1}}],["0",{"0":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":2,"11":1,"12":1,"15":1,"16":1,"19":1,"20":2,"21":1,"22":1,"23":2,"24":1,"27":1,"28":1,"33":1,"39":1,"42":1,"44":1,"45":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":2,"58":1,"63":1,"65":1,"68":1,"69":1,"86":1,"89":1,"93":1,"94":1,"96":1,"101":1,"106":1,"111":1,"113":1,"116":1,"123":1,"128":1,"135":1,"139":1,"142":1,"216":1,"228":1,"246":1,"267":1,"279":1,"288":1,"291":1,"307":1,"317":1,"318":1,"324":1,"325":1},"1":{"217":1,"218":1,"219":1,"220":1,"221":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"247":1,"248":1,"249":1,"250":1,"251":1,"268":1,"269":1,"280":1,"281":1,"282":1,"283":1,"284":1,"289":1,"290":1,"292":1,"293":1,"294":1,"295":1,"296":1,"308":1,"309":1,"310":1,"318":1,"319":1,"320":1,"321":1,"322":1},"2":{"9":1,"13":1,"20":1,"21":1,"22":1,"41":1,"85":1,"86":1,"94":1,"95":1,"96":1,"111":1,"112":1,"131":2,"138":1,"164":2,"176":1,"183":2,"193":1,"198":1,"204":6,"228":1,"236":2,"244":1,"250":1,"252":1,"253":1,"267":1,"270":2,"272":1,"275":1,"281":1,"282":1,"285":2,"286":1,"288":1,"289":1,"293":1,"297":2,"299":1,"308":1,"311":2,"312":1,"324":2,"330":9,"334":3}}],["仓库",{"2":{"0":2}}],["为开发人员提供了大量安装工具",{"2":{"333":1}}],["为方便起见",{"2":{"184":1}}],["为什么这个文档很多错误或者不通顺的地方",{"0":{"170":1}}],["为什么",{"0":{"168":1}}],["为了应用",{"2":{"211":1}}],["为了确保所有后续执行的",{"2":{"173":1}}],["为了减少",{"2":{"164":1}}],["为了防止检测",{"2":{"158":1}}],["为了获得magisk正在使用的当前基本文件夹",{"2":{"157":1}}],["为了区分",{"2":{"72":1}}],["为",{"2":{"73":2}}],["为镜像仓库",{"2":{"0":1}}],["为主仓库",{"2":{"0":1}}],["上下文",{"2":{"337":2}}],["上下文中运行的每个",{"2":{"173":1}}],["上的文件管理器或第三方",{"2":{"209":1}}],["上测试的那样",{"2":{"208":1}}],["上打开",{"2":{"201":1}}],["上运行",{"2":{"199":1}}],["上面的",{"2":{"187":1}}],["上面的列表将对应创建以下文件",{"2":{"184":1}}],["上面没有提到的其他字符串可以是任何单行字符串",{"2":{"175":1}}],["上触发",{"2":{"161":1}}],["上表中的最终根目录",{"2":{"74":1}}],["上表中的初始根目录",{"2":{"74":1}}],["上",{"2":{"0":1,"72":1,"73":1,"74":1,"79":5,"336":1}}],["与不存在的文件对应的文件将被忽略",{"2":{"187":1}}],["与仅",{"2":{"75":1}}],["与",{"2":{"0":1,"82":2}}],["注入的所有文件都应放在此文件夹中",{"2":{"177":1}}],["注",{"2":{"0":1}}],["注意事项",{"0":{"203":1}}],["注意",{"0":{"185":1},"2":{"0":1,"197":1,"201":1,"206":1,"208":1,"211":1,"338":1}}],["翻译的中文文档",{"2":{"0":1}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/@localSearchIndexroot.93b308b9.js b/assets/chunks/@localSearchIndexroot.93b308b9.js new file mode 100644 index 00000000..854b7c67 --- /dev/null +++ b/assets/chunks/@localSearchIndexroot.93b308b9.js @@ -0,0 +1 @@ +const e='{"documentCount":354,"nextId":354,"documentIds":{"0":"/MagiskChineseDocument/README.html#magisk-中文文档-magisk-chinese-document","1":"/MagiskChineseDocument/README.html#开发","2":"/MagiskChineseDocument/README.html#贡献","3":"/MagiskChineseDocument/README.html#许可","4":"/MagiskChineseDocument/README.html#star-历史","5":"/MagiskChineseDocument/app_changes.html#magisk-manager-更新日志","6":"/MagiskChineseDocument/app_changes.html#v8-0-7","7":"/MagiskChineseDocument/app_changes.html#v8-0-6","8":"/MagiskChineseDocument/app_changes.html#v8-0-5","9":"/MagiskChineseDocument/app_changes.html#v8-0-4","10":"/MagiskChineseDocument/app_changes.html#v8-0-3","11":"/MagiskChineseDocument/app_changes.html#v8-0-2","12":"/MagiskChineseDocument/app_changes.html#v8-0-1","13":"/MagiskChineseDocument/app_changes.html#v8-0-0","14":"/MagiskChineseDocument/app_changes.html#v7-5-1","15":"/MagiskChineseDocument/app_changes.html#v7-5-0","16":"/MagiskChineseDocument/app_changes.html#v7-4-0","17":"/MagiskChineseDocument/app_changes.html#v7-3-5","18":"/MagiskChineseDocument/app_changes.html#v7-3-4","19":"/MagiskChineseDocument/app_changes.html#v7-3-0-1-2","20":"/MagiskChineseDocument/app_changes.html#v7-2-0","21":"/MagiskChineseDocument/app_changes.html#v7-1-2","22":"/MagiskChineseDocument/app_changes.html#v7-1-1","23":"/MagiskChineseDocument/app_changes.html#v7-1-0","24":"/MagiskChineseDocument/app_changes.html#v7-0-0","25":"/MagiskChineseDocument/app_changes.html#v6-1-0","26":"/MagiskChineseDocument/app_changes.html#v6-0-1","27":"/MagiskChineseDocument/app_changes.html#v6-0-0","28":"/MagiskChineseDocument/app_changes.html#v5-9-0-v5-9-1","29":"/MagiskChineseDocument/app_changes.html#v5-8-3","30":"/MagiskChineseDocument/app_changes.html#v5-8-1","31":"/MagiskChineseDocument/app_changes.html#v5-8-0","32":"/MagiskChineseDocument/app_changes.html#v5-7-0","33":"/MagiskChineseDocument/app_changes.html#v5-6-4","34":"/MagiskChineseDocument/app_changes.html#v5-6-3","35":"/MagiskChineseDocument/app_changes.html#v5-6-2","36":"/MagiskChineseDocument/app_changes.html#v5-6-1","37":"/MagiskChineseDocument/app_changes.html#v5-6-0","38":"/MagiskChineseDocument/app_changes.html#v5-5-5","39":"/MagiskChineseDocument/app_changes.html#v5-5-4","40":"/MagiskChineseDocument/app_changes.html#v5-5-3","41":"/MagiskChineseDocument/app_changes.html#v5-5-2","42":"/MagiskChineseDocument/app_changes.html#v5-5-1","43":"/MagiskChineseDocument/app_changes.html#v5-5-0","44":"/MagiskChineseDocument/app_changes.html#v5-4-3","45":"/MagiskChineseDocument/app_changes.html#v5-4-2","46":"/MagiskChineseDocument/app_changes.html#v5-4-0","47":"/MagiskChineseDocument/app_changes.html#v5-3-5","48":"/MagiskChineseDocument/app_changes.html#v5-3-0","49":"/MagiskChineseDocument/app_changes.html#v5-2-0","50":"/MagiskChineseDocument/app_changes.html#v5-1-1","51":"/MagiskChineseDocument/app_changes.html#v5-1-0","52":"/MagiskChineseDocument/app_changes.html#v5-0-6","53":"/MagiskChineseDocument/app_changes.html#v5-0-5","54":"/MagiskChineseDocument/app_changes.html#v5-0-4","55":"/MagiskChineseDocument/app_changes.html#v5-0-3","56":"/MagiskChineseDocument/app_changes.html#v5-0-2","57":"/MagiskChineseDocument/app_changes.html#v5-0-1","58":"/MagiskChineseDocument/app_changes.html#v5-0-0","59":"/MagiskChineseDocument/app_changes.html#v4-3-3","60":"/MagiskChineseDocument/app_changes.html#v4-3-2","61":"/MagiskChineseDocument/app_changes.html#v4-3-1","62":"/MagiskChineseDocument/app_changes.html#v4-3-0","63":"/MagiskChineseDocument/app_changes.html#v4-2-7","64":"/MagiskChineseDocument/app_changes.html#v4-2-6","65":"/MagiskChineseDocument/app_changes.html#v4-2","66":"/MagiskChineseDocument/app_changes.html#v4-1","67":"/MagiskChineseDocument/app_changes.html#v4-0","68":"/MagiskChineseDocument/app_changes.html#v3-1","69":"/MagiskChineseDocument/app_changes.html#v3-0","70":"/MagiskChineseDocument/app_changes.html#v2-5","71":"/MagiskChineseDocument/app_changes.html#v2-1","72":"/MagiskChineseDocument/app_changes.html#v2-0","73":"/MagiskChineseDocument/app_changes.html#v1-0","74":"/MagiskChineseDocument/app_changes.html#参考链接","75":"/MagiskChineseDocument/boot.html#android-引导诡计","76":"/MagiskChineseDocument/boot.html#术语","77":"/MagiskChineseDocument/boot.html#引导方法","78":"/MagiskChineseDocument/boot.html#讨论","79":"/MagiskChineseDocument/boot.html#一些历史","80":"/MagiskChineseDocument/boot.html#将这些拼凑在一起","81":"/MagiskChineseDocument/boot.html#参考链接","82":"/MagiskChineseDocument/build.html#构建和开发-magisk","83":"/MagiskChineseDocument/build.html#设置环境","84":"/MagiskChineseDocument/build.html#构建","85":"/MagiskChineseDocument/build.html#ide-支持","86":"/MagiskChineseDocument/build.html#在-android-studio-中开发-rust","87":"/MagiskChineseDocument/build.html#签名和分发","88":"/MagiskChineseDocument/changes.html#magisk-更新日志","89":"/MagiskChineseDocument/changes.html#v26-3","90":"/MagiskChineseDocument/changes.html#v26-2","91":"/MagiskChineseDocument/changes.html#v26-1","92":"/MagiskChineseDocument/changes.html#v26-0","93":"/MagiskChineseDocument/changes.html#v25-2","94":"/MagiskChineseDocument/changes.html#v25-1","95":"/MagiskChineseDocument/changes.html#v25-0","96":"/MagiskChineseDocument/changes.html#v24-3","97":"/MagiskChineseDocument/changes.html#v24-2","98":"/MagiskChineseDocument/changes.html#v24-1","99":"/MagiskChineseDocument/changes.html#v24-0","100":"/MagiskChineseDocument/changes.html#v23-0","101":"/MagiskChineseDocument/changes.html#v22-1","102":"/MagiskChineseDocument/changes.html#v22-0","103":"/MagiskChineseDocument/changes.html#v21-4","104":"/MagiskChineseDocument/changes.html#v21-3","105":"/MagiskChineseDocument/changes.html#v21-2","106":"/MagiskChineseDocument/changes.html#v21-1","107":"/MagiskChineseDocument/changes.html#v21-0","108":"/MagiskChineseDocument/changes.html#v20-4","109":"/MagiskChineseDocument/changes.html#v20-3","110":"/MagiskChineseDocument/changes.html#v20-2","111":"/MagiskChineseDocument/changes.html#v20-1","112":"/MagiskChineseDocument/changes.html#v20-0","113":"/MagiskChineseDocument/changes.html#v19-4","114":"/MagiskChineseDocument/changes.html#v19-3","115":"/MagiskChineseDocument/changes.html#v19-2","116":"/MagiskChineseDocument/changes.html#v19-1","117":"/MagiskChineseDocument/changes.html#v19-0","118":"/MagiskChineseDocument/changes.html#v18-1","119":"/MagiskChineseDocument/changes.html#v18-0","120":"/MagiskChineseDocument/changes.html#v17-3","121":"/MagiskChineseDocument/changes.html#v17-2","122":"/MagiskChineseDocument/changes.html#v17-0-17-1","123":"/MagiskChineseDocument/changes.html#v16-7","124":"/MagiskChineseDocument/changes.html#v16-6","125":"/MagiskChineseDocument/changes.html#v16-4","126":"/MagiskChineseDocument/changes.html#v16-3","127":"/MagiskChineseDocument/changes.html#v16-2","128":"/MagiskChineseDocument/changes.html#v16-1","129":"/MagiskChineseDocument/changes.html#v16-0","130":"/MagiskChineseDocument/changes.html#v15-4","131":"/MagiskChineseDocument/changes.html#v15-3","132":"/MagiskChineseDocument/changes.html#v15-2","133":"/MagiskChineseDocument/changes.html#v15-1","134":"/MagiskChineseDocument/changes.html#v15-0","135":"/MagiskChineseDocument/changes.html#v14-6-1468","136":"/MagiskChineseDocument/changes.html#v14-5-1456","137":"/MagiskChineseDocument/changes.html#v14-5-1455","138":"/MagiskChineseDocument/changes.html#v14-3-1437","139":"/MagiskChineseDocument/changes.html#v14-2","140":"/MagiskChineseDocument/changes.html#v14-1","141":"/MagiskChineseDocument/changes.html#v14-0","142":"/MagiskChineseDocument/changes.html#v13-3","143":"/MagiskChineseDocument/changes.html#v13-2","144":"/MagiskChineseDocument/changes.html#v13-1","145":"/MagiskChineseDocument/changes.html#v12-0","146":"/MagiskChineseDocument/changes.html#v11-5-11-6","147":"/MagiskChineseDocument/changes.html#v11-1","148":"/MagiskChineseDocument/changes.html#v11-0","149":"/MagiskChineseDocument/changes.html#v10-2","150":"/MagiskChineseDocument/changes.html#v10","151":"/MagiskChineseDocument/changes.html#v9","152":"/MagiskChineseDocument/changes.html#v8","153":"/MagiskChineseDocument/changes.html#v7","154":"/MagiskChineseDocument/changes.html#v6","155":"/MagiskChineseDocument/changes.html#v5","156":"/MagiskChineseDocument/changes.html#v4","157":"/MagiskChineseDocument/changes.html#v3","158":"/MagiskChineseDocument/changes.html#v2","159":"/MagiskChineseDocument/changes.html#v1","160":"/MagiskChineseDocument/changes.html#参考链接","161":"/MagiskChineseDocument/delta/faq.html#常见问题","162":"/MagiskChineseDocument/delta/faq.html#如何安装-magisk-delta","163":"/MagiskChineseDocument/delta/faq.html#如何从当前的-magisk-切换到-magisk-delta-反之亦然","164":"/MagiskChineseDocument/delta/faq.html#直接安装-推荐","165":"/MagiskChineseDocument/delta/faq.html#只需从当前的-magisk-应用程序刷入-magisk-delta","166":"/MagiskChineseDocument/delta/faq.html#将-magisk-直接安装到-system-不推荐","167":"/MagiskChineseDocument/delta/faq.html#如何将-magisk-安装到-android-x86-项目或-android-模拟器中","168":"/MagiskChineseDocument/delta/faq.html#开始之前","169":"/MagiskChineseDocument/delta/faq.html#将-magisk-安装到-noxplayer、ldplayer、memuplayer-等模拟器的步骤","170":"/MagiskChineseDocument/delta/faq.html#将-magisk-安装到-bluestacks-的步骤","171":"/MagiskChineseDocument/delta/faq.html#将-magisk-安装到-android-x86-项目的步骤","172":"/MagiskChineseDocument/delta/faq.html#在-waydroid-上安装-magisk-的步骤","173":"/MagiskChineseDocument/delta/faq.html#启用-magiskhide-后-为什么我的应用程序-游戏仍能检测到模拟器","174":"/MagiskChineseDocument/delta/faq.html#如何在-recovery-手动触发核心模式","175":"/MagiskChineseDocument/delta/faq.html#为什么不恢复-magisk-模块的在线-repo","176":"/MagiskChineseDocument/delta/faq.html#我应该安装-shxxxxo-模块来隐藏-root-吗","177":"/MagiskChineseDocument/delta/faq.html#为什么启用-sulist-后某些模块会损坏","178":"/MagiskChineseDocument/delta/faq.html#参考链接","179":"/MagiskChineseDocument/delta/internal-guide.html#magisk-delta-内部文档","180":"/MagiskChineseDocument/delta/internal-guide.html#早期挂载","181":"/MagiskChineseDocument/delta/internal-guide.html#常规挂载","182":"/MagiskChineseDocument/delta/internal-guide.html#模块挂载","183":"/MagiskChineseDocument/delta/internal-guide.html#init-rc-注入","184":"/MagiskChineseDocument/delta/internal-guide.html#常规注入","185":"/MagiskChineseDocument/delta/internal-guide.html#模块注入","186":"/MagiskChineseDocument/delta/internal-guide.html#删除文件和文件夹","187":"/MagiskChineseDocument/delta/internal-guide.html#参考链接","188":"/MagiskChineseDocument/details.html#内部细节","189":"/MagiskChineseDocument/details.html#文档结构","190":"/MagiskChineseDocument/details.html#magisk-tmpfs-目录-中的路径","191":"/MagiskChineseDocument/details.html#data-中的路径","192":"/MagiskChineseDocument/details.html#magisk-启动过程","193":"/MagiskChineseDocument/details.html#预初始化-pre-init","194":"/MagiskChineseDocument/details.html#解密后-post-fs-data","195":"/MagiskChineseDocument/details.html#后期启动-late-start","196":"/MagiskChineseDocument/details.html#重置属性-resetprop","197":"/MagiskChineseDocument/details.html#selinux-政策","198":"/MagiskChineseDocument/details.html#参考链接","199":"/MagiskChineseDocument/faq.html#常见问题","200":"/MagiskChineseDocument/faq.html#q-我安装了一个模块-然后启动时卡在了开机动画。求助","201":"/MagiskChineseDocument/faq.html#q-为什么-xxx应用会检测到-root","202":"/MagiskChineseDocument/faq.html#q-在我隐藏-magisk-app-后-应用图标显示异常","203":"/MagiskChineseDocument/faq.html#q-为什么这个文档很多错误或者不通顺的地方","204":"/MagiskChineseDocument/faq.html#参考链接","205":"/MagiskChineseDocument/guides.html#开发者指南","206":"/MagiskChineseDocument/guides.html#busybox","207":"/MagiskChineseDocument/guides.html#magisk-模块","208":"/MagiskChineseDocument/guides.html#module-prop","209":"/MagiskChineseDocument/guides.html#shell-脚本-sh","210":"/MagiskChineseDocument/guides.html#system-文件夹","211":"/MagiskChineseDocument/guides.html#zygisk","212":"/MagiskChineseDocument/guides.html#system-prop","213":"/MagiskChineseDocument/guides.html#sepolicy-rule","214":"/MagiskChineseDocument/guides.html#magisk-模块安装程序","215":"/MagiskChineseDocument/guides.html#自定义","216":"/MagiskChineseDocument/guides.html#变量","217":"/MagiskChineseDocument/guides.html#函数","218":"/MagiskChineseDocument/guides.html#注意","219":"/MagiskChineseDocument/guides.html#启动脚本","220":"/MagiskChineseDocument/guides.html#根目录覆盖系统","221":"/MagiskChineseDocument/guides.html#参考链接","222":"/MagiskChineseDocument/#magisk-中文文档","223":"/MagiskChineseDocument/#magisk-许可-license","224":"/MagiskChineseDocument/#相关链接","225":"/MagiskChineseDocument/#友情链接","226":"/MagiskChineseDocument/install.html#安装","227":"/MagiskChineseDocument/install.html#入门","228":"/MagiskChineseDocument/install.html#修补映像","229":"/MagiskChineseDocument/install.html#卸载","230":"/MagiskChineseDocument/install.html#recovery-中的-magisk","231":"/MagiskChineseDocument/install.html#三星设备","232":"/MagiskChineseDocument/install.html#刷机工具","233":"/MagiskChineseDocument/install.html#要求","234":"/MagiskChineseDocument/install.html#解锁-bootloader","235":"/MagiskChineseDocument/install.html#操作指南","236":"/MagiskChineseDocument/install.html#系统更新","237":"/MagiskChineseDocument/install.html#注意事项","238":"/MagiskChineseDocument/install.html#华为","239":"/MagiskChineseDocument/install.html#获得官方映像","240":"/MagiskChineseDocument/install.html#emui-5-及以下","241":"/MagiskChineseDocument/install.html#emui-8","242":"/MagiskChineseDocument/install.html#emui-9-或更高版本","243":"/MagiskChineseDocument/install.html#第三方-recovery","244":"/MagiskChineseDocument/install.html#参考链接","245":"/MagiskChineseDocument/ota.html#ota-升级指南","246":"/MagiskChineseDocument/ota.html#必要条件","247":"/MagiskChineseDocument/ota.html#带-a-b-分区的设备","248":"/MagiskChineseDocument/ota.html#非-a-b-设备","249":"/MagiskChineseDocument/ota.html#参考链接","250":"/MagiskChineseDocument/releases/18000.html#_2018-12-7-magisk-v18-0","251":"/MagiskChineseDocument/releases/18000.html#magiskhide-improvements","252":"/MagiskChineseDocument/releases/18000.html#path-changes","253":"/MagiskChineseDocument/releases/18000.html#dropping-legacy-support","254":"/MagiskChineseDocument/releases/18000.html#modern-c-code-base","255":"/MagiskChineseDocument/releases/18100.html#_2019-2-4-magisk-v18-1","256":"/MagiskChineseDocument/releases/18100.html#emui-9-support","257":"/MagiskChineseDocument/releases/18100.html#support-down-to-android-4-2","258":"/MagiskChineseDocument/releases/18100.html#major-magisk-manager-update","259":"/MagiskChineseDocument/releases/18100.html#final-words","260":"/MagiskChineseDocument/releases/19000.html#_2019-3-28-magisk-v19-0","261":"/MagiskChineseDocument/releases/19000.html#magisk-module-installer","262":"/MagiskChineseDocument/releases/19000.html#imageless-magisk","263":"/MagiskChineseDocument/releases/19000.html#native-64-bit-is-back","264":"/MagiskChineseDocument/releases/19000.html#zygote-ptrace-based-magiskhide","265":"/MagiskChineseDocument/releases/19000.html#android-q","266":"/MagiskChineseDocument/releases/19000.html#final-words","267":"/MagiskChineseDocument/releases/19100.html#_2019-5-1-magisk-v19-1","268":"/MagiskChineseDocument/releases/19200.html#todo","269":"/MagiskChineseDocument/releases/19300.html#todo","270":"/MagiskChineseDocument/releases/19400.html#_2019-9-19-magisk-v19-4","271":"/MagiskChineseDocument/releases/19400.html#new-system-as-root-implementation","272":"/MagiskChineseDocument/releases/19400.html#android-10-support","273":"/MagiskChineseDocument/releases/19400.html#product-partition-support","274":"/MagiskChineseDocument/releases/19400.html#a-only-system-as-root","275":"/MagiskChineseDocument/releases/20000.html#_2019-10-11-magisk-v20-0","276":"/MagiskChineseDocument/releases/20000.html#new-system-as-root-implementation","277":"/MagiskChineseDocument/releases/20000.html#android-10-support","278":"/MagiskChineseDocument/releases/20000.html#product-partition-support","279":"/MagiskChineseDocument/releases/20000.html#a-only-system-as-root","280":"/MagiskChineseDocument/releases/20100.html#_2019-11-2-magisk-v20-1","281":"/MagiskChineseDocument/releases/20100.html#updated-magisk-manager-hiding","282":"/MagiskChineseDocument/releases/20200.html#_2020-1-2-magisk-v20-2","283":"/MagiskChineseDocument/releases/20200.html#pre-init-sepolicy-patches-for-modules","284":"/MagiskChineseDocument/releases/20200.html#new-module-installer-format","285":"/MagiskChineseDocument/releases/20300.html#_2020-1-10-magisk-v20-3","286":"/MagiskChineseDocument/releases/20300.html#magisk","287":"/MagiskChineseDocument/releases/20300.html#magisk-manager","288":"/MagiskChineseDocument/releases/20400.html#_2020-3-23-magisk-v20-4","289":"/MagiskChineseDocument/releases/20400.html#miscellaneous","290":"/MagiskChineseDocument/releases/20400.html#busybox-standalone-mode","291":"/MagiskChineseDocument/releases/20400.html#magisk-changelog","292":"/MagiskChineseDocument/releases/21000.html#_2020-10-3-magisk-v21-0","293":"/MagiskChineseDocument/releases/21000.html#highlights","294":"/MagiskChineseDocument/releases/21100.html#_2020-11-13-magisk-v21-1","295":"/MagiskChineseDocument/releases/21200.html#_2020-12-28-magisk-v21-2","296":"/MagiskChineseDocument/releases/21200.html#v21-2","297":"/MagiskChineseDocument/releases/21400.html#_2021-1-17-magisk-v21-4","298":"/MagiskChineseDocument/releases/21400.html#v21-4","299":"/MagiskChineseDocument/releases/21400.html#v21-3","300":"/MagiskChineseDocument/releases/22000.html#_2021-2-23-magisk-v22-0","301":"/MagiskChineseDocument/releases/22000.html#restore-the-existing-magisk-manager-back-to-normal-before-upgrading-if-hidden","302":"/MagiskChineseDocument/releases/22000.html#magisk-manager-is-dead-long-live-the-magisk-app","303":"/MagiskChineseDocument/releases/22000.html#app-hiding","304":"/MagiskChineseDocument/releases/22000.html#bug-fixes","305":"/MagiskChineseDocument/releases/22100.html#_2021-4-9-magisk-v22-1","306":"/MagiskChineseDocument/releases/22100.html#bug-fixes","307":"/MagiskChineseDocument/releases/23000.html#_2021-5-12-magisk-v23-0","308":"/MagiskChineseDocument/releases/23000.html#bug-fixes","309":"/MagiskChineseDocument/releases/24000.html#_2022-1-26-magisk-v24-0","310":"/MagiskChineseDocument/releases/24000.html#magiskhide-removal","311":"/MagiskChineseDocument/releases/24000.html#sunsetting-magisk-modules-repo","312":"/MagiskChineseDocument/releases/24000.html#introducing-zygisk","313":"/MagiskChineseDocument/releases/24000.html#documentation","314":"/MagiskChineseDocument/releases/24100.html#_2022-1-28-magisk-v24-1","315":"/MagiskChineseDocument/releases/24100.html#magiskhide-removal","316":"/MagiskChineseDocument/releases/24100.html#sunsetting-magisk-modules-repo","317":"/MagiskChineseDocument/releases/24100.html#introducing-zygisk","318":"/MagiskChineseDocument/releases/24100.html#documentation","319":"/MagiskChineseDocument/releases/24200.html#_2022-3-1-magisk-v24-2","320":"/MagiskChineseDocument/releases/24300.html#_2022-3-10-magisk-v24-3","321":"/MagiskChineseDocument/releases/25000.html#_2022-6-7-magisk-v25-0","322":"/MagiskChineseDocument/releases/25000.html#magiskinit-rewrite","323":"/MagiskChineseDocument/releases/25000.html#magisksu-security-enhancements","324":"/MagiskChineseDocument/releases/25100.html#_2022-6-19-magisk-v25-1","325":"/MagiskChineseDocument/releases/25100.html#magiskinit-rewrite","326":"/MagiskChineseDocument/releases/25100.html#magisksu-security-enhancements","327":"/MagiskChineseDocument/releases/25200.html#_2022-7-20-magisk-v25-2","328":"/MagiskChineseDocument/releases/26000.html#_2023-4-5-magisk-v26-0","329":"/MagiskChineseDocument/releases/26000.html#将最低-android-版本提升到6-0","330":"/MagiskChineseDocument/releases/26000.html#新的-magic-mount-实现","331":"/MagiskChineseDocument/releases/26000.html#新的-sepolicy-rule-实现","332":"/MagiskChineseDocument/releases/26000.html#zygisk-更新","333":"/MagiskChineseDocument/releases/26100.html#_2023-4-11-magisk-v26-1","334":"/MagiskChineseDocument/releases/26100.html#与-v26-0-相比的更改","335":"/MagiskChineseDocument/releases/26100.html#将最低-android-版本提升到6-0","336":"/MagiskChineseDocument/releases/26100.html#新的-magic-mount-实现","337":"/MagiskChineseDocument/releases/26100.html#新的-sepolicy-rule-实现","338":"/MagiskChineseDocument/releases/26100.html#zygisk-更新","339":"/MagiskChineseDocument/releases/26200.html#_2023-8-27-magisk-v26-2","340":"/MagiskChineseDocument/releases/26300.html#_2023-9-4-magisk-v26-3","341":"/MagiskChineseDocument/releases/26300.html#v26-3","342":"/MagiskChineseDocument/releases/26300.html#v26-2","343":"/MagiskChineseDocument/releases/#发布日志","344":"/MagiskChineseDocument/releases/#其他日志","345":"/MagiskChineseDocument/releases/#参考链接","346":"/MagiskChineseDocument/tools.html#magisk-工具","347":"/MagiskChineseDocument/tools.html#magiskboot","348":"/MagiskChineseDocument/tools.html#magiskinit","349":"/MagiskChineseDocument/tools.html#magiskpolicy","350":"/MagiskChineseDocument/tools.html#magisk","351":"/MagiskChineseDocument/tools.html#su","352":"/MagiskChineseDocument/tools.html#resetprop","353":"/MagiskChineseDocument/tools.html#参考链接"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[5,1,40],"1":[1,5,6],"2":[1,5,8],"3":[1,5,89],"4":[2,5,1],"5":[3,1,1],"6":[3,3,2],"7":[3,3,3],"8":[3,3,2],"9":[3,3,5],"10":[3,3,5],"11":[3,3,19],"12":[3,3,46],"13":[2,3,32],"14":[3,3,10],"15":[3,3,18],"16":[3,3,32],"17":[3,3,18],"18":[3,3,19],"19":[5,3,31],"20":[3,3,11],"21":[3,3,11],"22":[2,3,14],"23":[3,3,34],"24":[2,3,50],"25":[3,3,57],"26":[3,3,52],"27":[2,3,51],"28":[4,3,69],"29":[3,3,16],"30":[3,3,15],"31":[3,3,54],"32":[3,3,28],"33":[3,3,11],"34":[3,3,6],"35":[3,3,11],"36":[3,3,20],"37":[3,3,39],"38":[2,3,12],"39":[3,3,20],"40":[3,3,11],"41":[3,3,22],"42":[3,3,19],"43":[3,3,56],"44":[3,3,9],"45":[3,3,100],"46":[3,3,74],"47":[3,3,54],"48":[3,3,50],"49":[3,3,81],"50":[2,3,34],"51":[3,3,37],"52":[3,3,9],"53":[3,3,16],"54":[3,3,6],"55":[3,3,18],"56":[3,3,18],"57":[3,3,12],"58":[2,3,39],"59":[2,3,7],"60":[3,3,17],"61":[3,3,16],"62":[3,3,23],"63":[3,3,5],"64":[3,3,32],"65":[2,3,48],"66":[2,3,14],"67":[2,3,33],"68":[2,3,25],"69":[2,3,29],"70":[2,3,31],"71":[2,3,30],"72":[2,3,12],"73":[2,3,2],"74":[1,3,5],"75":[2,1,1],"76":[1,2,91],"77":[1,2,71],"78":[1,3,68],"79":[1,2,80],"80":[1,2,90],"81":[1,2,6],"82":[2,1,1],"83":[1,2,79],"84":[1,2,22],"85":[2,2,21],"86":[5,4,73],"87":[1,2,27],"88":[2,1,1],"89":[2,2,36],"90":[2,2,114],"91":[2,2,49],"92":[2,2,95],"93":[2,2,32],"94":[2,2,50],"95":[2,2,93],"96":[2,2,21],"97":[2,2,75],"98":[2,2,4],"99":[2,2,152],"100":[2,2,69],"101":[2,2,92],"102":[2,2,88],"103":[2,2,22],"104":[2,2,44],"105":[2,2,51],"106":[2,2,86],"107":[2,2,151],"108":[2,2,111],"109":[2,2,6],"110":[2,2,37],"111":[2,2,62],"112":[2,2,40],"113":[2,2,91],"114":[2,2,51],"115":[2,2,53],"116":[2,2,52],"117":[2,2,104],"118":[2,2,21],"119":[2,2,138],"120":[2,2,72],"121":[2,2,27],"122":[4,2,93],"123":[2,2,50],"124":[2,2,189],"125":[2,2,145],"126":[2,2,15],"127":[2,2,26],"128":[2,2,39],"129":[2,2,27],"130":[2,2,53],"131":[2,2,40],"132":[2,2,64],"133":[2,2,17],"134":[2,2,34],"135":[4,2,83],"136":[4,2,25],"137":[4,2,88],"138":[4,2,83],"139":[2,2,12],"140":[2,2,83],"141":[2,2,131],"142":[2,2,21],"143":[2,2,60],"144":[2,2,190],"145":[2,2,118],"146":[4,2,72],"147":[2,2,11],"148":[2,2,223],"149":[2,2,28],"150":[1,2,103],"151":[1,2,109],"152":[1,2,24],"153":[1,2,60],"154":[1,2,25],"155":[1,2,21],"156":[1,2,87],"157":[1,2,69],"158":[1,2,76],"159":[1,2,3],"160":[1,2,4],"161":[1,1,1],"162":[4,1,9],"163":[6,1,4],"164":[3,7,14],"165":[4,7,15],"166":[6,7,49],"167":[7,1,1],"168":[1,8,38],"169":[7,8,42],"170":[5,8,28],"171":[6,8,7],"172":[5,8,12],"173":[6,1,3],"174":[4,1,9],"175":[5,1,13],"176":[6,1,15],"177":[4,1,13],"178":[1,1,3],"179":[3,1,10],"180":[1,3,40],"181":[1,4,45],"182":[1,4,26],"183":[3,3,1],"184":[1,6,63],"185":[1,6,23],"186":[1,3,53],"187":[1,3,6],"188":[1,1,1],"189":[1,1,1],"190":[5,2,67],"191":[3,2,81],"192":[2,1,1],"193":[4,3,55],"194":[5,3,13],"195":[4,3,13],"196":[3,1,77],"197":[2,1,70],"198":[1,1,6],"199":[1,1,1],"200":[4,1,40],"201":[5,1,21],"202":[6,1,23],"203":[2,1,5],"204":[1,1,6],"205":[1,1,1],"206":[1,1,82],"207":[2,1,81],"208":[2,3,79],"209":[4,3,27],"210":[2,3,29],"211":[1,3,16],"212":[2,3,10],"213":[2,3,10],"214":[2,1,50],"215":[1,3,37],"216":[1,4,59],"217":[1,4,65],"218":[1,3,23],"219":[1,1,74],"220":[1,1,123],"221":[1,1,6],"222":[2,1,25],"223":[4,2,110],"224":[1,2,5],"225":[1,2,6],"226":[1,1,8],"227":[1,1,110],"228":[1,1,80],"229":[1,1,14],"230":[3,1,63],"231":[1,1,15],"232":[1,2,15],"233":[1,2,45],"234":[2,2,25],"235":[1,2,89],"236":[1,2,21],"237":[1,2,19],"238":[1,1,40],"239":[1,2,15],"240":[3,2,21],"241":[2,2,38],"242":[3,2,56],"243":[2,1,75],"244":[1,1,5],"245":[2,1,22],"246":[1,2,20],"247":[4,2,41],"248":[5,2,69],"249":[1,2,6],"250":[6,1,13],"251":[2,6,108],"252":[2,6,94],"253":[3,6,75],"254":[4,6,43],"255":[6,1,15],"256":[3,6,56],"257":[6,6,59],"258":[4,6,27],"259":[2,6,52],"260":[6,1,38],"261":[3,6,63],"262":[2,6,91],"263":[5,6,41],"264":[4,6,74],"265":[2,6,44],"266":[2,6,56],"267":[5,1,72],"268":[1,1,1],"269":[1,1,1],"270":[6,1,35],"271":[5,6,165],"272":[3,6,59],"273":[3,6,33],"274":[5,6,37],"275":[6,1,34],"276":[5,6,163],"277":[3,6,55],"278":[3,6,33],"279":[5,6,37],"280":[6,1,13],"281":[4,6,133],"282":[5,1,14],"283":[6,5,82],"284":[4,5,84],"285":[6,1,1],"286":[1,6,10],"287":[2,6,8],"288":[6,1,1],"289":[1,6,74],"290":[3,6,102],"291":[2,6,111],"292":[6,1,88],"293":[1,6,113],"294":[6,1,38],"295":[6,1,25],"296":[2,6,53],"297":[6,1,40],"298":[2,6,22],"299":[2,6,46],"300":[6,1,1],"301":[13,6,21],"302":[9,6,72],"303":[2,6,42],"304":[2,6,36],"305":[6,1,35],"306":[2,6,94],"307":[6,1,28],"308":[2,6,71],"309":[6,1,41],"310":[2,6,84],"311":[4,6,45],"312":[2,6,58],"313":[1,6,20],"314":[5,1,57],"315":[2,5,84],"316":[4,5,45],"317":[2,5,58],"318":[1,5,20],"319":[6,1,82],"320":[5,1,38],"321":[6,1,22],"322":[2,6,143],"323":[3,6,134],"324":[6,1,35],"325":[2,6,143],"326":[3,6,134],"327":[6,1,39],"328":[6,1,3],"329":[4,6,17],"330":[4,6,13],"331":[4,6,25],"332":[2,6,19],"333":[6,1,1],"334":[4,6,51],"335":[4,6,17],"336":[4,6,13],"337":[4,6,25],"338":[2,6,19],"339":[6,1,116],"340":[6,1,1],"341":[2,6,36],"342":[2,6,116],"343":[1,1,17],"344":[1,1,4],"345":[1,1,5],"346":[2,1,16],"347":[1,2,231],"348":[1,2,21],"349":[1,2,153],"350":[1,2,108],"351":[1,2,59],"352":[1,2,47],"353":[1,2,5]},"averageFieldLength":[2.7344632768361565,2.9209039548022586,44.601694915254285],"storedFields":{"0":{"title":"Magisk 中文文档 | Magisk Chinese Document","titles":[]},"1":{"title":"开发","titles":["Magisk 中文文档 | Magisk Chinese Document"]},"2":{"title":"贡献","titles":["Magisk 中文文档 | Magisk Chinese Document"]},"3":{"title":"许可","titles":["Magisk 中文文档 | Magisk Chinese Document"]},"4":{"title":"Star 历史","titles":["Magisk 中文文档 | Magisk Chinese Document"]},"5":{"title":"Magisk Manager 更新日志","titles":[]},"6":{"title":"v8.0.7","titles":["Magisk Manager 更新日志"]},"7":{"title":"v8.0.6","titles":["Magisk Manager 更新日志"]},"8":{"title":"v8.0.5","titles":["Magisk Manager 更新日志"]},"9":{"title":"v8.0.4","titles":["Magisk Manager 更新日志"]},"10":{"title":"v8.0.3","titles":["Magisk Manager 更新日志"]},"11":{"title":"v8.0.2","titles":["Magisk Manager 更新日志"]},"12":{"title":"v8.0.1","titles":["Magisk Manager 更新日志"]},"13":{"title":"v8.0.0","titles":["Magisk Manager 更新日志"]},"14":{"title":"v7.5.1","titles":["Magisk Manager 更新日志"]},"15":{"title":"v7.5.0","titles":["Magisk Manager 更新日志"]},"16":{"title":"v7.4.0","titles":["Magisk Manager 更新日志"]},"17":{"title":"v7.3.5","titles":["Magisk Manager 更新日志"]},"18":{"title":"v7.3.4","titles":["Magisk Manager 更新日志"]},"19":{"title":"v7.3.0/1/2","titles":["Magisk Manager 更新日志"]},"20":{"title":"v7.2.0","titles":["Magisk Manager 更新日志"]},"21":{"title":"v7.1.2","titles":["Magisk Manager 更新日志"]},"22":{"title":"v7.1.1","titles":["Magisk Manager 更新日志"]},"23":{"title":"v7.1.0","titles":["Magisk Manager 更新日志"]},"24":{"title":"v7.0.0","titles":["Magisk Manager 更新日志"]},"25":{"title":"v6.1.0","titles":["Magisk Manager 更新日志"]},"26":{"title":"v6.0.1","titles":["Magisk Manager 更新日志"]},"27":{"title":"v6.0.0","titles":["Magisk Manager 更新日志"]},"28":{"title":"v5.9.0/v5.9.1","titles":["Magisk Manager 更新日志"]},"29":{"title":"v5.8.3","titles":["Magisk Manager 更新日志"]},"30":{"title":"v5.8.1","titles":["Magisk Manager 更新日志"]},"31":{"title":"v5.8.0","titles":["Magisk Manager 更新日志"]},"32":{"title":"v5.7.0","titles":["Magisk Manager 更新日志"]},"33":{"title":"v5.6.4","titles":["Magisk Manager 更新日志"]},"34":{"title":"v5.6.3","titles":["Magisk Manager 更新日志"]},"35":{"title":"v5.6.2","titles":["Magisk Manager 更新日志"]},"36":{"title":"v5.6.1","titles":["Magisk Manager 更新日志"]},"37":{"title":"v5.6.0","titles":["Magisk Manager 更新日志"]},"38":{"title":"v5.5.5","titles":["Magisk Manager 更新日志"]},"39":{"title":"v5.5.4","titles":["Magisk Manager 更新日志"]},"40":{"title":"v5.5.3","titles":["Magisk Manager 更新日志"]},"41":{"title":"v5.5.2","titles":["Magisk Manager 更新日志"]},"42":{"title":"v5.5.1","titles":["Magisk Manager 更新日志"]},"43":{"title":"v5.5.0","titles":["Magisk Manager 更新日志"]},"44":{"title":"v5.4.3","titles":["Magisk Manager 更新日志"]},"45":{"title":"v5.4.2","titles":["Magisk Manager 更新日志"]},"46":{"title":"v5.4.0","titles":["Magisk Manager 更新日志"]},"47":{"title":"v5.3.5","titles":["Magisk Manager 更新日志"]},"48":{"title":"v5.3.0","titles":["Magisk Manager 更新日志"]},"49":{"title":"v5.2.0","titles":["Magisk Manager 更新日志"]},"50":{"title":"v5.1.1","titles":["Magisk Manager 更新日志"]},"51":{"title":"v5.1.0","titles":["Magisk Manager 更新日志"]},"52":{"title":"v5.0.6","titles":["Magisk Manager 更新日志"]},"53":{"title":"v5.0.5","titles":["Magisk Manager 更新日志"]},"54":{"title":"v5.0.4","titles":["Magisk Manager 更新日志"]},"55":{"title":"v5.0.3","titles":["Magisk Manager 更新日志"]},"56":{"title":"v5.0.2","titles":["Magisk Manager 更新日志"]},"57":{"title":"v5.0.1","titles":["Magisk Manager 更新日志"]},"58":{"title":"v5.0.0","titles":["Magisk Manager 更新日志"]},"59":{"title":"v4.3.3","titles":["Magisk Manager 更新日志"]},"60":{"title":"v4.3.2","titles":["Magisk Manager 更新日志"]},"61":{"title":"v4.3.1","titles":["Magisk Manager 更新日志"]},"62":{"title":"v4.3.0","titles":["Magisk Manager 更新日志"]},"63":{"title":"v4.2.7","titles":["Magisk Manager 更新日志"]},"64":{"title":"v4.2.6","titles":["Magisk Manager 更新日志"]},"65":{"title":"v4.2","titles":["Magisk Manager 更新日志"]},"66":{"title":"v4.1","titles":["Magisk Manager 更新日志"]},"67":{"title":"v4.0","titles":["Magisk Manager 更新日志"]},"68":{"title":"v3.1","titles":["Magisk Manager 更新日志"]},"69":{"title":"v3.0","titles":["Magisk Manager 更新日志"]},"70":{"title":"v2.5","titles":["Magisk Manager 更新日志"]},"71":{"title":"v2.1","titles":["Magisk Manager 更新日志"]},"72":{"title":"v2.0","titles":["Magisk Manager 更新日志"]},"73":{"title":"v1.0","titles":["Magisk Manager 更新日志"]},"74":{"title":"参考链接","titles":["Magisk Manager 更新日志"]},"75":{"title":"Android 引导诡计","titles":[]},"76":{"title":"术语","titles":["Android 引导诡计"]},"77":{"title":"引导方法","titles":["Android 引导诡计"]},"78":{"title":"讨论","titles":["Android 引导诡计","引导方法"]},"79":{"title":"一些历史","titles":["Android 引导诡计"]},"80":{"title":"将这些拼凑在一起","titles":["Android 引导诡计"]},"81":{"title":"参考链接","titles":["Android 引导诡计"]},"82":{"title":"构建和开发 Magisk","titles":[]},"83":{"title":"设置环境","titles":["构建和开发 Magisk"]},"84":{"title":"构建","titles":["构建和开发 Magisk"]},"85":{"title":"IDE 支持","titles":["构建和开发 Magisk"]},"86":{"title":"在 Android Studio 中开发 Rust","titles":["构建和开发 Magisk","IDE 支持"]},"87":{"title":"签名和分发","titles":["构建和开发 Magisk"]},"88":{"title":"Magisk 更新日志","titles":[]},"89":{"title":"v26.3","titles":["Magisk 更新日志"]},"90":{"title":"v26.2","titles":["Magisk 更新日志"]},"91":{"title":"v26.1","titles":["Magisk 更新日志"]},"92":{"title":"v26.0","titles":["Magisk 更新日志"]},"93":{"title":"v25.2","titles":["Magisk 更新日志"]},"94":{"title":"v25.1","titles":["Magisk 更新日志"]},"95":{"title":"v25.0","titles":["Magisk 更新日志"]},"96":{"title":"v24.3","titles":["Magisk 更新日志"]},"97":{"title":"v24.2","titles":["Magisk 更新日志"]},"98":{"title":"v24.1","titles":["Magisk 更新日志"]},"99":{"title":"v24.0","titles":["Magisk 更新日志"]},"100":{"title":"v23.0","titles":["Magisk 更新日志"]},"101":{"title":"v22.1","titles":["Magisk 更新日志"]},"102":{"title":"v22.0","titles":["Magisk 更新日志"]},"103":{"title":"v21.4","titles":["Magisk 更新日志"]},"104":{"title":"v21.3","titles":["Magisk 更新日志"]},"105":{"title":"v21.2","titles":["Magisk 更新日志"]},"106":{"title":"v21.1","titles":["Magisk 更新日志"]},"107":{"title":"v21.0","titles":["Magisk 更新日志"]},"108":{"title":"v20.4","titles":["Magisk 更新日志"]},"109":{"title":"v20.3","titles":["Magisk 更新日志"]},"110":{"title":"v20.2","titles":["Magisk 更新日志"]},"111":{"title":"v20.1","titles":["Magisk 更新日志"]},"112":{"title":"v20.0","titles":["Magisk 更新日志"]},"113":{"title":"v19.4","titles":["Magisk 更新日志"]},"114":{"title":"v19.3","titles":["Magisk 更新日志"]},"115":{"title":"v19.2","titles":["Magisk 更新日志"]},"116":{"title":"v19.1","titles":["Magisk 更新日志"]},"117":{"title":"v19.0","titles":["Magisk 更新日志"]},"118":{"title":"v18.1","titles":["Magisk 更新日志"]},"119":{"title":"v18.0","titles":["Magisk 更新日志"]},"120":{"title":"v17.3","titles":["Magisk 更新日志"]},"121":{"title":"v17.2","titles":["Magisk 更新日志"]},"122":{"title":"v17.0/17.1","titles":["Magisk 更新日志"]},"123":{"title":"v16.7","titles":["Magisk 更新日志"]},"124":{"title":"v16.6","titles":["Magisk 更新日志"]},"125":{"title":"v16.4","titles":["Magisk 更新日志"]},"126":{"title":"v16.3","titles":["Magisk 更新日志"]},"127":{"title":"v16.2","titles":["Magisk 更新日志"]},"128":{"title":"v16.1","titles":["Magisk 更新日志"]},"129":{"title":"v16.0","titles":["Magisk 更新日志"]},"130":{"title":"v15.4","titles":["Magisk 更新日志"]},"131":{"title":"v15.3","titles":["Magisk 更新日志"]},"132":{"title":"v15.2","titles":["Magisk 更新日志"]},"133":{"title":"v15.1","titles":["Magisk 更新日志"]},"134":{"title":"v15.0","titles":["Magisk 更新日志"]},"135":{"title":"v14.6 (1468)","titles":["Magisk 更新日志"]},"136":{"title":"v14.5 (1456)","titles":["Magisk 更新日志"]},"137":{"title":"v14.5 (1455)","titles":["Magisk 更新日志"]},"138":{"title":"v14.3 (1437)","titles":["Magisk 更新日志"]},"139":{"title":"v14.2","titles":["Magisk 更新日志"]},"140":{"title":"v14.1","titles":["Magisk 更新日志"]},"141":{"title":"v14.0","titles":["Magisk 更新日志"]},"142":{"title":"v13.3","titles":["Magisk 更新日志"]},"143":{"title":"v13.2","titles":["Magisk 更新日志"]},"144":{"title":"v13.1","titles":["Magisk 更新日志"]},"145":{"title":"v12.0","titles":["Magisk 更新日志"]},"146":{"title":"v11.5/11.6","titles":["Magisk 更新日志"]},"147":{"title":"v11.1","titles":["Magisk 更新日志"]},"148":{"title":"v11.0","titles":["Magisk 更新日志"]},"149":{"title":"v10.2","titles":["Magisk 更新日志"]},"150":{"title":"v10","titles":["Magisk 更新日志"]},"151":{"title":"v9","titles":["Magisk 更新日志"]},"152":{"title":"v8","titles":["Magisk 更新日志"]},"153":{"title":"v7","titles":["Magisk 更新日志"]},"154":{"title":"v6","titles":["Magisk 更新日志"]},"155":{"title":"v5","titles":["Magisk 更新日志"]},"156":{"title":"v4","titles":["Magisk 更新日志"]},"157":{"title":"v3","titles":["Magisk 更新日志"]},"158":{"title":"v2","titles":["Magisk 更新日志"]},"159":{"title":"v1","titles":["Magisk 更新日志"]},"160":{"title":"参考链接","titles":["Magisk 更新日志"]},"161":{"title":"常见问题","titles":[]},"162":{"title":"如何安装 Magisk Delta?","titles":["常见问题"]},"163":{"title":"如何从当前的 Magisk 切换到 Magisk Delta,反之亦然?","titles":["常见问题"]},"164":{"title":"直接安装(推荐)","titles":["常见问题","如何从当前的 Magisk 切换到 Magisk Delta,反之亦然?"]},"165":{"title":"只需从当前的 Magisk 应用程序刷入 Magisk Delta","titles":["常见问题","如何从当前的 Magisk 切换到 Magisk Delta,反之亦然?"]},"166":{"title":"将 Magisk 直接安装到 /system(不推荐)","titles":["常见问题","如何从当前的 Magisk 切换到 Magisk Delta,反之亦然?"]},"167":{"title":"如何将 Magisk 安装到 Android-x86 项目或 Android 模拟器中","titles":["常见问题"]},"168":{"title":"开始之前","titles":["常见问题","如何将 Magisk 安装到 Android-x86 项目或 Android 模拟器中"]},"169":{"title":"将 Magisk 安装到 NoxPlayer、LDPlayer、MemuPlayer 等模拟器的步骤","titles":["常见问题","如何将 Magisk 安装到 Android-x86 项目或 Android 模拟器中"]},"170":{"title":"将 Magisk 安装到 Bluestacks 的步骤","titles":["常见问题","如何将 Magisk 安装到 Android-x86 项目或 Android 模拟器中"]},"171":{"title":"将 Magisk 安装到 Android-x86 项目的步骤","titles":["常见问题","如何将 Magisk 安装到 Android-x86 项目或 Android 模拟器中"]},"172":{"title":"在 Waydroid 上安装 Magisk 的步骤","titles":["常见问题","如何将 Magisk 安装到 Android-x86 项目或 Android 模拟器中"]},"173":{"title":"启用 MagiskHide 后,为什么我的应用程序/游戏仍能检测到模拟器?","titles":["常见问题"]},"174":{"title":"如何在 Recovery 手动触发核心模式?","titles":["常见问题"]},"175":{"title":"为什么不恢复 Magisk 模块的在线 repo?","titles":["常见问题"]},"176":{"title":"我应该安装 Shxxxxo 模块来隐藏 root 吗?","titles":["常见问题"]},"177":{"title":"为什么启用 SuList 后某些模块会损坏?","titles":["常见问题"]},"178":{"title":"参考链接","titles":["常见问题"]},"179":{"title":"Magisk Delta 内部文档","titles":[]},"180":{"title":"早期挂载","titles":["Magisk Delta 内部文档"]},"181":{"title":"常规挂载","titles":["Magisk Delta 内部文档","早期挂载"]},"182":{"title":"模块挂载","titles":["Magisk Delta 内部文档","早期挂载"]},"183":{"title":"init.rc 注入","titles":["Magisk Delta 内部文档"]},"184":{"title":"常规注入","titles":["Magisk Delta 内部文档","init.rc 注入"]},"185":{"title":"模块注入","titles":["Magisk Delta 内部文档","init.rc 注入"]},"186":{"title":"删除文件和文件夹","titles":["Magisk Delta 内部文档"]},"187":{"title":"参考链接","titles":["Magisk Delta 内部文档"]},"188":{"title":"内部细节","titles":[]},"189":{"title":"文档结构","titles":["内部细节"]},"190":{"title":"“Magisk tmpfs 目录”中的路径","titles":["内部细节","文档结构"]},"191":{"title":"/data 中的路径","titles":["内部细节","文档结构"]},"192":{"title":"Magisk 启动过程","titles":["内部细节"]},"193":{"title":"预初始化(Pre-Init)","titles":["内部细节","Magisk 启动过程"]},"194":{"title":"解密后(post-fs-data)","titles":["内部细节","Magisk 启动过程"]},"195":{"title":"后期启动(late_start)","titles":["内部细节","Magisk 启动过程"]},"196":{"title":"重置属性(Resetprop)","titles":["内部细节"]},"197":{"title":"SELinux 政策","titles":["内部细节"]},"198":{"title":"参考链接","titles":["内部细节"]},"199":{"title":"常见问题","titles":[]},"200":{"title":"Q: 我安装了一个模块,然后启动时卡在了开机动画。求助","titles":["常见问题"]},"201":{"title":"Q: 为什么 XXX应用会检测到 Root?","titles":["常见问题"]},"202":{"title":"Q: 在我隐藏 Magisk App 后,应用图标显示异常","titles":["常见问题"]},"203":{"title":"Q: 为什么这个文档很多错误或者不通顺的地方","titles":["常见问题"]},"204":{"title":"参考链接","titles":["常见问题"]},"205":{"title":"开发者指南","titles":[]},"206":{"title":"BusyBox","titles":["开发者指南"]},"207":{"title":"Magisk 模块","titles":["开发者指南"]},"208":{"title":"module.prop","titles":["开发者指南","Magisk 模块"]},"209":{"title":"Shell 脚本 (*.sh)","titles":["开发者指南","Magisk 模块"]},"210":{"title":"system 文件夹","titles":["开发者指南","Magisk 模块"]},"211":{"title":"zygisk","titles":["开发者指南","Magisk 模块"]},"212":{"title":"system.prop","titles":["开发者指南","Magisk 模块"]},"213":{"title":"sepolicy.rule","titles":["开发者指南","Magisk 模块"]},"214":{"title":"Magisk 模块安装程序","titles":["开发者指南"]},"215":{"title":"自定义","titles":["开发者指南","Magisk 模块安装程序"]},"216":{"title":"变量","titles":["开发者指南","Magisk 模块安装程序","自定义"]},"217":{"title":"函数","titles":["开发者指南","Magisk 模块安装程序","自定义"]},"218":{"title":"注意","titles":["开发者指南","Magisk 模块安装程序"]},"219":{"title":"启动脚本","titles":["开发者指南"]},"220":{"title":"根目录覆盖系统","titles":["开发者指南"]},"221":{"title":"参考链接","titles":["开发者指南"]},"222":{"title":"Magisk 中文文档","titles":[]},"223":{"title":"Magisk 许可(License)","titles":["Magisk 中文文档"]},"224":{"title":"相关链接","titles":["Magisk 中文文档"]},"225":{"title":"友情链接","titles":["Magisk 中文文档"]},"226":{"title":"安装","titles":[]},"227":{"title":"入门","titles":["安装"]},"228":{"title":"修补映像","titles":["安装"]},"229":{"title":"卸载","titles":["安装"]},"230":{"title":"Recovery 中的 Magisk","titles":["安装"]},"231":{"title":"三星设备","titles":["安装"]},"232":{"title":"刷机工具","titles":["安装","三星设备"]},"233":{"title":"要求","titles":["安装","三星设备"]},"234":{"title":"解锁 Bootloader","titles":["安装","三星设备"]},"235":{"title":"操作指南","titles":["安装","三星设备"]},"236":{"title":"系统更新","titles":["安装","三星设备"]},"237":{"title":"注意事项","titles":["安装","三星设备"]},"238":{"title":"华为","titles":["安装"]},"239":{"title":"获得官方映像","titles":["安装","华为"]},"240":{"title":"EMUI 5 及以下","titles":["安装","华为"]},"241":{"title":"EMUI 8","titles":["安装","华为"]},"242":{"title":"EMUI 9 或更高版本","titles":["安装","华为"]},"243":{"title":"第三方 Recovery","titles":["安装"]},"244":{"title":"参考链接","titles":["安装"]},"245":{"title":"OTA 升级指南","titles":[]},"246":{"title":"必要条件","titles":["OTA 升级指南"]},"247":{"title":"带 A/B 分区的设备","titles":["OTA 升级指南"]},"248":{"title":"“非 A/B” 设备","titles":["OTA 升级指南"]},"249":{"title":"参考链接","titles":["OTA 升级指南"]},"250":{"title":"2018.12.7 Magisk v18.0","titles":[]},"251":{"title":"MagiskHide Improvements","titles":["2018.12.7 Magisk v18.0"]},"252":{"title":"Path Changes","titles":["2018.12.7 Magisk v18.0"]},"253":{"title":"Dropping Legacy Support","titles":["2018.12.7 Magisk v18.0"]},"254":{"title":"Modern C++ Code Base","titles":["2018.12.7 Magisk v18.0"]},"255":{"title":"2019.2.4 Magisk v18.1","titles":[]},"256":{"title":"EMUI 9 Support","titles":["2019.2.4 Magisk v18.1"]},"257":{"title":"Support Down to Android 4.2","titles":["2019.2.4 Magisk v18.1"]},"258":{"title":"Major Magisk Manager Update","titles":["2019.2.4 Magisk v18.1"]},"259":{"title":"Final Words","titles":["2019.2.4 Magisk v18.1"]},"260":{"title":"2019.3.28 Magisk v19.0","titles":[]},"261":{"title":"Magisk Module installer","titles":["2019.3.28 Magisk v19.0"]},"262":{"title":"Imageless Magisk","titles":["2019.3.28 Magisk v19.0"]},"263":{"title":"Native 64 Bit is Back","titles":["2019.3.28 Magisk v19.0"]},"264":{"title":"Zygote Ptrace Based MagiskHide","titles":["2019.3.28 Magisk v19.0"]},"265":{"title":"Android Q","titles":["2019.3.28 Magisk v19.0"]},"266":{"title":"Final Words","titles":["2019.3.28 Magisk v19.0"]},"267":{"title":"2019.5.1 Magisk v19.1","titles":[]},"268":{"title":"TODO","titles":[]},"269":{"title":"TODO","titles":[]},"270":{"title":"2019.9.19 Magisk v19.4","titles":[]},"271":{"title":"New System-as-root Implementation","titles":["2019.9.19 Magisk v19.4"]},"272":{"title":"Android 10 Support","titles":["2019.9.19 Magisk v19.4"]},"273":{"title":"Product Partition Support","titles":["2019.9.19 Magisk v19.4"]},"274":{"title":"A-Only System-as-root","titles":["2019.9.19 Magisk v19.4"]},"275":{"title":"2019.10.11 Magisk v20.0","titles":[]},"276":{"title":"New System-as-root Implementation","titles":["2019.10.11 Magisk v20.0"]},"277":{"title":"Android 10 Support","titles":["2019.10.11 Magisk v20.0"]},"278":{"title":"Product Partition Support","titles":["2019.10.11 Magisk v20.0"]},"279":{"title":"A-Only System-as-root","titles":["2019.10.11 Magisk v20.0"]},"280":{"title":"2019.11.2 Magisk v20.1","titles":[]},"281":{"title":"Updated Magisk Manager Hiding","titles":["2019.11.2 Magisk v20.1"]},"282":{"title":"2020.1.2 Magisk v20.2","titles":[]},"283":{"title":"Pre-Init sepolicy Patches for Modules","titles":["2020.1.2 Magisk v20.2"]},"284":{"title":"New Module Installer Format","titles":["2020.1.2 Magisk v20.2"]},"285":{"title":"2020.1.10 Magisk v20.3","titles":[]},"286":{"title":"Magisk","titles":["2020.1.10 Magisk v20.3"]},"287":{"title":"Magisk Manager","titles":["2020.1.10 Magisk v20.3"]},"288":{"title":"2020.3.23 Magisk v20.4","titles":[]},"289":{"title":"Miscellaneous","titles":["2020.3.23 Magisk v20.4"]},"290":{"title":"BusyBox Standalone Mode","titles":["2020.3.23 Magisk v20.4"]},"291":{"title":"Magisk Changelog","titles":["2020.3.23 Magisk v20.4"]},"292":{"title":"2020.10.3 Magisk v21.0","titles":[]},"293":{"title":"Highlights","titles":["2020.10.3 Magisk v21.0"]},"294":{"title":"2020.11.13 Magisk v21.1","titles":[]},"295":{"title":"2020.12.28 Magisk v21.2","titles":[]},"296":{"title":"v21.2","titles":["2020.12.28 Magisk v21.2"]},"297":{"title":"2021.1.17 Magisk v21.4","titles":[]},"298":{"title":"v21.4","titles":["2021.1.17 Magisk v21.4"]},"299":{"title":"v21.3","titles":["2021.1.17 Magisk v21.4"]},"300":{"title":"2021.2.23 Magisk v22.0","titles":[]},"301":{"title":"RESTORE THE EXISTING MAGISK MANAGER BACK TO NORMAL BEFORE UPGRADING IF HIDDEN!","titles":["2021.2.23 Magisk v22.0"]},"302":{"title":"Magisk Manager is dead.Long live the Magisk app!","titles":["2021.2.23 Magisk v22.0"]},"303":{"title":"App Hiding","titles":["2021.2.23 Magisk v22.0"]},"304":{"title":"Bug Fixes","titles":["2021.2.23 Magisk v22.0"]},"305":{"title":"2021.4.9 Magisk v22.1","titles":[]},"306":{"title":"Bug Fixes","titles":["2021.4.9 Magisk v22.1"]},"307":{"title":"2021.5.12 Magisk v23.0","titles":[]},"308":{"title":"Bug Fixes","titles":["2021.5.12 Magisk v23.0"]},"309":{"title":"2022.1.26 Magisk v24.0","titles":[]},"310":{"title":"MagiskHide Removal","titles":["2022.1.26 Magisk v24.0"]},"311":{"title":"Sunsetting Magisk-Modules-Repo","titles":["2022.1.26 Magisk v24.0"]},"312":{"title":"Introducing Zygisk","titles":["2022.1.26 Magisk v24.0"]},"313":{"title":"Documentation","titles":["2022.1.26 Magisk v24.0"]},"314":{"title":"2022.1.28 Magisk v24.1","titles":[]},"315":{"title":"MagiskHide Removal","titles":["2022.1.28 Magisk v24.1"]},"316":{"title":"Sunsetting Magisk-Modules-Repo","titles":["2022.1.28 Magisk v24.1"]},"317":{"title":"Introducing Zygisk","titles":["2022.1.28 Magisk v24.1"]},"318":{"title":"Documentation","titles":["2022.1.28 Magisk v24.1"]},"319":{"title":"2022.3.1 Magisk v24.2","titles":[]},"320":{"title":"2022.3.10 Magisk v24.3","titles":[]},"321":{"title":"2022.6.7 Magisk v25.0","titles":[]},"322":{"title":"MagiskInit Rewrite","titles":["2022.6.7 Magisk v25.0"]},"323":{"title":"MagiskSU Security Enhancements","titles":["2022.6.7 Magisk v25.0"]},"324":{"title":"2022.6.19 Magisk v25.1","titles":[]},"325":{"title":"MagiskInit Rewrite","titles":["2022.6.19 Magisk v25.1"]},"326":{"title":"MagiskSU Security Enhancements","titles":["2022.6.19 Magisk v25.1"]},"327":{"title":"2022.7.20 Magisk v25.2","titles":[]},"328":{"title":"2023.4.5 Magisk v26.0","titles":[]},"329":{"title":"将最低 Android 版本提升到6.0","titles":["2023.4.5 Magisk v26.0"]},"330":{"title":"新的 Magic Mount 实现","titles":["2023.4.5 Magisk v26.0"]},"331":{"title":"新的 sepolicy.rule 实现","titles":["2023.4.5 Magisk v26.0"]},"332":{"title":"Zygisk 更新","titles":["2023.4.5 Magisk v26.0"]},"333":{"title":"2023.4.11 Magisk v26.1","titles":[]},"334":{"title":"与 v26.0 相比的更改","titles":["2023.4.11 Magisk v26.1"]},"335":{"title":"将最低 Android 版本提升到6.0","titles":["2023.4.11 Magisk v26.1"]},"336":{"title":"新的 Magic Mount 实现","titles":["2023.4.11 Magisk v26.1"]},"337":{"title":"新的 sepolicy.rule 实现","titles":["2023.4.11 Magisk v26.1"]},"338":{"title":"Zygisk 更新","titles":["2023.4.11 Magisk v26.1"]},"339":{"title":"2023.8.27 Magisk v26.2","titles":[]},"340":{"title":"2023.9.4 Magisk v26.3","titles":[]},"341":{"title":"v26.3","titles":["2023.9.4 Magisk v26.3"]},"342":{"title":"v26.2","titles":["2023.9.4 Magisk v26.3"]},"343":{"title":"发布日志","titles":[]},"344":{"title":"其他日志","titles":["发布日志"]},"345":{"title":"参考链接","titles":["发布日志"]},"346":{"title":"Magisk 工具","titles":[]},"347":{"title":"magiskboot","titles":["Magisk 工具"]},"348":{"title":"magiskinit","titles":["Magisk 工具"]},"349":{"title":"magiskpolicy","titles":["Magisk 工具"]},"350":{"title":"magisk","titles":["Magisk 工具"]},"351":{"title":"su","titles":["Magisk 工具"]},"352":{"title":"resetprop","titles":["Magisk 工具"]},"353":{"title":"参考链接","titles":["Magisk 工具"]}},"dirtCount":0,"index":[["写入属性",{"2":{"352":2}}],["向持久存储读取",{"2":{"352":2}}],["向系统注入覆盖层的",{"2":{"330":1,"336":1}}],["属性",{"2":{"352":6}}],["详细信息",{"2":{"352":1}}],["详情请查阅",{"2":{"172":1}}],["兼容",{"2":{"351":1}}],["尽管上面没有列出",{"2":{"351":1}}],["伪装成一个登录",{"2":{"351":2}}],["入口点",{"2":{"351":1}}],["入门",{"0":{"227":1}}],["禁用拒绝列表强制",{"2":{"350":2}}],["返回强制的状态",{"2":{"350":2}}],["返回值为0或或运算以下值",{"2":{"347":2}}],["返回值",{"2":{"347":4}}],["拒绝列表配置",{"2":{"350":2}}],["拒绝并强制卸载任何不匹配的",{"2":{"87":1}}],["克隆",{"2":{"350":2}}],["克隆权限",{"2":{"350":2}}],["克隆源代码",{"2":{"83":1}}],["手动启动",{"2":{"350":2}}],["手动触发核心模式",{"0":{"174":1}}],["高级系统属性操作实用程序",{"2":{"352":1}}],["高级选项",{"2":{"350":2}}],["高级开发人员可以使用此工具修改",{"2":{"349":1}}],["移除所有",{"2":{"350":2}}],["移除所有模块并重新启动",{"2":{"350":2}}],["移动到",{"2":{"347":2}}],["列出所有可用的小程序",{"2":{"350":2}}],["默认为",{"2":{"349":2}}],["默认情况下",{"2":{"196":1,"347":4}}],["唯一支持的操作是",{"2":{"349":2}}],["唯一的不同在于请勿使用最新版本的",{"2":{"240":1}}],["唯一的例外是",{"2":{"78":1}}],["唯一的区别是",{"2":{"76":1}}],["运算符",{"2":{"349":2}}],["运行",{"2":{"83":2,"233":1}}],["运行版本",{"2":{"76":1}}],["多个条目由大括号",{"2":{"349":2}}],["立即将",{"2":{"349":2}}],["编译拆分的cil策略",{"2":{"349":2}}],["语句的格式为",{"2":{"349":2}}],["语句的帮助消息",{"2":{"349":2}}],["语言和框架",{"2":{"86":1}}],["显示此消息",{"2":{"352":2}}],["显示此帮助消息并退出",{"2":{"351":2}}],["显示版本号并退出",{"2":{"351":2}}],["显示版本名并退出",{"2":{"351":2}}],["显示",{"2":{"349":2}}],["及其所有分支",{"2":{"349":1}}],["及以下",{"0":{"240":1}}],["他们会直接修改",{"2":{"349":1}}],["策略声明",{"2":{"349":2}}],["策略源",{"2":{"349":1}}],["策略",{"2":{"349":3}}],["策略的设备上",{"2":{"193":1}}],["检测格式并将",{"2":{"347":2}}],["检查",{"2":{"200":1}}],["压缩为",{"2":{"347":2}}],["压缩包修补启动映像",{"2":{"90":1,"339":1,"342":1}}],["格式为",{"2":{"349":2}}],["格式",{"2":{"347":4}}],["输出所有属性",{"2":{"352":2}}],["输出文件",{"2":{"347":14}}],["输出bootimg",{"2":{"347":4}}],["输入文件",{"2":{"347":14}}],["清理当前工作目录",{"2":{"347":2}}],["校验和",{"2":{"347":2}}],["出",{"2":{"347":2}}],["拆分为",{"2":{"347":2}}],["节点",{"2":{"347":2}}],["备份恢复",{"2":{"347":2}}],["备份",{"2":{"347":2}}],["备份内置",{"2":{"169":1}}],["创建",{"2":{"347":2}}],["创建指向",{"2":{"347":2}}],["测试",{"2":{"347":4}}],["指定",{"2":{"347":4}}],["果当前目录中的组件文件已被压缩",{"2":{"347":2}}],["定",{"2":{"347":2}}],["原始bootimg",{"2":{"347":6}}],["原因在",{"2":{"235":1}}],["参数",{"2":{"347":4,"349":4,"350":4,"351":2}}],["参考链接",{"0":{"74":1,"81":1,"160":1,"178":1,"187":1,"198":1,"204":1,"221":1,"244":1,"249":1,"345":1,"353":1}}],["十六进制修补二进制文件",{"2":{"347":1}}],["前往",{"2":{"332":1,"338":1}}],["前的块验证",{"2":{"246":1}}],["许多设备都不支持",{"2":{"331":1,"337":1}}],["许可证的第3版",{"2":{"223":2}}],["许可",{"0":{"3":1,"223":1},"2":{"3":1}}],["配合使用",{"2":{"330":1,"336":1}}],["配置构建",{"2":{"84":1}}],["魔力挂载",{"2":{"330":1,"336":1}}],["新版",{"2":{"332":1,"338":1}}],["新的实现方式从根本上改变了文件系统镜像的创建方式",{"2":{"330":1,"336":1}}],["新的",{"0":{"330":1,"331":1,"336":1,"337":1}}],["新域",{"2":{"197":1}}],["好久不见",{"2":{"328":1}}],["好的旧传统",{"2":{"80":1}}],["嘿",{"2":{"328":1}}],["功能安装",{"2":{"248":1,"331":1,"337":1}}],["功能的开发者",{"2":{"206":1}}],["仍然保持不变",{"2":{"248":1}}],["升级后",{"2":{"248":1}}],["升级指南",{"0":{"245":1},"1":{"246":1,"247":1,"248":1,"249":1}}],["非",{"0":{"248":1}}],["非a",{"2":{"76":1}}],["绕过任何可能的",{"2":{"247":1}}],["强制您的设备切换到更新的插槽",{"2":{"247":1}}],["强烈建议直接通过",{"2":{"226":1}}],["优化您的设备",{"2":{"247":1}}],["步骤2",{"2":{"247":1}}],["步骤1",{"2":{"247":1,"248":1}}],["带",{"0":{"247":1}}],["带有",{"2":{"78":1,"230":1}}],["必要条件",{"0":{"246":1}}],["必须解锁设备的引导加载程序",{"2":{"227":1}}],["必须是整数",{"2":{"208":1}}],["必须匹配此正则表达式",{"2":{"208":1}}],["必须遵守的格式",{"2":{"208":1}}],["必须使用完整路径调用可执行文件",{"2":{"206":1}}],["必须能够挂载为读写",{"2":{"166":1}}],["盘等",{"2":{"243":1}}],["卡",{"2":{"243":1}}],["卡片下的",{"2":{"169":1}}],["刷回",{"2":{"248":1}}],["刷入",{"2":{"243":1}}],["刷机工具",{"0":{"232":1}}],["刷机包中提取所需文件",{"2":{"227":1}}],["刷机指南",{"2":{"225":1}}],["才能使用第三方",{"2":{"243":1}}],["荣耀",{"2":{"242":1}}],["遵循入门的教程",{"2":{"240":1}}],["遵守更新的要求",{"2":{"78":1}}],["获取",{"2":{"352":2}}],["获取模块的基本目录路径",{"2":{"209":1}}],["获得官方映像",{"0":{"239":1}}],["搭配",{"2":{"238":1}}],["说明会略有不同",{"2":{"238":1}}],["更改并停止守护程序",{"2":{"350":2}}],["更多详细信息可以在",{"2":{"348":1}}],["更重要的是他们不遵循标准的",{"2":{"238":1}}],["更新的",{"2":{"208":1}}],["更新",{"0":{"332":1,"338":1},"2":{"196":1}}],["更新工具链",{"2":{"89":1,"341":1}}],["更新到",{"2":{"89":1,"341":1}}],["更新内部脚本",{"2":{"7":1}}],["更新日志",{"0":{"5":1,"88":1},"1":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1},"2":{"222":1,"343":1,"344":1}}],["华为的内核似乎无法在早期启动时捕获按键事件",{"2":{"242":1}}],["华为设备进入",{"2":{"240":1}}],["华为不发布官方出厂映像以及",{"2":{"239":1}}],["华为",{"0":{"238":1},"1":{"239":1,"240":1,"241":1,"242":1}}],["切勿出于上述原因直接使用原厂",{"2":{"237":1}}],["切换到系统",{"2":{"193":1}}],["切换到",{"0":{"163":1},"1":{"164":1,"165":1,"166":1}}],["切换到新的magisk模块仓库设置",{"2":{"10":1}}],["恢复到官方映像和其他映像后",{"2":{"248":1}}],["恢复官方映像后",{"2":{"247":1}}],["恢复映像",{"2":{"246":1}}],["恢复",{"2":{"237":1,"350":2}}],["永远不要尝试将",{"2":{"237":1}}],["永远",{"2":{"237":1}}],["让应用程序完成它的工作并自动重启设备",{"2":{"235":1}}],["让我们继续修补映像",{"2":{"227":1}}],["让我们回到",{"2":{"79":1}}],["连同原始固件中的",{"2":{"235":1}}],["归档文件",{"2":{"235":1,"236":2,"237":1,"239":1}}],["归档文件复制到设备",{"2":{"235":1}}],["勾选",{"2":{"235":1}}],["尚未锁定您的设备",{"2":{"234":1}}],["确认",{"2":{"234":1}}],["确保使用",{"2":{"208":1}}],["跳过所有步骤",{"2":{"234":1}}],["长按音量上键解锁启动加载器",{"2":{"234":1}}],["长按音量增大",{"2":{"230":1}}],["关闭设备电源并按下设备的下载模式组合键",{"2":{"234":1}}],["关于",{"2":{"80":1}}],["小时正常运行时间后会触发解锁",{"2":{"233":1}}],["小程序",{"2":{"206":1,"350":2}}],["达到",{"2":{"233":1}}],["美国",{"2":{"233":1}}],["锁的值",{"2":{"233":1}}],["锁的值可能如下",{"2":{"233":1}}],["锁和",{"2":{"233":1}}],["状态",{"2":{"233":1}}],["状态标志",{"2":{"207":2}}],["需要原始",{"2":{"347":1}}],["需要在启动后通过",{"2":{"331":1,"337":1}}],["需要执行此步骤",{"2":{"246":1}}],["需要",{"2":{"232":1}}],["需要完整的数据擦除",{"2":{"231":1}}],["首先转到",{"2":{"246":1}}],["首先必须检查",{"2":{"233":1}}],["首次安装",{"2":{"231":1}}],["首选项",{"2":{"86":1}}],["保护整个环境",{"2":{"351":2}}],["保护用户免受恶意和未经验证的",{"2":{"87":1}}],["保修位",{"2":{"231":1}}],["三星设备",{"0":{"231":1},"1":{"232":1,"233":1,"234":1,"235":1,"236":1,"237":1}}],["释放所有按钮",{"2":{"230":1}}],["释放所有按键即可启动",{"2":{"230":1}}],["→",{"2":{"230":7,"234":1,"243":1,"246":2,"247":4}}],["正如在",{"2":{"242":1}}],["正常开机",{"2":{"230":1}}],["正确支持设置持久属性绕过",{"2":{"90":1,"339":1,"342":1}}],["总之",{"2":{"230":1}}],["总是引导到",{"2":{"79":1}}],["屏幕",{"2":{"230":1}}],["直到看到",{"2":{"230":1}}],["直接对文件进行修改",{"2":{"347":2}}],["直接安装到系统分区",{"2":{"169":1,"170":1}}],["直接安装到",{"0":{"166":1}}],["直接安装",{"0":{"164":1},"2":{"164":1,"169":1,"226":1}}],["直接处理",{"2":{"90":1,"339":1,"342":1}}],["搜索",{"2":{"230":2,"347":2}}],["百度搜索",{"2":{"230":1}}],["音量增大",{"2":{"230":2,"240":1}}],["电源",{"2":{"230":2,"240":1}}],["别无选择",{"2":{"230":1}}],["卸载机制和新的",{"2":{"332":1,"338":1}}],["卸载",{"0":{"229":1},"2":{"229":1,"246":1}}],["瞧",{"2":{"228":1,"235":1}}],["按正常方式应用",{"2":{"247":1}}],["按照上面的引导映像修补说明进行操作",{"2":{"242":1}}],["按照上面的修补映像说明进行操作",{"2":{"241":1}}],["按键组合",{"2":{"230":2}}],["按钮",{"2":{"228":1,"235":1,"247":1}}],["按下",{"2":{"228":1,"235":1,"247":1}}],["主屏幕中的",{"2":{"228":1,"235":1}}],["主要内容",{"2":{"207":2}}],["基于",{"2":{"227":1}}],["基于文件的加密",{"2":{"191":1}}],["快速回顾一下",{"2":{"227":1}}],["比如在",{"2":{"243":1}}],["比如华为设备",{"2":{"227":2}}],["比较流行的模块是",{"2":{"201":1}}],["接下来",{"2":{"227":1}}],["所以如果您在",{"2":{"240":1}}],["所以大多数人可以忽略这条信息",{"2":{"227":1}}],["所有卸载操作",{"2":{"350":1}}],["所有卸载操作用法",{"2":{"350":1}}],["所有值应以十六进制书写",{"2":{"349":2}}],["所有安装了",{"2":{"349":1}}],["所有部分将被压缩回原始格式",{"2":{"347":1}}],["所有启动脚本都将在",{"2":{"219":1}}],["所有模块将被禁用",{"2":{"200":1}}],["所有允许的",{"2":{"197":1}}],["所有与",{"2":{"191":2}}],["所有东西都必须存储在",{"2":{"191":1}}],["所有预初始化补丁文件都存储在这里绑定挂载",{"2":{"190":2}}],["所有者和",{"2":{"350":2}}],["所有者为",{"2":{"191":1}}],["所有者",{"2":{"91":1,"334":1}}],["所有使用引导方法",{"2":{"80":1}}],["所有",{"2":{"76":1}}],["据我们所知",{"2":{"227":1}}],["幸运的是",{"2":{"227":1}}],["没有什么办法检测到这一点",{"2":{"227":1}}],["信息",{"2":{"227":1}}],["资源分享",{"2":{"225":1}}],["系列",{"2":{"225":1}}],["系统",{"2":{"247":1}}],["系统属性",{"2":{"196":1}}],["系统更新了",{"2":{"236":1}}],["系统更新",{"0":{"236":1},"2":{"79":1,"247":1}}],["系统作为根",{"2":{"76":1}}],["友情链接",{"0":{"225":1}}],["甚至没有适销性或特定用途适用性",{"2":{"223":2}}],["分发此程序是希望它有用",{"2":{"223":2}}],["分区的情况下开始安装",{"2":{"248":1}}],["分区的设备",{"0":{"247":1}}],["分区且无外置存储设备",{"2":{"243":1}}],["分区上锁",{"2":{"243":1}}],["分区不再存在",{"2":{"242":1}}],["分区方案",{"2":{"238":1}}],["分区恢复到原样",{"2":{"237":1}}],["分区shellfastboot",{"2":{"228":1}}],["分区映像",{"2":{"190":2}}],["分区而不是",{"2":{"91":1,"334":1}}],["分区中是否有",{"2":{"227":1}}],["分区中",{"2":{"80":1,"243":1}}],["分区包含",{"2":{"80":1,"227":1}}],["分区和",{"2":{"79":1}}],["分区并将其用作新的",{"2":{"77":1}}],["分区作为",{"2":{"77":1}}],["分区将把我们带到",{"2":{"76":1}}],["分区",{"2":{"76":2,"79":1,"80":1,"227":5,"228":2,"230":1,"238":1,"242":1,"243":1}}],["任何更高版本重新分发和",{"2":{"223":2}}],["任何运行",{"2":{"78":1}}],["子模块都是自由软件",{"2":{"223":2}}],["工具兼容",{"2":{"349":1}}],["工具",{"0":{"346":1},"1":{"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1},"2":{"222":1,"353":1}}],["工具链与名称",{"2":{"86":2}}],["工具链并将其设置为默认值",{"2":{"86":1}}],["工具链管理器",{"2":{"86":1}}],["工具链",{"2":{"86":1}}],["针对",{"2":{"222":1}}],["替换",{"2":{"220":2,"347":2}}],["会在每次启动时随机生成一个不同的",{"2":{"220":1}}],["会在每次启动时将此文件夹中的所有脚本注入到",{"2":{"184":1}}],["会在每次启动时将它们注入到",{"2":{"184":1}}],["条规则不适用于此文件夹中的任何内容",{"2":{"220":1}}],["现已上线",{"2":{"332":1,"338":1}}],["现已进行了重大改写",{"2":{"330":1,"336":1}}],["现有实现无法很好地与使用",{"2":{"330":1,"336":1}}],["现有文件可以替换为位于相同相对路径的文件",{"2":{"220":1}}],["现在在下载模式下可接受的非官方映像",{"2":{"234":1}}],["现在不要重启",{"2":{"169":1}}],["现在我们可以将所有",{"2":{"80":1}}],["除外",{"2":{"220":1}}],["除非另有特别说明",{"2":{"78":1}}],["覆盖文件应放在",{"2":{"220":1}}],["放置在模块自己的文件夹中",{"2":{"219":1}}],["放置在",{"2":{"219":1}}],["种脚本",{"2":{"219":1}}],["种主要的不同方法",{"2":{"77":1}}],["秒前暂停",{"2":{"219":1}}],["末尾调用",{"2":{"218":1}}],["注意事项",{"0":{"237":1}}],["注意",{"0":{"218":1},"2":{"230":1,"240":1,"245":1,"351":1}}],["注入的所有文件都应放在此文件夹中",{"2":{"210":1}}],["注入到",{"2":{"184":1}}],["注入",{"0":{"183":1},"1":{"184":1,"185":1}}],["打印当前拒绝列表",{"2":{"350":2}}],["打印当前二进制版本",{"2":{"350":2}}],["打印正在运行的守护程序版本号",{"2":{"350":2}}],["打印正在运行的守护程序版本",{"2":{"350":2}}],["打印错误消息",{"2":{"217":2}}],["打印",{"2":{"217":2,"347":2,"350":2}}],["打开",{"2":{"85":1,"86":1,"165":1,"170":1}}],["函数钩子实现",{"2":{"332":1,"338":1}}],["函数钩子",{"2":{"332":1,"338":1}}],["函数",{"0":{"217":1}}],["找到所有",{"2":{"216":1}}],["安卓版本",{"2":{"216":1}}],["安装模块",{"2":{"350":2}}],["安装机制来升级您的系统",{"2":{"248":1}}],["安装完成后",{"2":{"247":1}}],["安装更新",{"2":{"247":1}}],["安装后可以保存",{"2":{"247":1}}],["安装工作无缝",{"2":{"247":1}}],["安装指南",{"2":{"244":1}}],["安装包",{"2":{"243":1}}],["安装您已经下载的",{"2":{"235":1}}],["安装说明",{"2":{"222":1}}],["安装的模块将存储在此处并将在下次重新启动时",{"2":{"191":2}}],["安装配置",{"2":{"190":2}}],["安装并打开",{"2":{"164":1,"169":1}}],["安装官方",{"2":{"86":1}}],["安装",{"0":{"226":1},"1":{"227":1,"228":1,"229":1,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"242":1,"243":1,"244":1},"2":{"83":3,"164":1,"169":1,"170":1,"228":1,"231":1,"235":1,"243":1,"247":1}}],["安装到更新的插槽",{"2":{"247":1}}],["安装到更新的分区上",{"2":{"247":1}}],["安装到非活动插槽",{"2":{"247":2}}],["安装到系统分区中",{"2":{"171":1}}],["安装到系统分区",{"2":{"168":1}}],["安装到",{"0":{"167":1,"169":1,"170":1,"171":1},"1":{"168":1,"169":1,"170":1,"171":1,"172":1},"2":{"80":1,"166":1}}],["值为",{"2":{"216":1}}],["架构",{"2":{"216":1}}],["变量进行配置",{"2":{"347":4}}],["变量",{"0":{"216":1},"2":{"347":2}}],["稍后将详细介绍",{"2":{"214":2}}],["稍后提供更多信息",{"2":{"76":1}}],["每个命令都是一个参数",{"2":{"347":2}}],["每个命令都将直接使用",{"2":{"206":1}}],["每个组件将使用",{"2":{"347":2}}],["每个组件将保持不变",{"2":{"347":2}}],["每个组件将在写入输出文件之前即时自动解压缩",{"2":{"347":2}}],["每个组件到一个文件",{"2":{"347":2}}],["每个设备都有自己的启动到",{"2":{"230":1}}],["每次启用",{"2":{"230":1}}],["每行由",{"2":{"212":1}}],["真实",{"2":{"210":1}}],["真正的区别在于设备在完全启动时使用的是什么",{"2":{"78":1}}],["部分找到",{"2":{"348":1}}],["部分设备依旧需要修补",{"2":{"242":1}}],["部分",{"2":{"209":1,"227":1}}],["部署了新的",{"2":{"197":1}}],["换行类型",{"2":{"208":1}}],["该选项被默默地忽略",{"2":{"351":1}}],["该文件可用于",{"2":{"347":2}}],["该文件夹位于设备加密存储区中",{"2":{"191":1}}],["该工具还支持许多",{"2":{"347":1}}],["该检测机制无法在第三方",{"2":{"331":1,"337":1}}],["该功能的兼容性一直很不稳定",{"2":{"331":1,"337":1}}],["该脚本将由",{"2":{"215":1}}],["该",{"2":{"208":1}}],["且开头必须为字母",{"2":{"208":1}}],["点",{"2":{"208":1}}],["点击它并等待重启",{"2":{"228":1}}],["点击",{"2":{"164":1,"165":1,"169":1,"170":1}}],["数据库",{"2":{"350":2}}],["数据库存储设置和",{"2":{"191":2}}],["数字",{"2":{"208":1}}],["译者注",{"2":{"208":1,"235":1,"242":1}}],["^attribute",{"2":{"349":2}}],["^type",{"2":{"349":6}}],["^",{"2":{"208":1,"349":6}}],["^early",{"2":{"180":2}}],["整数",{"2":{"208":2}}],["字符串",{"2":{"208":10}}],["库不兼容",{"2":{"207":2}}],["库",{"2":{"207":2}}],["└──",{"2":{"207":8,"214":8,"220":8}}],["│ramdisk",{"2":{"220":1}}],["│模块module",{"2":{"214":1}}],["│",{"2":{"207":142,"214":17,"220":25}}],["命名",{"2":{"207":2}}],["命令到",{"2":{"350":2}}],["命令",{"2":{"197":1,"241":1,"242":1,"347":4,"351":3}}],["├──",{"2":{"207":56,"214":10,"220":16}}],["结构如下",{"2":{"207":1}}],["示例",{"2":{"206":1,"208":1,"349":2}}],["独立模式",{"2":{"206":1,"215":1,"219":1}}],["像其他普通的刷机包一样刷",{"2":{"243":1}}],["像",{"2":{"206":1}}],["二进制",{"2":{"206":1}}],["二进制文件时",{"2":{"350":1}}],["二进制文件和小程序如下所示",{"2":{"346":1}}],["二进制文件标记为",{"2":{"197":1}}],["二进制文件",{"2":{"168":1,"190":2,"191":2,"197":1,"349":1}}],["附带了一个完整的",{"2":{"206":1}}],["附加",{"2":{"86":1}}],["希望您可以向我们提交反馈",{"2":{"203":1}}],["占位",{"2":{"202":1}}],["警告",{"2":{"201":1,"219":1,"242":1}}],["哔哩哔哩",{"2":{"201":1}}],["酷安",{"2":{"201":1}}],["😉",{"2":{"201":1,"310":1,"315":1}}],["😃",{"2":{"67":1,"125":1,"154":1,"253":1,"258":1,"259":1,"264":1,"267":1,"282":1}}],["隐藏",{"2":{"201":1}}],["那么您的设备有一个单独的",{"2":{"227":2}}],["那么请联网搜索您的设备相对应的方法",{"2":{"227":1}}],["那么请联网搜索您的设备相对应的方法adb",{"2":{"227":1}}],["那么请尝试把命令更换为",{"2":{"227":2}}],["那么请查看",{"2":{"200":1}}],["那么请在电脑上直接运行以下命令",{"2":{"200":1}}],["那就卸载",{"2":{"176":1}}],["管理模块",{"2":{"200":1}}],["大多数现代",{"2":{"200":1}}],["大量的稳定性更改和小错误修复",{"2":{"9":1}}],["求助",{"0":{"200":1}}],["完整更新日志",{"2":{"254":1,"259":1,"266":1,"267":1,"274":1,"279":1,"281":1,"284":1,"287":1,"293":1,"294":1,"296":1,"299":1,"304":1,"306":1,"308":1,"313":1,"318":1,"319":1,"320":1,"323":1,"326":1,"327":1,"332":1,"338":1,"339":1,"342":1}}],["完整的规则可以在",{"2":{"197":1}}],["完成刷机",{"2":{"235":1}}],["完成初始设置",{"2":{"234":1}}],["完成后",{"2":{"170":1}}],["完全解锁",{"2":{"233":1}}],["完全锁定",{"2":{"233":1}}],["特定规则与其他策略分开",{"2":{"197":1}}],["域进程将文件归因于",{"2":{"197":1}}],["客户端域将通过使用",{"2":{"197":1}}],["客户端域都可以直接连接到",{"2":{"197":1}}],["沙盒中规则的放宽",{"2":{"197":1}}],["能够正常运行",{"2":{"197":1}}],["还有",{"2":{"219":1}}],["还必须放宽一些",{"2":{"197":1}}],["还可能导致问题",{"2":{"186":1}}],["之间的区别",{"2":{"209":1}}],["之外使用",{"2":{"206":1}}],["之后安装它",{"2":{"227":1}}],["之后",{"2":{"197":1,"220":1}}],["之前的设备上",{"2":{"220":1}}],["之前",{"2":{"197":1}}],["之类的命令向",{"2":{"196":1}}],["政策",{"0":{"197":1}}],["读取属性将从",{"2":{"196":1}}],["读取属性不会从持久存储中读取",{"2":{"196":1}}],["读取和写入文件夹",{"2":{"191":1}}],["持久属性",{"2":{"196":1}}],["匹配",{"2":{"196":1}}],["发送请求来更改属性",{"2":{"196":1}}],["发布说明相同",{"2":{"334":1}}],["发布日志",{"0":{"343":1},"1":{"344":1,"345":1},"2":{"222":1}}],["发布",{"2":{"76":1}}],["托管",{"2":{"196":1}}],["由",{"2":{"196":1}}],["由于复杂的原因",{"2":{"331":1,"337":1}}],["由于历史原因",{"2":{"218":1}}],["由于我们绕过了",{"2":{"196":1}}],["由于在",{"2":{"181":1}}],["由于某些原因",{"2":{"166":1}}],["由于",{"2":{"86":2,"169":1,"190":2,"202":1,"220":1,"331":1,"337":1}}],["由于其",{"2":{"80":1}}],["由于存储大小问题",{"2":{"79":1}}],["被设计为仅由",{"2":{"196":1}}],["被解密和装载时会在",{"2":{"194":1}}],["重新打包",{"2":{"347":1}}],["重新启动",{"2":{"247":1}}],["重新启动并检查是否已安装",{"2":{"243":1}}],["重新启动到下载模式",{"2":{"235":1}}],["重启至下载模式",{"2":{"234":1}}],["重启并启动",{"2":{"228":1}}],["重置属性",{"0":{"196":1}}],["重命名为",{"2":{"165":1,"166":1,"229":1}}],["执行与",{"2":{"347":2}}],["执行服务",{"2":{"195":1}}],["执行",{"2":{"194":1,"347":2,"350":2}}],["执行原始的",{"2":{"193":1}}],["取消阻止",{"2":{"193":1}}],["尝试加载",{"2":{"193":1}}],["劫持",{"2":{"193":2,"230":1}}],["加拿大设备",{"2":{"233":1}}],["加载属性",{"2":{"352":2}}],["加载或编译拆分的",{"2":{"349":2}}],["加载到内核中",{"2":{"193":1,"349":2}}],["加载",{"2":{"193":1,"349":4}}],["加上其他一些东西",{"2":{"76":1}}],["服务的入口点",{"2":{"350":1}}],["服务器管理员这样的常见场景中",{"2":{"349":1}}],["服务中执行",{"2":{"207":2}}],["服务",{"2":{"195":1}}],["服务注入",{"2":{"193":1}}],["服务脚本的文件夹",{"2":{"191":2}}],["预初始化",{"0":{"193":1},"2":{"348":1}}],["预启动",{"2":{"180":1}}],["用法",{"2":{"349":1,"350":2,"352":1}}],["用",{"2":{"347":2}}],["用户",{"2":{"248":1}}],["用于支持模块安装",{"2":{"191":2}}],["用一个空文件夹替换就足够了",{"2":{"186":1}}],["用一个假文件替换它就足够了",{"2":{"186":1}}],["权限中添加",{"2":{"347":2}}],["权限下创建目录",{"2":{"347":2}}],["权限",{"2":{"191":2,"236":1}}],["合并到",{"2":{"191":2}}],["合并到boot中",{"2":{"79":1}}],["通用公共许可证",{"2":{"223":2}}],["通用公共许可证的条款",{"2":{"223":2}}],["通用脚本",{"2":{"219":1}}],["通用脚本和模块脚本",{"2":{"219":1}}],["通常安装在设备的",{"2":{"238":1}}],["通常",{"2":{"196":1}}],["通过首先删除属性",{"2":{"196":1}}],["通过",{"2":{"191":2,"200":1}}],["通俗地说",{"2":{"78":1}}],["很少有进程有权与该",{"2":{"191":1}}],["标志",{"2":{"352":4}}],["标志设置为",{"2":{"350":2}}],["标有",{"2":{"349":4}}],["标记为",{"2":{"191":1}}],["标准的原因",{"2":{"78":1}}],["标准中的设备",{"2":{"77":1}}],["选择并修补一个文件",{"2":{"228":1,"235":1}}],["选",{"2":{"191":1}}],["选项1是首选方法",{"2":{"206":1}}],["选项卡",{"2":{"165":1}}],["选项",{"2":{"90":1,"169":2,"228":2,"235":1,"339":1,"342":1,"349":4,"350":4,"351":5,"352":4}}],["未",{"2":{"248":1}}],["未执行",{"2":{"215":1}}],["未使用原始文件夹",{"2":{"190":2}}],["未找到",{"2":{"86":1}}],["挂载路径",{"2":{"350":2}}],["挂载早期所需的分区",{"2":{"193":1}}],["挂载标志",{"2":{"190":2}}],["挂载为",{"2":{"79":1}}],["`magisk",{"2":{"190":2}}],["其余的",{"2":{"220":2}}],["其中包含正确的应用名称和图标",{"2":{"202":1}}],["其中没有任何内容",{"2":{"202":1}}],["其用作基本文件夹",{"2":{"190":1}}],["其他日志",{"0":{"344":1}}],["其他模块",{"2":{"207":2}}],["其他自定义",{"2":{"207":2}}],["其他不在",{"2":{"181":1}}],["其他镜像平台提交的内容可能会因强制推送丢失",{"2":{"2":1}}],["目标",{"2":{"186":1}}],["目录中",{"2":{"220":2}}],["目录来存储一些临时数据",{"2":{"190":1}}],["目录来存储自定义脚本",{"2":{"184":1}}],["目录的副本",{"2":{"184":1}}],["目录下的相应位置",{"2":{"181":1}}],["目录",{"0":{"190":1},"2":{"180":1,"184":4,"220":3}}],["目录挂载文件的方法",{"2":{"180":1}}],["引用",{"2":{"184":2,"220":2}}],["引导",{"2":{"80":1}}],["引导方式",{"2":{"80":1}}],["引导方法",{"0":{"77":1},"1":{"78":1}}],["引导到",{"2":{"79":1}}],["引导诡计",{"0":{"75":1},"1":{"76":1,"77":1,"78":1,"79":1,"80":1,"81":1},"2":{"222":1}}],["名为",{"2":{"184":1}}],["脚本设置",{"2":{"220":1}}],["脚本与引导过程的其余部分并行运行",{"2":{"219":1}}],["脚本在装入任何模块之前运行",{"2":{"219":1}}],["脚本在",{"2":{"215":1}}],["脚本提供",{"2":{"215":1}}],["脚本都将在启用独立模式",{"2":{"206":1}}],["脚本中永远不要硬编码",{"2":{"220":1}}],["脚本中的",{"2":{"220":1}}],["脚本中引用的其他文件",{"2":{"220":1}}],["脚本中注册的on",{"2":{"196":1}}],["脚本中出现的",{"2":{"184":1}}],["脚本",{"0":{"209":1},"2":{"191":2,"194":1,"195":1,"220":1}}],["脚本的文件夹",{"2":{"191":2}}],["脚本的位置是",{"2":{"184":1}}],["脚本注入设备",{"2":{"184":1}}],["即使将分区重新挂载到",{"2":{"245":1}}],["即使它不应该接受",{"2":{"227":1}}],["即可",{"2":{"227":1}}],["即可访问该文件夹",{"2":{"191":1}}],["即可以替换文件",{"2":{"182":1}}],["即在执行",{"2":{"180":1}}],["早期启动挂载只支持简单挂载",{"2":{"182":1}}],["早期挂载分区与预启动分区相同",{"2":{"181":1}}],["早期挂载",{"0":{"180":1},"1":{"181":1,"182":1}}],["自动生成",{"2":{"207":2}}],["自定义",{"0":{"215":1},"1":{"216":1,"217":1},"2":{"184":1}}],["自",{"2":{"182":1,"185":1}}],["复制到设备",{"2":{"228":1}}],["复制到",{"2":{"181":1}}],["填满它们可能会导致设备无法启动",{"2":{"181":1}}],["$arch",{"2":{"216":1}}],["$android",{"2":{"86":3}}],["$modpath",{"2":{"217":2}}],["$modid",{"2":{"207":8}}],["$magisktmp",{"2":{"181":2}}],["$secure",{"2":{"191":10}}],["$internaldir",{"2":{"190":8}}],["$prenitdir",{"2":{"184":1}}],["$",{"2":{"180":2,"184":10,"220":14}}],["阶段使用",{"2":{"180":1}}],["进程",{"2":{"197":1}}],["进程是只读的",{"2":{"196":1}}],["进程无法以任何可能的方式进入",{"2":{"191":1}}],["进程之前",{"2":{"180":1}}],["进行安装",{"2":{"243":1}}],["进行",{"2":{"236":1}}],["进行其他设置",{"2":{"215":1}}],["进行任何交互",{"2":{"191":1}}],["进行早期挂载时要小心",{"2":{"181":1}}],["进行密钥签名的证书作为参考",{"2":{"87":1}}],["允许多重",{"2":{"349":2}}],["允许模块通过包含",{"2":{"331":1,"337":1}}],["允许在解锁",{"2":{"234":1}}],["允许任何其他的文件",{"2":{"207":2}}],["允许你在不改变原始启动映像的情况下修改设备",{"2":{"179":1}}],["允许您在线下载",{"2":{"175":1}}],["解压到",{"2":{"347":2}}],["解压缩到",{"2":{"347":2}}],["解压缩到其各个组件",{"2":{"347":2}}],["解压缩文件的工具",{"2":{"347":1}}],["解压缩",{"2":{"347":1}}],["解压缩固件并将",{"2":{"235":1}}],["解析",{"2":{"347":1}}],["解密后",{"0":{"194":1}}],["解决方案",{"2":{"179":1}}],["解锁选项是否存在",{"2":{"234":1}}],["解锁已启用",{"2":{"233":1}}],["解锁",{"0":{"234":1},"2":{"170":2,"234":1}}],["本教程假设您了解如何使用",{"2":{"227":1}}],["本身",{"2":{"222":1}}],["本身上进行任何开发",{"2":{"87":1}}],["本文档涵盖了4个二进制文件和所有包含的小程序",{"2":{"346":1}}],["本文档翻译了",{"2":{"222":1}}],["本文档介绍了适用于安卓设备的无系统",{"2":{"179":1}}],["意味着",{"2":{"177":1}}],["ツ",{"2":{"176":1}}],["¯",{"2":{"176":2}}],["吗",{"0":{"176":1}}],["我安装了一个模块",{"0":{"200":1}}],["我应该安装",{"0":{"176":1}}],["我们直接修补二进制文件",{"2":{"349":1}}],["我们设计了全新的启动前分区检测机制",{"2":{"331":1,"337":1}}],["我们不放心支持安卓棒棒糖",{"2":{"329":1,"335":1}}],["我们依赖使用官方安卓模拟器对旧平台进行回归测试",{"2":{"329":1,"335":1}}],["我们需要知道您的设备是否有单独的",{"2":{"227":1}}],["我们修补原始的",{"2":{"193":1}}],["我们将",{"2":{"193":1}}],["我们将使用",{"2":{"76":1}}],["我们提供了一个一般的经验法则",{"2":{"77":1}}],["我们称这些为a",{"2":{"76":1}}],["游戏仍能检测到模拟器",{"0":{"173":1}}],["了解",{"2":{"209":1}}],["了解更多信息",{"2":{"172":1}}],["了解有关生成自己的密钥的更多详细信息",{"2":{"87":1}}],["单击",{"2":{"170":1}}],["操作指南",{"0":{"235":1}}],["操作能够以安全可靠的方式完成",{"2":{"197":1}}],["操作",{"2":{"170":1,"196":1,"197":1,"347":5,"350":4}}],["补丁的复杂性",{"2":{"331":1,"337":1}}],["补丁",{"2":{"170":1,"213":1,"331":1,"337":1,"347":2}}],["补丁启动映像的",{"2":{"348":1}}],["补丁启动映像",{"2":{"166":1}}],["否则返回",{"2":{"347":2}}],["否则将卸载",{"2":{"246":1}}],["否则将替换现有文件",{"2":{"220":1}}],["否则您将进入的是",{"2":{"240":1}}],["否则",{"2":{"227":1}}],["否则我们使用",{"2":{"193":1}}],["否则无法安装",{"2":{"170":1}}],["否则本文件后面提到的每一个",{"2":{"78":1}}],["享受",{"2":{"169":1,"170":1}}],["后缀为匹配文件扩展名的另一个文件",{"2":{"347":2}}],["后验证",{"2":{"247":1}}],["后像其他普通的刷机包一样刷入",{"2":{"229":1}}],["后期启动",{"0":{"195":1}}],["后某些模块会损坏",{"0":{"177":1}}],["后",{"0":{"173":1,"202":1},"2":{"185":1,"215":1,"230":1,"233":1}}],["后删除所有su",{"2":{"169":1}}],["后恢复内置",{"2":{"169":1}}],["~~",{"2":{"169":2}}],["授予",{"2":{"169":1}}],["等待安装完成",{"2":{"247":1}}],["等待",{"2":{"193":1}}],["等待升级的",{"2":{"191":2}}],["等",{"2":{"191":2}}],["等模拟器会在设置中禁用",{"2":{"169":1}}],["等模拟器的步骤",{"0":{"169":1}}],["等用户调试",{"2":{"166":1}}],["已测试的",{"2":{"168":1}}],["已测试的模拟器列表",{"2":{"168":1}}],["已采用最新的",{"2":{"168":1}}],["磁盘空间非常小",{"2":{"168":1}}],["映像修改更简单",{"2":{"347":1}}],["映像后请将手机与电脑断开连接后再按下",{"2":{"240":1}}],["映像中没有",{"2":{"230":1}}],["映像中的",{"2":{"80":1,"228":1}}],["映像刷入到您的设备",{"2":{"228":1}}],["映像",{"2":{"168":1,"220":1,"228":3,"241":1,"242":1,"347":2}}],["虽然模拟器有",{"2":{"168":1}}],["开箱即用的",{"2":{"247":1}}],["开头的属性",{"2":{"196":2}}],["开始安装",{"2":{"228":1,"235":1}}],["开始",{"2":{"190":1,"220":1}}],["开始之前",{"0":{"168":1}}],["开发者选项",{"2":{"234":1}}],["开发者指南",{"0":{"205":1},"1":{"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1},"2":{"221":1,"222":1}}],["开发者预览版中",{"2":{"77":1}}],["开发了",{"2":{"175":1}}],["开发",{"0":{"1":1},"2":{"222":1}}],["模型",{"2":{"197":1}}],["模式中刷入",{"2":{"240":1}}],["模式则不能将手机连接到电脑",{"2":{"240":1}}],["模式需要将手机使用数据线连接电脑",{"2":{"240":1}}],["模式的按键组合",{"2":{"230":1}}],["模式运行",{"2":{"219":4}}],["模式",{"2":{"195":1,"219":3,"228":2,"230":3}}],["模式来访问",{"2":{"184":1}}],["模式将被替换为",{"2":{"184":1}}],["模拟器中",{"0":{"167":1},"1":{"168":1,"169":1,"170":1,"171":1,"172":1}}],["模块脚本",{"2":{"219":1}}],["模块不应在安装过程中添加常规脚本",{"2":{"219":1}}],["模块文件应安装的路径",{"2":{"216":1}}],["模块文件在挂载时无法安全修改",{"2":{"191":2}}],["模块来说应该足够好了",{"2":{"214":1}}],["模块来隐藏",{"0":{"176":1}}],["模块安装程序脚本必须在退出之前执行一些清理",{"2":{"218":1}}],["模块安装程序脚本会将",{"2":{"217":1}}],["模块安装程序脚本将会设置环境",{"2":{"214":1}}],["模块安装程序只是一个打包为",{"2":{"214":1}}],["模块安装程序是打包在",{"2":{"214":1}}],["模块安装程序",{"0":{"214":1},"1":{"215":1,"216":1,"217":1,"218":1}}],["模块示例",{"2":{"211":1,"332":1,"338":1}}],["模块的",{"2":{"243":1}}],["模块的压缩文件",{"2":{"216":1}}],["模块的其余文件",{"2":{"214":2}}],["模块的更多详细信息",{"2":{"211":1}}],["模块的在线",{"0":{"175":1}}],["模块发布后",{"2":{"208":1}}],["模块将在下次重新启动时删除",{"2":{"207":2}}],["模块将被禁用",{"2":{"207":2}}],["模块是放置在",{"2":{"207":1}}],["模块是修改系统分区的简便方法",{"2":{"186":1}}],["模块专门提供这些功能",{"2":{"201":1}}],["模块禁用状态持续",{"2":{"200":1}}],["模块删除文件",{"2":{"186":1}}],["模块可以替换或添加任何文件或文件夹到系统中",{"2":{"186":1}}],["模块注入",{"0":{"185":1}}],["模块挂载",{"0":{"182":1}}],["模块管理器",{"2":{"175":1}}],["模块",{"0":{"207":1},"1":{"208":1,"209":1,"210":1,"211":1,"212":1,"213":1},"2":{"165":1,"175":1,"191":4,"207":2,"210":1,"214":2}}],["则它",{"2":{"349":2}}],["则输出原始引导sha1",{"2":{"347":2}}],["则返回",{"2":{"347":2}}],["则将使用",{"2":{"347":2}}],["则将设置启动映像的",{"2":{"347":2}}],["则将跳过所有压缩操作",{"2":{"347":2}}],["则将跳过所有解压缩操作",{"2":{"347":2}}],["则不会对该特定组件执行任何附加压缩",{"2":{"347":2}}],["则不会触发在",{"2":{"196":1}}],["则启动映像标头信息将转储到文件",{"2":{"347":2}}],["则会立即解压缩",{"2":{"347":1}}],["则必须从固件中提取",{"2":{"242":1}}],["则必须从您的固件中提取",{"2":{"241":1}}],["则可以从以前的备份",{"2":{"248":1}}],["则可以使用以下命令修补",{"2":{"228":1}}],["则可能由于市场限制",{"2":{"233":1}}],["则默认值为",{"2":{"217":4}}],["则为",{"2":{"216":2,"347":2}}],["则该文件夹将直接替换实际系统中的文件夹",{"2":{"210":1}}],["则环境变量",{"2":{"209":1}}],["则",{"2":{"207":2,"347":4}}],["则无法使用此模块",{"2":{"201":1}}],["则有一个标志",{"2":{"196":1}}],["则还原为默认启动映像",{"2":{"166":1}}],["则您的代码无需遵循",{"2":{"3":1}}],["你必须手动将",{"2":{"248":1}}],["你就不能再通过",{"2":{"236":1}}],["你可以将文件从资源管理器直接拖到终端中来获得文件绝对路径",{"2":{"228":1}}],["你可以使用",{"2":{"171":1}}],["你应该已经收到了gnu通用公共许可证的副本以及这个程序",{"2":{"223":2}}],["你应该卸载它",{"2":{"176":1}}],["你应该备份你的",{"2":{"166":1}}],["你不想用常规方法安装",{"2":{"166":1}}],["你的",{"2":{"166":1}}],["宽容模式的",{"2":{"166":1}}],["推荐使用",{"2":{"238":1}}],["推荐",{"0":{"164":1}}],["推出版本",{"2":{"76":1}}],["反之亦然",{"0":{"163":1},"1":{"164":1,"165":1,"166":1}}],["过程类似安装",{"2":{"162":1}}],["过去的美好时光",{"2":{"77":1}}],["常见问题",{"0":{"161":1,"199":1},"1":{"162":1,"163":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"200":1,"201":1,"202":1,"203":1,"204":1},"2":{"222":2}}],["常规注入",{"0":{"184":1}}],["常规挂载",{"0":{"181":1}}],["常规",{"2":{"89":3,"91":1,"334":1,"341":3}}],["quick",{"2":{"252":1,"267":1}}],["quite",{"2":{"250":1,"257":1,"264":1,"310":1,"312":1,"315":1,"317":1}}],["questions",{"2":{"204":1}}],["queue",{"2":{"144":1}}],["quot",{"2":{"18":2,"25":2,"26":2,"28":2,"71":2,"86":4,"97":2,"102":2,"111":2,"112":2,"119":4,"124":2,"135":2,"138":2,"148":4,"151":8,"166":2,"169":2,"180":4,"186":6,"208":16,"217":4,"256":2,"271":2,"272":4,"276":2,"277":4,"284":4,"310":2,"315":2,"319":2,"322":2,"323":4,"325":2,"326":4,"349":68}}],["q",{"0":{"200":1,"201":1,"202":1,"203":1,"265":1},"2":{"116":1,"117":2,"180":2,"265":2}}],["qcdt",{"2":{"112":1}}],["🎉",{"2":{"107":1,"293":1}}],["zopfli",{"2":{"347":4}}],["z0",{"2":{"208":1}}],["za",{"2":{"208":2}}],["zenfone",{"2":{"132":1}}],["zeros",{"2":{"107":1}}],["z",{"2":{"108":1,"208":1,"291":1,"351":1}}],["zimage",{"2":{"140":2}}],["zimages",{"2":{"99":1}}],["zipfile",{"2":{"216":1}}],["zipurl",{"2":{"208":2}}],["zip",{"2":{"56":1,"65":1,"80":1,"165":2,"166":1,"214":5,"216":1,"218":1,"229":1,"243":4,"248":2,"284":1,"302":1,"350":4}}],["zips",{"2":{"49":1,"56":1,"90":1,"339":1,"342":1}}],["zygote",{"0":{"264":1},"2":{"92":1,"97":2,"100":1,"106":1,"111":1,"113":1,"117":1,"150":1,"219":1,"264":1,"267":1,"308":1,"312":2,"317":2,"319":2,"350":2}}],["zygisk",{"0":{"211":1,"312":1,"317":1,"332":1,"338":1},"2":{"92":4,"94":1,"95":4,"96":1,"97":5,"99":3,"168":1,"201":1,"207":4,"209":1,"211":4,"312":3,"313":1,"317":3,"318":1,"319":5,"320":1,"332":3,"338":3}}],["组成",{"2":{"208":1,"212":1}}],["组",{"2":{"91":1,"334":1}}],["从拒绝列表中删除目标",{"2":{"350":2}}],["从预编译的",{"2":{"349":2}}],["从关机开始",{"2":{"230":1}}],["从",{"2":{"170":1,"190":1,"193":1,"220":1,"347":4,"349":2,"352":4}}],["从存储安装",{"2":{"165":1}}],["从镜像恢复模块文件的上下文",{"2":{"91":1,"334":1}}],["从文档来看",{"2":{"78":1}}],["始终在",{"2":{"237":1}}],["始终更喜欢",{"2":{"91":1,"334":1}}],["始终安装在引导映像的",{"2":{"80":1}}],["规则严格限制仅允许",{"2":{"197":1}}],["规则传输到",{"2":{"197":1}}],["规则实施",{"2":{"181":1}}],["规则补丁",{"2":{"166":1}}],["规则中使用许可",{"2":{"166":1}}],["规则",{"2":{"90":1,"193":1,"207":2,"339":1,"342":1,"349":2}}],["使开发者能够替换根目录中的文件或添加新的",{"2":{"220":1}}],["使守护程序套接字成为",{"2":{"90":1,"339":1,"342":1}}],["使用名称",{"2":{"347":2}}],["使用当前目录中的文件将启动映像组件重新打包到",{"2":{"347":2}}],["使用了麒麟处理器的华为设备与大多数常见设备的分区方式不同",{"2":{"238":1}}],["使用标志",{"2":{"196":1}}],["使用命令行选项切换",{"2":{"206":1}}],["使用命令",{"2":{"190":2}}],["使用官方",{"2":{"176":1}}],["使用此方法风险自负",{"2":{"166":1}}],["使用",{"2":{"84":2,"90":1,"169":1,"181":1,"182":1,"184":2,"185":1,"186":1,"196":1,"218":1,"219":1,"220":2,"222":1,"339":1,"342":1,"347":4,"351":2,"352":2}}],["使用脚本下载并安装",{"2":{"83":1}}],["使用您喜欢的软件包管理器安装",{"2":{"83":2}}],["守护程序和实用程序",{"2":{"346":1}}],["守护程序",{"2":{"194":1}}],["守护程序将使用对",{"2":{"87":1}}],["守护进程派生的所有进程",{"2":{"349":1}}],["守护进程",{"2":{"90":1,"339":1,"342":1,"350":2}}],["实际上是",{"2":{"202":1}}],["实际删除文件很复杂",{"2":{"186":1}}],["实例成功启动后",{"2":{"170":1}}],["实例",{"2":{"170":1}}],["实例都将参考",{"2":{"78":1}}],["实现",{"0":{"330":1,"331":1,"336":1,"337":1},"2":{"90":1,"339":1,"342":1}}],["无",{"2":{"230":1}}],["无论是哪种方式",{"2":{"248":1}}],["无论您的启动加载器处于何种锁定状态",{"2":{"233":1}}],["无论",{"2":{"206":1}}],["无需对系统分区进行实际修改",{"2":{"186":1}}],["无需通过",{"2":{"90":1,"339":1,"342":1}}],["无缝",{"2":{"79":1}}],["签名和验证",{"2":{"90":1,"339":1,"342":1}}],["签名和分发",{"0":{"87":1}}],["内重新安装并重新启动",{"2":{"243":1}}],["内的文件夹",{"2":{"217":2}}],["内的文件",{"2":{"217":2}}],["内部",{"2":{"350":2}}],["内部使用的方法",{"2":{"206":1}}],["内部材料",{"2":{"190":2}}],["内部细节",{"0":{"188":1},"1":{"189":1,"190":1,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1},"2":{"198":1,"222":1}}],["内部文档",{"0":{"179":1},"1":{"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1},"2":{"222":1}}],["内容",{"2":{"90":1,"339":1,"342":1}}],["内核必须支持动态",{"2":{"166":1}}],["内核无法直接理解这种新的分区格式",{"2":{"79":1}}],["内核不需要",{"2":{"79":1}}],["内核直接挂载",{"2":{"77":1}}],["内核使用",{"2":{"77":2}}],["内核的",{"2":{"76":1}}],["内核将使用它作为rootfs",{"2":{"76":1}}],["英文原版",{"2":{"89":1,"90":1,"91":1,"223":1,"334":1,"339":1,"341":1,"342":1}}],["生成损坏的",{"2":{"89":1,"341":1}}],["查看",{"2":{"87":1,"352":1}}],["查看您的选项",{"2":{"84":1}}],["要简单得多",{"2":{"245":1}}],["要将修补后的映像刷入您的设备",{"2":{"241":1,"242":1}}],["要从压缩包中的",{"2":{"239":1}}],["要使用新的固件升级您的设备",{"2":{"237":1}}],["要进行系统更新",{"2":{"236":1}}],["要解锁引导加载器",{"2":{"233":1}}],["要验证三星设备是否可以安装",{"2":{"233":1}}],["要求进行额外的设置",{"2":{"235":1}}],["要求",{"0":{"233":1}}],["要添加您在自定义",{"2":{"220":1}}],["要替换",{"2":{"210":1}}],["要强制命令不使用busybox",{"2":{"206":1}}],["要真正删除文件夹非常复杂",{"2":{"186":1}}],["要查找",{"2":{"180":1}}],["要检查",{"2":{"180":1}}],["要分发使用您自己的密钥签名的自己的",{"2":{"87":1}}],["要在",{"2":{"87":1}}],["要构建所有内容并创建最终的",{"2":{"84":1}}],["横幅中选择",{"2":{"86":1}}],["插件",{"2":{"86":1}}],["插件的工作方式",{"2":{"86":1}}],["链接起来",{"2":{"86":2}}],["链接",{"2":{"86":1,"208":2}}],["软件包",{"2":{"86":1}}],["代码库一起使用",{"2":{"86":1}}],["代码之前运行",{"2":{"85":1}}],["代码应该在",{"2":{"85":1}}],["支持格式",{"2":{"347":4}}],["支持的策略声明",{"2":{"349":2}}],["支持的命令",{"2":{"347":2}}],["支持的组件",{"2":{"347":2}}],["支持的操作",{"2":{"347":4}}],["支持的平台",{"2":{"83":1}}],["支持常见的压缩格式",{"2":{"347":1}}],["支持运行时可切换的",{"2":{"206":1}}],["支持将",{"2":{"168":1}}],["支持从",{"2":{"90":1,"339":1,"342":1}}],["支持从payload",{"2":{"90":1,"339":1,"342":1}}],["支持打印加载的",{"2":{"90":1,"339":1,"342":1}}],["支持打印属性上下文",{"2":{"90":1,"339":1,"342":1}}],["支持更多语法以获得扩展权限",{"2":{"90":1,"339":1,"342":1}}],["支持使用",{"2":{"90":1,"339":1,"342":1}}],["支持列出",{"2":{"90":1,"339":1,"342":1}}],["支持包含字符文件的",{"2":{"90":1,"339":1,"342":1}}],["支持",{"0":{"85":1},"1":{"86":1},"2":{"90":1,"168":1,"206":1,"339":1,"342":1}}],["提供的出厂映像中恢复",{"2":{"248":1}}],["提供了一个覆盖系统",{"2":{"220":1}}],["提供了一种无系统地实现这一目标的方法",{"2":{"184":1}}],["提供了一种在",{"2":{"180":1}}],["提供了示例",{"2":{"84":1}}],["提示",{"2":{"200":1,"216":1,"228":1}}],["提交",{"2":{"2":1}}],["调用",{"2":{"84":1,"350":1}}],["调试桥",{"2":{"200":1}}],["调试",{"2":{"1":1,"200":1}}],["您将得到一个升级的",{"2":{"248":1}}],["您将看到一个询问修复环境的对话框",{"2":{"228":1}}],["您将看到一个用于占位的",{"2":{"228":1}}],["您都可以最终使用",{"2":{"248":1}}],["您正在刷入",{"2":{"241":1,"242":1}}],["您正在浏览的是",{"2":{"238":1}}],["您这样做会破坏您的设备",{"2":{"237":1}}],["您不能使用",{"2":{"230":1}}],["您不应更改它",{"2":{"208":1}}],["您应该已经知道并准备好了",{"2":{"227":1}}],["您应该看到",{"2":{"227":1}}],["您必须手动重新",{"2":{"248":1}}],["您必须手动下载新的固件归档文件并完成上一节中编写的相同",{"2":{"236":1}}],["您必须确保自己没有以任何方式修改只读分区",{"2":{"245":1}}],["您必须使用",{"2":{"239":1}}],["您必须按照说明进行操作",{"2":{"227":1}}],["您必须进行一些额外的设置才能使",{"2":{"86":1}}],["您下载",{"2":{"214":2}}],["您还可以通过将设备连接到",{"2":{"227":1}}],["您还可以在变量名称",{"2":{"217":1}}],["您还可以手动要求应用在应用设置中创建图标",{"2":{"202":1}}],["您还可以构建特定的子组件",{"2":{"84":1}}],["您的体验可能会有所不同",{"2":{"242":1}}],["您的设备有一个名为",{"2":{"241":1}}],["您的设备应该会自动重启",{"2":{"235":1}}],["您的设备已解锁",{"2":{"233":1}}],["您的设备已被电信运营商或保险公司远程锁定",{"2":{"233":1}}],["您的设备被暂时锁定",{"2":{"233":1}}],["您的设备无法解锁",{"2":{"233":1}}],["您的设备没有单独的",{"2":{"227":1}}],["您的设备足够现代",{"2":{"78":1}}],["您的",{"2":{"184":1,"215":1,"234":1}}],["您可以有几种选择",{"2":{"248":1}}],["您可以从官方固件包或第三方",{"2":{"227":1}}],["您可以根据自由软件基金会发布的",{"2":{"223":2}}],["您可以以两种不同的模式运行启动脚本",{"2":{"219":1}}],["您可以在",{"2":{"201":1,"216":1}}],["您可以通过使用诸如",{"2":{"196":1}}],["您可以使用以下工具之一直接从三星服务器下载",{"2":{"235":1}}],["您可以使用",{"2":{"184":2}}],["您可以将文件放到",{"2":{"181":1}}],["您也可以提供",{"2":{"243":1}}],["您也可以将",{"2":{"185":1}}],["您也可以将早期挂载文件放在",{"2":{"182":1}}],["您也可以自己设置",{"2":{"83":1}}],["建议不要使用最新版本的",{"2":{"238":1}}],["建议大多数脚本在此阶段运行",{"2":{"219":1}}],["建议的选项是将环境变量",{"2":{"83":1}}],["建议尽量使用",{"2":{"2":1}}],["包括新的代码加载",{"2":{"332":1,"338":1}}],["包括所有",{"2":{"223":2}}],["包括完整的",{"2":{"206":1}}],["包括",{"2":{"191":2,"197":1,"347":1,"349":1}}],["包含一个完全独立的",{"2":{"86":1}}],["包含极简的",{"2":{"79":1}}],["包",{"2":{"83":1}}],["添加到",{"2":{"83":1}}],["将详细输出打印到",{"2":{"352":2}}],["将命令传递给调用的",{"2":{"351":2}}],["将新目标添加到拒绝列表",{"2":{"350":2}}],["将所有块设备的",{"2":{"350":2}}],["将扩展到",{"2":{"349":2}}],["将扩展名",{"2":{"165":1}}],["将从当前活动策略",{"2":{"349":2}}],["将整体策略转储到",{"2":{"349":2}}],["将是不完整的",{"2":{"331":1,"337":1}}],["将最低",{"0":{"329":1,"335":1}}],["将覆盖第三方",{"2":{"242":1}}],["将安装到",{"2":{"242":1}}],["将安装一个",{"2":{"190":1}}],["将熔断您的",{"2":{"231":1}}],["将简单地替换为",{"2":{"220":1}}],["将其注入",{"2":{"220":1}}],["将读取并连接",{"2":{"220":1}}],["将导致启动过程死锁",{"2":{"219":1}}],["将强制替换为最新的",{"2":{"218":1}}],["将负责自行安装所有内容",{"2":{"215":1}}],["将模块文件从",{"2":{"214":1}}],["将透明地处理这些分区是否位于单独的分区中",{"2":{"210":1}}],["将设置为",{"2":{"209":1}}],["将此文件中的属性作为系统属性加载",{"2":{"207":2}}],["将执行此脚本",{"2":{"207":2}}],["将不会挂载您的",{"2":{"207":2}}],["将检测到安全模式被激活",{"2":{"200":1}}],["将在其中运行的内容",{"2":{"197":1}}],["将在下次重启时挂载您的文件",{"2":{"181":1}}],["将修补好的",{"2":{"228":1}}],["将修补现成的",{"2":{"197":1}}],["将修补的归档文件复制到您的电脑",{"2":{"235":1}}],["将修补的映像复制到您的电脑",{"2":{"228":1}}],["将修补的",{"2":{"193":1}}],["将触发类",{"2":{"195":1}}],["将被视为",{"2":{"349":2}}],["将被替换为",{"2":{"347":2}}],["将被启动",{"2":{"194":1}}],["将被忽略并消失",{"2":{"186":1}}],["将第二阶段的",{"2":{"193":1}}],["将替换为另一个文件",{"2":{"347":2}}],["将替换",{"2":{"193":1}}],["将挂载此文件夹",{"2":{"207":2}}],["将挂载到此处",{"2":{"190":2}}],["将挂载命名空间切换到",{"2":{"90":1,"339":1,"342":1}}],["将选择该文件夹",{"2":{"190":1}}],["将文件夹添加到模块模板中",{"2":{"186":1}}],["将它们添加回去毫无意义",{"2":{"175":1}}],["将环境变量",{"2":{"83":1,"206":1}}],["将",{"0":{"166":1,"169":1,"170":1,"171":1},"2":{"83":1,"86":3,"89":1,"166":1,"184":1,"190":1,"193":2,"228":1,"235":1,"243":1,"247":2,"341":1,"347":10,"351":2}}],["将这些拼凑在一起",{"0":{"80":1}}],["请为每个命令添加引号",{"2":{"347":2}}],["请考虑使用",{"2":{"248":1}}],["请转到",{"2":{"247":1}}],["请不要擦除",{"2":{"243":1}}],["请直接在",{"2":{"243":1}}],["请手动安装",{"2":{"243":1}}],["请先阅读",{"2":{"242":1}}],["请注意",{"2":{"241":1,"242":1}}],["请立即重新启动到",{"2":{"235":1}}],["请同意",{"2":{"235":1}}],["请按照以下说明操作",{"2":{"233":1}}],["请备份您的数据",{"2":{"231":1}}],["请确认",{"2":{"231":1}}],["请确保在安装过程前",{"2":{"83":1}}],["请长按音量增大",{"2":{"230":1}}],["请选中",{"2":{"228":2}}],["请获取",{"2":{"227":2}}],["请参见",{"2":{"223":2}}],["请参阅",{"2":{"223":2}}],["请以英文原版为准",{"2":{"223":1}}],["请改用",{"2":{"219":1}}],["请勿在模块",{"2":{"218":1}}],["请勿手动创建或修改",{"2":{"207":2}}],["请避免使用",{"2":{"217":4}}],["请查看相应部分",{"2":{"227":2}}],["请查看",{"2":{"211":1,"213":1}}],["请分别将它们放在",{"2":{"210":1}}],["请重新启动到安全模式",{"2":{"200":1}}],["请进入",{"2":{"200":1}}],["请将",{"2":{"229":1}}],["请将它们添加到",{"2":{"220":1}}],["请将这些规则添加到此文件中",{"2":{"213":1}}],["请将手机连接到",{"2":{"200":1}}],["请将您的",{"2":{"181":1}}],["请使用正确的修补映像方法",{"2":{"243":1}}],["请使用",{"2":{"209":1,"241":1,"242":1,"243":2,"248":2}}],["请使用此代码",{"2":{"180":2}}],["请使用直接安装到系统分区",{"2":{"166":1}}],["请阅读",{"2":{"177":1,"209":1}}],["请关闭并重新打开",{"2":{"169":1}}],["请仅在具有",{"2":{"166":1}}],["请尝试关闭并打开应用程序",{"2":{"164":1}}],["请在开发人员选项中禁用自动系统更新",{"2":{"246":1}}],["请在设置过程中将设备连接到互联网",{"2":{"234":1}}],["请在继续之前阅读",{"2":{"227":1}}],["请在安装",{"2":{"227":1}}],["请在安装过程中选择",{"2":{"83":1}}],["请在网络上查找它们",{"2":{"201":1}}],["请在",{"2":{"87":1,"215":1}}],["请切换到",{"2":{"87":1}}],["请运行",{"2":{"84":1}}],["请尽量采用",{"2":{"2":1}}],["启用拒绝列表强制",{"2":{"350":2}}],["启用开发者选项",{"2":{"234":1}}],["启用开发者模式",{"2":{"83":1}}],["启用",{"0":{"173":1},"2":{"233":1}}],["启用符号链接",{"2":{"83":1}}],["启动第三方",{"2":{"248":1}}],["启动加载程序已锁定",{"2":{"233":1}}],["启动屏幕",{"2":{"230":2}}],["启动之前",{"2":{"219":1}}],["启动脚本",{"0":{"219":1},"2":{"209":1}}],["启动过程在执行完成",{"2":{"219":1}}],["启动过程",{"0":{"192":1},"1":{"193":1,"194":1,"195":1},"2":{"348":1}}],["启动时",{"2":{"184":1}}],["启动到",{"2":{"166":1}}],["启动可以大致分为",{"2":{"77":1}}],["启动",{"2":{"76":1,"78":1,"180":1,"243":1}}],["启动映像",{"2":{"76":1}}],["启动映像中的一个部分",{"2":{"76":1}}],["仅当您的设备启动",{"2":{"243":1}}],["仅当脚本设置为可执行文件时才执行",{"2":{"219":1}}],["仅限linux",{"2":{"232":1}}],["仅限",{"2":{"232":1,"239":1}}],["仅在lg上使用",{"2":{"347":1}}],["仅在启用模块时执行",{"2":{"219":1}}],["仅在必要时在此模式下运行脚本",{"2":{"219":1}}],["仅将文件或文件夹替换为空文件或文件夹是不够的",{"2":{"186":1}}],["仅支持从存储中打印持久属性",{"2":{"90":1,"339":1,"342":1}}],["仅",{"2":{"83":1}}],["设计的应用程序进行",{"2":{"351":1}}],["设置它来实现",{"2":{"196":1}}],["设置",{"2":{"83":1,"247":1,"352":4}}],["设置中找到",{"2":{"83":1}}],["设置为什么",{"2":{"206":1}}],["设置为允许每个域",{"2":{"197":1}}],["设置为钩住",{"2":{"193":1}}],["设置为工具链位置",{"2":{"86":1}}],["设置为默认",{"2":{"86":2}}],["设置为",{"2":{"83":2,"206":1,"347":2}}],["设置环境",{"0":{"83":1}}],["设备将在重启后自动给",{"2":{"243":1}}],["设备就会显示启动屏幕",{"2":{"230":1}}],["设备是否有单独的",{"2":{"227":1}}],["设备是否有启动",{"2":{"227":1}}],["设备的",{"2":{"216":2}}],["设备都支持在启动时按特殊键组合键以进入安全模式作为紧急选项",{"2":{"200":1}}],["设备上是只读的",{"2":{"220":1}}],["设备上协助劫持",{"2":{"193":1}}],["设备上",{"2":{"193":2}}],["设备中",{"2":{"191":1}}],["设备分类为以下不同类型",{"2":{"80":1}}],["设备卡在方法",{"2":{"78":1}}],["设备",{"0":{"248":1},"2":{"77":1,"78":1,"80":2,"242":1,"248":1}}],["设备过去启动的方式",{"2":{"77":1}}],["设备当前运行的",{"2":{"76":1}}],["设备首次上市时预装的",{"2":{"76":1}}],["设备推出时使用的安卓版本",{"2":{"76":1}}],["设备使用",{"2":{"76":1}}],["如节大小和校验和",{"2":{"347":1}}],["如ro",{"2":{"196":1}}],["如",{"2":{"166":1,"190":2,"196":1,"214":1,"245":1,"347":2}}],["如何在",{"0":{"174":1}}],["如何将",{"0":{"167":1},"1":{"168":1,"169":1,"170":1,"171":1,"172":1}}],["如何从当前的",{"0":{"163":1},"1":{"164":1,"165":1,"166":1}}],["如何安装",{"0":{"162":1}}],["如何实现其引导加载程序",{"2":{"80":1}}],["如果既没有指定",{"2":{"349":2}}],["如果以前已在",{"2":{"347":2}}],["如果提供了",{"2":{"347":2}}],["如果提供",{"2":{"347":4}}],["如果需要",{"2":{"347":1}}],["如果需要自定义模块安装过程",{"2":{"215":1}}],["如果支持",{"2":{"248":1}}],["如果可能",{"2":{"245":1}}],["如果未指",{"2":{"347":2}}],["如果未指定",{"2":{"217":4,"347":6}}],["如果未自动安装",{"2":{"243":1}}],["如果重命名文件扩展名时遇到问题",{"2":{"243":1}}],["如果被要求恢复出厂设置",{"2":{"235":1}}],["如果有条件",{"2":{"235":1}}],["如果下载模式下未显示",{"2":{"233":1}}],["如果找到",{"2":{"227":1}}],["如果还是报错",{"2":{"227":2}}],["如果没有",{"2":{"223":2}}],["如果没有看到此选项",{"2":{"169":1}}],["如果在任何部分中检测到压缩",{"2":{"347":1}}],["如果在根目录中不存在",{"2":{"220":1}}],["如果在开发人员选项中启用了usb调试",{"2":{"200":1}}],["如果模块在",{"2":{"216":1}}],["如果要修补",{"2":{"228":1}}],["如果要完全控制和自定义安装过程",{"2":{"215":1}}],["如果要替换",{"2":{"210":1}}],["如果要更新",{"2":{"166":1}}],["如果启用了zygisk",{"2":{"209":1}}],["如果存在",{"2":{"207":8,"227":1,"347":2}}],["如果",{"2":{"207":2,"216":1,"347":4}}],["如果你使用的是",{"2":{"201":1}}],["如果你真的想使用",{"2":{"176":1}}],["如果检测到了设备",{"2":{"200":1}}],["如果属性更改未通过",{"2":{"196":1}}],["如果我们使用",{"2":{"193":1}}],["如果您有官方映像转储的副本",{"2":{"248":1}}],["如果您决定在不接触",{"2":{"248":1}}],["如果您决定引导到实际的",{"2":{"230":1}}],["如果您安装了第三方",{"2":{"248":1}}],["如果您遇到任何问题",{"2":{"243":1}}],["如果您遇到如",{"2":{"227":2}}],["如果您不打算使用第三方",{"2":{"241":1,"242":1}}],["如果您不知道什么是",{"2":{"200":1}}],["如果您打算使用第三方",{"2":{"241":1,"242":1}}],["如果您坚持使用第三方",{"2":{"229":1}}],["如果您清除数据",{"2":{"228":1}}],["如果您使用的是三星设备",{"2":{"227":1}}],["如果您使用的是华为设备",{"2":{"227":1}}],["如果您的官方固件包包含",{"2":{"227":1}}],["如果您的设备在",{"2":{"230":1}}],["如果您的设备有单独的",{"2":{"228":1}}],["如果您的设备有启动",{"2":{"227":1}}],["如果您的设备没有单独的",{"2":{"228":1}}],["如果您的设备没有启动",{"2":{"227":2,"235":2}}],["如果您的模块需要基于设备",{"2":{"215":1}}],["如果您的模块需要一些额外的",{"2":{"213":1}}],["如果您还计划安装第三方内核",{"2":{"227":1}}],["如果您还不知道什么是",{"2":{"200":1}}],["如果您已经安装了",{"2":{"226":1}}],["如果您将名为",{"2":{"210":1}}],["如果您只需要运行引导脚本",{"2":{"209":1}}],["如果您只是引用了本文档翻译的内容",{"2":{"3":1}}],["如果您发现了这些错误或者不通顺的地方",{"2":{"203":1}}],["如果您没有启用",{"2":{"200":1}}],["如果您需要此特殊行为",{"2":{"196":1}}],["如果您想经常接收官方",{"2":{"248":1}}],["如果您想在不重新打包启动映像的情况下将自定义",{"2":{"184":1}}],["如果您想替换",{"2":{"181":1}}],["如果不这样做",{"2":{"176":1}}],["如果已安装",{"2":{"166":1}}],["如果看不到",{"2":{"164":1}}],["如果使用",{"2":{"79":1}}],["访问守护进程的唯一方法是通过",{"2":{"197":1}}],["访问权限等",{"2":{"179":1}}],["访问权限",{"2":{"164":1,"169":1}}],["访问帮助",{"2":{"84":1}}],["访问",{"2":{"80":1,"169":3,"170":1,"197":1}}],["相同",{"2":{"349":2}}],["相同的格式",{"2":{"212":1}}],["相比的更改",{"0":{"334":1}}],["相比有几个区别",{"2":{"79":1}}],["相关的操作",{"2":{"347":2}}],["相关的二进制文件",{"2":{"191":2}}],["相关链接",{"0":{"224":1}}],["相反",{"2":{"80":1,"220":1,"247":1}}],["修改已到位",{"2":{"347":2}}],["修改的分区从安装时的生成备份恢复到官方",{"2":{"246":1}}],["修补过程",{"2":{"236":1}}],["修补映像",{"0":{"228":1},"2":{"243":1,"248":1}}],["修补",{"2":{"193":1,"228":1,"347":2}}],["修补三星固件时正确保留",{"2":{"90":1,"339":1,"342":1}}],["修补引导映像来轻松安装",{"2":{"80":1}}],["修复了撤销根权限时崩溃的问题",{"2":{"91":1,"334":1}}],["修复修补扩展权限",{"2":{"90":1,"339":1,"342":1}}],["修复根服务无法绑定一加设备的问题",{"2":{"89":1,"341":1}}],["修复设备信息检测脚本",{"2":{"89":1,"341":1}}],["修复sepolicy规则复制",{"2":{"8":1}}],["修复升级时的sepolicy规则迁移",{"2":{"6":1}}],["型设备",{"2":{"80":2}}],["就可以找到提取",{"2":{"248":1}}],["就好像您的设备的",{"2":{"227":1}}],["就足够了",{"2":{"176":1}}],["就不要向我抱怨死机了",{"2":{"176":1}}],["就像更新",{"2":{"163":1}}],["就",{"2":{"80":1}}],["年",{"2":{"80":1}}],["年末",{"2":{"80":1}}],["同时也是第一个",{"2":{"80":1}}],["旧版",{"2":{"80":1}}],["类设备的引导加载程序仍然会接受并提供手动添加到内核",{"2":{"80":1}}],["类设备的更多详细信息",{"2":{"80":1}}],["类设备用户必须始终重新启动到",{"2":{"80":1}}],["类",{"2":{"80":6}}],["类型",{"2":{"80":1}}],["混合",{"2":{"80":1}}],["里的",{"2":{"80":1}}],["有效的触发器",{"2":{"350":2}}],["有一个特殊的机制允许您实际进入到",{"2":{"230":1}}],["有一个用于修复和升级设备的极简自带",{"2":{"76":1}}],["有一些例外情况",{"2":{"227":1}}],["有两种方法可以启用它",{"2":{"206":1}}],["有大量",{"2":{"201":1}}],["有可能",{"2":{"186":2}}],["有些文件需要在启动过程中尽早挂载",{"2":{"180":1}}],["有关详细信息",{"2":{"223":2}}],["有关如何格式化策略语句的更多详细信息",{"2":{"213":1}}],["有关",{"2":{"177":1,"211":1}}],["有了上面的所有知识",{"2":{"80":1}}],["存储在",{"2":{"196":1}}],["存储在单独的分区中",{"2":{"168":1}}],["存储在单独的分区中时",{"2":{"79":1}}],["存储常规",{"2":{"191":4}}],["存在的标志",{"2":{"191":1}}],["存在",{"2":{"79":1,"347":2}}],["处理其余的引导",{"2":{"79":1}}],["因此长按音量增大不会在我的设备上不会启动到",{"2":{"242":1}}],["因此唯一可以确定的方法就是实际尝试",{"2":{"227":1}}],["因此在引用这些附加文件时",{"2":{"220":1}}],["因此它不包含",{"2":{"202":1}}],["因此需要注意一些",{"2":{"196":1}}],["因此需要使用",{"2":{"184":1}}],["因此一旦数据正确装载到",{"2":{"191":1}}],["因此非",{"2":{"191":1}}],["因此不能作为",{"2":{"191":1}}],["因此无法完全支持模块的功能",{"2":{"177":1}}],["因此无法直接将",{"2":{"79":1}}],["因此",{"2":{"175":1,"186":1,"190":1,"220":1}}],["因此切勿在模拟器设置中禁用",{"2":{"169":1}}],["因此单独构建",{"2":{"86":1}}],["因此可以通过",{"2":{"80":1}}],["因为在没有充分测试的情况下",{"2":{"329":1,"335":1}}],["因为每个设备的程序可能有所不同",{"2":{"245":1}}],["因为其设备上的",{"2":{"238":1}}],["因为我们正在执行升级",{"2":{"236":1}}],["因为我们要清除数据",{"2":{"235":1}}],["因为数据将在后面的步骤中再次清除",{"2":{"234":1}}],["因为它不再相关",{"2":{"351":1}}],["因为它不会显示在第三方",{"2":{"217":2}}],["因为它通常涉及",{"2":{"248":1}}],["因为它可能会损坏大型文件",{"2":{"235":1}}],["因为它可能会损坏大文件",{"2":{"228":1}}],["因为它会跳过终止清理步骤",{"2":{"217":2}}],["因为它还将充当将二进制文件注入",{"2":{"190":1}}],["因为环境变量继承到子进程",{"2":{"206":1}}],["因为这是",{"2":{"196":1}}],["因为这些分区的大小非常有限",{"2":{"181":1}}],["因为某些设备的引导加载程序会接受",{"2":{"227":1}}],["因为某些修改需要文件消失才能生效",{"2":{"186":1}}],["因为某些生成的代码仅在构建过程中创建",{"2":{"85":1}}],["因为大多数模块必须在所有应用程序中加载",{"2":{"177":1}}],["因为需要支持符号链接",{"2":{"83":1}}],["因为谷歌每年都强制所有",{"2":{"78":1}}],["因为",{"2":{"78":1,"79":2,"168":1,"220":2}}],["到控制台并终止安装",{"2":{"217":2}}],["到控制台",{"2":{"217":2}}],["到",{"2":{"79":1,"350":2}}],["然后完成安装过程",{"2":{"214":1}}],["然后再进行专业化和运行",{"2":{"211":1}}],["然后通过",{"2":{"196":1}}],["然后启动时卡在了开机动画",{"0":{"200":1}}],["然后启动守护程序",{"2":{"193":1}}],["然后启动它",{"2":{"170":1}}],["然后重新注册实例",{"2":{"170":1}}],["然后重启回到正常模式",{"2":{"200":1}}],["然后重启",{"2":{"169":1}}],["然后选择",{"2":{"165":1,"228":1,"235":1}}],["然后点击",{"2":{"164":1}}],["然后授予",{"2":{"164":1}}],["然后在",{"2":{"86":1}}],["然后让内核根据引导加载程序的信息选择要使用的任何根目录",{"2":{"79":1}}],["然而机器翻译的正确率有待提高",{"2":{"203":1}}],["然而",{"2":{"78":1,"80":1,"351":1}}],["删除其文件格式文件扩展名",{"2":{"347":2}}],["删除您的模块时",{"2":{"207":2}}],["删除属性将同时删除",{"2":{"196":1}}],["删除属性不会将其从持久存储中删除",{"2":{"196":1}}],["删除文件和文件夹",{"0":{"186":1}}],["删除",{"2":{"79":1,"347":2,"352":2}}],["塞入",{"2":{"79":1}}],["只能放弃对棒棒糖的支持",{"2":{"329":1,"335":1}}],["只能劫持",{"2":{"230":1}}],["只能引导到",{"2":{"80":1}}],["只有部分小米设备具有此属性",{"2":{"227":1}}],["只有列表中的应用程序才会加载",{"2":{"177":1}}],["只有",{"2":{"168":1}}],["只有使用方法b的设备才被正式视为",{"2":{"78":1}}],["只需更改必要的内容",{"2":{"347":1}}],["只需按照第三方",{"2":{"241":1,"242":1}}],["只需下载",{"2":{"227":1}}],["只需从当前的",{"0":{"165":1}}],["只需将",{"2":{"79":1}}],["当使用名称",{"2":{"350":1}}],["当ota可用时",{"2":{"246":1}}],["当在",{"2":{"206":1}}],["当您打开隐藏的",{"2":{"202":1}}],["当隐藏",{"2":{"202":1}}],["当前安装的magisk的版本代码",{"2":{"216":1}}],["当前安装的",{"2":{"216":1}}],["当前",{"2":{"190":2}}],["当",{"2":{"79":1,"184":1,"194":1,"207":2,"220":1,"230":1}}],["当时只有引导方法",{"2":{"79":1}}],["当谷歌发布第一代",{"2":{"79":1}}],["第一次设计",{"2":{"79":1}}],["第三方",{"0":{"243":1},"2":{"78":1,"230":1}}],["它作为一个实用工具",{"2":{"350":1}}],["它最初是为支持以",{"2":{"348":1}}],["它解析标头并提取映像中的所有部分",{"2":{"347":1}}],["它具有新功能和完善的",{"2":{"332":1,"338":1}}],["它不会安装",{"2":{"246":1}}],["它应该显示一个对话框",{"2":{"235":1}}],["它通常命名为",{"2":{"235":1}}],["它们将直接复制到magisk",{"2":{"220":1}}],["它们仅限于将",{"2":{"80":1}}],["它允许高级模块开发人员在每个",{"2":{"211":1}}],["它是现代安卓系统上的一个现有文件夹",{"2":{"191":1}}],["它将显示一个让您重新安装的对话框",{"2":{"243":1}}],["它将为您提供在主屏幕中创建快捷方式的选项",{"2":{"202":1}}],["它将安装一个",{"2":{"202":1}}],["它将用一个空文件夹替换该文件夹",{"2":{"186":1}}],["它将具有所有只读分区的2个插槽",{"2":{"76":1}}],["它还推出了",{"2":{"79":1}}],["一个策略声明应被视为一个参数",{"2":{"349":2}}],["一个用于解压缩",{"2":{"347":1}}],["一旦完成",{"2":{"248":1}}],["一旦下载了",{"2":{"248":1}}],["一旦你的三星设备获得了",{"2":{"236":1}}],["一旦你按下组合键",{"2":{"230":1}}],["一旦",{"2":{"235":1}}],["一样",{"2":{"227":1}}],["一起刷入",{"2":{"235":1}}],["一起使用",{"2":{"184":1}}],["一起安装的软件包",{"2":{"86":1}}],["一般的早期挂载分区将挂载到",{"2":{"181":1}}],["一些二进制文件和文件应存储在",{"2":{"191":1}}],["一些",{"2":{"80":1}}],["一些使用带有",{"2":{"79":1}}],["一些历史",{"0":{"79":1}}],["一加",{"2":{"77":1}}],["应的文件名",{"2":{"347":2}}],["应为",{"2":{"228":1}}],["应只包含字符串",{"2":{"214":2}}],["应该取决于您的设备",{"2":{"228":1}}],["应该足够好了",{"2":{"209":1}}],["应该指向一个",{"2":{"208":1}}],["应该与平台绑定",{"2":{"78":1}}],["应用内置",{"2":{"349":2}}],["应用图标显示异常",{"0":{"202":1}}],["应用程序重新安装",{"2":{"331":1,"337":1}}],["应用程序中修补",{"2":{"237":1}}],["应用程序的",{"2":{"226":1}}],["应用程序的进程中直接运行代码",{"2":{"211":1}}],["应用程序下载模块时",{"2":{"218":1}}],["应用程序或第三方recovery",{"2":{"214":1}}],["应用程序刷入",{"0":{"165":1}}],["应用程序",{"2":{"90":2,"91":1,"165":1,"169":1,"175":1,"227":1,"228":2,"229":1,"235":1,"243":2,"334":1,"339":2,"342":2}}],["应用程序日志和magisk日志",{"2":{"9":1}}],["应用",{"2":{"87":1,"89":1,"238":1,"240":1,"248":1,"341":1,"347":2,"349":2}}],["是可选的",{"2":{"349":4}}],["是用于解压缩组件的原始启动映像",{"2":{"347":2}}],["是一项能让模块修改分区的功能",{"2":{"330":1,"336":1}}],["是一种新的文件类型",{"2":{"197":1}}],["是有效的",{"2":{"197":1}}],["是通过从",{"2":{"196":1}}],["是否支持",{"2":{"180":1}}],["是这种类型的第一个设备",{"2":{"80":1}}],["是",{"2":{"78":1,"211":1,"216":1}}],["对",{"2":{"329":1,"335":1,"347":4}}],["对设备进行了改造以适应新方法",{"2":{"78":1}}],["对于重新打包",{"2":{"347":1}}],["对于解包",{"2":{"347":1}}],["对于运行",{"2":{"241":1}}],["对于这些设备",{"2":{"230":1}}],["对于大多数设备",{"2":{"228":1}}],["对于大多数模块开发人员来说",{"2":{"209":1}}],["对于想在",{"2":{"206":1}}],["对于与第三方开发人员相关的内容",{"2":{"206":1}}],["对于带有",{"2":{"190":1}}],["对于每个操作",{"2":{"84":1}}],["对于所有其他类型的设备",{"2":{"80":1}}],["对于",{"2":{"78":1,"80":1,"217":4,"220":1,"242":1}}],["对于支持无缝系统更新的设备",{"2":{"76":1}}],["可用的小程序",{"2":{"350":2}}],["可能还会振动",{"2":{"230":1}}],["可选地",{"2":{"248":1}}],["可选",{"2":{"208":2,"214":2}}],["可选文件",{"2":{"207":2}}],["可执行文件位于",{"2":{"206":1}}],["可执行文件",{"2":{"89":1,"341":1}}],["可以是",{"2":{"347":4}}],["可以是其中之一",{"2":{"181":1}}],["可以将",{"2":{"247":1}}],["可以验证一下哈希值",{"2":{"235":1}}],["可以很容易地获得这些信息",{"2":{"230":1}}],["可以重启到",{"2":{"228":1}}],["可以临时存储文件的地方",{"2":{"216":1}}],["可以选择在安装程序中创建名为",{"2":{"215":1}}],["可以在一个命令中提供多个策略语句",{"2":{"349":2}}],["可以在",{"2":{"214":1}}],["可以更新模块",{"2":{"208":1}}],["可以禁用它",{"2":{"196":1}}],["可以与",{"2":{"184":1}}],["可以直接将",{"2":{"166":1}}],["可以根据引导加载程序的信息启动到",{"2":{"80":1}}],["可以使用",{"2":{"78":1}}],["可帮助您更精确地定义设备的",{"2":{"76":1}}],["但该选项仍然存在",{"2":{"351":1}}],["但该工具被扩展为支持所有设备",{"2":{"348":1}}],["但另外支持",{"2":{"349":2}}],["但在",{"2":{"349":1}}],["但谷歌从未提供过支持",{"2":{"329":1,"335":1}}],["但",{"2":{"248":1}}],["但使用",{"2":{"241":1,"242":1}}],["但大多数固件压缩包可以从华为固件下载站下载",{"2":{"239":1}}],["但没有任何保证",{"2":{"223":2}}],["但仍然禁止更改只读属性",{"2":{"196":1}}],["但仍不允许使用",{"2":{"186":1}}],["但不值得费力",{"2":{"186":1}}],["但不值得这么做",{"2":{"186":1}}],["但不能添加新文件",{"2":{"182":1}}],["但不使用修补",{"2":{"168":1}}],["但需要",{"2":{"168":1}}],["但是华为设备没有这个分区",{"2":{"238":1}}],["但是",{"2":{"86":1}}],["但本指南不再赘述",{"2":{"83":1}}],["但许多设备不接受",{"2":{"80":1}}],["但实施方式不同",{"2":{"78":1}}],["但例外情况单独列出",{"2":{"77":1}}],["讨论",{"0":{"78":1}}],["不错的旧",{"2":{"351":1}}],["不修改大多数只读分区",{"2":{"245":1}}],["不建议在新的设备上通过第三方",{"2":{"243":1}}],["不建议使用",{"2":{"176":1}}],["不可通过官方途径解锁",{"2":{"238":1}}],["不可写",{"2":{"190":2}}],["不是",{"2":{"235":1}}],["不是模拟器检测绕过程序",{"2":{"173":1}}],["不幸的是",{"2":{"227":1,"248":1}}],["不要按",{"2":{"247":1}}],["不要重新启动",{"2":{"246":1}}],["不要使用",{"2":{"228":1,"235":1,"236":1}}],["不要在",{"2":{"218":1}}],["不要在脚本中硬编码模块路径",{"2":{"209":1}}],["不要尝试在",{"2":{"218":1}}],["不存在",{"2":{"207":2,"220":2}}],["不再正式支持较新的华为设备",{"2":{"238":1}}],["不再处理",{"2":{"201":1}}],["不再维护",{"2":{"175":1}}],["不允许直接连接到",{"2":{"197":1}}],["不受限制的文件上下文",{"2":{"197":1}}],["不过",{"2":{"175":1}}],["不足以存储",{"2":{"168":1}}],["不推荐",{"0":{"166":1}}],["不包括已在使用方法",{"2":{"77":1}}],["不属于方法",{"2":{"77":1}}],["最佳实践",{"2":{"248":1}}],["最简单的",{"2":{"214":1}}],["最新的版本",{"2":{"83":1}}],["最相关的是删除",{"2":{"79":1}}],["最后执行",{"2":{"77":1}}],["最终根目录",{"2":{"77":1}}],["负责挂载",{"2":{"77":1}}],["也没有指定",{"2":{"349":2}}],["也会篡改块验证",{"2":{"245":1}}],["也就是由字母",{"2":{"208":1}}],["也就是说",{"2":{"76":2,"210":1}}],["也以独立模式运行",{"2":{"206":1}}],["也不要使用已损坏的第三方",{"2":{"166":1}}],["也许一些",{"2":{"77":1}}],["时并修改补充后的版本",{"2":{"238":1}}],["时的数据擦除",{"2":{"231":1}}],["时都必须重新启动至",{"2":{"230":1}}],["时一样",{"2":{"163":1}}],["时",{"2":{"77":2,"79":1,"184":1,"202":2,"220":1,"230":1,"243":1}}],["谷歌的标准正式支持这一点",{"2":{"79":1}}],["谷歌推出了动态分区",{"2":{"79":1}}],["谷歌对",{"2":{"78":1}}],["谷歌",{"2":{"77":2}}],["的小程序",{"2":{"351":1,"352":1}}],["的参数与",{"2":{"349":2}}],["的参数可以接受一个或多个条目",{"2":{"349":2}}],["的关键部分",{"2":{"348":1}}],["的所有内容以进行调试",{"2":{"347":2}}],["的状态",{"2":{"347":4}}],["的概念是使",{"2":{"347":1}}],["的实现也经历了一些重大的重构",{"2":{"332":1,"338":1}}],["的实际硬件",{"2":{"329":1,"335":1}}],["的棒棒糖模拟器镜像",{"2":{"329":1,"335":1}}],["的活跃开发者都没有运行",{"2":{"329":1,"335":1}}],["的支持在不知不觉中已经中断了一段时间",{"2":{"329":1,"335":1}}],["的方法",{"2":{"248":1}}],["的更新",{"2":{"248":1}}],["的更多信息",{"2":{"177":1}}],["的说明进行操作即可",{"2":{"241":1,"242":1}}],["的地方",{"2":{"241":1}}],["的分区",{"2":{"241":1}}],["的值可能如下",{"2":{"233":1}}],["的系统",{"2":{"230":2}}],["的系统上使用的规则都可以被视为官方的",{"2":{"349":1}}],["的系统上",{"2":{"190":2}}],["的最简单方法是直接通过",{"2":{"229":1}}],["的报错",{"2":{"227":2}}],["的副本",{"2":{"227":2}}],["的结果确定您的设备在",{"2":{"227":1}}],["的隐含保证",{"2":{"223":2}}],["的开发人员",{"2":{"222":1}}],["的示例",{"2":{"220":2}}],["的内部",{"2":{"220":1}}],["的控制台中",{"2":{"217":2}}],["的版本字符串",{"2":{"216":1}}],["的脚本以",{"2":{"219":1}}],["的脚本",{"2":{"215":1}}],["的一切",{"2":{"219":1}}],["的一项功能",{"2":{"211":1}}],["的一种形式",{"2":{"78":1}}],["的文件",{"2":{"218":1}}],["的文件放在任何文件夹中",{"2":{"210":1}}],["的文档",{"2":{"87":1,"213":1}}],["的格式",{"2":{"208":1}}],["的符号链接",{"2":{"207":6,"347":2}}],["的图标资源",{"2":{"202":1}}],["的行为",{"2":{"196":1}}],["的默认设置属性行为与",{"2":{"196":1}}],["的覆盖层",{"2":{"190":1}}],["的损坏的符号链接",{"2":{"186":1}}],["的替换列表中",{"2":{"186":1}}],["的镜像不可用",{"2":{"184":1}}],["的部分高级功能",{"2":{"179":1}}],["的官方模块库已经死亡",{"2":{"175":1}}],["的空文件",{"2":{"174":1}}],["的步骤",{"0":{"170":1,"172":1}}],["的侵害",{"2":{"87":1}}],["的存储库可以作为一个项目直接使用",{"2":{"85":1}}],["的安装路径",{"2":{"83":1}}],["的现代设备还带有",{"2":{"79":1}}],["的",{"2":{"79":1,"86":1,"87":1,"184":4,"197":2,"206":4,"215":1,"216":1,"219":1,"220":7,"227":1,"230":1,"247":1,"248":1,"347":2,"349":1}}],["的流逝",{"2":{"79":1}}],["的时候",{"2":{"79":2}}],["的标准有点复杂",{"2":{"78":1}}],["的定义",{"2":{"78":1}}],["的定义只考虑了内核如何引导设备",{"2":{"78":1}}],["的设备而创建的",{"2":{"348":1}}],["的设备特别友好",{"2":{"243":1}}],["的设备通常是这样的",{"2":{"227":1}}],["的设备都是",{"2":{"80":1}}],["的设备都将自动使用方法",{"2":{"78":1}}],["的设备上运行",{"2":{"78":1}}],["的设备",{"2":{"77":4,"80":1,"241":1,"248":2}}],["的启动方式",{"2":{"76":1}}],["具有许多助手函数和几个",{"2":{"350":1}}],["具有以下补丁",{"2":{"349":1}}],["具有",{"2":{"77":3}}],["此标志仅影响",{"2":{"352":4}}],["此工具别名为",{"2":{"349":1}}],["此外",{"2":{"329":1,"335":1}}],["此外还有以下文件",{"2":{"214":1}}],["此操作无论如何都是不可逆的",{"2":{"231":1}}],["此操作可能清除您的数据",{"2":{"228":1}}],["此时",{"2":{"227":1}}],["此功能主要为第三方内核开发者设计",{"2":{"220":1}}],["此阶段为非阻塞",{"2":{"219":1}}],["此阶段会阻塞",{"2":{"219":1}}],["此函数是以下psuedo代码的简写",{"2":{"217":2}}],["此函数是以下命令的简写",{"2":{"217":2}}],["此脚本将来源于",{"2":{"214":2}}],["此脚本将在",{"2":{"207":4}}],["此文件将被",{"2":{"220":2}}],["此文件将被忽略",{"2":{"220":2}}],["此文件将被注入到",{"2":{"220":2}}],["此文件将替换",{"2":{"220":2}}],["此文件中的每一行都将被视为策略语句",{"2":{"213":1}}],["此文件遵循与",{"2":{"212":1}}],["此文件夹将以递归方式合并到真正的",{"2":{"210":1}}],["此文件夹包含模块的",{"2":{"207":2}}],["此文件存储模块的元数据",{"2":{"207":2}}],["此路径中的每个目录都将装载其目录名的分区",{"2":{"190":2}}],["此路径可以在",{"2":{"83":1}}],["此处",{"2":{"170":1}}],["此方法首次出现在",{"2":{"77":2}}],["此仓库分别存在",{"2":{"0":1}}],["来进入",{"2":{"240":1}}],["来安装或升级",{"2":{"230":1}}],["来引用",{"2":{"184":1}}],["来引导",{"2":{"77":3,"79":1}}],["来运行",{"2":{"168":1}}],["来支持",{"2":{"168":1}}],["来说是个坏消息",{"2":{"79":1}}],["来说",{"2":{"78":1}}],["来表示",{"2":{"76":1}}],["传统",{"2":{"77":2}}],["初始化触发器上的回调",{"2":{"350":2}}],["初始根目录",{"2":{"77":1}}],["初始版本",{"2":{"73":1}}],["方法进行升级",{"2":{"226":1}}],["方法",{"2":{"77":4,"78":3,"193":1}}],["并重新编译",{"2":{"349":1}}],["并重启设备",{"2":{"248":1}}],["并成为",{"2":{"348":1}}],["并删除",{"2":{"347":2}}],["并删除它们",{"2":{"169":1}}],["并安装",{"2":{"248":1}}],["并没有真正好的方法",{"2":{"248":1}}],["并改用它",{"2":{"237":1}}],["并显示为灰色",{"2":{"234":1}}],["并使用以下命令刷入",{"2":{"228":1}}],["并使用",{"2":{"228":1,"235":1}}],["并补充了很多内容",{"2":{"222":1}}],["并补充了一些内容",{"2":{"0":1}}],["并遵循以下规则",{"2":{"220":1}}],["并启用",{"2":{"219":1}}],["并启用了",{"2":{"215":1}}],["并启动该应用程序",{"2":{"235":1}}],["并启动",{"2":{"195":1}}],["并通过",{"2":{"200":1}}],["并将其替换为",{"2":{"347":2}}],["并将该脚本重命名或复制为",{"2":{"214":1}}],["并将",{"2":{"197":1}}],["并与守护进程建立连接",{"2":{"197":1}}],["并进行了修补",{"2":{"196":1}}],["并神奇地安装模块文件",{"2":{"194":1}}],["并退出守护进程",{"2":{"193":1}}],["并在当前目录中具有相",{"2":{"347":2}}],["并在安装后保留",{"2":{"245":1}}],["并在",{"2":{"193":1}}],["并提供一个统一的界面来管理模块",{"2":{"179":1}}],["并执行它为我们装载分区",{"2":{"193":1}}],["并执行",{"2":{"170":1}}],["并单击",{"2":{"170":1}}],["并刷入",{"2":{"166":1}}],["并按照说明进行初始设置",{"2":{"83":1}}],["并让",{"2":{"79":1,"247":1}}],["并且在这种情况下无需将",{"2":{"243":1}}],["并且可以用很小的工作量来维护",{"2":{"243":1}}],["并且从中恢复的唯一方法是清除数据并进行完整的",{"2":{"237":1}}],["并且无论在哪个",{"2":{"206":1}}],["并且执行",{"2":{"197":1}}],["并且对非",{"2":{"196":1}}],["并且",{"2":{"77":1}}],["并运行以下命令进行检查",{"2":{"227":1}}],["并运行命令",{"2":{"200":1}}],["并运行",{"2":{"76":1}}],["随机字符",{"2":{"228":8}}],["随着时间从",{"2":{"79":1}}],["随",{"2":{"76":1}}],["xz",{"2":{"347":5}}],["xda",{"2":{"266":1}}],["x",{"2":{"228":5}}],["xbin",{"2":{"169":1}}],["xposed",{"2":{"156":2}}],["xperm",{"2":{"144":1,"349":8}}],["xperia",{"2":{"95":1}}],["xxx应用会检测到",{"0":{"201":1}}],["xxxxx",{"2":{"186":3}}],["xxx",{"2":{"124":1}}],["xiaomi",{"2":{"108":1,"137":1,"291":1}}],["x86",{"0":{"167":1,"171":1},"1":{"168":1,"169":1,"170":1,"171":1,"172":1},"2":{"108":1,"140":1,"168":1,"207":4,"216":1,"291":1}}],["x64",{"2":{"83":3,"216":2}}],["xl",{"2":{"76":1,"122":1,"137":1,"265":1}}],["xml",{"2":{"36":1,"181":3}}],["例如几乎所有的小米设备均为",{"2":{"230":1}}],["例如三星",{"2":{"80":1}}],["例如一些小米手机",{"2":{"80":1}}],["例如",{"2":{"76":1,"84":1,"181":1,"190":2,"206":1,"216":3,"217":1,"243":1}}],["级别和",{"2":{"76":1}}],["级别",{"2":{"76":1,"216":2}}],["版本提升到6",{"0":{"329":1,"335":1}}],["版本对应的",{"2":{"216":1}}],["版本上运行",{"2":{"206":1}}],["版本之间的映射可以在这张表格中看到",{"2":{"76":1}}],["版本",{"2":{"76":3,"83":1,"168":1,"227":1,"238":1}}],["以了解更多背景信息",{"2":{"352":1}}],["以与",{"2":{"349":1}}],["以作为",{"2":{"347":4}}],["以仅打印",{"2":{"347":2}}],["以递归删除",{"2":{"347":2}}],["以原始格式转储",{"2":{"347":2}}],["以支持更多设备",{"2":{"331":1,"337":1}}],["以应用",{"2":{"245":1}}],["以启用",{"2":{"235":1}}],["以及使用多种算法压缩",{"2":{"347":1}}],["以及",{"2":{"230":1}}],["以前是",{"2":{"220":1}}],["以下内容与",{"2":{"334":1}}],["以下教程不会保留",{"2":{"248":1}}],["以下教程仅针对初始安装",{"2":{"226":1}}],["以下是几种不同类型的设备的教程",{"2":{"245":1}}],["以下是一些参数",{"2":{"76":1}}],["以下只是一些一般性指导",{"2":{"238":1}}],["以下部分面向开发者",{"2":{"222":1}}],["以下变量和函数可用",{"2":{"215":1}}],["以跳过所有默认安装步骤",{"2":{"215":1}}],["以方便您使用",{"2":{"202":1}}],["以便与为",{"2":{"351":1}}],["以便可以使用原始标头",{"2":{"347":1}}],["以便通过",{"2":{"246":1}}],["以便检查更新",{"2":{"208":1}}],["以便",{"2":{"197":1,"208":1}}],["以获得远程",{"2":{"197":1}}],["以确保",{"2":{"197":1}}],["以确定您的设备最有可能使用哪种方法",{"2":{"77":1}}],["以",{"2":{"196":1,"219":2}}],["以允许直接修改属性区域或",{"2":{"196":1}}],["以允许第三方仓库",{"2":{"10":1}}],["以ro",{"2":{"196":1}}],["以继续启动过程",{"2":{"193":1}}],["以创建符号链接",{"2":{"186":1}}],["以来",{"2":{"182":1}}],["以防卸载",{"2":{"169":1}}],["以防系统无法启动",{"2":{"166":1}}],["以关闭签名检查",{"2":{"87":1}}],["以安装",{"2":{"83":1}}],["以保持",{"2":{"80":1}}],["两阶段初始化",{"2":{"76":1}}],["作为策略语句逐行读取和分析",{"2":{"349":2}}],["作为解决方法",{"2":{"242":1}}],["作为第一个运行的程序",{"2":{"193":1}}],["作为",{"2":{"76":1,"77":2,"235":1,"347":2}}],["环境中执行",{"2":{"331":1,"337":1}}],["环境下运行的每一个",{"2":{"206":1}}],["环境",{"2":{"76":1,"79":1}}],["而不经过",{"2":{"352":2}}],["而不是默认的",{"2":{"351":2}}],["而不是初始安装",{"2":{"236":1}}],["而不是合并其内容",{"2":{"210":1}}],["而不是直接安装",{"2":{"166":1}}],["而不是",{"2":{"76":1,"169":1,"208":1,"241":1,"242":2}}],["而进入",{"2":{"240":1}}],["而是使用",{"2":{"236":1}}],["而是直接调用内部",{"2":{"206":1}}],["而无需通过",{"2":{"196":1}}],["而且修改非常容易",{"2":{"186":1}}],["而言",{"2":{"78":1,"80":1}}],["而",{"2":{"76":1,"219":1}}],["都在上下文",{"2":{"349":1}}],["都将无法安装",{"2":{"233":1}}],["都将替换为",{"2":{"220":1}}],["都始终具有完整的命令集",{"2":{"206":1}}],["都是",{"2":{"78":1}}],["都是包含",{"2":{"76":1}}],["都存储在",{"2":{"76":1}}],["和文档",{"2":{"332":1,"338":1}}],["和构建",{"2":{"211":1}}],["和减号",{"2":{"208":1}}],["和所有",{"2":{"197":1}}],["和所有小程序的符号链接直接存储",{"2":{"190":2}}],["和持久存储中读取",{"2":{"196":1}}],["和删除属性",{"2":{"196":1}}],["和模块默认未加载",{"2":{"177":1}}],["和方法",{"2":{"78":1}}],["和",{"2":{"76":3,"77":4,"78":2,"80":1,"85":1,"90":1,"169":1,"191":2,"196":2,"197":1,"206":2,"209":1,"210":1,"217":1,"219":1,"222":1,"227":1,"235":1,"247":1,"339":1,"342":1,"347":4,"352":2}}],["人们也可以使用术语",{"2":{"76":1}}],["或运行时策略",{"2":{"349":1}}],["或将所有条目解压到当前目录",{"2":{"347":2}}],["或更高版本",{"0":{"242":1}}],["或修改它",{"2":{"223":2}}],["或过",{"2":{"219":1}}],["或按照上述指南直接将",{"2":{"171":1}}],["或在",{"2":{"166":1}}],["或第三方",{"2":{"80":1}}],["或者第三方",{"2":{"243":1}}],["或者不写",{"2":{"228":1}}],["或者您需要为某些模块文件设置特殊权限",{"2":{"215":1}}],["或者您在使用方法",{"2":{"78":1}}],["或者",{"2":{"201":1,"227":1,"230":1}}],["或者他们正式称之为",{"2":{"79":1}}],["或",{"2":{"76":1,"79":2,"80":1,"172":1,"174":1,"181":1,"208":1,"210":1,"216":2,"219":1,"223":2,"227":2,"228":4,"232":1,"238":1,"245":1,"349":2,"350":2}}],["下面是如何使用自定义",{"2":{"220":1}}],["下面是一个自定义脚本的示例",{"2":{"184":1}}],["下划线",{"2":{"208":1}}],["下载并安装最新的",{"2":{"227":1}}],["下载最新的",{"2":{"214":1}}],["下载提供信息的",{"2":{"208":1}}],["下载到内部存储并动态加载",{"2":{"202":1}}],["下载",{"2":{"170":1,"243":1,"248":1}}],["下",{"2":{"76":1,"210":1,"247":1}}],["中备份",{"2":{"347":2}}],["中存储的",{"2":{"347":2}}],["中检测到的相应格式自动压缩",{"2":{"347":2}}],["中所述的方法",{"2":{"248":1}}],["中提取映像",{"2":{"239":1}}],["中提取出与系统属性相关的源代码来实现的",{"2":{"196":1}}],["中说明",{"2":{"235":1}}],["中添加名为",{"2":{"218":1}}],["中添加任何自定义逻辑",{"2":{"218":1}}],["中列出的文件夹中",{"2":{"217":1}}],["中运行",{"2":{"215":1,"219":1,"349":1}}],["中运行时",{"2":{"206":1}}],["中声明要替换的文件夹列表",{"2":{"217":1}}],["中声明",{"2":{"215":1}}],["中刷入",{"2":{"214":1}}],["中执行",{"2":{"206":1,"207":2}}],["中搜索",{"2":{"201":1,"347":2}}],["中找到",{"2":{"197":1}}],["中安全且不可检测的地方",{"2":{"191":1}}],["中安装",{"2":{"86":1,"216":1,"230":1}}],["中引入的回归",{"2":{"91":1,"334":1}}],["中的空格分隔列表组成",{"2":{"349":2}}],["中的规则",{"2":{"349":2}}],["中的所有禁用标志",{"2":{"347":2}}],["中的重新启动按钮",{"2":{"247":1}}],["中的每个",{"2":{"220":1}}],["中的脚本以",{"2":{"219":1}}],["中的新文件将被添加到真实",{"2":{"210":1}}],["中的现有文件将被模块",{"2":{"210":1}}],["中的文件管理功能重命名文件",{"2":{"243":1}}],["中的文件",{"2":{"210":1}}],["中的文件替换",{"2":{"210":1}}],["中的文件夹",{"2":{"207":1}}],["中的文件将被忽略",{"2":{"181":1}}],["中的内容",{"2":{"206":1}}],["中的",{"0":{"230":1},"2":{"206":1,"227":1,"235":1,"242":1,"348":2}}],["中的属性",{"2":{"196":1}}],["中的节点",{"2":{"193":1}}],["中的非易失性存储中",{"2":{"191":1}}],["中的路径",{"0":{"190":1,"191":1}}],["中的固定路径",{"2":{"90":1,"339":1,"342":1}}],["中的刷入",{"2":{"80":1}}],["中设置您的签名配置",{"2":{"87":1}}],["中开发",{"0":{"86":1}}],["中得到适当的开箱即用的支持",{"2":{"85":1}}],["中",{"2":{"79":1,"80":1,"86":1,"182":1,"184":2,"185":1,"190":2,"191":2,"196":1,"210":2,"219":2,"220":3}}],["中非常重要的一部分",{"2":{"78":1}}],["中使用了新的",{"2":{"181":1}}],["中使用",{"2":{"77":1}}],["中或挂载在",{"2":{"76":1}}],["中文汉化",{"2":{"223":1}}],["中文汉化版许可仅供参考",{"2":{"223":1}}],["中文汉化英文原版",{"2":{"220":1}}],["中文技术文档写作规范",{"2":{"2":1}}],["中文文档",{"0":{"0":1,"222":1},"1":{"1":1,"2":1,"3":1,"4":1,"223":1,"224":1,"225":1}}],["文可能存储在",{"2":{"243":1}}],["文档",{"2":{"222":1}}],["文档结构",{"0":{"189":1},"1":{"190":1,"191":1}}],["文档中",{"2":{"186":1}}],["文档链接",{"2":{"0":1}}],["文件上的",{"2":{"350":2}}],["文件来提供自定义",{"2":{"331":1,"337":1}}],["文件资源管理器中默认不显示文件扩展名",{"2":{"243":1}}],["文件扩展名重命名为",{"2":{"243":2}}],["文件而不是",{"2":{"241":1,"242":1}}],["文件创建到",{"2":{"217":1}}],["文件提取到正确的位置",{"2":{"214":1}}],["文件的",{"2":{"214":1}}],["文件中的",{"2":{"214":1}}],["文件类型",{"2":{"197":1}}],["文件重定向到",{"2":{"193":1}}],["文件放到",{"2":{"185":1}}],["文件夹可能不再存在",{"2":{"220":1}}],["文件夹可能不存在",{"2":{"190":1}}],["文件夹中",{"2":{"220":1}}],["文件夹以模块的",{"2":{"207":2}}],["文件夹的权限默认为",{"2":{"191":1}}],["文件夹的设备",{"2":{"190":1}}],["文件夹是因为其具有以下优点",{"2":{"191":1}}],["文件夹或替换文件夹",{"2":{"182":1}}],["文件夹或文件系统",{"2":{"76":1}}],["文件夹",{"0":{"210":1},"2":{"83":1,"191":1,"207":4,"220":2}}],["文件系统可以是",{"2":{"76":1}}],["文件",{"2":{"76":1,"90":1,"220":3,"228":1,"229":1,"339":1,"342":1,"347":14,"349":2,"350":2}}],["根目录覆盖系统",{"0":{"220":1}}],["根目录修补程序文件",{"2":{"190":2}}],["根目录",{"2":{"76":1}}],["根据您的设备运行的",{"2":{"238":1}}],["根据您的选择",{"2":{"223":2}}],["根据",{"2":{"0":1}}],["术语",{"0":{"76":1}}],["官方的",{"2":{"248":1}}],["官方仓库",{"2":{"224":1}}],["官方调试版本并重新安装",{"2":{"87":1}}],["官方",{"2":{"74":1,"81":1,"160":1,"178":1,"187":1,"198":1,"204":1,"221":1,"244":1,"249":1,"345":1,"353":1}}],["官方文档",{"2":{"0":2,"222":1,"224":1}}],["=格式",{"2":{"347":2}}],["=",{"2":{"66":1,"76":2,"77":5,"78":1,"212":1}}],["+x",{"2":{"219":1}}],["+$",{"2":{"208":1}}],["+",{"2":{"31":1,"86":1,"99":1,"230":3,"240":1,"347":2}}],["8+",{"2":{"83":1}}],["8",{"0":{"29":1,"30":1,"31":1,"241":1,"339":1},"2":{"107":1,"197":2,"241":1,"293":1,"322":1,"325":1}}],["ko",{"2":{"184":2,"220":6}}],["kotlin",{"2":{"18":1,"85":1}}],["k",{"2":{"150":1}}],["knoxguard",{"2":{"233":3,"234":1}}],["knox",{"2":{"145":2,"231":1}}],["know",{"2":{"51":1,"251":1}}],["kitkat",{"2":{"257":1,"305":1,"307":1}}],["kinds",{"2":{"144":1,"322":1,"325":1}}],["kill",{"2":{"122":1}}],["killed",{"2":{"111":1}}],["kirin",{"2":{"115":1,"118":1}}],["kmsg",{"2":{"110":1}}],["key",{"2":{"212":1,"289":1}}],["keys",{"2":{"16":1,"281":1,"323":1,"326":1}}],["kernel",{"2":{"99":2,"104":1,"106":2,"107":1,"108":1,"123":1,"124":1,"128":1,"141":1,"143":1,"145":2,"153":1,"227":1,"251":1,"262":1,"271":1,"276":1,"291":1,"293":1,"297":1,"299":1,"347":8}}],["kernels",{"2":{"95":2,"122":1,"145":2,"322":1,"325":1}}],["keeps",{"2":{"293":1}}],["keepforceencrypt",{"2":{"43":1,"347":2}}],["keepverity",{"2":{"43":1,"122":1,"347":4}}],["9+",{"2":{"242":1}}],["960",{"2":{"118":1}}],["9",{"0":{"28":2,"242":1,"256":1,"270":1,"305":1,"340":1},"1":{"271":1,"272":1,"273":1,"274":1,"306":1,"341":1,"342":1},"2":{"16":1,"102":1,"114":1,"117":1,"118":1,"208":1,"274":1,"279":1,"281":3,"303":1}}],["numerous",{"2":{"283":1}}],["number",{"2":{"274":1,"279":1}}],["null",{"2":{"123":1}}],["nitanmarcel",{"2":{"172":1}}],["nslookup",{"2":{"290":1}}],["ns",{"2":{"123":1}}],["ndk",{"2":{"83":2,"86":5,"129":1,"136":1}}],["n",{"2":{"80":1,"196":1,"219":1,"347":8,"352":2}}],["necessarily",{"2":{"302":1}}],["necessary",{"2":{"47":1,"101":1,"271":1,"276":1,"306":1}}],["near",{"2":{"253":1}}],["nearly",{"2":{"148":2,"156":1}}],["next",{"2":{"253":1,"272":1,"312":1,"317":1}}],["needs",{"2":{"302":1}}],["need",{"2":{"108":1,"291":1}}],["needed",{"2":{"46":1,"48":1,"49":1}}],["net",{"2":{"69":1,"151":1,"235":1}}],["newer",{"2":{"94":1,"132":1}}],["newline",{"2":{"50":1,"105":1,"296":1}}],["newly",{"2":{"25":1,"256":1}}],["new",{"0":{"271":1,"276":1,"284":1},"2":{"15":1,"18":2,"19":1,"22":1,"23":1,"25":2,"26":1,"27":1,"28":2,"31":2,"32":1,"43":2,"45":1,"46":1,"51":1,"58":1,"65":1,"67":1,"92":3,"94":1,"95":1,"96":1,"99":2,"107":2,"113":3,"116":2,"117":2,"119":2,"121":1,"122":1,"124":2,"128":3,"132":1,"135":1,"137":1,"138":3,"140":1,"141":1,"144":3,"146":1,"148":1,"150":1,"151":2,"153":1,"154":1,"158":1,"220":4,"252":3,"255":2,"261":5,"264":3,"271":2,"272":1,"274":1,"276":2,"277":1,"279":1,"280":1,"281":2,"282":2,"283":1,"284":3,"293":1,"294":1,"320":1,"322":1,"323":1,"325":1,"326":1,"347":2}}],["nasty",{"2":{"136":1,"137":1}}],["naive",{"2":{"130":1}}],["nand",{"2":{"108":1,"291":1}}],["naming",{"2":{"108":1,"291":1}}],["name=",{"2":{"208":2}}],["names",{"2":{"70":1,"101":1,"112":1,"119":2,"121":1,"124":1,"130":1,"251":4,"306":1}}],["namespace",{"2":{"49":1,"57":1,"90":1,"99":1,"104":1,"107":1,"114":1,"124":2,"144":1,"150":2,"299":1,"339":1,"342":1}}],["name",{"2":{"16":1,"17":1,"25":2,"37":1,"70":1,"100":1,"111":1,"137":1,"148":1,"219":1,"227":4,"251":3,"252":1,"281":1,"308":1,"349":12,"352":12}}],["navigation",{"2":{"99":1}}],["native",{"0":{"263":1},"2":{"24":1,"36":1,"51":1,"85":1,"86":1,"117":1,"119":1,"141":1,"144":1,"207":4,"263":2,"267":1}}],["natively",{"2":{"24":1,"119":1}}],["nosuid",{"2":{"190":2}}],["noxplayer",{"0":{"169":1},"2":{"168":1}}],["nook",{"2":{"128":1,"130":1}}],["nougat",{"2":{"119":1,"158":1}}],["none",{"2":{"252":1}}],["non",{"2":{"112":1,"117":1,"119":1,"122":1,"129":1,"132":1}}],["nodes",{"2":{"108":1,"116":1,"291":1}}],["normal",{"0":{"301":1},"2":{"51":1,"186":4,"303":1}}],["no",{"2":{"19":1,"24":1,"25":1,"28":1,"50":1,"71":1,"80":1,"86":1,"102":1,"107":1,"113":2,"114":1,"117":1,"120":1,"125":1,"141":1,"148":2,"150":2,"152":1,"157":1,"227":2,"252":3,"259":1,"262":1,"271":3,"276":3,"283":1,"284":1,"289":3,"290":2,"292":1,"293":2,"302":1,"309":1,"314":1,"322":1,"325":1,"352":2}}],["now",{"2":{"18":1,"26":1,"28":1,"31":1,"37":1,"45":1,"46":3,"48":1,"49":1,"64":1,"65":2,"69":1,"70":2,"99":1,"102":1,"107":1,"113":1,"117":2,"119":1,"125":1,"141":1,"143":1,"144":1,"145":2,"148":6,"150":2,"151":3,"156":1,"158":4,"257":1,"258":1,"262":2,"263":1,"266":1,"271":1,"273":2,"276":2,"277":1,"278":2,"281":1,"284":1,"293":1,"303":1,"309":1,"311":1,"314":1,"316":1}}],["notable",{"2":{"275":1}}],["nothing",{"2":{"146":1,"254":1}}],["notorious",{"2":{"138":1}}],["notify",{"2":{"115":1}}],["notification",{"2":{"50":1}}],["notifications",{"2":{"25":1,"28":1,"50":1,"53":1,"64":1,"65":1,"67":1}}],["not",{"2":{"3":2,"22":1,"27":1,"30":1,"38":1,"61":1,"64":1,"67":1,"70":1,"71":1,"94":1,"99":1,"102":1,"106":1,"112":1,"116":1,"119":1,"124":2,"125":2,"132":1,"140":3,"144":2,"145":1,"148":2,"150":1,"151":1,"152":1,"155":1,"156":1,"157":1,"158":1,"223":2,"252":1,"253":1,"257":1,"261":1,"264":1,"266":1,"271":7,"272":1,"276":7,"281":2,"284":1,"290":1,"292":1,"301":1,"304":1,"310":1,"315":1,"322":2,"323":3,"325":2,"326":3}}],["notes",{"2":{"108":1,"275":1,"291":1,"294":1,"295":1,"297":1,"305":1,"314":1,"324":1,"345":1}}],["note",{"2":{"0":1,"3":1,"62":1,"80":1,"146":1,"153":1,"281":1,"284":1,"305":1,"307":1}}],["job",{"2":{"283":1}}],["jump",{"2":{"259":1,"309":1,"314":1}}],["justice",{"2":{"260":1}}],["just",{"2":{"51":1,"99":1,"144":1,"156":1,"262":1,"302":1}}],["jellybean",{"2":{"257":2,"305":1,"307":1}}],["jesse205",{"2":{"0":3,"3":2}}],["js",{"2":{"235":1}}],["json",{"2":{"208":3}}],["jsdelivr",{"2":{"12":1}}],["jdk",{"2":{"83":3}}],["java",{"2":{"37":1,"51":1,"85":1,"90":2,"251":1,"339":2,"342":2}}],["jni",{"2":{"37":1}}],["riru",{"2":{"312":1,"317":1}}],["right",{"2":{"309":1,"314":1}}],["rid",{"2":{"136":1}}],["rw",{"2":{"245":1,"271":2,"276":2}}],["rmm",{"2":{"233":1}}],["rm",{"2":{"206":2,"290":1,"347":2,"350":2}}],["rkp",{"2":{"145":1}}],["r10e",{"2":{"136":1}}],["r",{"2":{"125":2,"148":1,"166":1,"191":1,"217":4,"347":4,"349":1}}],["rc",{"0":{"183":1},"1":{"184":1,"185":1},"2":{"92":1,"117":1,"141":1,"152":2,"184":7,"193":1,"196":1,"220":14}}],["rv",{"2":{"76":3,"77":3}}],["robust",{"2":{"106":1}}],["ro",{"2":{"101":1,"145":1,"146":5,"151":3,"306":1}}],["rom",{"2":{"78":1,"90":2,"134":1,"166":4,"227":1,"339":2,"342":2}}],["roms",{"2":{"61":1,"108":1,"122":1,"157":1,"291":1}}],["rock",{"2":{"45":1}}],["rooted",{"2":{"293":1}}],["rootfs",{"2":{"76":2,"77":4,"93":1,"107":1,"271":2,"276":2,"327":1}}],["rootdir",{"2":{"76":4,"77":4,"78":1,"79":2,"190":2}}],["root",{"0":{"176":1,"201":1,"271":1,"274":1,"276":1,"279":1},"2":{"26":1,"27":1,"30":1,"37":1,"42":1,"48":1,"51":1,"58":1,"64":1,"69":1,"71":1,"76":1,"83":1,"86":3,"87":1,"89":1,"91":1,"99":1,"103":1,"105":1,"107":1,"110":1,"113":6,"115":1,"116":2,"117":1,"122":3,"124":1,"125":1,"148":3,"149":1,"150":6,"153":3,"156":1,"157":3,"158":1,"164":1,"169":5,"170":1,"179":2,"190":2,"191":4,"193":2,"196":2,"197":4,"201":1,"220":1,"236":1,"248":4,"251":1,"257":1,"267":1,"270":1,"271":9,"272":2,"274":1,"276":9,"277":2,"279":1,"296":1,"298":1,"310":2,"315":2,"323":6,"326":6,"334":1,"341":1,"348":1,"349":1}}],["rather",{"2":{"301":1}}],["rate",{"2":{"157":1}}],["raw",{"2":{"119":1}}],["rampant",{"2":{"323":1,"326":1}}],["ramdis",{"2":{"242":2}}],["ramdisk",{"2":{"76":2,"77":2,"79":4,"80":9,"94":1,"113":1,"117":1,"130":1,"131":1,"133":1,"135":1,"141":1,"150":2,"156":1,"157":1,"168":3,"190":1,"220":1,"227":8,"230":1,"235":2,"241":6,"242":5,"243":1,"347":12,"348":1}}],["ram",{"2":{"43":1}}],["range",{"2":{"253":1}}],["randomly",{"2":{"293":1}}],["randomize",{"2":{"121":1}}],["random",{"2":{"16":1,"37":1,"113":2,"220":8,"235":2}}],["ran",{"2":{"12":1}}],["rule",{"0":{"213":1,"331":1,"337":1},"2":{"100":1,"101":1,"106":1,"146":1,"148":1,"207":2,"243":1,"283":1,"284":1,"306":1,"308":1,"331":1,"337":1,"349":2}}],["rules",{"2":{"23":1,"90":1,"92":2,"93":1,"100":1,"107":1,"108":1,"119":2,"125":1,"128":1,"129":1,"132":1,"144":1,"145":1,"197":1,"261":1,"291":1,"293":2,"308":1,"327":1,"339":1,"342":1}}],["rustup",{"2":{"86":5}}],["rust",{"0":{"86":1},"2":{"86":10,"93":1,"327":1}}],["run",{"2":{"117":1,"122":1,"125":1,"141":1,"144":1,"145":1,"148":1,"151":1,"153":1,"158":1,"252":1,"264":1,"281":1,"290":1,"312":2,"317":2}}],["runcon",{"2":{"108":1,"291":1}}],["runs",{"2":{"99":1,"148":1,"263":1,"322":1,"325":1}}],["runtime",{"2":{"48":1}}],["running",{"2":{"30":1,"95":2,"97":1,"101":1,"145":1,"148":1,"257":1,"272":1,"281":1,"306":1,"319":1}}],["reinstall",{"2":{"262":1,"267":1}}],["rename",{"2":{"146":1}}],["renamed",{"2":{"144":1,"302":1}}],["render",{"2":{"24":1,"49":1}}],["reject",{"2":{"112":1}}],["regarding",{"2":{"284":1}}],["regardless",{"2":{"281":1}}],["region",{"2":{"108":1,"291":1}}],["regressions",{"2":{"101":1,"305":1,"306":1,"307":1}}],["regression",{"2":{"91":1,"297":1,"334":1}}],["reverted",{"2":{"289":1}}],["reverts",{"2":{"271":1,"276":1}}],["revert",{"2":{"99":1,"271":1,"276":1}}],["revoking",{"2":{"91":1,"334":1}}],["reuse",{"2":{"95":1,"323":1,"326":1}}],["refining",{"2":{"294":1}}],["refined",{"2":{"64":1,"65":1}}],["refuse",{"2":{"262":1}}],["refer",{"2":{"102":1,"220":2}}],["refactor",{"2":{"72":1,"135":1}}],["refresh",{"2":{"46":1}}],["refreshing",{"2":{"32":1}}],["relied",{"2":{"322":1,"325":1}}],["relies",{"2":{"281":1}}],["reliable",{"2":{"49":1,"290":1}}],["rely",{"2":{"271":1,"276":1,"281":1,"322":1,"325":1}}],["related",{"2":{"119":1,"124":2,"290":1}}],["relevant",{"2":{"106":1,"148":1}}],["releases",{"2":{"266":1,"294":1,"295":1,"297":1,"305":1}}],["released",{"2":{"117":1,"289":1,"302":1}}],["release",{"2":{"62":1,"92":1,"108":1,"146":1,"159":1,"250":1,"259":1,"260":2,"264":1,"265":1,"267":2,"270":2,"275":1,"282":1,"289":1,"291":1,"292":2,"294":1,"295":1,"297":1,"301":1,"302":1,"303":1,"305":2,"307":1,"309":1,"314":2,"319":1,"321":1,"324":2,"327":1,"345":1}}],["rewritten",{"2":{"51":1,"107":2,"151":2,"292":1,"322":1,"325":1}}],["rewrite",{"0":{"322":1,"325":1},"2":{"13":1,"48":1,"49":1,"50":1,"56":1,"92":3,"101":1,"135":2,"156":1,"306":1}}],["reasons",{"2":{"292":1}}],["reason",{"2":{"272":1,"290":1}}],["ready",{"2":{"114":1,"289":1}}],["readlinkat",{"2":{"108":1,"291":1}}],["read",{"2":{"65":1,"103":1,"144":1,"146":1,"261":1,"271":1,"276":1,"284":1,"298":1}}],["reading",{"2":{"50":1,"105":1,"148":1,"296":1}}],["readme",{"2":{"49":1,"65":1}}],["realize",{"2":{"323":1,"326":1}}],["really",{"2":{"321":1,"323":1,"324":1,"326":1}}],["realme",{"2":{"99":1}}],["real",{"2":{"46":1,"99":1}}],["remounting",{"2":{"271":1,"276":1}}],["remount",{"2":{"271":1,"276":1}}],["remounts",{"2":{"271":1,"276":1}}],["removal",{"0":{"310":1,"315":1},"2":{"111":1,"137":1,"151":1}}],["removing",{"2":{"71":1,"142":1}}],["removes",{"2":{"108":1,"291":1}}],["removed",{"2":{"28":1,"65":1,"99":2,"148":2,"158":1,"261":1,"311":1,"316":1}}],["remove",{"2":{"26":1,"31":1,"33":1,"37":1,"45":1,"47":1,"49":2,"70":1,"100":2,"106":1,"111":1,"113":2,"117":1,"119":4,"120":1,"122":2,"125":4,"126":1,"137":1,"140":2,"142":1,"144":4,"145":1,"149":1,"151":1,"153":2,"158":1,"200":3,"207":2,"308":2,"350":2}}],["remain",{"2":{"31":1,"322":1,"325":1}}],["research",{"2":{"266":1}}],["resetprop",{"0":{"196":1,"352":1},"2":{"46":1,"90":6,"99":1,"101":1,"121":1,"125":1,"128":1,"138":1,"140":1,"142":1,"144":3,"148":1,"151":3,"196":2,"207":2,"219":1,"257":1,"306":1,"339":6,"342":6,"346":2,"350":2,"352":3}}],["reset",{"2":{"31":1,"106":1,"148":1}}],["res",{"2":{"220":8}}],["resize2fs",{"2":{"138":1,"262":1}}],["resizing",{"2":{"138":1,"262":2}}],["respawn",{"2":{"124":1}}],["response",{"2":{"28":1}}],["results",{"2":{"290":1}}],["result",{"2":{"104":1,"138":1,"151":1,"299":1}}],["resolve",{"2":{"101":1,"102":1,"306":1}}],["resources",{"2":{"124":1}}],["resource",{"2":{"43":1}}],["restart",{"2":{"350":2}}],["restarted",{"2":{"138":1}}],["restarts",{"2":{"95":1,"138":1}}],["restrictions",{"2":{"117":1,"141":1,"323":1,"326":1}}],["restorecon",{"2":{"138":1,"350":2}}],["restore",{"0":{"301":1},"2":{"28":1,"37":1,"48":1,"91":1,"99":1,"137":1,"150":1,"281":1,"303":1,"334":1,"347":2}}],["restoring",{"2":{"25":1,"141":1}}],["re",{"2":{"28":1,"55":1,"58":1,"59":1,"102":1,"125":1,"143":1,"148":1,"281":1,"322":1,"325":1}}],["represent",{"2":{"284":1}}],["replacement",{"2":{"281":1}}],["replaces",{"2":{"261":1}}],["replace=",{"2":{"217":1}}],["replaced",{"2":{"125":1,"252":1}}],["replace",{"2":{"124":1,"151":1,"210":1,"217":5,"271":1,"276":1}}],["replacing",{"2":{"92":1,"113":1,"148":1}}],["repack",{"2":{"347":2}}],["repackaged",{"2":{"31":1,"124":1,"281":2}}],["repackaging",{"2":{"23":1,"25":2,"37":1,"43":1,"45":1,"96":1,"320":1}}],["repair",{"2":{"119":1}}],["reported",{"2":{"125":1}}],["reporting",{"2":{"124":1}}],["repo",{"0":{"175":1,"311":1,"316":1},"2":{"29":1,"32":1,"34":1,"46":2,"51":1,"56":1,"65":1,"68":2,"99":1,"144":1,"311":2,"316":2}}],["repos",{"2":{"27":1,"41":1,"45":1,"52":1,"60":1,"70":1}}],["requiring",{"2":{"145":1}}],["required",{"2":{"99":1,"145":1,"148":1,"261":1}}],["require",{"2":{"46":1,"251":1,"290":1}}],["requirement",{"2":{"32":1,"37":1,"141":1}}],["requires",{"2":{"26":1,"251":1,"277":1,"284":1}}],["request",{"2":{"43":1,"46":1,"48":1,"97":1,"110":1,"144":2,"319":1}}],["requests",{"2":{"37":1,"39":1,"67":1}}],["requesting",{"2":{"11":1,"115":1}}],["reduces",{"2":{"107":1}}],["reduce",{"2":{"24":1,"66":1,"107":1,"124":1,"125":1,"144":1,"148":1,"150":1}}],["redesigned",{"2":{"289":1,"292":1,"293":1}}],["redesign",{"2":{"24":1}}],["redistribute",{"2":{"3":2,"223":2}}],["reboots",{"2":{"148":1}}],["reboot",{"2":{"19":2,"31":1,"43":1,"47":1,"93":1,"117":1,"281":2,"293":1,"327":1}}],["recap",{"2":{"252":1}}],["recently",{"2":{"251":1}}],["receive",{"2":{"48":1}}],["received",{"2":{"3":2,"223":2}}],["recursive",{"2":{"217":4}}],["recurse",{"2":{"83":2}}],["recyclerview",{"2":{"51":1}}],["recompression",{"2":{"113":1}}],["recommended",{"2":{"43":1,"271":1,"276":1}}],["recoveries",{"2":{"51":1,"56":1}}],["recovery或",{"2":{"237":1}}],["recovery模式",{"2":{"235":1}}],["recovery",{"0":{"174":1,"230":1,"243":1},"2":{"18":1,"76":2,"79":8,"80":5,"93":1,"94":1,"108":1,"111":3,"116":3,"120":1,"124":1,"148":1,"166":2,"217":2,"227":3,"228":7,"229":1,"230":10,"235":2,"240":3,"241":3,"242":14,"243":4,"248":5,"274":1,"279":1,"290":1,"291":1,"302":2,"327":1,"331":2,"337":2,"347":2}}],["reconstructing",{"2":{"31":1}}],["19",{"0":{"270":1,"324":1},"1":{"271":1,"272":1,"273":1,"274":1,"325":1,"326":1}}],["1st",{"2":{"261":1}}],["168",{"2":{"233":1}}],["1437",{"0":{"138":1}}],["1455",{"0":{"137":1}}],["1456",{"0":{"136":1}}],["1468",{"0":{"135":1}}],["11",{"0":{"146":1,"275":1,"280":1,"294":1,"333":1},"1":{"276":1,"277":1,"278":1,"279":1,"281":1,"334":1,"335":1,"336":1,"337":1,"338":1},"2":{"106":1,"107":2,"190":1,"220":2,"292":2,"293":2}}],["123456",{"2":{"208":1}}],["123456789",{"2":{"220":1}}],["123456789sh",{"2":{"220":1}}],["1234567",{"2":{"208":1}}],["12",{"0":{"250":1,"295":1,"307":1},"1":{"251":1,"252":1,"253":1,"254":1,"296":1,"308":1},"2":{"95":1,"99":1}}],["13",{"0":{"294":1},"2":{"95":1,"227":1}}],["17",{"0":{"122":1,"297":1},"1":{"298":1,"299":1},"2":{"83":1,"142":1}}],["1500",{"2":{"32":1}}],["1+",{"2":{"32":1,"281":1}}],["1",{"0":{"12":1,"14":1,"19":1,"21":1,"22":2,"23":1,"25":1,"26":1,"28":1,"30":1,"36":1,"42":1,"50":2,"51":1,"57":1,"61":1,"66":1,"68":1,"71":1,"91":1,"94":1,"98":1,"101":1,"106":1,"111":1,"116":1,"118":1,"122":1,"128":1,"133":1,"140":1,"144":1,"147":1,"255":1,"267":2,"280":1,"282":1,"285":1,"294":1,"297":1,"305":1,"309":1,"314":2,"319":1,"324":1,"333":1},"1":{"256":1,"257":1,"258":1,"259":1,"281":1,"283":1,"284":1,"286":1,"287":1,"298":1,"299":1,"306":1,"310":1,"311":1,"312":1,"313":1,"315":2,"316":2,"317":2,"318":2,"325":1,"326":1,"334":1,"335":1,"336":1,"337":1,"338":1},"2":{"24":1,"45":1,"76":1,"77":2,"79":1,"80":1,"89":4,"90":2,"99":2,"114":1,"137":1,"143":1,"206":1,"208":1,"209":1,"227":1,"238":1,"243":2,"257":1,"259":1,"265":1,"267":1,"281":1,"294":1,"314":1,"320":1,"324":1,"339":2,"341":4,"342":2,"343":8,"347":6}}],["101",{"2":{"208":1}}],["10+",{"2":{"76":1,"78":3,"108":2,"291":2}}],["100",{"2":{"13":1,"27":1,"46":1,"92":1,"114":1,"248":1,"257":1,"264":1,"290":1,"302":1}}],["10",{"0":{"272":1,"275":1,"277":1,"285":1,"292":1,"320":1},"1":{"276":1,"277":1,"278":1,"279":1,"286":1,"287":1,"293":1},"2":{"11":1,"76":1,"77":1,"79":1,"80":1,"107":1,"112":1,"113":3,"219":1,"242":1,"271":2,"272":3,"273":1,"275":1,"276":2,"277":2,"278":1}}],["27",{"0":{"339":1}}],["22",{"2":{"238":1}}],["23",{"0":{"288":1,"300":1},"1":{"289":1,"290":1,"291":1,"301":1,"302":1,"303":1,"304":1},"2":{"216":1}}],["26",{"0":{"309":1},"1":{"310":1,"311":1,"312":1,"313":1},"2":{"148":1}}],["24+",{"2":{"119":1}}],["28",{"0":{"260":1,"295":1,"314":1},"1":{"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"296":1,"315":1,"316":1,"317":1,"318":1},"2":{"77":3}}],["29",{"2":{"76":1,"77":4}}],["25",{"2":{"76":1}}],["2si",{"2":{"76":1,"77":1,"79":1,"80":1,"95":1,"105":1,"107":3,"108":1,"112":1,"113":1,"193":2,"291":1,"296":1}}],["20",{"0":{"327":1}}],["2022",{"0":{"309":1,"314":1,"319":1,"320":1,"321":1,"324":1,"327":1},"1":{"310":1,"311":1,"312":1,"313":1,"315":1,"316":1,"317":1,"318":1,"322":1,"323":1,"325":1,"326":1}}],["2020",{"0":{"282":1,"285":1,"288":1,"292":1,"294":1,"295":1},"1":{"283":1,"284":1,"286":1,"287":1,"289":1,"290":1,"291":1,"293":1,"296":1},"2":{"282":1}}],["2021",{"0":{"297":1,"300":1,"305":1,"307":1},"1":{"298":1,"299":1,"301":1,"302":1,"303":1,"304":1,"306":1,"308":1},"2":{"238":1,"297":1}}],["2023",{"0":{"328":1,"333":1,"339":1,"340":1},"1":{"329":1,"330":1,"331":1,"332":1,"334":1,"335":1,"336":1,"337":1,"338":1,"341":1,"342":1},"2":{"3":2}}],["20000",{"2":{"216":1}}],["2017",{"2":{"142":1}}],["2019",{"0":{"255":1,"260":1,"267":1,"270":1,"275":1,"280":1},"1":{"256":1,"257":1,"258":1,"259":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"271":1,"272":1,"273":1,"274":1,"276":1,"277":1,"278":1,"279":1,"281":1},"2":{"80":1,"261":1}}],["2018",{"0":{"250":1},"1":{"251":1,"252":1,"253":1,"254":1},"2":{"80":1}}],["20mb",{"2":{"45":1}}],["21",{"2":{"36":1}}],["2",{"0":{"11":1,"19":1,"20":1,"21":1,"35":1,"41":1,"45":1,"49":1,"56":1,"60":1,"63":1,"64":1,"65":1,"90":1,"93":1,"97":1,"105":1,"110":1,"115":1,"121":1,"127":1,"132":1,"139":1,"143":1,"149":1,"255":1,"257":1,"280":1,"282":2,"295":1,"296":1,"300":1,"319":1,"327":1,"339":1,"342":1},"1":{"256":1,"257":1,"258":1,"259":1,"281":1,"283":2,"284":2,"296":1,"301":1,"302":1,"303":1,"304":1},"2":{"24":1,"27":1,"39":1,"77":1,"101":1,"113":1,"116":1,"118":1,"122":1,"137":1,"148":1,"219":1,"260":1,"272":2,"277":2,"283":1,"295":1,"306":1,"320":1,"343":6,"347":2}}],["稳定性更改和错误修复",{"2":{"10":1}}],["在全局装载命名空间中强制运行",{"2":{"351":1}}],["在全局装载命名空间中强制运行用法",{"2":{"351":1}}],["在隔离的挂载命名空间中执行命令并执行",{"2":{"350":2}}],["在像",{"2":{"349":1}}],["在重新打包期间修改标头配置",{"2":{"347":2}}],["在不接触恢复分区的情况下刷入",{"2":{"248":1}}],["在线转储或",{"2":{"248":1}}],["在这些设备上应用",{"2":{"248":1}}],["在这种情况下",{"2":{"220":1,"227":1,"230":1}}],["在执行以下步骤之前",{"2":{"246":1}}],["在按照以下说明操作之前",{"2":{"242":1}}],["在您的",{"2":{"235":1}}],["在继续之前",{"2":{"231":1}}],["在方式中选择",{"2":{"228":1,"235":1}}],["在出厂时搭载",{"2":{"227":1}}],["在主屏幕中",{"2":{"227":1}}],["在你开始之前",{"2":{"227":1}}],["在magisk中",{"2":{"219":1}}],["在magisk部分",{"2":{"164":1}}],["在提取所有文件并设置默认权限和",{"2":{"215":1}}],["在我隐藏",{"0":{"202":1}}],["在此版本中",{"2":{"331":1,"337":1}}],["在此模式下",{"2":{"195":1}}],["在此路径中",{"2":{"190":2}}],["在稍后的引导过程中",{"2":{"195":1}}],["在使用",{"2":{"193":1}}],["在已停产",{"2":{"193":1}}],["在模块的所有脚本中",{"2":{"209":1}}],["在模块目录的相应位置创建指向",{"2":{"186":1}}],["在模拟器设置中禁用",{"2":{"169":1}}],["在模拟器设置中启用",{"2":{"169":1}}],["在某些情况下",{"2":{"186":1}}],["在修补引导映像时会对预启动分区进行硬编码",{"2":{"181":1}}],["在以下位置创建名为",{"2":{"174":1}}],["在选择预初始化分区时",{"2":{"91":1,"334":1}}],["在发布版本中",{"2":{"87":1}}],["在处理原生",{"2":{"85":1}}],["在官方网站上下载并安装最新的",{"2":{"83":1}}],["在官方网站上下载并安装",{"2":{"83":1}}],["在正常启动时无法运行",{"2":{"80":1}}],["在",{"0":{"86":1,"172":1},"2":{"76":1,"77":1,"79":1,"80":1,"83":5,"86":2,"186":1,"190":2,"193":1,"197":2,"206":2,"219":1,"220":3,"230":1,"234":1,"247":1,"347":6}}],["在超级用户请求对话框中添加抽头劫持保护",{"2":{"10":1}}],["在日志菜单中保存日志时",{"2":{"9":1}}],["收集设备属性",{"2":{"9":1}}],["40",{"2":{"107":1}}],["4a",{"2":{"106":2,"294":1}}],["4+",{"2":{"32":1}}],["4",{"0":{"9":1,"16":1,"18":1,"33":1,"39":1,"44":1,"45":1,"46":1,"54":1,"103":1,"108":1,"113":1,"125":1,"130":1,"255":1,"257":1,"270":1,"288":1,"297":1,"298":1,"305":1,"328":1,"333":1,"340":1},"1":{"256":1,"257":1,"258":1,"259":1,"271":1,"272":1,"273":1,"274":1,"289":1,"290":1,"291":1,"298":1,"299":1,"306":1,"329":1,"330":1,"331":1,"332":1,"334":1,"335":1,"336":1,"337":1,"338":1,"341":1,"342":1},"2":{"24":2,"92":1,"118":1,"132":1,"238":1,"257":1,"271":1,"275":2,"281":1,"290":1,"297":1,"343":3}}],["5g",{"2":{"106":2,"294":1}}],["5+",{"2":{"45":1}}],["5",{"0":{"8":1,"14":1,"15":1,"17":1,"38":2,"39":1,"40":1,"41":1,"42":1,"43":1,"47":1,"53":1,"70":1,"136":1,"137":1,"146":1,"240":1,"267":1,"307":1,"328":1},"1":{"308":1,"329":1,"330":1,"331":1,"332":1},"2":{"17":1,"45":1,"100":1,"102":2,"106":2,"137":1,"144":1,"158":1,"238":1,"294":1,"305":1,"307":1,"308":1}}],["轻微的ui更改",{"2":{"7":1}}],["64",{"0":{"263":1},"2":{"99":1,"117":2,"125":1,"151":1,"207":2,"263":2,"267":1}}],["6",{"0":{"7":1,"33":1,"34":1,"35":1,"36":1,"37":1,"52":1,"64":1,"124":1,"135":1,"146":1,"321":1,"324":1},"1":{"322":1,"323":1,"325":1,"326":1},"2":{"43":1,"77":1,"92":1,"95":1,"99":1,"216":1}}],["700",{"2":{"191":1}}],["7",{"0":{"6":1,"32":1,"63":1,"123":1,"250":1,"321":1,"327":1},"1":{"251":1,"252":1,"253":1,"254":1,"322":1,"323":1},"2":{"32":1,"76":1,"77":1,"79":1,"142":1,"153":1,"251":1}}],["0xffff",{"2":{"349":2}}],["0x4",{"2":{"347":2}}],["0x2",{"2":{"347":2}}],["0x1",{"2":{"347":2}}],["0x0000",{"2":{"349":2}}],["0x0",{"2":{"145":1}}],["03",{"2":{"238":1}}],["0+",{"2":{"16":1,"36":1,"102":2,"107":1,"181":1,"182":1,"185":1,"251":1,"281":3,"293":1}}],["0",{"0":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":2,"15":1,"16":1,"19":1,"20":1,"23":1,"24":2,"25":1,"26":1,"27":2,"28":1,"31":1,"32":1,"37":1,"43":1,"46":1,"48":1,"49":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":2,"62":1,"67":1,"69":1,"72":1,"73":1,"92":1,"95":1,"99":1,"100":1,"102":1,"107":1,"112":1,"117":1,"119":1,"122":1,"129":1,"134":1,"141":1,"145":1,"148":1,"250":1,"260":1,"275":1,"292":1,"300":1,"307":1,"309":1,"321":1,"328":1,"329":1,"334":1,"335":1},"1":{"251":1,"252":1,"253":1,"254":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"276":1,"277":1,"278":1,"279":1,"293":1,"301":1,"302":1,"303":1,"304":1,"308":1,"310":1,"311":1,"312":1,"313":1,"322":1,"323":1,"329":1,"330":1,"331":1,"332":1},"2":{"13":1,"17":1,"24":1,"25":1,"26":1,"45":1,"90":2,"91":2,"92":1,"100":1,"101":1,"102":1,"117":1,"118":1,"137":2,"144":1,"197":2,"209":1,"216":2,"238":1,"260":1,"267":2,"274":1,"279":1,"280":1,"281":1,"292":1,"294":2,"295":1,"297":1,"302":1,"303":1,"305":2,"306":1,"307":1,"308":1,"311":1,"314":2,"316":1,"322":1,"324":2,"325":1,"334":3,"339":2,"342":2,"343":9,"347":6}}],["v",{"2":{"350":4,"351":4,"352":2}}],["volatile",{"2":{"271":1,"276":1}}],["volume",{"2":{"116":1}}],["visible",{"2":{"321":1,"324":1}}],["view",{"2":{"242":1}}],["vintf",{"2":{"181":2}}],["video",{"2":{"115":1}}],["v9",{"0":{"151":1}}],["ve",{"2":{"312":1,"317":1}}],["vendor",{"2":{"106":1,"107":1,"116":1,"117":1,"122":1,"146":1,"150":3,"151":2,"181":2,"186":4,"190":2,"207":4,"210":2,"245":1,"290":1,"323":1,"326":1}}],["veritymode",{"2":{"151":1}}],["verity",{"2":{"106":1,"132":2,"137":1,"158":1,"228":2,"271":2,"276":2,"347":2}}],["verifiedbootstate",{"2":{"151":1}}],["verification",{"2":{"90":1,"228":2,"281":1,"323":2,"326":2,"339":1,"342":1}}],["verify",{"2":{"28":1,"95":1,"281":1}}],["verifying",{"2":{"24":1}}],["ver",{"2":{"78":1,"216":2,"235":1}}],["very",{"2":{"12":1,"43":1,"65":1,"125":1,"251":1,"253":1,"284":1,"290":1}}],["versioncode",{"2":{"208":3}}],["versioncode=",{"2":{"208":2}}],["version=",{"2":{"208":2}}],["versions",{"2":{"95":1,"143":1,"155":1,"156":1,"251":1,"253":1}}],["version",{"2":{"3":4,"26":1,"62":1,"65":1,"70":1,"71":1,"92":2,"156":1,"208":2,"223":4,"270":1,"305":1,"307":1,"351":2}}],["various",{"2":{"319":1,"327":1}}],["variables",{"2":{"135":2}}],["variable",{"2":{"99":1,"290":1}}],["valid",{"2":{"124":1,"271":1,"276":1,"347":4}}],["validation",{"2":{"100":1,"308":1}}],["values",{"2":{"148":1}}],["value",{"2":{"112":1,"212":1,"219":1,"349":2,"352":4}}],["v20",{"0":{"108":1,"109":1,"110":1,"111":1,"112":1,"275":1,"280":1,"282":1,"285":1,"288":1},"1":{"276":1,"277":1,"278":1,"279":1,"281":1,"283":1,"284":1,"286":1,"287":1,"289":1,"290":1,"291":1},"2":{"216":1,"238":1,"280":1,"281":2,"283":1,"290":1,"343":5}}],["v22",{"0":{"101":1,"102":1,"300":1,"305":1},"1":{"301":1,"302":1,"303":1,"304":1,"306":1},"2":{"302":1,"305":2,"307":1,"343":2}}],["v23",{"0":{"100":1,"307":1},"1":{"308":1},"2":{"238":1,"305":1,"307":1,"343":1}}],["v24",{"0":{"96":1,"97":1,"98":1,"99":1,"309":1,"314":1,"319":1,"320":1},"1":{"310":1,"311":1,"312":1,"313":1,"315":1,"316":1,"317":1,"318":1},"2":{"311":1,"314":3,"316":1,"320":2,"343":4}}],["v25",{"0":{"93":1,"94":1,"95":1,"321":1,"324":1,"327":1},"1":{"322":1,"323":1,"325":1,"326":1},"2":{"321":1,"323":1,"324":4,"326":1,"343":3}}],["v26+",{"2":{"180":1,"331":1,"337":1}}],["v26",{"0":{"89":1,"90":1,"91":1,"92":1,"328":1,"333":1,"334":1,"339":1,"340":1,"341":1,"342":1},"1":{"329":1,"330":1,"331":1,"332":1,"334":1,"335":1,"336":1,"337":1,"338":1,"341":1,"342":1},"2":{"91":2,"181":1,"182":1,"185":1,"243":2,"334":3,"343":4}}],["v2",{"0":{"70":1,"71":1,"72":1,"158":1},"2":{"108":1,"114":1,"122":1,"124":1,"180":3,"181":1,"182":1,"185":1,"291":1}}],["v21",{"0":{"103":1,"104":1,"105":1,"106":1,"107":1,"292":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1},"1":{"293":1,"296":1,"298":1,"299":1},"2":{"13":1,"292":1,"294":3,"295":2,"297":3,"343":4}}],["v3",{"0":{"68":1,"69":1,"157":1},"2":{"96":1,"105":1,"106":1,"156":1,"296":1,"320":1}}],["v4",{"0":{"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"156":1},"2":{"92":1,"99":1,"332":1,"338":1}}],["v5",{"0":{"28":2,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"155":1}}],["v6",{"0":{"25":1,"26":1,"27":1,"154":1}}],["v10",{"0":{"149":1,"150":1}}],["v11",{"0":{"146":1,"147":1,"148":1}}],["v12",{"0":{"145":1}}],["v13",{"0":{"142":1,"143":1,"144":1},"2":{"143":1}}],["v19",{"0":{"113":1,"114":1,"115":1,"116":1,"117":1,"260":1,"267":1,"270":1},"1":{"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"271":1,"272":1,"273":1,"274":1},"2":{"260":1,"263":1,"267":2,"271":1,"275":2,"343":5}}],["v19+",{"2":{"23":1}}],["v1",{"0":{"73":1,"159":1},"2":{"108":1,"119":1,"120":1,"148":1,"156":1,"291":1}}],["v14",{"0":{"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1},"2":{"43":1,"45":2}}],["v16",{"0":{"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1},"2":{"32":1}}],["v17",{"0":{"120":1,"121":1,"122":1},"2":{"27":1}}],["v15",{"0":{"130":1,"131":1,"132":1,"133":1,"134":1},"2":{"26":1}}],["v18+",{"2":{"253":1}}],["v18",{"0":{"118":1,"119":1,"250":1,"255":1},"1":{"251":1,"252":1,"253":1,"254":1,"256":1,"257":1,"258":1,"259":1},"2":{"24":1,"25":1,"251":1,"259":1,"260":1,"267":1,"343":2}}],["v7a",{"2":{"207":2}}],["v7",{"0":{"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"153":1},"2":{"238":1,"281":1}}],["vbmeta",{"2":{"12":1,"95":1,"99":2,"111":1,"227":9,"228":8,"237":1,"347":2}}],["v8a",{"2":{"207":2}}],["v8",{"0":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"152":1}}],["历史",{"0":{"4":1}}],["s2",{"2":{"349":6}}],["s21",{"2":{"102":1,"304":1}}],["s1",{"2":{"349":6}}],["s10",{"2":{"12":1,"80":1,"230":1,"266":1}}],["sql",{"2":{"350":4}}],["sqlite",{"2":{"36":1,"350":2}}],["squashing",{"2":{"289":1}}],["squashed",{"2":{"270":1}}],["slowing",{"2":{"148":1}}],["slot",{"2":{"28":1,"47":1,"99":1,"122":1,"129":1,"132":2,"140":1}}],["skeleton",{"2":{"140":1,"151":1}}],["skips",{"2":{"323":1,"326":1}}],["skipunzip=1",{"2":{"215":1}}],["skip",{"2":{"99":2,"117":1,"129":1,"132":1,"140":2,"207":4}}],["skipped",{"2":{"94":1}}],["smaller",{"2":{"156":1}}],["small",{"2":{"126":1,"137":1,"156":1}}],["s0",{"2":{"125":2,"148":1,"166":1,"191":1,"217":4,"349":1}}],["s9+",{"2":{"124":1}}],["s9",{"2":{"124":1}}],["spawned",{"2":{"251":2}}],["spawn",{"2":{"135":1,"144":1}}],["spaces",{"2":{"148":2}}],["space",{"2":{"124":1,"157":2}}],["split",{"2":{"117":1,"132":1,"134":1,"347":2,"349":8}}],["specific",{"2":{"132":1,"277":1,"284":1,"322":1,"325":1}}],["specify",{"2":{"99":1,"311":1,"316":1}}],["special",{"2":{"108":1,"138":1,"256":1,"281":1,"291":1}}],["speed",{"2":{"46":1,"144":1,"148":1}}],["sbin",{"2":{"107":1,"111":1,"113":1,"116":1,"117":1,"119":2,"124":1,"125":1,"130":1,"137":2,"143":1,"150":2,"190":4,"220":7,"252":5,"293":2}}],["src",{"2":{"86":1,"350":6}}],["sd",{"2":{"243":1}}],["sdk",{"2":{"83":2,"86":3,"119":1}}],["sdcard",{"2":{"28":1,"228":2,"235":2}}],["similar",{"2":{"312":1,"317":1}}],["simply",{"2":{"271":1,"276":1}}],["simple",{"2":{"125":1}}],["simplify",{"2":{"124":1,"141":1}}],["since",{"2":{"145":1,"154":1,"155":1,"256":1,"262":1,"264":1,"266":1,"271":2,"276":2,"289":1,"302":1,"309":1,"310":1,"314":1,"315":1,"322":2,"323":1,"325":2,"326":1}}],["single",{"2":{"99":1,"148":1,"290":1}}],["silent",{"2":{"131":1}}],["silicon",{"2":{"83":1}}],["situations",{"2":{"120":1}}],["sideload",{"2":{"243":1}}],["side",{"2":{"120":1,"124":1}}],["sigstop",{"2":{"150":1}}],["sigwinch",{"2":{"119":1}}],["signed",{"2":{"56":1}}],["signals",{"2":{"113":1}}],["signal",{"2":{"101":1,"306":1}}],["signapk",{"2":{"43":1}}],["signature",{"2":{"16":1,"95":1,"101":1,"281":1,"306":1,"323":2,"326":2}}],["significant",{"2":{"322":1,"325":1}}],["significantly",{"2":{"24":1,"46":1,"95":1,"106":1,"107":1,"125":1,"144":1,"290":1}}],["signing",{"2":{"24":1,"45":1,"56":1,"90":1,"323":1,"326":1,"339":1,"342":1}}],["sign",{"2":{"16":1,"137":1,"281":1}}],["size",{"2":{"107":2,"111":1,"126":1,"135":1,"144":1,"156":1,"263":1}}],["sys",{"2":{"145":1,"146":2,"184":2,"196":1,"220":4,"349":2}}],["sysfs",{"2":{"124":1}}],["syscall",{"2":{"96":1,"320":1}}],["systemmagisk",{"2":{"166":1}}],["systemless",{"2":{"25":1,"119":2,"143":1,"158":1}}],["system",{"0":{"166":1,"210":1,"212":1,"271":1,"274":1,"276":1,"279":1},"2":{"18":1,"25":1,"49":1,"57":1,"76":3,"77":6,"79":3,"92":1,"95":1,"97":1,"99":2,"105":1,"108":2,"113":4,"116":2,"117":2,"120":1,"121":1,"122":3,"124":1,"127":1,"138":1,"141":1,"144":1,"150":4,"151":3,"154":1,"157":1,"166":1,"169":2,"181":2,"186":3,"190":6,"193":1,"206":3,"207":16,"210":10,"217":10,"220":1,"245":1,"267":1,"271":13,"272":2,"273":1,"274":1,"276":13,"277":2,"278":1,"279":1,"290":2,"291":2,"296":1,"319":1,"323":2,"326":2,"348":1,"351":2}}],["symlinks",{"2":{"126":1,"148":2,"150":1,"252":1}}],["symlink",{"2":{"93":1,"327":1}}],["syntax",{"2":{"90":1,"148":1,"293":1,"339":1,"342":1}}],["sync",{"2":{"40":1,"302":1}}],["sustainable",{"2":{"322":1,"325":1}}],["sunsetting",{"0":{"311":1,"316":1}}],["such",{"2":{"227":2}}],["sulist",{"0":{"177":1},"2":{"177":2}}],["sukernel",{"2":{"150":1}}],["suid",{"2":{"150":1}}],["substantial",{"2":{"321":1,"324":1}}],["subshell",{"2":{"141":1}}],["subject",{"2":{"310":1,"315":1}}],["subfolder",{"2":{"156":1}}],["subfolders",{"2":{"130":1}}],["sub",{"2":{"125":1}}],["submodules",{"2":{"83":2,"223":2}}],["surface",{"2":{"321":1,"324":1}}],["survival",{"2":{"144":1}}],["survive",{"2":{"106":1}}],["sure",{"2":{"105":1,"111":1,"124":1,"148":2,"283":1,"296":1,"323":1,"326":1}}],["suffix",{"2":{"106":1,"129":1}}],["sudb",{"2":{"41":1}}],["su",{"0":{"351":1},"2":{"37":1,"45":1,"54":1,"97":2,"103":1,"115":1,"120":1,"124":1,"125":1,"135":2,"144":1,"145":1,"148":7,"157":1,"166":1,"169":4,"197":3,"298":1,"319":2,"346":2,"350":2,"351":3}}],["supplement",{"2":{"311":1,"316":1}}],["supposedly",{"2":{"251":1}}],["supposed",{"2":{"148":1}}],["supports",{"2":{"92":1,"99":1,"143":1,"307":1}}],["supported",{"2":{"92":1,"150":1,"151":2,"263":1,"271":1,"272":1,"276":1,"277":1,"281":1}}],["supporting",{"2":{"43":1,"253":1}}],["support",{"0":{"253":1,"256":1,"257":1,"272":1,"273":1,"277":1,"278":1},"2":{"13":2,"15":2,"17":1,"21":1,"23":2,"24":3,"25":1,"26":1,"27":2,"28":1,"31":1,"35":1,"41":1,"43":2,"45":6,"47":1,"49":1,"58":2,"60":1,"64":1,"65":2,"70":1,"90":11,"92":4,"95":3,"97":1,"99":12,"100":1,"102":2,"106":5,"107":5,"108":6,"110":2,"111":2,"112":5,"113":6,"114":1,"115":1,"116":2,"117":6,"118":3,"119":2,"120":2,"121":1,"122":1,"123":2,"124":4,"125":1,"128":4,"129":1,"130":4,"132":3,"134":2,"135":1,"137":7,"138":1,"140":6,"142":1,"144":8,"145":2,"148":4,"150":1,"151":1,"152":1,"153":3,"156":2,"158":3,"253":2,"257":1,"265":1,"266":2,"267":2,"272":1,"275":1,"283":1,"291":6,"292":1,"293":1,"294":1,"304":1,"305":2,"307":1,"308":1,"319":1,"323":1,"326":1,"339":11,"342":11}}],["supolicy",{"2":{"148":1,"153":1,"156":1,"157":1,"158":1,"346":2,"349":1}}],["superior",{"2":{"153":1}}],["supersu",{"2":{"145":1,"150":2,"151":1,"152":2,"153":2,"156":1,"158":1,"349":1,"351":1}}],["superuser",{"2":{"26":1,"39":1,"42":1,"43":1,"46":1,"67":3,"97":1,"148":3,"153":1,"158":1,"319":1,"323":1,"326":1}}],["say",{"2":{"252":1,"260":1}}],["sandbox",{"2":{"107":1,"251":1,"293":1}}],["safe",{"2":{"107":2,"135":1,"293":2}}],["safety",{"2":{"69":1,"151":1}}],["safetynet",{"2":{"33":1,"43":1,"46":1,"58":1,"68":1,"100":1,"144":1,"145":1,"152":1,"289":2,"308":1}}],["samloader",{"2":{"235":1}}],["samfirm",{"2":{"235":2}}],["same",{"2":{"102":1,"122":2,"135":1,"148":2,"275":1,"323":1,"324":1,"326":1}}],["sample",{"2":{"84":1}}],["samsung",{"2":{"12":1,"13":1,"21":1,"62":1,"64":1,"90":1,"92":1,"97":1,"111":1,"120":1,"122":1,"124":2,"125":1,"130":1,"132":1,"138":1,"141":2,"145":7,"146":1,"150":1,"157":4,"232":3,"266":1,"267":1,"319":1,"339":1,"342":1}}],["sarcompat",{"2":{"113":1}}],["sar",{"2":{"76":1,"77":2,"78":5,"79":2,"80":1,"94":1,"105":1,"106":1,"113":1,"296":1}}],["saving",{"2":{"45":1}}],["save",{"2":{"37":1,"45":1,"107":1,"349":2}}],["shift",{"2":{"322":1,"325":1}}],["shine",{"2":{"310":1,"315":1}}],["ship",{"2":{"271":1,"276":1}}],["ships",{"2":{"262":1}}],["shreplace=",{"2":{"217":1}}],["shxxxxo",{"0":{"176":1},"2":{"176":1}}],["sh",{"0":{"209":1},"2":{"111":1,"119":1,"141":1,"144":1,"184":2,"186":1,"206":3,"207":6,"209":3,"214":5,"215":4,"218":3,"219":3,"220":7,"284":1,"351":2}}],["shamiko",{"2":{"201":1}}],["sha1",{"2":{"141":1,"347":6}}],["shadowed",{"2":{"130":1}}],["shared",{"2":{"95":1}}],["shareduserid",{"2":{"95":1,"323":1,"326":1}}],["shall",{"2":{"51":1,"104":1,"125":1,"145":1,"151":1,"290":1,"299":1}}],["shenanigans",{"2":{"81":1}}],["shellfastboot",{"2":{"228":3,"241":1,"242":1}}],["shelladb",{"2":{"200":1,"227":1,"228":1,"235":1}}],["shells",{"2":{"113":1,"122":1}}],["shell",{"0":{"209":1},"2":{"30":1,"49":2,"51":2,"99":1,"113":1,"122":1,"135":1,"141":2,"144":2,"148":2,"197":3,"200":4,"206":4,"215":1,"219":1,"227":4,"290":1,"349":1,"351":12}}],["short",{"2":{"144":1}}],["shortcuts",{"2":{"32":1}}],["shows",{"2":{"310":1,"315":1}}],["show",{"2":{"46":2}}],["shown",{"2":{"31":1}}],["showing",{"2":{"22":1,"49":1}}],["should",{"2":{"3":2,"39":1,"45":1,"99":1,"101":1,"114":2,"124":1,"125":1,"131":2,"132":2,"136":1,"138":3,"139":1,"143":2,"145":2,"148":1,"149":1,"150":1,"153":1,"157":2,"158":1,"223":2,"252":2,"253":1,"261":1,"262":1,"292":1,"306":1}}],["snet",{"2":{"28":1,"100":1,"308":1}}],["scenarios",{"2":{"322":1,"325":1}}],["scenario",{"2":{"145":1}}],["scan",{"2":{"111":1}}],["scheme",{"2":{"27":1,"121":1}}],["scratch",{"2":{"101":1,"107":2,"151":2,"292":1,"306":1,"322":1,"325":1}}],["scripting",{"2":{"290":1}}],["script",{"2":{"47":1,"50":1,"89":1,"122":4,"124":1,"131":1,"137":2,"140":4,"141":7,"144":2,"148":1,"151":1,"152":1,"172":1,"206":2,"214":3,"219":1,"283":1,"341":1}}],["scripts",{"2":{"24":1,"40":1,"47":1,"63":1,"101":1,"105":1,"106":1,"108":4,"110":1,"117":1,"119":2,"120":2,"123":1,"124":4,"132":2,"141":4,"144":6,"147":1,"149":1,"150":1,"158":1,"252":3,"283":1,"290":4,"291":4,"296":1,"306":1}}],["screen",{"2":{"13":1,"14":1,"46":1,"148":1}}],["s",{"2":{"26":1,"95":3,"97":1,"107":1,"113":1,"148":1,"156":1,"157":1,"158":2,"186":2,"216":1,"220":2,"232":1,"264":1,"271":1,"272":1,"276":1,"277":1,"282":1,"290":2,"292":1,"293":1,"309":1,"314":1,"319":1,"323":2,"326":2,"351":2}}],["sw",{"2":{"235":1}}],["sweet",{"2":{"19":1,"20":1}}],["switched",{"2":{"263":1}}],["switching",{"2":{"58":1,"90":1,"137":1,"339":1,"342":1}}],["switch",{"2":{"12":1,"45":1,"49":1,"99":1,"120":1,"125":1,"145":1,"271":1,"276":1}}],["stderr",{"2":{"352":2}}],["stdout",{"2":{"347":4}}],["stdin",{"2":{"347":4}}],["step",{"2":{"264":1}}],["straightforward",{"2":{"284":1}}],["strategy",{"2":{"101":1,"306":1}}],["structural",{"2":{"253":1}}],["structure",{"2":{"140":1,"284":1}}],["structures",{"2":{"101":1,"306":1}}],["strengthened",{"2":{"123":1}}],["stripped",{"2":{"148":1,"322":1,"325":1}}],["strip",{"2":{"101":1,"107":1,"306":1}}],["strings",{"2":{"113":1,"235":2}}],["string",{"2":{"70":1,"208":12,"216":2}}],["stuff",{"2":{"292":1}}],["stupid",{"2":{"252":1}}],["stuck",{"2":{"145":1}}],["studio",{"0":{"86":1},"2":{"83":4,"85":2,"86":2}}],["stubs",{"2":{"281":2}}],["stub",{"2":{"15":1,"16":1,"92":1,"93":2,"95":1,"97":1,"100":2,"102":1,"111":1,"124":1,"281":4,"308":2,"319":1,"327":2}}],["stick",{"2":{"41":1}}],["still",{"2":{"27":1,"148":2,"252":2,"256":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"271":1,"276":1,"284":1}}],["stay",{"2":{"148":1,"259":1,"265":1,"272":1}}],["stage",{"2":{"113":1,"119":2,"125":1,"252":3,"272":2,"277":2}}],["standalone=1",{"2":{"206":1}}],["standalone",{"0":{"290":1},"2":{"108":1,"206":3,"290":2,"291":1}}],["standard",{"2":{"99":1}}],["standards",{"2":{"38":1}}],["stability",{"2":{"98":1,"289":1}}],["stable",{"2":{"27":1,"29":1,"45":1,"59":1,"250":1,"259":1,"267":1,"270":1}}],["state",{"2":{"127":1,"134":1,"145":1}}],["statement",{"2":{"107":1}}],["states",{"2":{"102":1,"145":1}}],["static",{"2":{"66":1,"263":1}}],["status",{"2":{"46":1,"58":1,"69":3,"119":1,"144":1,"145":2,"350":2}}],["starts",{"2":{"264":1}}],["starting",{"2":{"251":2,"263":1,"265":1,"271":1,"281":1,"290":1,"302":1}}],["started",{"2":{"125":1,"141":1,"148":1}}],["start",{"0":{"195":1},"2":{"119":1,"125":1,"130":1,"141":1,"145":2,"147":1,"184":2,"191":2,"195":1,"207":2,"219":4,"220":4,"276":1,"282":1}}],["startup",{"2":{"66":1,"125":1}}],["star",{"0":{"4":1}}],["stopped",{"2":{"119":1}}],["stopping",{"2":{"102":1,"304":1}}],["stop",{"2":{"96":1,"115":1,"119":1,"253":1,"320":1,"350":2}}],["storing",{"2":{"252":1}}],["stored",{"2":{"119":1,"262":2,"283":1,"284":1}}],["store",{"2":{"47":1,"69":1,"252":1}}],["storage",{"2":{"26":1,"46":1,"47":1,"48":1,"90":1,"138":1,"271":1,"276":1,"339":1,"342":1}}],["stock",{"2":{"26":1,"48":1,"107":1,"110":1,"140":1,"141":4,"145":1,"153":1,"157":1}}],["segfault",{"2":{"143":1}}],["segmentation",{"2":{"131":1}}],["seamlessly",{"2":{"138":1}}],["search",{"2":{"71":1}}],["send",{"2":{"120":1,"150":1}}],["separately",{"2":{"302":1}}],["separates",{"2":{"293":1}}],["separate",{"2":{"124":1,"146":1,"150":1,"151":1}}],["separated",{"2":{"104":1,"124":1,"299":1}}],["sepolicy",{"0":{"213":1,"283":1,"331":1,"337":1},"2":{"90":2,"92":1,"93":1,"95":1,"100":2,"101":1,"106":1,"108":1,"110":1,"117":1,"119":1,"122":1,"125":1,"130":1,"145":1,"146":1,"147":1,"148":3,"153":1,"156":2,"157":2,"158":1,"166":1,"181":1,"193":5,"197":1,"207":4,"213":1,"243":1,"283":4,"284":1,"291":1,"306":1,"308":2,"322":1,"325":1,"327":1,"331":1,"337":1,"339":2,"342":2,"349":11}}],["sepolicies",{"2":{"32":1,"132":1}}],["serialized",{"2":{"121":1}}],["series",{"2":{"102":1,"304":1}}],["services",{"2":{"117":1,"125":1,"251":2,"256":1}}],["service",{"2":{"89":1,"90":2,"117":1,"121":1,"122":1,"131":1,"141":1,"145":1,"148":1,"184":2,"191":2,"195":1,"196":5,"207":2,"209":2,"219":7,"220":4,"251":1,"252":1,"339":2,"341":1,"342":2,"350":2,"352":2}}],["server",{"2":{"45":1,"95":1}}],["sessions",{"2":{"101":1,"306":1}}],["selabel",{"2":{"141":1}}],["selinuxfs",{"2":{"193":1}}],["selinux",{"0":{"197":1},"2":{"107":1,"108":1,"138":1,"143":1,"144":1,"145":2,"146":3,"153":2,"158":1,"166":3,"197":1,"206":1,"290":1,"291":1,"293":1,"322":1,"325":1,"329":1,"331":2,"335":1,"337":2,"349":4,"350":4}}],["selected",{"2":{"99":1}}],["selection",{"2":{"64":1}}],["selecting",{"2":{"62":1,"91":1,"334":1}}],["self",{"2":{"47":1,"95":1,"116":1}}],["sever",{"2":{"46":1}}],["several",{"2":{"12":1,"15":1,"23":1,"36":1,"46":1,"49":1,"100":1,"125":1,"136":1,"137":1,"266":1,"271":2,"275":1,"276":2,"308":1,"322":1,"325":1}}],["secure",{"2":{"146":1,"323":1,"326":1}}],["security",{"0":{"323":1,"326":1},"2":{"107":1,"125":1,"130":1,"193":1,"293":1,"309":1,"314":1}}],["seccomp",{"2":{"123":1}}],["secontext",{"2":{"122":1,"191":2,"215":2}}],["seconds",{"2":{"105":1,"107":2,"296":1}}],["second",{"2":{"47":1,"347":2}}],["secondary",{"2":{"46":1,"106":1}}],["sections",{"2":{"71":1,"124":1}}],["section",{"2":{"26":2,"43":1,"64":1,"67":2,"69":2,"70":1,"72":1}}],["setprop",{"2":{"184":2,"196":2,"219":1,"220":4,"352":2}}],["set",{"2":{"71":1,"97":1,"99":1,"111":1,"124":2,"132":1,"135":1,"143":1,"158":1,"217":10,"319":1,"349":16}}],["setups",{"2":{"274":1,"279":1,"322":1,"325":1}}],["setup",{"2":{"45":1,"107":2,"112":1,"116":1,"117":1,"271":1,"276":1,"290":1,"293":1}}],["setting",{"2":{"42":1,"90":1,"141":1,"339":1,"342":1}}],["settings",{"2":{"18":1,"23":1,"25":1,"28":4,"36":2,"41":1,"43":1,"46":1,"48":1,"49":1,"64":1,"67":1,"71":1,"97":1,"144":1,"148":1,"319":1}}],["seen",{"2":{"323":1,"326":1}}],["seems",{"2":{"289":1}}],["seemingly",{"2":{"266":1}}],["see",{"2":{"3":4,"223":4,"292":1,"309":1,"312":1,"314":1,"317":1}}],["solving",{"2":{"322":1,"325":1}}],["sole",{"2":{"272":1}}],["solely",{"2":{"252":1}}],["solution",{"2":{"257":1,"265":1}}],["solutions",{"2":{"153":2,"266":1}}],["source",{"2":{"141":1,"144":1,"153":1,"156":2,"347":4,"349":20}}],["soon",{"2":{"95":1}}],["sony",{"2":{"95":1,"99":1,"347":2}}],["sockets",{"2":{"103":1,"122":1,"135":1,"197":1,"298":1}}],["socket",{"2":{"90":1,"130":1,"339":1,"342":1}}],["so",{"2":{"51":1,"102":1,"106":1,"108":1,"144":2,"148":1,"207":8,"252":1,"253":1,"256":1,"257":1,"260":1,"264":1,"289":1,"291":1,"292":1,"304":1,"310":2,"315":2,"322":1,"325":1}}],["sorted",{"2":{"70":1}}],["sorting",{"2":{"41":1}}],["sort",{"2":{"17":1}}],["software",{"2":{"3":4,"223":4,"322":2,"325":2}}],["somewhere",{"2":{"283":1}}],["sometimes",{"2":{"271":2,"276":2,"322":1,"325":1}}],["some",{"2":{"0":1,"22":1,"26":1,"38":1,"42":1,"45":1,"50":1,"99":4,"100":1,"108":1,"111":1,"113":1,"115":1,"117":1,"125":1,"131":2,"132":2,"133":1,"157":2,"158":1,"251":1,"262":1,"266":1,"267":1,"280":1,"281":1,"283":1,"291":1,"292":1,"293":1,"294":1,"302":1,"308":1,"314":1,"322":2,"323":1,"324":1,"325":2,"326":1}}],["essential",{"2":{"273":1,"278":1}}],["especially",{"2":{"145":1}}],["edde",{"2":{"225":1}}],["edge",{"2":{"134":1}}],["echo",{"2":{"217":2}}],["efforts",{"2":{"259":1}}],["effort",{"2":{"254":1}}],["efficient",{"2":{"135":1}}],["effective",{"2":{"251":1,"289":1,"310":1,"315":1}}],["effectively",{"2":{"251":1}}],["effect",{"2":{"102":1,"304":1}}],["everlasting",{"2":{"310":1,"315":1}}],["ever",{"2":{"302":1,"310":1,"315":1,"322":1,"323":1,"325":1,"326":1}}],["everyone",{"2":{"281":1}}],["every",{"2":{"148":1,"283":1,"290":1,"293":1,"312":1,"317":1,"322":1,"325":1}}],["everything",{"2":{"125":1,"138":1,"146":1,"148":1,"153":1,"302":1}}],["events",{"2":{"264":2}}],["eventually",{"2":{"253":1,"257":1}}],["even",{"2":{"3":2,"125":1,"223":2,"252":1,"256":1,"264":2,"271":1,"276":1}}],["eliminate",{"2":{"151":1}}],["eliminates",{"2":{"124":1}}],["elsewhere",{"2":{"102":1}}],["emmc",{"2":{"144":2}}],["empty",{"2":{"128":1,"202":1}}],["embed",{"2":{"141":1}}],["embedded",{"2":{"124":1}}],["embryo",{"2":{"122":1}}],["emulator",{"2":{"122":1}}],["emui",{"0":{"240":1,"241":1,"242":1,"256":1},"2":{"114":1,"118":1,"123":1,"238":1,"241":1,"242":1}}],["erecovery",{"2":{"240":1}}],["erofs",{"2":{"114":1,"271":1,"276":1}}],["error",{"2":{"31":1,"45":1,"47":1,"92":1,"97":1,"111":1,"319":1,"347":4}}],["errors",{"2":{"28":1,"100":2,"123":2,"308":2}}],["etc",{"2":{"99":1,"108":1,"150":1,"181":2,"186":4,"291":1}}],["easy",{"2":{"284":1}}],["easier",{"2":{"254":1}}],["easily",{"2":{"28":1,"271":1,"276":1}}],["each",{"2":{"144":1}}],["earlymountv2=true",{"2":{"180":2}}],["early",{"2":{"97":1,"114":1,"117":1,"120":2,"123":1,"141":1,"180":7,"181":5,"182":2,"184":9,"185":2,"220":4,"277":1,"319":1,"322":1,"325":1}}],["e",{"2":{"31":1,"33":1,"49":1,"95":1,"106":1,"116":1,"121":1,"125":1,"132":1,"253":1,"271":1,"276":1,"283":1,"290":1}}],["ensure",{"2":{"323":1,"326":1}}],["enhancements",{"0":{"323":1,"326":1}}],["enhanced",{"2":{"251":1}}],["enjoy",{"2":{"267":1,"281":1}}],["enough",{"2":{"264":1}}],["engine",{"2":{"186":4}}],["entry",{"2":{"130":1,"152":1,"347":26}}],["entering",{"2":{"26":1}}],["encourages",{"2":{"261":1}}],["encoder",{"2":{"143":1}}],["encoded",{"2":{"141":1}}],["encode",{"2":{"125":1}}],["encryption",{"2":{"47":1,"93":1,"101":1,"120":1,"134":1,"140":1,"191":1,"306":1,"327":1}}],["env",{"2":{"99":1,"347":6}}],["environment",{"2":{"30":1,"31":1,"49":1,"135":2,"290":3,"351":2}}],["enforced",{"2":{"148":1,"261":1,"271":1,"276":1}}],["enforce",{"2":{"94":1,"95":1,"145":1,"146":1,"253":1,"323":1,"326":1,"349":2}}],["end",{"2":{"50":1,"254":1,"262":1,"292":1}}],["enable",{"2":{"27":1,"108":1,"122":1,"141":1,"291":1,"350":2}}],["enabled",{"2":{"23":1,"26":1,"108":1,"144":1,"158":1,"209":1,"257":1,"289":2,"290":1,"291":1,"312":1,"317":1}}],["exit",{"2":{"217":2,"218":1}}],["existence",{"2":{"262":1}}],["exists",{"2":{"107":1,"117":1,"119":1,"347":2}}],["exist",{"2":{"47":1,"140":1,"293":1,"322":1,"325":1}}],["existing",{"0":{"301":1},"2":{"12":1,"28":1,"92":1,"101":1,"252":1,"261":3,"262":1,"267":1,"271":2,"276":2,"303":1,"306":1,"310":1,"315":1}}],["example",{"2":{"184":2,"220":4,"322":1,"325":1}}],["exynos",{"2":{"157":1}}],["exceptions",{"2":{"135":1}}],["except",{"2":{"135":1}}],["excessive",{"2":{"27":1}}],["extremely",{"2":{"260":1,"264":2}}],["extreme",{"2":{"117":1,"151":1}}],["extractor",{"2":{"239":1}}],["extract",{"2":{"141":2,"157":1,"347":2}}],["extraction",{"2":{"95":1}}],["extracting",{"2":{"90":1,"140":1,"339":1,"342":1}}],["extra",{"2":{"107":1,"119":1,"124":1,"261":1,"347":2}}],["ext",{"2":{"99":1,"190":2,"207":4,"210":2}}],["ext4",{"2":{"91":2,"117":1,"122":1,"124":1,"127":1,"144":1,"262":2,"271":1,"276":1,"334":2}}],["extended",{"2":{"90":2,"339":2,"342":2}}],["extension",{"2":{"28":1,"46":1,"100":1,"308":1}}],["external",{"2":{"46":2,"49":1,"144":1,"290":1,"322":1,"325":1}}],["executed",{"2":{"131":1,"148":1}}],["execute",{"2":{"111":1}}],["executing",{"2":{"106":1,"136":1}}],["execution",{"2":{"97":1,"319":1}}],["executables",{"2":{"89":1,"341":1}}],["exec",{"2":{"77":3,"141":1,"197":2,"350":2}}],["expected",{"2":{"277":1,"284":1}}],["expect",{"2":{"253":1,"266":1}}],["experienced",{"2":{"284":1}}],["experience",{"2":{"25":1,"42":1,"258":1,"301":1}}],["exposes",{"2":{"251":1}}],["exported",{"2":{"94":1}}],["expanding",{"2":{"68":1,"295":1}}],["either",{"2":{"3":2,"223":2,"252":1}}],["were",{"2":{"267":1,"270":1,"322":1,"325":1}}],["welcome",{"2":{"256":1}}],["weirdly",{"2":{"125":1}}],["weird",{"2":{"113":1,"124":1,"141":1,"322":1,"325":1}}],["weirdness",{"2":{"105":1,"296":1}}],["we",{"2":{"102":1,"251":1,"260":1}}],["webview",{"2":{"24":1}}],["wrap",{"2":{"292":1}}],["wrapper",{"2":{"108":1,"124":1,"168":1,"291":1}}],["wrong",{"2":{"45":1}}],["write",{"2":{"103":1,"144":1,"148":1,"251":1,"298":1}}],["writer",{"2":{"101":1,"306":1}}],["written",{"2":{"18":1,"144":1}}],["writing",{"2":{"12":1,"271":1,"276":1}}],["want",{"2":{"284":1}}],["was",{"2":{"254":1,"257":1,"262":1,"263":1,"264":1,"267":1,"311":1,"316":1,"322":1,"325":1}}],["wake",{"2":{"119":1}}],["wait",{"2":{"114":1,"312":1,"317":1}}],["warning",{"2":{"136":1,"223":1,"228":1,"235":1,"238":1,"243":2,"261":1,"262":1}}],["warn",{"2":{"102":1}}],["warranty",{"2":{"3":4,"223":4}}],["ways",{"2":{"310":1,"315":1}}],["waydroid",{"0":{"172":1},"2":{"168":1,"172":2}}],["way",{"2":{"45":1,"148":1,"150":2,"156":1,"255":1,"277":1,"281":1,"289":1,"310":1,"315":1}}],["would",{"2":{"131":1,"260":1}}],["worries",{"2":{"302":1}}],["words",{"0":{"259":1,"266":1}}],["world",{"2":{"107":1}}],["working",{"2":{"148":1,"264":1,"266":1,"277":1,"309":1,"314":1}}],["worker",{"2":{"138":1}}],["work",{"2":{"106":1,"107":1,"125":1,"135":1,"144":1,"145":2,"148":1,"150":1,"158":1,"252":1,"262":2,"271":2,"276":2}}],["workflow",{"2":{"96":1,"320":1}}],["workarounds",{"2":{"256":1}}],["workaround",{"2":{"95":1,"97":1,"108":2,"117":1,"122":1,"123":1,"129":1,"141":1,"291":2,"297":1,"319":1}}],["works",{"2":{"45":1,"148":1,"257":1}}],["won",{"2":{"37":1,"41":1,"140":1}}],["why",{"2":{"257":1,"272":1,"292":1,"310":1,"315":1}}],["whitelist",{"2":{"149":1}}],["while",{"2":{"143":1,"264":1,"309":1,"310":1,"314":1,"315":1}}],["which",{"2":{"42":1,"49":1,"108":1,"125":1,"133":1,"140":1,"251":3,"262":1,"271":1,"272":1,"276":1,"277":1,"281":1,"291":1,"310":1,"315":1,"322":1,"323":1,"325":1,"326":1}}],["whole",{"2":{"67":1,"93":1,"146":1,"253":1,"301":1,"322":2,"323":1,"325":2,"326":1,"327":1}}],["what",{"2":{"51":1,"148":1,"255":1,"266":1,"312":1,"317":1}}],["whether",{"2":{"99":1,"124":2,"132":1,"138":1,"281":1}}],["where",{"2":{"46":1,"120":1,"135":1,"148":1}}],["when",{"2":{"12":1,"16":1,"17":1,"24":1,"26":2,"27":1,"31":1,"32":1,"43":1,"45":2,"46":1,"47":1,"48":1,"49":1,"50":1,"52":1,"53":1,"55":1,"62":1,"64":1,"65":1,"71":3,"90":1,"91":2,"93":2,"97":1,"99":1,"100":3,"101":2,"102":2,"105":1,"106":2,"107":2,"108":1,"115":1,"120":1,"122":1,"124":1,"131":2,"136":1,"137":1,"141":1,"148":1,"149":1,"271":1,"276":1,"286":1,"291":1,"296":1,"302":1,"304":2,"306":2,"308":3,"312":1,"317":1,"319":1,"327":2,"334":2,"339":1,"342":1}}],["www",{"2":{"3":2,"223":4}}],["wip",{"2":{"265":1,"289":1}}],["wipe",{"2":{"124":1}}],["wiped",{"2":{"99":1}}],["wide",{"2":{"253":1}}],["widespread",{"2":{"251":1}}],["window",{"2":{"135":1}}],["windows",{"2":{"83":5,"105":1,"208":1,"232":1,"239":1,"243":1,"296":1}}],["will",{"2":{"3":2,"13":1,"46":2,"47":1,"49":1,"56":1,"61":1,"101":1,"107":2,"111":2,"124":1,"125":2,"135":3,"138":2,"141":1,"145":1,"146":1,"148":4,"151":2,"157":1,"158":2,"223":2,"251":2,"252":2,"253":2,"257":2,"260":1,"261":1,"262":2,"267":1,"271":7,"274":1,"276":7,"279":1,"281":6,"283":1,"289":1,"290":4,"293":1,"305":1,"306":1,"311":1,"312":1,"316":1,"317":1,"322":1,"325":1}}],["within",{"2":{"31":1,"49":1,"124":1,"140":1,"148":1,"149":1,"262":1,"302":1}}],["without",{"2":{"3":4,"48":1,"65":1,"90":1,"111":1,"113":1,"132":1,"223":4,"309":1,"314":1,"323":1,"326":1,"339":1,"342":1}}],["with",{"2":{"0":1,"3":2,"11":1,"15":1,"16":1,"27":1,"28":1,"31":1,"36":1,"37":1,"40":1,"41":1,"48":1,"50":2,"59":1,"90":2,"92":2,"95":1,"97":1,"102":1,"107":3,"108":1,"112":1,"113":1,"115":3,"117":1,"119":1,"121":1,"122":1,"124":3,"125":1,"128":1,"129":1,"136":1,"137":1,"138":1,"141":3,"144":1,"145":2,"146":1,"147":1,"148":4,"150":1,"151":1,"154":1,"156":1,"157":2,"223":2,"250":1,"251":1,"252":1,"254":1,"262":1,"264":1,"265":1,"271":4,"272":1,"275":1,"276":3,"277":1,"281":5,"282":1,"283":1,"286":1,"290":4,"291":1,"292":1,"293":1,"297":1,"319":1,"322":1,"325":1,"339":2,"342":2}}],["ux",{"2":{"323":1,"326":1}}],["utilized",{"2":{"254":1}}],["util",{"2":{"141":1,"144":1}}],["url",{"2":{"99":1,"208":8,"311":1,"316":1}}],["urls",{"2":{"29":1}}],["umask",{"2":{"97":1,"319":1}}],["u",{"2":{"92":2,"125":2,"148":1,"166":1,"191":1,"217":4,"233":2,"243":1,"349":1}}],["upcoming",{"2":{"266":1}}],["upper",{"2":{"124":1}}],["upstream",{"2":{"121":1,"134":1,"144":1}}],["updating",{"2":{"101":1,"306":1}}],["updater",{"2":{"214":3}}],["updatejson",{"2":{"208":1,"311":1,"313":1,"316":1,"318":1}}],["updatejson=",{"2":{"208":2}}],["updates",{"2":{"48":1,"66":1,"101":1,"137":1,"250":1,"272":1,"281":1,"306":1,"311":1,"316":1}}],["update",{"0":{"258":1},"2":{"14":1,"26":2,"27":1,"28":1,"29":1,"37":1,"40":2,"41":1,"43":1,"44":1,"45":3,"47":1,"48":1,"50":2,"53":3,"55":1,"58":1,"60":1,"61":1,"63":2,"64":1,"68":1,"89":2,"92":1,"95":1,"96":1,"99":3,"100":3,"106":1,"107":1,"110":1,"120":1,"121":1,"128":1,"132":1,"134":1,"135":1,"140":1,"141":1,"142":1,"144":1,"146":1,"155":1,"157":2,"191":2,"214":6,"215":1,"218":2,"239":2,"255":1,"270":1,"289":1,"294":1,"295":1,"297":1,"308":3,"309":1,"314":1,"320":1,"341":2}}],["updated",{"0":{"281":1},"2":{"12":1,"71":1,"107":1,"119":1,"144":4,"148":1,"154":1,"156":1,"259":1,"261":1,"274":1,"279":1,"284":1,"292":1,"293":1,"302":1,"313":1,"318":1}}],["upgrade",{"2":{"58":1,"97":1,"249":1,"253":3,"261":2,"271":1,"276":1,"281":3,"319":1,"321":1,"324":1}}],["upgrading",{"0":{"301":1},"2":{"31":1,"149":1,"153":1,"156":1,"303":1}}],["up",{"2":{"22":1,"42":1,"47":1,"51":1,"115":1,"116":1,"125":1,"141":1,"148":1,"251":1,"283":1,"290":1,"292":1,"322":1,"325":1}}],["unmodified",{"2":{"323":1,"326":1}}],["unmount",{"2":{"144":1,"157":2}}],["unmounting",{"2":{"119":1,"144":1,"150":1}}],["unofficial",{"2":{"323":1,"326":1}}],["unaware",{"2":{"309":1,"314":1}}],["unable",{"2":{"89":1,"111":1,"158":1,"262":1,"341":1}}],["unfortunate",{"2":{"274":1,"279":1}}],["unpatch",{"2":{"170":1}}],["unpack",{"2":{"151":1,"347":2}}],["unpacking",{"2":{"102":1,"128":1,"304":1}}],["unreliable",{"2":{"144":1,"264":1}}],["untested",{"2":{"124":1}}],["unblock",{"2":{"113":1}}],["undefined",{"2":{"100":1,"308":1}}],["underlying",{"2":{"323":1,"326":1}}],["under",{"2":{"3":2,"31":1,"37":1,"118":1,"150":1,"223":2}}],["unused",{"2":{"95":1,"148":1}}],["unsupported",{"2":{"94":1,"347":2}}],["unlabeled",{"2":{"138":1}}],["unlinking",{"2":{"99":1}}],["unlimited",{"2":{"60":1}}],["unloaded",{"2":{"207":2}}],["unloading",{"2":{"92":1,"95":1}}],["unlocks",{"2":{"256":1}}],["unlock",{"2":{"15":1,"144":1,"256":1,"350":2}}],["universal",{"2":{"138":1,"150":1}}],["unix",{"2":{"83":2,"208":1}}],["unified",{"2":{"58":1}}],["unicode",{"2":{"49":1}}],["uninstallation",{"2":{"141":1,"148":1}}],["uninstalled",{"2":{"45":1}}],["uninstaller",{"2":{"31":1,"50":1,"115":1,"142":1,"148":1,"151":1,"155":1,"156":1}}],["uninstall",{"2":{"31":1,"47":1,"58":1,"63":1,"67":1,"111":1,"155":1,"156":1,"207":2,"229":1}}],["unnecessary",{"2":{"28":1,"100":1,"125":1,"148":1,"308":1}}],["usable",{"2":{"257":1}}],["usage",{"2":{"60":1,"117":1,"140":1}}],["usages",{"2":{"24":1}}],["usb",{"2":{"196":1,"200":1,"232":1}}],["using",{"2":{"15":1,"19":1,"22":1,"33":1,"46":1,"62":1,"95":1,"96":1,"97":1,"119":1,"122":1,"125":1,"132":1,"145":2,"157":1,"158":1,"262":1,"267":1,"281":1,"312":1,"317":1,"319":1,"320":1,"323":2,"326":2}}],["used",{"2":{"93":2,"102":2,"107":1,"114":1,"126":1,"137":1,"138":1,"144":1,"251":1,"252":3,"264":1,"271":2,"276":2,"283":1,"327":2}}],["uses",{"2":{"25":1,"79":1,"144":1,"150":1,"158":1,"262":1,"263":1,"281":1,"293":2}}],["userdata",{"2":{"104":1,"299":1}}],["userspace",{"2":{"79":1}}],["users",{"2":{"42":1,"46":1,"106":1,"107":1,"115":1,"145":1,"293":2}}],["user",{"2":{"13":1,"25":1,"47":1,"99":2,"135":1,"254":1,"258":1,"271":1,"276":1,"292":1,"301":1,"351":2}}],["use",{"2":{"12":1,"26":1,"27":1,"28":1,"36":1,"43":1,"49":2,"92":1,"99":2,"100":1,"107":1,"108":1,"116":2,"117":4,"119":1,"124":3,"127":1,"132":1,"135":1,"137":1,"143":1,"144":2,"150":3,"153":1,"156":2,"157":3,"220":2,"251":1,"261":2,"264":1,"265":2,"281":3,"283":1,"290":3,"291":1,"293":1,"303":1,"308":1,"311":1,"316":1,"323":1,"326":1}}],["useful",{"2":{"3":2,"223":2}}],["uids",{"2":{"95":1}}],["uid",{"2":{"45":1,"95":2,"97":2,"122":1,"319":2,"323":1,"326":1}}],["ui",{"2":{"12":1,"16":1,"20":1,"23":1,"24":1,"25":1,"34":1,"45":2,"258":1}}],["html",{"2":{"162":1}}],["http",{"2":{"3":2,"223":4}}],["https",{"2":{"0":2,"83":2,"162":1,"172":2}}],["huawei",{"2":{"113":1,"129":1,"156":1,"239":1,"256":4,"283":1}}],["hugely",{"2":{"114":1}}],["huge",{"2":{"19":1,"20":1,"124":1,"262":1,"274":1,"279":1}}],["heard",{"2":{"312":1,"317":1}}],["heavily",{"2":{"270":1,"281":1}}],["head",{"2":{"322":1,"325":1}}],["headache",{"2":{"262":1}}],["headers",{"2":{"101":1,"111":1,"119":2,"124":1,"128":1,"137":1,"145":1,"306":1}}],["header",{"2":{"99":1,"104":2,"105":2,"106":1,"111":1,"114":1,"120":1,"130":1,"296":2,"299":2,"347":4}}],["heimdall",{"2":{"232":1}}],["hexpattern2",{"2":{"347":4}}],["hexpattern1",{"2":{"347":4}}],["hexpatch",{"2":{"120":1,"122":1,"145":1,"347":2}}],["hex",{"2":{"153":1}}],["here",{"2":{"148":1,"250":1,"264":1,"267":1,"292":1,"293":5}}],["hey",{"2":{"148":1,"256":1}}],["helpers",{"2":{"153":1}}],["help",{"2":{"107":1,"322":1,"325":1,"349":2,"351":2,"352":2}}],["h",{"2":{"84":2,"347":4,"351":2,"352":2}}],["hats",{"2":{"323":1,"326":1}}],["half",{"2":{"292":1}}],["happy",{"2":{"282":1,"297":1}}],["happen",{"2":{"151":1}}],["happening",{"2":{"51":1}}],["had",{"2":{"256":1,"292":1,"322":1,"325":1}}],["hack",{"2":{"148":1}}],["has",{"2":{"148":1,"153":1,"254":1,"256":1,"262":1,"271":2,"276":2,"289":1,"292":2,"309":1,"310":1,"314":2,"315":1,"322":2,"323":1,"325":2,"326":1}}],["hardware",{"2":{"289":1}}],["hardlink",{"2":{"123":1}}],["hardlinking",{"2":{"45":1}}],["hardened",{"2":{"107":1}}],["handshake",{"2":{"124":1}}],["handful",{"2":{"114":1}}],["handled",{"2":{"156":1}}],["handle",{"2":{"43":1,"58":1,"67":1,"90":1,"103":1,"110":1,"124":1,"125":1,"138":1,"150":1,"298":1,"339":1,"342":1}}],["handling",{"2":{"37":1,"97":1,"127":1,"137":1,"319":1}}],["hanging",{"2":{"50":1}}],["have",{"2":{"3":2,"25":1,"113":1,"146":1,"223":2,"251":1,"253":1,"256":1,"257":2,"271":1,"274":2,"276":1,"279":2,"281":2,"289":1,"290":1,"310":1,"315":1}}],["history",{"2":{"263":1,"292":1}}],["hit",{"2":{"144":1,"270":1}}],["hi6250",{"2":{"115":1}}],["hijacking",{"2":{"124":1}}],["hijack",{"2":{"94":1}}],["highly",{"2":{"310":1,"315":1}}],["highlights",{"0":{"293":1},"2":{"267":1}}],["highlight",{"2":{"13":1}}],["higher",{"2":{"257":1,"305":1,"307":1}}],["highest",{"2":{"49":1,"157":1}}],["high",{"2":{"128":1,"135":1,"349":2}}],["highcomp",{"2":{"43":1}}],["hiding",{"0":{"281":1,"303":1},"2":{"16":1,"25":2,"43":1,"45":1,"102":1,"104":1,"106":1,"125":1,"137":1,"144":1,"150":1,"259":1,"281":2,"299":1,"303":1,"310":2,"315":2}}],["hide",{"2":{"16":1,"48":2,"62":1,"70":2,"71":1,"100":1,"119":1,"143":1,"144":1,"145":1,"150":3,"151":1,"152":1,"251":2,"271":1,"276":1,"281":2,"303":1,"308":1}}],["hidden",{"0":{"301":1},"2":{"15":1,"16":1,"31":2,"100":2,"124":2,"125":1,"137":1,"281":1,"303":1,"308":2}}],["hot",{"2":{"297":1,"322":1,"325":1}}],["hotfix",{"2":{"155":1}}],["host",{"2":{"158":1}}],["hosts",{"2":{"25":1,"119":2,"143":1,"148":1}}],["hooking",{"2":{"95":1}}],["hood",{"2":{"31":1,"37":1,"118":1,"247":1}}],["however",{"2":{"253":1,"259":1,"263":1,"265":1,"270":1,"271":1,"276":1,"283":1,"292":1}}],["how",{"2":{"45":1,"102":1,"156":1,"271":1,"276":1,"284":1,"290":2,"293":1,"322":1,"325":1}}],["home",{"2":{"13":1,"135":1,"235":1,"236":1}}],["hopefully",{"2":{"114":1}}],["hope",{"2":{"3":2,"157":1,"223":2}}],["ln",{"2":{"347":2}}],["ll",{"2":{"292":1}}],["l",{"2":{"227":4,"233":1,"351":2}}],["lf",{"2":{"208":1}}],["ls",{"2":{"206":2,"227":4,"350":2}}],["lzma",{"2":{"143":3,"347":5}}],["lzma2",{"2":{"117":1}}],["lz4",{"2":{"92":1,"97":2,"102":1,"106":2,"109":1,"138":1,"145":2,"286":1,"304":1,"319":2,"347":14}}],["ldplayer",{"0":{"169":1},"2":{"168":1,"169":1}}],["ld",{"2":{"106":1,"124":1,"193":1}}],["lg用法",{"2":{"347":1}}],["lg",{"2":{"97":1,"102":1,"106":1,"138":1,"304":1,"319":1,"347":3}}],["lv",{"2":{"76":3,"77":4,"78":1}}],["let",{"2":{"282":1,"309":1,"310":1,"314":1,"315":1}}],["leads",{"2":{"145":1,"283":1,"302":1}}],["leaked",{"2":{"251":1}}],["leaks",{"2":{"66":1}}],["leak",{"2":{"50":1}}],["length",{"2":{"113":1}}],["level",{"2":{"108":1,"291":1}}],["legacy",{"0":{"253":1},"2":{"92":1,"94":1,"97":1,"105":1,"106":2,"109":1,"138":1,"145":1,"148":1,"153":1,"253":1,"286":1,"296":1,"319":1,"347":5}}],["less",{"2":{"66":1,"124":1,"258":1,"293":1}}],["lack",{"2":{"311":1,"316":1}}],["layman",{"2":{"264":1}}],["lazy",{"2":{"157":1}}],["latter",{"2":{"143":1}}],["late",{"0":{"195":1},"2":{"145":1,"150":1,"191":2,"195":1,"207":2,"219":4}}],["latest",{"2":{"27":1,"144":1,"156":1}}],["later",{"2":{"3":2,"223":2}}],["languages",{"2":{"49":1,"86":1}}],["language",{"2":{"49":1,"254":1}}],["largest",{"2":{"292":1}}],["large",{"2":{"49":1,"65":1}}],["larger",{"2":{"45":1}}],["last",{"2":{"41":1,"305":1,"307":1,"309":1,"314":1}}],["launch",{"2":{"25":1}}],["lovers",{"2":{"302":1}}],["lovely",{"2":{"267":1}}],["love",{"2":{"256":1}}],["lol",{"2":{"144":1,"257":1}}],["lollipop",{"2":{"38":1,"141":1,"329":2,"335":2}}],["lost",{"2":{"262":1,"267":1,"310":1,"315":1}}],["loss",{"2":{"124":1,"150":1}}],["lose",{"2":{"23":1}}],["long",{"0":{"302":1},"2":{"116":1,"145":1,"271":1,"276":1,"292":1,"309":1,"314":1,"322":1,"325":1}}],["longer",{"2":{"25":1,"102":1,"114":1,"141":1,"152":1,"252":2,"271":3,"276":3,"283":1,"284":1,"289":1,"293":2,"322":1,"325":1}}],["located",{"2":{"152":1}}],["location",{"2":{"69":1,"135":1,"140":1,"252":1}}],["locked",{"2":{"151":1,"233":1}}],["lock",{"2":{"115":1,"323":1,"326":1}}],["locking",{"2":{"115":1}}],["lot",{"2":{"104":1,"144":1,"257":1,"299":1,"302":1,"321":1,"324":1}}],["lots",{"2":{"67":1,"280":1}}],["load",{"2":{"99":1,"102":1,"105":1,"108":1,"150":1,"193":1,"281":1,"291":1,"296":1,"304":1,"349":8}}],["loader",{"2":{"92":1,"130":1}}],["loaded",{"2":{"90":1,"339":1,"342":1}}],["loading",{"2":{"34":1,"43":1,"46":2,"92":2,"97":2,"99":3,"102":1,"130":1,"319":2}}],["login",{"2":{"351":2}}],["logical",{"2":{"117":1,"265":1,"266":1}}],["logic",{"2":{"34":1,"47":1,"100":1,"107":1,"128":1,"144":1,"261":1,"308":1}}],["logname",{"2":{"135":1}}],["logd",{"2":{"125":1,"127":1,"130":1,"141":1}}],["logcat",{"2":{"105":1,"120":1,"123":1,"124":1,"125":1,"130":1,"132":1,"135":3,"138":1,"145":1,"264":1,"296":1}}],["logging",{"2":{"67":1,"93":1,"97":1,"110":1,"115":1,"125":1,"141":1,"319":1,"327":1}}],["log",{"2":{"24":1,"51":1,"101":1,"105":1,"119":1,"123":1,"132":1,"296":1,"306":1}}],["logs",{"2":{"19":1,"45":1,"67":1,"100":1,"308":1}}],["lower",{"2":{"24":1,"26":1,"62":1,"102":1,"303":1}}],["low",{"2":{"12":1,"349":2}}],["loop",{"2":{"12":1,"16":1,"124":2,"130":1,"262":2}}],["live",{"0":{"302":1},"2":{"145":1,"156":1,"262":1,"283":2,"349":2}}],["liveboot",{"2":{"144":1}}],["life",{"2":{"144":1}}],["limited",{"2":{"125":1}}],["limitations",{"2":{"55":1}}],["libfoo",{"2":{"184":2,"220":6}}],["lib",{"2":{"151":1}}],["libs",{"2":{"150":1}}],["libselinux",{"2":{"144":1}}],["libsepol",{"2":{"134":1,"144":1}}],["libsqlite",{"2":{"102":1,"106":1,"108":1,"144":1,"291":1,"304":1}}],["libraries",{"2":{"113":1}}],["library",{"2":{"27":1,"92":1,"106":1}}],["libc",{"2":{"100":1,"144":1,"308":1}}],["lines",{"2":{"120":1}}],["lineageos",{"2":{"166":1}}],["lineage",{"2":{"108":1,"291":1}}],["line",{"2":{"92":1,"148":1}}],["linux",{"2":{"76":3,"79":2,"83":1,"135":2,"145":1,"251":1,"297":1,"349":1}}],["links",{"2":{"292":1}}],["linker",{"2":{"136":1}}],["linked",{"2":{"120":1,"293":1}}],["linking",{"2":{"106":1,"143":1}}],["link",{"2":{"65":2,"86":2,"144":1,"150":1}}],["lists",{"2":{"120":1}}],["listing",{"2":{"90":1,"339":1,"342":1}}],["list",{"2":{"31":1,"45":1,"67":1,"68":1,"70":1,"119":1,"144":1,"151":1,"251":2,"272":1,"350":2}}],["little",{"2":{"27":1,"43":1,"258":1}}],["likely",{"2":{"281":1}}],["like",{"2":{"12":1,"51":1,"137":2,"156":1,"252":1,"302":1,"322":1,"325":1}}],["licenses",{"2":{"3":2,"223":4}}],["license",{"0":{"223":1},"2":{"3":8,"223":8}}],["lt",{"2":{"3":2,"77":2,"97":1,"119":3,"182":1,"185":1,"206":2,"207":32,"208":28,"214":6,"217":32,"219":2,"220":12,"223":4,"248":1,"251":2,"252":4,"319":1,"347":54,"349":2}}],["3rd",{"2":{"265":1}}],["39",{"2":{"180":4,"220":2}}],["35",{"2":{"105":1,"296":1}}],["34",{"2":{"99":1}}],["32",{"2":{"99":2,"125":1,"263":2}}],["36",{"2":{"89":2,"341":2}}],["3a",{"2":{"77":2,"78":1}}],["3",{"0":{"10":1,"17":1,"18":1,"19":1,"29":1,"34":1,"40":1,"44":1,"47":1,"48":1,"55":1,"59":2,"60":1,"61":1,"62":1,"89":1,"96":1,"104":1,"109":1,"114":1,"120":1,"126":1,"131":1,"138":1,"142":1,"260":1,"285":1,"288":1,"292":1,"299":1,"319":1,"320":2,"340":1,"341":1},"1":{"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"286":1,"287":1,"289":1,"290":1,"291":1,"293":1,"341":1,"342":1},"2":{"3":2,"36":1,"62":1,"77":3,"78":1,"83":1,"113":1,"120":1,"220":1,"223":2,"265":1,"297":1,"343":4}}],["f",{"2":{"347":4}}],["fbe",{"2":{"124":1,"191":1}}],["fgo",{"2":{"121":1,"137":1}}],["fs",{"0":{"194":1},"2":{"105":1,"107":1,"113":1,"117":1,"119":1,"125":2,"131":1,"141":2,"145":1,"146":2,"148":1,"151":2,"191":4,"194":2,"207":4,"209":1,"219":7,"252":2,"296":1,"349":6,"350":2}}],["fstabs",{"2":{"132":1,"322":1,"325":1}}],["fstab",{"2":{"99":1,"106":1,"107":1,"112":1,"123":1,"133":1,"140":1,"277":1,"347":6}}],["fc",{"2":{"55":1}}],["few",{"2":{"250":1,"253":1,"262":1,"281":1,"322":1,"325":1}}],["feasible",{"2":{"115":1}}],["features",{"2":{"99":1,"108":1,"254":1,"257":1,"280":1,"290":1,"291":1,"293":1}}],["feature",{"2":{"31":1,"48":3,"58":1,"94":1,"99":2,"148":2,"281":3,"312":1,"317":1}}],["fetching",{"2":{"46":1}}],["f2fs",{"2":{"36":1,"91":2,"104":1,"262":1,"297":2,"299":1,"334":2}}],["fastboot",{"2":{"227":1,"228":1,"240":2,"241":1,"242":1,"243":1,"248":1}}],["faster",{"2":{"46":2,"49":1}}],["faq",{"2":{"178":1,"289":1}}],["fake",{"2":{"145":1}}],["family",{"2":{"140":1}}],["faulty",{"2":{"133":1}}],["fault",{"2":{"125":1,"131":1}}],["false",{"2":{"124":1}}],["fallback",{"2":{"108":1,"124":1,"291":1}}],["fatal",{"2":{"123":1}}],["fail",{"2":{"100":1,"102":1,"120":1,"304":1,"308":1}}],["failures",{"2":{"120":1,"131":1}}],["failure",{"2":{"49":1,"141":1}}],["failed",{"2":{"35":1}}],["fact",{"2":{"265":1,"292":1}}],["factory",{"2":{"31":1,"106":1}}],["face",{"2":{"15":1}}],["frozen",{"2":{"311":1,"316":1}}],["from",{"2":{"45":1,"46":1,"48":1,"52":1,"56":1,"70":1,"90":3,"91":1,"99":6,"101":1,"107":6,"117":3,"119":1,"123":1,"124":1,"125":1,"130":1,"137":1,"138":1,"141":2,"143":1,"144":5,"149":1,"151":2,"157":1,"251":3,"252":1,"258":1,"261":1,"263":1,"267":1,"273":1,"278":1,"280":1,"290":1,"292":1,"293":1,"294":2,"295":1,"297":1,"302":2,"305":1,"306":1,"310":1,"311":1,"314":2,"315":1,"316":1,"320":1,"322":2,"323":1,"325":2,"326":1,"334":1,"339":3,"342":3}}],["frija",{"2":{"235":1}}],["frequently",{"2":{"204":1}}],["freedom",{"2":{"284":1}}],["freezes",{"2":{"120":1}}],["free",{"2":{"3":4,"124":1,"223":4}}],["frameworks",{"2":{"86":1}}],["fragment",{"2":{"31":1,"58":3}}],["flourishing",{"2":{"310":1,"315":1}}],["flow",{"2":{"97":1,"319":1}}],["floating",{"2":{"19":1}}],["flawed",{"2":{"310":1,"315":1}}],["flag",{"2":{"119":1,"131":1,"138":1,"143":1}}],["flags",{"2":{"43":1,"44":1,"99":1,"101":1,"124":1,"306":1}}],["flashable",{"2":{"302":1}}],["flashfire",{"2":{"148":1}}],["flash",{"2":{"51":1,"144":1,"151":1,"228":8,"241":2,"242":2}}],["flashing",{"2":{"12":1,"49":1,"51":1,"111":1,"124":1,"153":1}}],["further",{"2":{"272":1,"309":1,"314":1}}],["fundamentally",{"2":{"264":1}}],["fun",{"2":{"257":1}}],["functioning",{"2":{"272":1}}],["functions",{"2":{"140":1,"141":1,"144":3,"284":1}}],["function",{"2":{"95":1,"141":1,"144":1}}],["functionally",{"2":{"312":1,"317":1}}],["functionality",{"2":{"151":1,"156":1,"252":1,"311":1,"316":1,"323":1,"326":1}}],["functional",{"2":{"13":1,"253":1}}],["future",{"2":{"19":1,"20":1,"113":1,"156":1,"253":1,"259":1}}],["fully",{"2":{"18":1,"141":1,"148":1,"153":1,"251":1,"253":1,"272":2,"274":1,"277":1,"279":1,"281":1,"289":2}}],["full",{"2":{"13":1,"46":1,"124":1,"251":1,"253":1,"257":1,"265":1,"266":1,"281":2,"289":1,"290":1,"292":2,"294":1,"295":1,"297":1,"320":1,"322":1,"325":1}}],["fighting",{"2":{"310":1,"315":1,"322":1,"325":1}}],["figured",{"2":{"144":1}}],["fit",{"2":{"292":1}}],["fitness",{"2":{"3":2,"223":2}}],["fifo",{"2":{"193":1}}],["fi",{"2":{"180":1}}],["fiearlymountv2=false",{"2":{"180":1}}],["fields",{"2":{"96":1,"320":1}}],["first",{"2":{"107":1,"271":1,"276":1,"302":1}}],["firmware",{"2":{"21":1,"90":1,"92":1,"339":1,"342":1}}],["fine",{"2":{"262":1}}],["final",{"0":{"259":1,"266":1}}],["finally",{"2":{"64":1,"258":1,"267":1,"273":1,"278":1}}],["fingerprint",{"2":{"16":1,"23":1,"26":2,"28":3,"39":1,"101":1,"306":1}}],["filepermission",{"2":{"217":4}}],["file",{"2":{"28":1,"47":1,"48":2,"99":1,"105":1,"117":1,"138":1,"140":2,"144":1,"148":1,"151":1,"191":2,"197":1,"217":6,"220":4,"227":2,"283":2,"284":1,"296":1,"349":12,"352":6}}],["filesystem",{"2":{"151":1}}],["filesystems",{"2":{"122":1}}],["files",{"2":{"11":1,"12":5,"17":1,"28":1,"47":1,"50":1,"90":2,"91":1,"92":2,"100":1,"105":1,"113":1,"116":1,"124":1,"128":1,"135":1,"138":1,"144":1,"148":2,"150":1,"154":1,"271":1,"273":2,"276":1,"278":2,"296":1,"308":1,"334":1,"339":2,"342":2}}],["fixing",{"2":{"101":1,"305":1,"306":1,"307":1,"319":1,"327":1}}],["fixed",{"2":{"64":1,"70":1,"90":1,"148":2,"154":1,"339":1,"342":1}}],["fixes",{"0":{"304":1,"306":1,"308":1},"2":{"12":1,"23":1,"31":1,"47":1,"68":1,"92":1,"100":2,"124":1,"267":1,"275":1,"280":1,"297":1,"308":2,"324":1}}],["fix",{"2":{"11":1,"12":1,"14":1,"15":1,"16":1,"17":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":2,"30":1,"32":1,"34":1,"36":1,"37":1,"38":1,"39":1,"41":1,"42":1,"43":1,"45":2,"46":1,"47":1,"49":1,"50":2,"52":1,"53":2,"54":1,"55":1,"57":1,"58":1,"62":1,"64":1,"68":2,"71":2,"89":2,"90":1,"91":1,"92":1,"93":3,"94":3,"95":6,"97":7,"99":1,"100":3,"101":2,"102":3,"103":1,"104":2,"105":2,"108":1,"109":1,"110":1,"111":2,"112":2,"113":1,"114":1,"115":3,"119":1,"123":3,"124":2,"125":2,"126":1,"127":1,"128":1,"130":1,"131":4,"132":3,"133":1,"134":1,"135":1,"136":1,"137":2,"138":3,"139":1,"140":3,"141":5,"143":3,"145":3,"146":2,"148":2,"149":3,"150":1,"153":1,"157":4,"158":2,"286":1,"287":1,"291":1,"296":2,"298":1,"299":2,"304":3,"306":2,"308":3,"319":7,"327":3,"334":1,"339":1,"341":2,"342":1}}],["foil",{"2":{"323":1,"326":1}}],["foo=bar",{"2":{"196":1}}],["foo",{"2":{"184":2,"220":4}}],["fox2code",{"2":{"175":1}}],["four",{"2":{"135":1}}],["found",{"2":{"86":1,"313":1,"318":1}}],["foundation",{"2":{"3":2,"223":2}}],["focuses",{"2":{"323":1,"326":1}}],["focused",{"2":{"289":1,"305":1,"307":1}}],["focus",{"2":{"115":1,"266":2,"301":1,"310":1,"315":1}}],["foss",{"2":{"46":1}}],["folder",{"2":{"47":1,"107":1,"116":1,"119":1,"140":1,"148":1,"252":2}}],["folders",{"2":{"35":1,"116":1,"140":1}}],["follow",{"2":{"39":1,"148":1,"261":1,"271":1,"276":1}}],["following",{"2":{"31":1,"38":1,"275":1,"293":1,"314":1,"324":1}}],["forward",{"2":{"253":1}}],["forget",{"2":{"154":1,"253":1}}],["forgot",{"2":{"46":1}}],["fork",{"2":{"141":1,"144":1,"148":1,"232":1,"264":1}}],["forced",{"2":{"290":1}}],["force",{"2":{"46":1,"49":1,"107":1,"119":1,"127":1,"130":1,"138":1}}],["formats",{"2":{"104":1,"110":1,"299":1}}],["format",{"0":{"284":1},"2":{"22":1,"23":1,"107":1,"108":1,"110":1,"133":1,"138":1,"141":1,"145":1,"251":1,"261":3,"284":2,"286":1,"291":1,"294":1}}],["for",{"0":{"283":1},"2":{"3":4,"12":2,"23":1,"24":2,"25":2,"28":2,"32":2,"35":1,"36":1,"39":1,"43":3,"45":1,"46":1,"48":1,"49":1,"56":1,"58":1,"65":1,"67":1,"70":1,"90":1,"92":1,"93":1,"95":1,"99":6,"104":1,"105":1,"106":2,"107":5,"108":2,"111":1,"113":4,"114":3,"115":1,"116":2,"117":2,"119":1,"120":2,"122":3,"124":3,"126":1,"128":1,"129":1,"132":1,"135":1,"137":1,"138":1,"140":1,"141":2,"144":6,"145":1,"146":4,"148":2,"150":2,"151":2,"153":3,"154":1,"155":1,"156":2,"157":3,"158":3,"223":4,"252":1,"257":1,"259":2,"261":1,"262":1,"264":3,"265":1,"266":1,"267":2,"270":1,"271":4,"272":2,"273":1,"274":1,"275":1,"276":4,"277":1,"278":1,"279":1,"281":2,"283":1,"284":1,"289":2,"290":1,"291":2,"292":1,"293":3,"294":1,"296":1,"297":1,"299":1,"302":1,"309":1,"310":1,"312":1,"313":1,"314":2,"315":1,"317":1,"318":1,"320":2,"322":4,"323":2,"325":4,"326":2,"327":1,"339":1,"342":1}}],["pkg",{"2":{"350":4}}],["png",{"2":{"220":8}}],["pc上magisk",{"2":{"228":8}}],["pc",{"2":{"200":1,"227":1,"235":1}}],["phhusson",{"2":{"157":1}}],["phh",{"2":{"148":2,"149":1,"150":2,"153":2,"157":1,"158":1}}],["pseudo",{"2":{"144":1,"148":1}}],["people",{"2":{"154":1,"256":1,"270":1,"310":1,"315":1,"322":1,"325":1}}],["penalty",{"2":{"125":1}}],["performed",{"2":{"323":1,"326":1}}],["performance",{"2":{"24":1,"45":1,"107":1,"144":1,"258":1}}],["personal",{"2":{"309":1,"314":1}}],["persist等",{"2":{"181":1}}],["persist",{"2":{"125":1,"138":2,"140":1,"142":2,"174":1,"181":1,"196":2}}],["persistent",{"2":{"90":2,"339":2,"342":2}}],["perm",{"2":{"217":10,"349":8}}],["permissive",{"2":{"144":2,"145":3,"157":1,"158":2,"349":2}}],["permissions",{"2":{"26":2,"90":2,"91":1,"145":2,"146":1,"334":1,"339":2,"342":2,"349":8}}],["permission",{"2":{"11":1,"48":2,"123":1,"154":1,"217":4,"323":1,"326":1}}],["per",{"2":{"23":1,"117":1}}],["pzizz",{"2":{"124":1}}],["ppid",{"2":{"124":1}}],["ptrace",{"0":{"264":1},"2":{"264":1,"267":1}}],["ptracing",{"2":{"117":1}}],["pts",{"2":{"122":2}}],["plt",{"2":{"332":2,"338":2}}],["plus",{"2":{"310":1,"315":1}}],["plug",{"2":{"138":1}}],["plenty",{"2":{"148":1}}],["please",{"2":{"107":1,"119":1,"146":1,"156":1,"252":1,"253":3,"265":1,"266":1,"271":1,"273":1,"274":1,"276":1,"278":1,"279":1,"284":1,"289":1,"290":1}}],["planning",{"2":{"322":1,"325":1}}],["platform",{"2":{"309":1,"314":1}}],["platforms",{"2":{"137":1}}],["plain",{"2":{"254":1}}],["placing",{"2":{"132":1}}],["placed",{"2":{"124":1}}],["place",{"2":{"69":1,"140":1,"150":1}}],["places",{"2":{"46":1,"252":1}}],["play",{"2":{"69":1,"138":1}}],["pxa",{"2":{"101":1,"112":1,"130":1,"306":1}}],["py",{"2":{"83":1,"84":3,"85":1,"86":1}}],["python3",{"2":{"83":1}}],["python",{"2":{"83":5}}],["piece",{"2":{"322":1,"325":1}}],["pid",{"2":{"90":2,"339":2,"342":2}}],["pipe",{"2":{"103":1,"298":1}}],["pip",{"2":{"83":1}}],["picked",{"2":{"47":1}}],["pixels",{"2":{"265":1}}],["pixel3",{"2":{"77":1}}],["pixel",{"2":{"39":1,"76":1,"77":4,"78":1,"79":1,"80":1,"95":1,"99":1,"106":2,"113":1,"120":1,"122":1,"137":1,"138":1,"140":1,"265":1,"271":1,"276":1,"294":1}}],["p",{"2":{"28":1,"35":1,"123":1,"125":2,"127":1,"128":3,"138":1,"196":1,"351":2,"352":2}}],["policies",{"2":{"144":1,"156":1}}],["policy",{"2":{"107":4,"134":1,"145":1,"146":1,"155":1,"193":1,"349":4}}],["poorly",{"2":{"144":1}}],["pool",{"2":{"113":1}}],["power",{"2":{"122":1,"124":1}}],["points",{"2":{"119":1,"152":1}}],["point",{"2":{"112":1,"125":1,"263":1,"271":1,"276":1,"292":1,"322":1,"325":1}}],["popup",{"2":{"50":1}}],["portion",{"2":{"49":1,"322":1,"325":1}}],["pokemon",{"2":{"33":1}}],["post",{"0":{"194":1},"2":{"24":1,"105":1,"107":1,"113":1,"117":1,"119":1,"125":2,"131":1,"141":2,"148":1,"151":2,"191":4,"194":2,"207":4,"209":1,"219":7,"252":2,"296":1,"350":2}}],["possible",{"2":{"12":1,"27":1,"49":1,"95":1,"101":2,"108":1,"124":1,"141":1,"148":1,"150":1,"151":1,"157":1,"257":1,"259":1,"271":1,"276":1,"291":1,"306":2}}],["potentially",{"2":{"143":1,"323":1,"326":1}}],["potential",{"2":{"17":1,"50":1,"68":1,"93":1,"108":2,"131":1,"291":2,"327":1}}],["pass",{"2":{"289":1}}],["passes",{"2":{"144":1,"145":1}}],["paired",{"2":{"281":1}}],["paid",{"2":{"256":1}}],["paves",{"2":{"156":1}}],["pause",{"2":{"150":1}}],["pay",{"2":{"145":1,"261":1,"266":1,"292":1}}],["payload",{"2":{"90":1,"339":1,"342":1}}],["pad",{"2":{"107":1}}],["packaging",{"2":{"102":1,"128":1}}],["packages",{"2":{"119":1,"323":1,"326":1}}],["package",{"2":{"37":1,"95":1,"100":1,"102":1,"106":1,"137":1,"251":1,"308":1,"323":1,"326":1}}],["paradigm",{"2":{"322":1,"325":1}}],["parallel",{"2":{"101":1,"117":1,"306":1}}],["parse",{"2":{"120":1,"144":1}}],["parsing",{"2":{"92":1,"124":1}}],["parent",{"2":{"107":1}}],["partname",{"2":{"123":1}}],["part",{"2":{"56":1,"148":1,"263":1,"273":1,"278":1,"312":1,"317":1}}],["partial",{"2":{"101":1,"306":1,"349":2}}],["partitioning",{"2":{"322":1,"325":1}}],["partitions",{"2":{"91":1,"114":1,"117":1,"132":1,"146":1,"256":1,"265":1,"271":1,"276":1,"334":1}}],["partition",{"0":{"273":1,"278":1},"2":{"47":1,"76":1,"91":1,"108":1,"110":1,"116":1,"117":1,"146":1,"150":1,"151":1,"156":1,"157":2,"266":1,"271":2,"273":1,"274":1,"276":2,"278":1,"279":1,"291":1,"334":1}}],["particular",{"2":{"3":2,"223":2,"292":1}}],["page",{"2":{"46":1,"256":1}}],["patterns",{"2":{"145":1}}],["pattern",{"2":{"120":1}}],["path`",{"2":{"190":2}}],["path",{"0":{"252":1},"2":{"49":1,"83":2,"90":1,"106":2,"119":1,"137":1,"141":1,"148":1,"152":1,"180":4,"190":5,"206":2,"216":3,"241":2,"242":2,"252":1,"290":2,"293":2,"339":1,"342":1,"349":2,"350":2}}],["paths",{"2":{"43":1,"45":1,"94":1,"102":1,"153":1,"252":4,"253":1,"304":1}}],["patches",{"0":{"283":1},"2":{"122":1,"132":1,"133":1,"146":1,"153":1,"158":1,"283":3,"290":1,"322":1,"325":1}}],["patched",{"2":{"99":1,"228":10,"235":3,"241":2,"242":2}}],["patchvbmetaflag",{"2":{"99":1,"347":2}}],["patch",{"2":{"48":3,"101":1,"110":1,"144":1,"145":1,"150":1,"151":2,"156":2,"157":2,"158":2,"251":1,"306":1,"322":1,"325":1,"347":4}}],["patching",{"2":{"12":1,"13":1,"17":1,"21":1,"26":1,"39":1,"90":3,"92":3,"99":3,"100":1,"108":1,"110":1,"112":3,"119":1,"123":1,"124":1,"131":1,"140":1,"144":1,"146":1,"155":1,"277":1,"291":1,"308":1,"339":3,"342":3}}],["put",{"2":{"323":1,"326":1}}],["push",{"2":{"253":1}}],["pull",{"2":{"228":2,"235":2}}],["pulling",{"2":{"46":1}}],["pure",{"2":{"37":1,"130":1}}],["purpose",{"2":{"3":2,"144":1,"223":2}}],["published",{"2":{"3":2,"223":2}}],["public",{"2":{"3":6,"223":6,"259":1,"260":1,"264":1,"270":2,"292":1,"309":1,"314":1}}],["prune",{"2":{"95":1}}],["prime",{"2":{"289":1}}],["primeos",{"2":{"168":1}}],["print",{"2":{"217":2,"347":2}}],["printing",{"2":{"90":3,"339":3,"342":3}}],["private",{"2":{"281":1}}],["priv",{"2":{"149":1}}],["priority",{"2":{"49":1}}],["practical",{"2":{"67":1}}],["pretty",{"2":{"284":1}}],["prepared",{"2":{"262":1,"267":1}}],["prenormal",{"2":{"233":1}}],["preload",{"2":{"193":1}}],["precise",{"2":{"124":1}}],["preserving",{"2":{"122":1}}],["preserved",{"2":{"146":1}}],["preserve",{"2":{"90":1,"101":1,"135":2,"148":1,"306":1,"339":1,"342":1,"351":2}}],["pressing",{"2":{"116":1}}],["previous",{"2":{"156":1,"254":1}}],["previously",{"2":{"148":1}}],["preview",{"2":{"92":1,"158":1}}],["prevents",{"2":{"100":1,"308":1}}],["preventing",{"2":{"68":1}}],["prevent",{"2":{"12":2,"16":1,"25":1,"27":2,"28":3,"29":1,"41":1,"43":1,"44":1,"45":1,"50":1,"71":1,"92":1,"95":1,"97":1,"101":4,"105":1,"111":1,"115":1,"119":1,"120":3,"121":1,"122":1,"124":3,"125":1,"130":3,"138":1,"141":1,"144":2,"146":1,"150":2,"281":1,"296":1,"306":4,"319":1}}],["prefer",{"2":{"91":1,"334":1}}],["preferences",{"2":{"86":1}}],["pre",{"0":{"193":1,"283":1},"2":{"17":1,"91":1,"100":1,"110":1,"122":1,"283":1,"308":1,"334":1,"348":1}}],["problem",{"2":{"322":1,"325":1}}],["problems",{"2":{"155":1,"262":2}}],["protected",{"2":{"251":1}}],["protection",{"2":{"119":1}}],["protobuf",{"2":{"125":1}}],["protocol",{"2":{"13":1,"107":1}}],["product",{"0":{"273":1,"278":1},"2":{"112":1,"113":1,"196":1,"207":4,"210":2,"273":2,"278":2}}],["produces",{"2":{"89":1,"341":1}}],["providing",{"2":{"107":1,"122":1,"323":1,"326":1}}],["provides",{"2":{"293":1}}],["provided",{"2":{"261":1,"262":1}}],["provide",{"2":{"102":1,"266":1,"271":1,"276":1}}],["profile",{"2":{"106":1}}],["procfs",{"2":{"119":1,"251":1}}],["proc",{"2":{"99":1,"123":1,"145":1,"180":2,"350":4}}],["process",{"2":{"100":1,"101":1,"107":1,"112":1,"114":1,"116":1,"119":1,"144":2,"150":1,"168":1,"251":5,"262":1,"264":3,"267":1,"284":2,"302":1,"306":1,"308":1,"312":1,"317":1}}],["processes",{"2":{"97":1,"99":1,"104":1,"117":1,"122":1,"135":1,"148":1,"251":2,"299":1,"312":1,"317":1,"319":1}}],["processed",{"2":{"45":1}}],["processing",{"2":{"65":1}}],["projects",{"2":{"86":1}}],["project",{"2":{"78":1,"113":1,"312":1,"317":1,"322":1,"325":1}}],["prompt",{"2":{"47":1,"110":1}}],["progress",{"2":{"45":1,"46":2}}],["program",{"2":{"3":6,"144":1,"223":4}}],["propfile",{"2":{"150":1}}],["props",{"2":{"101":1,"138":1,"140":2,"142":2,"144":2,"145":1,"306":1,"352":2}}],["prop",{"0":{"208":1,"212":1},"2":{"25":1,"84":2,"87":1,"144":1,"145":1,"148":2,"150":1,"196":4,"207":4,"208":1,"212":1,"219":2}}],["propertiesid=",{"2":{"208":1}}],["properties",{"2":{"90":2,"99":1,"101":1,"107":1,"108":1,"121":1,"125":1,"196":1,"291":1,"306":1,"339":2,"342":2}}],["property",{"2":{"90":3,"127":1,"128":1,"196":8,"339":3,"342":3,"352":2}}],["proper",{"2":{"19":1,"31":1,"48":1,"61":1,"95":1,"100":1,"101":1,"111":1,"114":1,"116":1,"122":1,"132":1,"135":1,"140":2,"141":2,"143":1,"144":1,"150":1,"151":2,"306":1,"308":1}}],["properly",{"2":{"12":1,"43":1,"46":1,"49":1,"56":1,"58":1,"65":1,"90":2,"94":1,"95":1,"101":1,"103":1,"106":1,"108":1,"110":1,"114":1,"119":2,"125":1,"134":1,"137":1,"138":1,"142":1,"143":1,"144":1,"146":1,"151":1,"262":1,"273":1,"278":1,"291":1,"298":1,"306":1,"323":1,"326":1,"339":2,"342":2}}],["pr",{"2":{"2":1}}],["gzip",{"2":{"347":7}}],["game",{"2":{"310":1,"315":1}}],["gained",{"2":{"293":1}}],["galaxy",{"2":{"12":1,"102":1,"230":1,"304":1}}],["gives",{"2":{"323":1,"326":1}}],["give",{"2":{"284":1,"310":1,"315":1}}],["given",{"2":{"251":1}}],["gitgit",{"2":{"83":1}}],["git",{"2":{"83":4,"223":4}}],["gitee",{"2":{"0":3,"2":1}}],["github",{"2":{"0":5,"60":1,"83":2,"162":1,"172":2}}],["guaranteed",{"2":{"290":1}}],["guarded",{"2":{"28":1}}],["guide",{"2":{"274":1,"279":1,"302":1}}],["guides",{"2":{"221":1,"249":1,"284":1}}],["gsi",{"2":{"124":1}}],["gkis",{"2":{"95":1}}],["grimler",{"2":{"232":1}}],["grep",{"2":{"180":4}}],["greatly",{"2":{"144":1}}],["green",{"2":{"130":1}}],["group",{"2":{"91":1,"217":12,"334":1}}],["granularity",{"2":{"23":1}}],["glitch",{"2":{"58":1}}],["global",{"2":{"45":1,"49":1,"144":1}}],["g",{"2":{"31":1,"33":1,"49":1,"90":4,"95":1,"106":1,"116":1,"121":1,"125":1,"132":1,"253":1,"271":1,"276":1,"283":1,"290":1,"339":4,"342":4}}],["gen",{"2":{"265":1}}],["genfscon",{"2":{"108":1,"291":1,"349":2}}],["generate",{"2":{"16":1,"281":1}}],["general",{"2":{"3":6,"89":3,"91":1,"92":2,"93":2,"94":1,"96":1,"97":1,"99":4,"100":4,"101":3,"102":1,"103":1,"105":4,"106":4,"107":4,"108":3,"110":1,"111":2,"113":2,"115":2,"116":2,"117":7,"118":4,"119":6,"120":1,"122":1,"124":2,"125":1,"126":1,"127":1,"135":1,"143":1,"144":5,"145":4,"223":6,"252":1,"291":3,"296":4,"298":1,"306":3,"308":4,"319":1,"320":1,"327":2,"334":1,"341":3}}],["getprop",{"2":{"196":1,"352":2}}],["getrandom",{"2":{"96":1,"320":1}}],["get",{"2":{"28":1,"115":1,"136":1,"256":1,"262":1,"267":1,"293":1}}],["got",{"2":{"322":1,"325":1}}],["goal",{"2":{"271":1,"276":1,"323":1,"326":1}}],["good",{"2":{"253":1,"254":1,"271":1,"276":1}}],["goodbye",{"2":{"252":1}}],["google",{"2":{"28":1,"78":1,"79":1,"87":1,"142":1,"214":2,"230":1,"265":1,"266":1,"271":1,"276":1,"289":2,"309":1,"314":1}}],["going",{"2":{"90":1,"119":1,"339":1,"342":1}}],["go",{"2":{"19":1,"33":1,"77":1,"95":1,"138":1,"260":1}}],["gpl",{"2":{"3":1}}],["gt",{"2":{"3":2,"77":3,"78":1,"86":2,"97":1,"119":3,"165":1,"182":1,"185":1,"206":2,"208":28,"217":32,"219":2,"223":4,"248":1,"251":2,"252":4,"319":1,"346":6,"347":54,"349":2}}],["gnu",{"2":{"3":8,"223":14}}],["mm",{"2":{"351":2}}],["mv",{"2":{"347":2}}],["mkdir",{"2":{"347":2}}],["mke2fs",{"2":{"128":1}}],["m",{"2":{"259":1,"264":1,"351":4}}],["mtp",{"2":{"228":1,"235":1}}],["mtk",{"2":{"128":1,"137":1,"145":2,"243":1}}],["msg",{"2":{"217":8}}],["ms",{"2":{"131":1}}],["mymodule",{"2":{"186":3}}],["myself",{"2":{"322":1,"325":1}}],["myservice",{"2":{"184":4,"220":8}}],["myscript",{"2":{"184":2,"220":6}}],["my",{"2":{"125":1,"153":1,"260":1,"266":1,"310":2,"315":2,"322":1,"325":1}}],["mnt",{"2":{"112":1,"123":1}}],["md5",{"2":{"235":1}}],["md",{"2":{"49":1,"65":1}}],["multirom",{"2":{"146":1}}],["multi",{"2":{"141":1}}],["multiple",{"2":{"97":1,"101":1,"102":1,"111":1,"144":1,"306":1,"319":1}}],["multithreading",{"2":{"46":1}}],["multiuser",{"2":{"45":1,"58":1,"97":1,"141":1,"144":1,"319":1}}],["much",{"2":{"21":1,"49":1,"72":1,"292":1,"310":2,"315":2,"323":1,"326":1}}],["missing",{"2":{"147":1}}],["miscellaneous",{"0":{"289":1}}],["misc",{"2":{"136":1,"137":1}}],["might",{"2":{"125":2,"151":1,"158":1,"322":1,"323":1,"325":1,"326":1}}],["migrated",{"2":{"135":1}}],["migrate",{"2":{"119":1,"141":1,"252":1,"254":1}}],["migration",{"2":{"36":1,"43":1,"101":1,"262":1,"267":1,"306":1}}],["microloader",{"2":{"92":1}}],["mirroring",{"2":{"150":1}}],["mirrors",{"2":{"116":1,"122":1,"150":1}}],["mirror",{"2":{"91":1,"112":1,"116":1,"151":1,"190":2,"334":1}}],["minimum",{"2":{"92":1}}],["minimal",{"2":{"32":1,"151":2,"156":1,"158":1}}],["minor",{"2":{"40":1,"50":1,"92":1,"104":1,"293":1,"299":1,"314":1,"324":1}}],["minmagisk",{"2":{"32":1}}],["meaning",{"2":{"261":1}}],["means",{"2":{"251":1,"271":1,"276":1,"281":1,"293":1,"322":1,"325":1}}],["me",{"2":{"254":1,"266":1,"292":1,"310":1,"315":1}}],["medium",{"2":{"251":1}}],["memuplayer",{"0":{"169":1}}],["memu",{"2":{"168":1}}],["member",{"2":{"119":1,"349":2}}],["memory",{"2":{"12":1,"24":1,"27":1,"50":1,"66":1,"99":1,"107":1,"140":1,"148":1}}],["messages",{"2":{"147":1}}],["messaging",{"2":{"97":1,"319":1}}],["messed",{"2":{"115":1}}],["meizu",{"2":{"99":1,"140":1}}],["merging",{"2":{"134":1,"153":1}}],["merged",{"2":{"51":1,"58":1,"102":1}}],["merge",{"2":{"48":1,"134":1,"144":1}}],["merchantability",{"2":{"3":2,"223":2}}],["menu",{"2":{"43":1}}],["meta",{"2":{"214":2}}],["metadata",{"2":{"27":1,"174":1,"181":2,"207":2}}],["methods",{"2":{"25":1,"124":1}}],["method",{"2":{"15":1,"26":1,"31":1,"37":1,"47":1,"48":1,"108":1,"124":1,"157":1,"158":1,"264":2,"283":2,"291":1}}],["mechanism",{"2":{"21":1,"28":1,"95":1,"97":2,"144":1,"151":1,"319":2,"322":1,"325":1}}],["malicious",{"2":{"323":1,"326":1}}],["malware",{"2":{"124":1}}],["making",{"2":{"302":1,"323":1,"326":1}}],["makes",{"2":{"148":1,"254":1,"284":1}}],["make",{"2":{"11":1,"90":1,"92":1,"105":1,"106":2,"107":1,"111":1,"122":1,"124":1,"144":1,"283":1,"296":1,"323":1,"326":1,"339":1,"342":1}}],["macintosh",{"2":{"208":1}}],["macos",{"2":{"83":2}}],["maximum",{"2":{"158":1}}],["master",{"2":{"144":1,"351":2}}],["massive",{"2":{"37":1,"43":1,"50":1,"72":1,"125":1,"135":1,"139":1,"156":1,"260":1,"270":1,"271":1,"276":1,"292":1}}],["maintenance",{"2":{"294":1,"295":1,"311":1,"316":1,"319":1,"327":1}}],["maintaining",{"2":{"322":1,"325":1}}],["maintain",{"2":{"254":1}}],["mainly",{"2":{"289":1}}],["mainline",{"2":{"113":1}}],["main",{"2":{"117":1,"263":1,"266":1,"292":1}}],["matter",{"2":{"290":2}}],["matching",{"2":{"148":1}}],["matches",{"2":{"148":1,"251":1}}],["match",{"2":{"94":1,"95":1,"101":1,"107":1,"306":1,"349":2}}],["material",{"2":{"72":1}}],["magic™🌈",{"2":{"302":1}}],["magicmount",{"2":{"112":1,"113":1,"116":3,"117":1,"139":1,"140":1}}],["magic",{"0":{"330":1,"336":1},"2":{"92":1,"97":1,"120":1,"141":1,"144":1,"146":1,"148":2,"149":1,"150":5,"151":3,"257":2,"319":1,"330":1,"336":1}}],["magiskmagiskboot",{"2":{"346":1}}],["magiskmanager",{"2":{"28":1,"47":1}}],["magisksecure",{"2":{"191":1}}],["magisksu",{"0":{"323":1,"326":1},"2":{"15":1,"67":2,"90":4,"95":5,"97":4,"99":2,"102":1,"103":1,"106":1,"107":3,"110":1,"111":1,"113":1,"114":1,"115":1,"117":1,"119":2,"120":3,"121":1,"122":1,"124":2,"135":1,"137":1,"140":1,"141":1,"144":7,"146":2,"148":9,"177":1,"257":1,"298":1,"304":1,"319":4,"339":4,"342":4,"351":1}}],["magisklogd",{"2":{"124":2}}],["magiskdb=$secure",{"2":{"191":2}}],["magiskd",{"2":{"94":1,"95":1,"124":1,"125":1,"194":1,"197":3}}],["magiskinit",{"0":{"322":1,"325":1,"348":1},"2":{"91":2,"92":2,"93":3,"94":1,"95":4,"99":6,"101":1,"102":1,"104":1,"105":1,"106":2,"107":4,"108":2,"110":1,"111":1,"112":1,"113":5,"114":2,"115":1,"116":2,"117":3,"121":1,"122":1,"123":1,"124":2,"125":2,"129":1,"130":2,"132":1,"135":2,"136":1,"137":4,"140":1,"184":1,"190":2,"193":2,"220":1,"283":1,"291":2,"296":1,"299":1,"304":1,"306":1,"322":2,"325":2,"327":3,"334":2,"346":2}}],["magiskpolicy",{"0":{"349":1},"2":{"90":6,"92":2,"99":1,"100":1,"107":4,"108":1,"117":1,"119":2,"125":2,"128":1,"129":1,"132":1,"143":2,"144":4,"146":3,"197":1,"213":1,"283":1,"291":1,"293":1,"308":1,"339":6,"342":6,"346":4,"349":3}}],["magisktmp=$",{"2":{"190":2}}],["magisktmp",{"2":{"90":2,"184":10,"220":14,"339":2,"342":2}}],["magiskboot",{"0":{"347":1},"2":{"90":8,"92":2,"94":2,"95":1,"97":2,"99":4,"101":3,"102":1,"104":1,"105":1,"106":3,"107":2,"108":1,"109":1,"110":1,"111":1,"112":4,"113":2,"114":1,"119":3,"120":1,"124":1,"126":1,"128":4,"130":4,"131":1,"132":1,"133":1,"135":2,"137":2,"138":2,"140":3,"141":1,"143":1,"144":2,"145":2,"146":1,"286":1,"291":1,"296":1,"299":1,"304":1,"306":3,"319":2,"339":8,"342":8,"347":4}}],["magiskhide",{"0":{"173":1,"251":1,"264":1,"310":1,"315":1},"2":{"14":1,"23":1,"26":1,"31":1,"45":1,"46":1,"66":1,"67":1,"99":1,"100":2,"101":2,"102":2,"104":1,"106":2,"107":1,"108":5,"111":1,"112":1,"113":2,"114":1,"117":2,"119":6,"120":1,"122":1,"123":1,"124":1,"125":2,"127":1,"132":1,"137":2,"141":1,"142":1,"143":2,"144":9,"145":4,"146":3,"147":2,"148":1,"173":1,"176":1,"251":1,"257":1,"259":1,"264":1,"267":1,"271":1,"272":1,"276":1,"277":1,"287":1,"289":1,"291":5,"299":1,"304":2,"306":2,"308":2,"310":2,"315":2}}],["magiskchinesedocument",{"2":{"0":1}}],["magisk",{"0":{"0":2,"5":1,"82":1,"88":1,"162":1,"163":2,"165":2,"166":1,"167":1,"169":1,"170":1,"171":1,"172":1,"175":1,"179":1,"190":1,"192":1,"202":1,"207":1,"214":1,"222":1,"223":1,"230":1,"250":1,"255":1,"258":1,"260":1,"261":1,"262":1,"267":1,"270":1,"275":1,"280":1,"281":1,"282":1,"285":1,"286":1,"287":1,"288":1,"291":1,"292":1,"294":1,"295":1,"297":1,"300":1,"301":1,"302":2,"305":1,"307":1,"309":1,"311":1,"314":1,"316":1,"319":1,"320":1,"321":1,"324":1,"327":1,"328":1,"333":1,"339":1,"340":1,"346":1,"350":1},"1":{"1":2,"2":2,"3":2,"4":2,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"83":1,"84":1,"85":1,"86":1,"87":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1,"153":1,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"164":2,"165":2,"166":2,"168":1,"169":1,"170":1,"171":1,"172":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"193":1,"194":1,"195":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"215":1,"216":1,"217":1,"218":1,"223":1,"224":1,"225":1,"251":1,"252":1,"253":1,"254":1,"256":1,"257":1,"258":1,"259":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"271":1,"272":1,"273":1,"274":1,"276":1,"277":1,"278":1,"279":1,"281":1,"283":1,"284":1,"286":1,"287":1,"289":1,"290":1,"291":1,"293":1,"296":1,"298":1,"299":1,"301":1,"302":1,"303":1,"304":1,"306":1,"308":1,"310":1,"311":1,"312":1,"313":1,"315":1,"316":1,"317":1,"318":1,"322":1,"323":1,"325":1,"326":1,"329":1,"330":1,"331":1,"332":1,"334":1,"335":1,"336":1,"337":1,"338":1,"341":1,"342":1,"347":1,"348":1,"349":1,"350":1,"351":1,"352":1,"353":1},"2":{"0":3,"13":1,"16":3,"19":1,"24":3,"25":2,"26":1,"27":2,"28":2,"31":4,"37":2,"40":1,"41":1,"43":2,"45":2,"47":1,"48":2,"49":1,"50":1,"53":1,"58":2,"61":1,"65":1,"69":1,"70":3,"71":2,"74":1,"78":3,"80":7,"81":1,"83":2,"84":1,"85":1,"86":12,"87":7,"94":1,"95":1,"99":5,"102":6,"105":1,"106":3,"107":1,"110":1,"111":1,"115":1,"116":1,"117":3,"119":5,"121":2,"122":1,"124":5,"125":3,"129":1,"130":1,"131":1,"134":3,"136":1,"137":3,"138":1,"141":3,"142":1,"143":1,"144":2,"145":1,"148":4,"149":1,"150":3,"151":3,"152":1,"153":3,"155":1,"156":3,"158":3,"160":2,"162":2,"163":1,"164":1,"165":4,"166":5,"168":4,"169":6,"170":3,"171":2,"172":1,"174":1,"175":3,"176":2,"177":1,"179":2,"180":11,"181":5,"182":1,"184":13,"185":1,"186":5,"187":1,"190":12,"191":16,"193":1,"195":1,"197":13,"198":2,"200":5,"201":3,"202":3,"204":1,"206":9,"207":5,"208":1,"210":1,"211":1,"214":9,"215":1,"216":4,"218":1,"219":2,"220":9,"221":2,"222":8,"223":2,"224":3,"225":1,"226":2,"227":4,"228":5,"229":3,"230":8,"231":2,"233":2,"235":7,"237":1,"238":6,"240":1,"241":3,"242":5,"243":7,"244":2,"245":2,"246":3,"247":7,"248":8,"249":1,"251":3,"252":7,"253":4,"254":1,"255":1,"256":1,"259":1,"261":3,"262":1,"263":2,"267":1,"271":4,"273":1,"274":1,"276":4,"278":1,"279":1,"281":13,"282":1,"283":3,"284":1,"289":2,"290":3,"292":3,"293":5,"296":1,"301":3,"302":7,"303":2,"305":2,"307":2,"310":2,"311":2,"312":3,"315":2,"316":2,"317":3,"322":5,"323":8,"325":5,"326":8,"329":2,"331":3,"335":2,"337":3,"343":1,"344":1,"345":1,"346":6,"347":2,"348":3,"349":9,"350":19,"351":1,"352":1,"353":2}}],["maybe",{"2":{"151":1}}],["may",{"2":{"37":1,"104":1,"107":1,"135":1,"261":1,"293":1,"297":1,"299":1}}],["manufacturers",{"2":{"281":1}}],["manually",{"2":{"47":1,"68":1,"69":1}}],["manifest",{"2":{"181":3}}],["manipulating",{"2":{"125":1}}],["manipulate",{"2":{"107":1}}],["manpage",{"2":{"135":1}}],["manage",{"2":{"156":1}}],["managed",{"2":{"97":1,"319":1}}],["management",{"2":{"58":1,"67":1,"72":1,"95":1,"153":1,"323":2,"326":2}}],["manager",{"0":{"5":1,"258":1,"281":1,"287":1,"301":1,"302":1},"1":{"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1},"2":{"16":3,"25":3,"27":1,"28":1,"31":2,"37":2,"41":1,"43":2,"45":1,"48":1,"50":1,"53":1,"57":1,"74":1,"102":2,"107":1,"115":1,"119":3,"121":1,"124":3,"125":1,"129":1,"137":2,"142":1,"148":2,"149":1,"153":2,"155":1,"156":1,"158":1,"238":1,"253":2,"264":1,"281":9,"289":3,"292":2,"293":1,"302":2,"303":1,"323":1,"326":1,"344":1}}],["many",{"2":{"25":1,"47":1,"101":1,"103":1,"108":1,"137":1,"143":1,"251":1,"254":1,"262":1,"271":2,"273":1,"276":2,"277":1,"278":1,"291":1,"297":1,"298":1,"306":1,"310":1,"315":1,"322":2,"323":1,"325":2,"326":1}}],["markdown",{"2":{"24":1,"49":1}}],["major",{"0":{"258":1},"2":{"24":1,"97":1,"118":1,"250":1,"252":1,"258":1,"301":1,"303":1,"305":1,"307":1,"319":1,"321":1,"324":1}}],["mouse",{"2":{"310":1,"315":1}}],["mountinfo",{"2":{"151":1}}],["mounting",{"2":{"92":1,"101":1,"104":1,"105":1,"107":1,"115":1,"120":1,"124":1,"131":1,"141":1,"144":1,"146":2,"271":1,"276":1,"296":1,"299":1,"306":1}}],["mounts",{"2":{"143":1,"150":1,"151":1,"180":2}}],["mountpoint",{"2":{"137":1,"139":1,"252":1}}],["mounted",{"2":{"113":1,"120":1,"141":1,"148":1,"252":1,"262":2}}],["mount",{"0":{"330":1,"336":1},"2":{"90":1,"92":1,"99":1,"104":1,"107":1,"114":2,"117":2,"119":1,"123":1,"124":2,"125":1,"131":1,"140":1,"141":1,"144":3,"146":1,"148":2,"149":1,"150":6,"151":4,"180":9,"181":5,"182":2,"184":7,"185":2,"207":4,"257":2,"271":1,"276":1,"277":1,"299":1,"322":1,"325":1,"330":1,"336":1,"339":1,"342":1,"351":2}}],["months",{"2":{"310":1,"315":1,"322":1,"325":1}}],["monolithic",{"2":{"193":1}}],["monitoring",{"2":{"117":1,"124":1,"151":1}}],["monitor",{"2":{"114":1,"135":3,"138":1,"144":1,"251":1,"264":1}}],["motorola",{"2":{"151":1}}],["motorolla",{"2":{"108":1,"291":1}}],["mostly",{"2":{"267":1,"275":1,"294":1,"295":1}}],["most",{"2":{"145":2,"151":1,"260":1,"263":1,"271":1,"275":1,"276":1,"281":1,"322":1,"325":1}}],["moved",{"2":{"119":1,"137":1,"140":1,"144":2,"252":1,"273":1,"278":1}}],["move",{"2":{"28":1,"93":1,"111":1,"117":1,"122":1,"135":1,"145":2,"150":1,"151":1,"327":1}}],["modded",{"2":{"323":1,"326":1}}],["modding",{"2":{"277":1}}],["moddir=$",{"2":{"209":1}}],["modpath",{"2":{"216":1}}],["modifications",{"2":{"158":1}}],["modifying",{"2":{"101":1,"271":1,"276":1,"306":1}}],["modify",{"2":{"3":2,"112":1,"119":1,"223":2,"271":1,"273":1,"276":1,"278":1}}],["mods",{"2":{"156":4,"323":1,"326":1}}],["module",{"0":{"208":1,"261":1,"284":1},"2":{"21":1,"23":1,"25":2,"26":1,"32":1,"45":1,"46":1,"71":1,"72":1,"91":1,"105":1,"107":1,"119":2,"127":1,"139":1,"141":1,"153":2,"154":1,"182":1,"185":1,"207":2,"208":7,"214":3,"216":1,"218":1,"253":1,"261":5,"262":2,"267":1,"273":1,"278":1,"283":2,"284":4,"290":1,"293":1,"296":1,"311":2,"312":2,"316":2,"317":2,"334":1,"350":2}}],["modulesadb",{"2":{"200":1}}],["modules",{"0":{"283":1,"311":1,"316":1},"2":{"17":1,"22":1,"25":1,"29":1,"43":1,"45":1,"52":1,"62":1,"65":3,"70":1,"92":1,"99":3,"106":1,"107":2,"110":1,"111":1,"113":2,"119":1,"151":2,"156":1,"182":1,"185":1,"186":3,"190":4,"191":6,"200":2,"207":3,"252":1,"257":1,"261":5,"262":5,"267":2,"283":2,"284":2,"293":2,"310":1,"311":3,"313":1,"315":1,"316":3,"318":1,"350":2}}],["model",{"2":{"235":1}}],["mode",{"0":{"290":1},"2":{"18":1,"45":1,"48":1,"57":1,"58":1,"62":1,"94":1,"107":3,"108":1,"116":1,"124":1,"128":1,"135":1,"138":2,"141":1,"143":1,"144":3,"148":1,"151":1,"158":1,"206":1,"271":2,"276":2,"281":1,"290":2,"291":1,"293":2,"347":8}}],["modernization",{"2":{"19":1,"118":1}}],["modern",{"0":{"254":1},"2":{"13":1,"251":1,"254":1}}],["more",{"2":{"3":2,"11":1,"19":2,"20":1,"24":1,"28":1,"72":1,"90":1,"105":1,"106":1,"107":2,"108":2,"113":1,"120":2,"128":1,"135":2,"144":1,"145":1,"146":1,"151":1,"157":1,"223":2,"254":1,"259":2,"273":1,"274":1,"275":1,"278":1,"279":1,"291":2,"293":3,"296":1,"297":1,"302":1,"310":1,"315":1,"323":1,"326":1,"339":1,"342":1}}],["year",{"2":{"255":1,"282":1,"292":1}}],["yet",{"2":{"117":1,"151":1,"257":1,"272":1,"289":1}}],["yes",{"2":{"80":1,"251":1,"322":1,"325":1}}],["youtube",{"2":{"217":3}}],["yourself",{"2":{"253":1}}],["your",{"2":{"3":2,"45":1,"157":1,"158":1,"216":1,"223":2,"261":1,"262":2,"266":1,"267":2,"283":1,"284":1,"293":1,"322":1,"323":3,"325":1,"326":3}}],["you",{"2":{"3":4,"45":1,"48":2,"49":1,"51":1,"65":1,"69":2,"70":1,"148":1,"156":1,"223":4,"259":1,"265":1,"266":1,"271":3,"276":3,"281":3,"290":2,"293":1,"312":1,"317":1,"323":1,"326":1}}],["yarn",{"2":{"1":2}}],["csc",{"2":{"235":2,"236":2}}],["cn",{"2":{"146":1,"148":1}}],["cts",{"2":{"142":1,"144":1,"289":1}}],["cust",{"2":{"181":1}}],["customize",{"2":{"214":2,"215":4,"218":1,"281":2}}],["customizing",{"2":{"16":1}}],["custom",{"2":{"45":1,"51":1,"56":1,"61":1,"70":2,"119":1,"120":1,"122":1,"124":1,"134":1,"145":1,"151":1,"157":1,"184":1,"220":3,"271":1,"276":1,"283":1,"290":1,"293":1,"302":2,"322":1,"323":1,"325":1,"326":1}}],["current",{"2":{"148":1}}],["currently",{"2":{"148":1}}],["cutting",{"2":{"134":1}}],["cp",{"2":{"235":1}}],["cpp",{"2":{"197":1}}],["cpu",{"2":{"114":1,"216":1}}],["cpio",{"2":{"90":4,"93":2,"113":1,"119":1,"135":1,"327":2,"339":4,"342":4,"347":10}}],["cgroup",{"2":{"101":1,"306":1}}],["certain",{"2":{"281":1}}],["certificate",{"2":{"95":1}}],["celebrate",{"2":{"255":1}}],["centralized",{"2":{"99":1,"311":1,"316":1}}],["cil",{"2":{"99":1,"134":1,"349":2}}],["cmds",{"2":{"350":2}}],["cmdline",{"2":{"106":1,"119":1}}],["cmd",{"2":{"97":1,"319":1}}],["c++",{"0":{"254":1},"2":{"85":1,"100":1,"119":1,"254":2,"308":1}}],["critical",{"2":{"322":1,"325":1}}],["cr",{"2":{"208":1}}],["cr+lf",{"2":{"208":1}}],["crc32",{"2":{"143":1}}],["crc64",{"2":{"143":1}}],["crappy",{"2":{"138":1,"258":1}}],["crash",{"2":{"52":1,"53":1,"71":1,"95":1}}],["crashing",{"2":{"29":1,"41":1,"91":1,"92":1,"141":1,"150":1,"286":1,"334":1}}],["crashes",{"2":{"26":1,"27":1,"32":1,"36":1,"38":1,"43":1,"44":1,"45":1,"62":1,"64":2,"68":1,"71":1,"101":2,"104":1,"114":1,"146":1,"149":1,"299":1,"306":2}}],["creating",{"2":{"284":2}}],["creation",{"2":{"113":1,"117":1,"264":1}}],["creates",{"2":{"271":1,"276":1}}],["created",{"2":{"112":1,"116":1,"252":1,"256":1,"293":1}}],["create",{"2":{"49":1,"140":1,"283":1}}],["cross",{"2":{"108":1,"291":1}}],["client",{"2":{"120":2,"197":2}}],["cli",{"2":{"119":1,"135":1,"350":2,"351":1}}],["class",{"2":{"251":1,"349":38}}],["claiming",{"2":{"115":1}}],["clang",{"2":{"86":1}}],["cloning",{"2":{"141":1,"151":1}}],["clone",{"2":{"83":2,"117":1,"139":1,"350":4}}],["closer",{"2":{"107":1}}],["close",{"2":{"49":1}}],["cleaned",{"2":{"51":1}}],["cleanup",{"2":{"35":1,"347":2}}],["clearly",{"2":{"322":1,"325":1}}],["clear",{"2":{"45":1}}],["cat",{"2":{"310":1,"315":1}}],["capable",{"2":{"310":1,"315":1}}],["came",{"2":{"271":1,"276":1}}],["caveat",{"2":{"256":1}}],["casualsnek",{"2":{"172":1}}],["cases",{"2":{"151":1,"277":1}}],["case",{"2":{"124":1,"262":1,"267":1,"290":1,"323":1,"326":1}}],["caching",{"2":{"120":1,"124":1}}],["cache",{"2":{"65":1,"134":1,"174":1,"181":1,"243":2}}],["calculation",{"2":{"114":1,"124":1,"126":1}}],["callback",{"2":{"284":1}}],["calling",{"2":{"144":1,"260":1}}],["calls",{"2":{"141":1}}],["called",{"2":{"124":1,"148":1,"283":1}}],["call",{"2":{"108":1,"290":1,"291":1}}],["carefully",{"2":{"261":1}}],["cargo",{"2":{"86":3}}],["card",{"2":{"68":1}}],["cards",{"2":{"65":1}}],["cardview",{"2":{"26":1}}],["caused",{"2":{"101":1,"102":1,"304":1,"306":1}}],["cause",{"2":{"30":1,"107":1,"112":1,"114":1,"120":1,"145":1,"155":1,"271":1,"276":1,"297":1}}],["causes",{"2":{"22":1,"23":1,"42":1,"100":1,"129":1,"133":1,"144":1,"308":1}}],["causing",{"2":{"25":1,"119":1,"141":1,"262":1}}],["canary",{"2":{"168":2,"259":1,"264":1,"289":1}}],["cannot",{"2":{"105":1,"131":1,"134":1,"145":2,"148":1,"265":1,"296":1,"312":1,"317":1,"323":1,"326":1}}],["can",{"2":{"3":2,"28":1,"45":1,"48":2,"49":1,"65":1,"69":2,"70":1,"71":1,"141":1,"148":2,"223":2,"251":1,"266":1,"273":1,"278":1,"281":2,"303":1,"311":1,"312":1,"313":1,"316":1,"317":1,"318":1,"323":1,"326":1}}],["chromeos",{"2":{"347":2}}],["chown",{"2":{"217":2}}],["choose",{"2":{"69":1}}],["chmod",{"2":{"206":2,"217":2,"219":1}}],["chcon",{"2":{"108":1,"146":1,"217":2,"291":1}}],["challenge",{"2":{"272":1,"277":1}}],["character",{"2":{"90":1,"108":1,"291":1,"339":1,"342":1}}],["characters",{"2":{"49":2}}],["chances",{"2":{"262":1,"267":1}}],["channel",{"2":{"27":1,"29":1,"45":1,"48":1,"259":1,"264":1,"281":1,"289":1}}],["changelogs",{"2":{"292":1}}],["changelog",{"0":{"291":1},"2":{"65":1,"74":1,"160":1,"208":2,"320":1}}],["changed",{"2":{"28":1,"45":1,"256":1,"292":2}}],["change",{"2":{"25":1,"65":1,"66":1,"68":1,"94":1,"119":1,"127":1,"143":1,"144":1,"145":2,"146":1,"148":1,"151":1,"252":1,"275":1,"289":1,"290":2,"303":1,"349":2}}],["changes",{"0":{"252":1},"2":{"13":1,"19":1,"20":1,"100":1,"113":1,"137":1,"152":1,"253":1,"260":1,"270":1,"292":2,"293":1,"308":1,"320":1,"321":1,"323":1,"324":1,"326":1}}],["checkout",{"2":{"294":1,"295":1,"297":1}}],["check",{"2":{"58":1,"68":1,"69":1,"107":1,"124":3,"125":1,"130":1,"132":1,"135":1,"143":2,"146":1,"150":1,"272":1,"273":1,"274":1,"277":1,"278":1,"279":1,"302":1,"305":1,"311":1,"316":1,"320":1}}],["checksum",{"2":{"104":1,"114":1,"299":1}}],["checksums",{"2":{"28":1}}],["checks",{"2":{"46":1}}],["checking",{"2":{"43":1,"101":1,"233":1,"306":1}}],["chinese",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1},"2":{"0":1,"49":1,"255":1,"281":1}}],["copied",{"2":{"314":1}}],["copyright",{"2":{"3":1}}],["copy",{"2":{"3":2,"100":1,"223":2,"308":1}}],["cool",{"2":{"280":1}}],["couldn",{"2":{"143":1}}],["could",{"2":{"101":1,"120":1,"125":1,"306":1}}],["correctly",{"2":{"148":1,"151":1}}],["corrupted",{"2":{"12":1,"45":1}}],["core",{"2":{"62":1,"119":2,"137":2,"140":1,"141":1,"143":1,"252":5,"301":1,"302":1}}],["convoluted",{"2":{"284":1}}],["convenient",{"2":{"48":1}}],["consistent",{"2":{"290":2}}],["considerations",{"2":{"263":1}}],["consider",{"2":{"148":1}}],["consequences",{"2":{"271":1,"276":1}}],["constantly",{"2":{"322":1,"325":1}}],["constant",{"2":{"264":1}}],["construct",{"2":{"140":1}}],["console",{"2":{"124":1}}],["conditions",{"2":{"117":1,"150":1}}],["confusion",{"2":{"302":1}}],["confusing",{"2":{"252":1}}],["confused",{"2":{"61":1}}],["confln",{"2":{"186":1}}],["conflicts",{"2":{"125":1}}],["conf",{"2":{"186":3}}],["confident",{"2":{"264":1}}],["configuration",{"2":{"99":1}}],["configurations",{"2":{"99":1}}],["configure",{"2":{"99":1}}],["configured",{"2":{"39":1}}],["config",{"2":{"84":2,"87":1,"94":1,"133":1,"186":1,"190":2,"196":1}}],["confirmed",{"2":{"64":1}}],["continue",{"2":{"289":1}}],["contextui",{"2":{"217":1}}],["context",{"2":{"90":1,"91":1,"128":1,"138":1,"143":1,"148":2,"217":15,"334":1,"339":1,"342":1,"349":2,"351":1}}],["content",{"2":{"90":1,"339":1,"342":1}}],["contentprovider",{"2":{"15":1}}],["contributes",{"2":{"137":1}}],["contributors",{"2":{"60":1,"322":1,"325":1}}],["controls",{"2":{"67":1}}],["contains",{"2":{"148":2}}],["containing",{"2":{"90":1,"339":1,"342":1}}],["contain",{"2":{"27":1}}],["colorama",{"2":{"83":2}}],["colors",{"2":{"64":1}}],["color",{"2":{"26":1}}],["code",{"0":{"254":1},"2":{"19":1,"46":1,"92":2,"95":1,"99":1,"118":1,"119":1,"133":1,"156":1,"216":1,"254":2,"264":1,"312":1,"317":1}}],["combat",{"2":{"323":1,"326":1}}],["combos",{"2":{"133":1}}],["come",{"2":{"262":1}}],["comes",{"2":{"250":1,"264":1,"292":1,"323":1,"326":1}}],["community",{"2":{"253":1,"310":1,"315":1}}],["communicate",{"2":{"121":1,"281":1}}],["communication",{"2":{"13":1,"15":1,"27":1,"107":1,"110":1,"111":1,"121":1,"148":1,"281":1}}],["commands",{"2":{"123":1,"144":1,"148":2}}],["commandline",{"2":{"97":1,"319":1}}],["command",{"2":{"92":1,"97":1,"105":1,"106":1,"113":1,"119":1,"120":1,"125":1,"148":3,"290":3,"293":1,"296":1,"319":1,"351":2}}],["com",{"2":{"83":2,"106":1,"124":1,"172":2,"214":2}}],["complicated",{"2":{"322":1,"325":1}}],["complex",{"2":{"322":1,"325":1}}],["complexity",{"2":{"302":1}}],["completed",{"2":{"233":1}}],["complete",{"2":{"148":1,"290":1,"350":2}}],["completely",{"2":{"31":1,"107":1,"261":1,"292":2,"293":1,"322":1,"325":1}}],["compile",{"2":{"349":4}}],["compiler",{"2":{"129":2}}],["compilations",{"2":{"134":1}}],["computing",{"2":{"124":1}}],["companion",{"2":{"302":1}}],["compared",{"2":{"275":1}}],["compare",{"2":{"124":1}}],["compatible",{"2":{"156":1,"271":1,"276":1}}],["compatibility",{"2":{"27":1,"95":1,"106":1,"116":1,"126":1,"144":1,"146":2,"158":1,"253":1,"262":1,"271":1,"276":1,"281":1,"295":1}}],["compat",{"2":{"99":1,"271":2,"276":2}}],["compromised",{"2":{"293":1}}],["compromises",{"2":{"107":1}}],["compress",{"2":{"347":2}}],["compressed",{"2":{"102":1,"107":1,"117":1,"141":1,"304":1}}],["compression",{"2":{"92":1,"97":1,"128":1,"135":1,"143":1,"145":1,"157":1,"319":1}}],["component",{"2":{"23":1,"111":1,"117":1,"119":1,"251":2,"287":1}}],["components",{"2":{"14":1,"49":1,"302":1}}],["coming",{"2":{"19":1,"20":1,"294":1,"295":1,"297":1,"305":1,"314":1,"320":1}}],["cdn",{"2":{"11":1,"12":1}}],["c",{"2":{"3":2,"77":3,"78":4,"79":1,"80":2,"85":1,"97":1,"103":1,"138":1,"144":1,"148":3,"254":1,"298":1,"319":1,"350":2,"351":2}}],["贡献",{"0":{"2":1}}],["构建脚本将自动查找并使用捆绑的",{"2":{"83":1}}],["构建和开发",{"0":{"82":1},"1":{"83":1,"84":1,"85":1,"86":1,"87":1},"2":{"222":1}}],["构建",{"0":{"84":1},"2":{"1":1,"87":1}}],["drowning",{"2":{"310":1,"315":1}}],["dropping",{"0":{"253":1}}],["drop",{"2":{"24":1,"253":1}}],["driver",{"2":{"262":1}}],["drivers",{"2":{"232":1,"297":1}}],["dr",{"2":{"251":1}}],["d$",{"2":{"180":1}}],["dp3",{"2":{"144":1}}],["dt",{"2":{"112":1}}],["dtbs",{"2":{"277":1}}],["dtbh",{"2":{"112":1}}],["dtb",{"2":{"94":1,"99":1,"108":1,"110":1,"112":1,"124":2,"128":1,"132":2,"140":2,"151":1,"291":1,"347":16}}],["dtbo",{"2":{"39":2,"110":1,"137":2,"347":2}}],["dm",{"2":{"106":1,"132":1,"271":1,"276":1}}],["dhtb",{"2":{"104":1,"130":1,"299":1}}],["dsu",{"2":{"99":1}}],["duh",{"2":{"256":1}}],["dummy",{"2":{"140":1,"151":2,"154":1}}],["dumps",{"2":{"141":1}}],["dump",{"2":{"105":1,"107":1,"296":1}}],["during",{"2":{"94":1}}],["due",{"2":{"27":1,"260":1,"263":1,"265":1,"270":1,"292":1,"303":1,"311":1,"316":1}}],["d",{"2":{"92":1,"108":1,"113":1,"119":2,"122":2,"124":2,"131":2,"141":2,"144":1,"148":2,"180":8,"181":5,"182":1,"184":10,"185":3,"191":6,"219":4,"220":8,"252":3,"271":2,"276":2,"291":1,"293":1}}],["db",{"2":{"45":1,"191":2}}],["dynamically",{"2":{"108":1,"281":1,"291":1}}],["dynamic",{"2":{"43":1,"137":1,"144":1}}],["dangerous",{"2":{"271":1,"276":1}}],["danger",{"2":{"238":1}}],["date",{"2":{"149":1}}],["databin=$secure",{"2":{"191":2}}],["database",{"2":{"28":1,"36":1,"37":1,"42":1,"45":2,"65":1,"119":2,"144":1}}],["data",{"0":{"191":1,"194":1},"2":{"45":1,"66":1,"93":1,"101":1,"105":1,"107":1,"113":1,"115":1,"117":1,"119":2,"120":2,"125":1,"131":1,"134":2,"135":1,"141":2,"145":1,"148":5,"181":1,"182":1,"185":1,"186":3,"190":4,"191":10,"194":3,"196":2,"206":3,"207":7,"209":1,"219":9,"243":1,"252":3,"262":1,"281":1,"296":1,"306":1,"327":1,"350":2}}],["daemon",{"2":{"90":2,"92":1,"110":1,"111":1,"114":1,"117":1,"120":3,"122":1,"123":2,"124":7,"125":8,"128":1,"130":3,"131":2,"132":1,"134":3,"135":4,"137":1,"138":6,"140":2,"141":4,"144":2,"145":1,"148":1,"151":1,"281":1,"283":1,"312":1,"317":1,"323":1,"326":1,"339":2,"342":2,"350":2}}],["dark",{"2":{"26":1,"43":1,"64":1,"65":1}}],["differently",{"2":{"323":1,"326":1}}],["different",{"2":{"312":1,"317":1}}],["dirpermission",{"2":{"217":6}}],["dir",{"2":{"191":14,"217":2,"271":1,"276":1}}],["dir=",{"2":{"191":2}}],["directory",{"2":{"113":1,"148":2,"217":8,"220":2,"227":2,"271":2,"276":2,"293":1}}],["directly",{"2":{"90":1,"105":1,"117":1,"125":1,"140":1,"144":1,"262":1,"284":1,"296":1,"312":1,"317":1,"339":1,"342":1}}],["direct",{"2":{"48":1}}],["ditched",{"2":{"144":1}}],["dialog",{"2":{"65":1}}],["dialogs",{"2":{"43":1}}],["diareuse",{"2":{"19":1}}],["discussion",{"2":{"266":1}}],["discovered",{"2":{"251":1}}],["disconnected",{"2":{"124":1}}],["distinguish",{"2":{"106":1}}],["distributors",{"2":{"323":1,"326":1}}],["distributor",{"2":{"95":1}}],["distributed",{"2":{"3":2,"223":2}}],["disappear",{"2":{"149":1}}],["disallow",{"2":{"102":1}}],["disable",{"2":{"64":1,"67":1,"107":1,"108":1,"119":1,"127":1,"146":1,"148":2,"157":1,"158":1,"174":1,"207":2,"228":4,"291":1,"350":2}}],["disabled",{"2":{"55":1,"127":1,"257":1,"293":1}}],["display",{"2":{"24":1,"65":1}}],["docs",{"2":{"261":1,"293":1}}],["documentations",{"2":{"271":1,"273":1,"276":1,"278":1,"292":1}}],["documentation",{"0":{"313":1,"318":1},"2":{"0":1,"107":1,"187":1,"313":1,"318":1}}],["document",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1}}],["domain",{"2":{"153":1,"157":2,"349":2}}],["dontauditxperm",{"2":{"349":2}}],["dontaudit",{"2":{"349":2}}],["done",{"2":{"254":1,"256":1,"259":1}}],["don",{"2":{"148":1,"253":1}}],["donation",{"2":{"65":1}}],["double",{"2":{"132":1}}],["does",{"2":{"102":1,"132":1,"144":1,"148":1,"261":1,"284":1,"304":1}}],["doesn",{"2":{"47":1,"148":1,"260":1}}],["do",{"2":{"99":1,"116":1,"146":1,"157":1,"254":1,"260":1,"266":1,"283":2,"284":1}}],["down",{"0":{"257":1},"2":{"24":1,"46":1,"118":1,"148":1}}],["downloaded",{"2":{"28":1,"45":1,"56":1}}],["downloads",{"2":{"28":1,"71":1}}],["downloading",{"2":{"18":1,"21":1,"25":1,"46":1,"52":1,"99":1,"302":1}}],["download",{"2":{"11":1,"25":1,"31":1,"45":1,"46":1,"49":1,"64":2,"65":2,"72":1,"156":1,"228":2,"235":2,"281":2,"311":2,"316":2}}],["dedup",{"2":{"271":1,"276":1}}],["dedicated",{"2":{"124":1,"251":1}}],["dest",{"2":{"347":4,"350":6}}],["description=",{"2":{"208":2}}],["designed",{"2":{"253":1,"271":1,"276":1,"283":1,"323":1,"326":1}}],["design",{"2":{"72":1,"125":1}}],["dead",{"0":{"302":1}}],["deadlocks",{"2":{"101":1,"306":1}}],["deadlock",{"2":{"100":1,"101":1,"306":1,"308":1}}],["dealing",{"2":{"286":1}}],["deal",{"2":{"150":1,"293":1}}],["debuggable",{"2":{"146":1}}],["debugging",{"2":{"119":1}}],["debug",{"2":{"123":1,"130":1,"190":1,"323":1,"326":1}}],["defex",{"2":{"120":1,"122":1}}],["default",{"2":{"49":1,"61":1,"86":2,"108":1,"144":1,"154":1,"158":1,"289":1,"291":1,"349":6}}],["deny",{"2":{"349":2}}],["denylist",{"2":{"95":2,"97":1,"99":1,"319":1,"350":4}}],["denies",{"2":{"119":1,"120":1}}],["depending",{"2":{"252":1}}],["depends",{"2":{"252":1}}],["dependency",{"2":{"153":1}}],["dependencies",{"2":{"49":1}}],["deprecate",{"2":{"119":1}}],["deprecated",{"2":{"113":1}}],["delprop",{"2":{"352":2}}],["delta",{"0":{"162":1,"163":1,"165":1,"179":1},"1":{"164":1,"165":1,"166":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1},"2":{"164":1,"168":2,"169":3,"170":1,"176":1,"179":2,"180":2,"181":2,"182":1,"184":3,"185":1,"186":1,"187":1,"201":1,"222":2,"224":1}}],["delay",{"2":{"113":1}}],["delete",{"2":{"101":1,"140":1,"306":1,"352":2}}],["deleted",{"2":{"99":1}}],["deleting",{"2":{"23":1}}],["decided",{"2":{"265":1,"270":1,"289":1}}],["decoupling",{"2":{"310":1,"315":1}}],["decouples",{"2":{"261":1}}],["decompress",{"2":{"140":1,"347":2}}],["decompression",{"2":{"109":1}}],["decode",{"2":{"125":1}}],["declaring",{"2":{"107":1}}],["de",{"2":{"47":1}}],["determined",{"2":{"310":1,"315":1}}],["detectable",{"2":{"108":1,"291":1}}],["detecting",{"2":{"99":1,"124":2,"125":1}}],["detection",{"2":{"25":1,"39":1,"48":1,"61":1,"89":1,"93":1,"94":1,"95":1,"106":1,"107":1,"119":1,"120":1,"121":1,"124":1,"128":1,"130":1,"144":1,"151":1,"281":1,"293":1,"327":1,"341":1}}],["detections",{"2":{"16":1,"27":1,"124":1,"130":1}}],["detect",{"2":{"46":1,"94":1,"102":1,"105":1,"108":1,"123":1,"134":1,"140":1,"155":1,"157":1,"251":2,"259":1,"291":1,"296":1}}],["detected",{"2":{"31":1,"49":1,"64":1,"119":1,"145":1,"150":1,"271":1,"276":1}}],["detail",{"2":{"322":1,"325":1}}],["detailed",{"2":{"13":1,"45":1}}],["details",{"2":{"3":2,"107":1,"108":1,"198":1,"223":2,"256":1,"271":1,"272":1,"273":1,"274":1,"276":1,"277":1,"278":1,"279":1,"284":1,"291":1,"293":3,"294":1,"313":1,"318":1}}],["development",{"2":{"323":1,"326":1}}],["developers",{"2":{"253":1,"261":2,"270":1,"273":1,"278":1,"283":1,"284":2,"292":1,"293":2,"311":1,"312":2,"313":1,"316":1,"317":2,"318":1,"322":1,"325":1}}],["developer",{"2":{"125":1,"158":1,"221":1,"284":1,"293":1,"323":1,"326":1}}],["devs",{"2":{"261":1,"283":1}}],["devpts",{"2":{"99":1}}],["device",{"2":{"12":1,"13":1,"19":1,"89":1,"95":1,"101":1,"107":2,"115":1,"116":1,"122":1,"123":1,"141":1,"150":1,"157":2,"158":1,"235":1,"283":1,"284":1,"293":1,"295":1,"306":1,"322":2,"323":1,"325":2,"326":1,"341":1}}],["devices",{"2":{"11":1,"12":1,"24":1,"26":1,"28":1,"38":1,"39":1,"43":1,"47":1,"62":1,"89":1,"92":1,"93":1,"94":1,"95":3,"99":5,"102":1,"105":1,"107":1,"108":3,"111":2,"113":2,"114":1,"115":1,"117":1,"118":1,"122":2,"124":4,"125":2,"129":1,"131":1,"132":4,"136":1,"137":1,"138":1,"140":3,"141":1,"143":1,"144":2,"145":2,"146":1,"151":1,"156":2,"157":3,"158":1,"200":1,"251":2,"257":2,"262":3,"263":1,"267":1,"271":4,"272":1,"274":2,"275":1,"276":4,"277":1,"279":2,"281":2,"283":1,"291":3,"296":1,"297":2,"303":1,"322":1,"325":1,"327":1,"341":1}}],["dev",{"2":{"1":1,"106":1,"108":1,"122":1,"123":1,"124":1,"227":4,"291":1}}],["仓库查看新的",{"2":{"332":1,"338":1}}],["仓库",{"2":{"0":2}}],["为开发人员提供了大量安装工具",{"2":{"346":1}}],["为我们提供了未修改文件系统的更精确克隆",{"2":{"330":1,"336":1}}],["为您的设备下载最新固件包",{"2":{"235":1}}],["为此请使用组合键在下载模式下启动设备",{"2":{"233":1}}],["为方便起见",{"2":{"217":1}}],["为了应用",{"2":{"245":1}}],["为了确保所有后续执行的",{"2":{"206":1}}],["为了减少",{"2":{"197":1}}],["为了防止检测",{"2":{"191":1}}],["为了获得magisk正在使用的当前基本文件夹",{"2":{"190":2}}],["为了区分",{"2":{"76":1}}],["为例",{"2":{"186":1}}],["为模块添加了删除支持",{"2":{"186":1}}],["为什么这个文档很多错误或者不通顺的地方",{"0":{"203":1}}],["为什么",{"0":{"201":1}}],["为什么启用",{"0":{"177":1}}],["为什么不恢复",{"0":{"175":1}}],["为什么我的应用程序",{"0":{"173":1}}],["为",{"2":{"77":2}}],["为镜像仓库",{"2":{"0":1}}],["为主仓库",{"2":{"0":1}}],["上下文",{"2":{"350":4}}],["上下文执行",{"2":{"166":1}}],["上的文件管理器或第三方",{"2":{"243":1}}],["上测试的那样",{"2":{"242":1}}],["上打开",{"2":{"235":1}}],["上面的",{"2":{"220":1}}],["上面的列表将对应创建以下文件",{"2":{"217":1}}],["上面没有提到的其他字符串可以是任何单行字符串",{"2":{"208":1}}],["上触发",{"2":{"194":1}}],["上安装",{"0":{"172":1}}],["上使用此方法",{"2":{"166":1}}],["上表中的最终根目录",{"2":{"78":1}}],["上表中的初始根目录",{"2":{"78":1}}],["上",{"2":{"0":1,"76":1,"77":1,"78":1,"83":5,"206":1,"349":1}}],["与不存在的文件对应的文件将被忽略",{"2":{"220":1}}],["与仅",{"2":{"79":1}}],["与",{"0":{"334":1},"2":{"0":1,"86":2}}],["id=",{"2":{"208":1}}],["id",{"2":{"182":1,"185":1,"186":3,"207":4,"208":1}}],["ide",{"0":{"85":1},"1":{"86":1}}],["ize",{"2":{"153":1}}],["i18n",{"2":{"106":1}}],["iv",{"2":{"80":5}}],["iii",{"2":{"80":6}}],["ii",{"2":{"80":2}}],["i",{"2":{"80":2,"251":1,"253":2,"259":1,"260":1,"264":1,"266":1,"272":1,"277":1,"289":1,"292":1,"309":1,"310":2,"312":1,"314":1,"315":2,"317":1,"323":1,"326":1}}],["icons",{"2":{"45":1}}],["icon",{"2":{"45":1,"71":1}}],["imageless",{"0":{"262":1},"2":{"267":1}}],["images",{"2":{"45":1,"48":1,"92":1,"101":2,"102":1,"105":1,"106":1,"107":1,"108":1,"111":1,"113":1,"119":1,"124":1,"127":1,"130":4,"137":1,"141":1,"291":1,"296":1,"304":1,"306":2}}],["image",{"2":{"24":1,"26":1,"48":3,"64":1,"69":1,"90":2,"92":1,"99":2,"104":1,"110":1,"111":1,"119":1,"120":1,"122":1,"123":1,"124":1,"128":2,"137":2,"138":1,"140":1,"141":1,"144":1,"146":1,"151":2,"153":1,"156":1,"262":2,"277":1,"294":1,"299":1,"339":2,"342":2,"347":2}}],["impossible",{"2":{"271":1,"276":1}}],["importantly",{"2":{"271":1,"276":1}}],["important",{"2":{"156":1,"263":1,"323":1,"326":1}}],["implicitly",{"2":{"322":1,"325":1}}],["implies",{"2":{"271":1,"276":1}}],["implied",{"2":{"3":2,"223":2}}],["implemented",{"2":{"125":1,"148":2}}],["implement",{"2":{"114":1,"148":1,"284":1,"323":1,"326":1}}],["implementations",{"2":{"322":1,"325":1}}],["implementation",{"0":{"271":1,"276":1},"2":{"48":1,"51":1,"90":1,"92":2,"95":3,"101":1,"106":1,"113":2,"114":1,"135":2,"271":1,"272":1,"276":1,"277":1,"301":1,"306":1,"310":1,"312":1,"315":1,"317":1,"323":1,"326":1,"339":1,"342":1}}],["improving",{"2":{"301":1,"310":1,"315":1}}],["improved",{"2":{"97":1,"144":1,"289":1,"319":1}}],["improvements",{"0":{"251":1},"2":{"31":1,"43":1,"45":1,"67":1,"97":1,"98":1,"258":1,"259":1,"264":1,"314":1,"319":1}}],["improve",{"2":{"24":1,"49":1,"50":1,"60":1,"96":1,"97":2,"107":1,"114":1,"150":1,"152":1,"319":2,"320":1}}],["improper",{"2":{"25":1,"97":1,"319":1}}],["imgfastboot",{"2":{"228":1,"241":1,"242":1}}],["img的路径fastboot",{"2":{"228":3}}],["img的路径",{"2":{"228":4}}],["img的路径adb",{"2":{"228":1}}],["imgtool",{"2":{"124":4}}],["img",{"2":{"12":1,"90":4,"92":1,"117":1,"119":1,"131":1,"134":2,"137":3,"141":2,"145":1,"227":7,"228":4,"241":3,"242":5,"248":1,"252":8,"339":4,"342":4,"347":2}}],["if",{"0":{"301":1},"2":{"3":2,"23":1,"31":1,"35":1,"45":2,"46":1,"49":3,"99":2,"101":1,"104":1,"115":1,"117":1,"124":2,"127":1,"140":1,"145":3,"148":2,"150":3,"180":2,"223":2,"252":1,"259":1,"271":1,"276":1,"281":1,"290":2,"293":1,"294":1,"295":1,"297":1,"299":1,"303":1,"305":1,"306":1,"312":1,"317":1}}],["inapplicable",{"2":{"283":1}}],["inaccessible",{"2":{"68":1}}],["inactive",{"2":{"28":1,"122":1}}],["inspired",{"2":{"312":1,"317":1}}],["insmod",{"2":{"184":2,"220":4}}],["insufficient",{"2":{"157":1}}],["instruction",{"2":{"256":1}}],["instructions",{"2":{"102":1,"256":1,"293":1}}],["instance",{"2":{"290":1}}],["instantly",{"2":{"148":1}}],["installer",{"0":{"261":1,"284":1},"2":{"157":1,"214":3,"218":1,"261":1,"283":1,"284":3}}],["installed",{"2":{"17":1,"25":1,"61":1,"95":1,"106":1,"124":1,"156":1,"256":1,"293":1}}],["install",{"2":{"48":1,"53":1,"58":2,"69":1,"83":1,"99":2,"105":1,"122":1,"124":1,"153":1,"162":1,"218":1,"274":1,"279":1,"284":1,"296":1,"311":1,"316":1,"350":2}}],["installing",{"2":{"28":1,"45":1,"47":1,"52":1,"65":1,"302":1}}],["installation",{"2":{"13":1,"35":1,"41":1,"43":1,"94":2,"96":1,"100":2,"101":1,"106":1,"125":1,"127":1,"131":1,"138":1,"141":2,"144":1,"145":1,"216":1,"244":1,"257":1,"261":2,"262":1,"274":1,"279":1,"284":1,"290":1,"302":2,"306":1,"308":2,"320":1}}],["instead",{"2":{"45":1,"46":1,"99":1,"117":1,"119":3,"125":1,"144":3,"157":1,"251":1,"254":1,"271":1,"276":1,"293":1,"310":1,"315":1}}],["independently",{"2":{"156":1}}],["independent",{"2":{"148":1}}],["indefinite",{"2":{"97":1,"319":1}}],["involves",{"2":{"277":1}}],["invoking",{"2":{"148":1}}],["invocation",{"2":{"148":2}}],["invincible",{"2":{"124":1,"135":1,"138":1}}],["invalid",{"2":{"28":1,"29":1,"102":1}}],["inherit",{"2":{"107":1}}],["inject",{"2":{"112":1,"117":1,"146":1,"147":1,"148":3}}],["injection",{"2":{"92":1,"95":1,"153":1,"156":1,"157":1,"322":1,"325":1}}],["injected",{"2":{"92":1}}],["initrc",{"2":{"184":3,"185":2}}],["initrd",{"2":{"171":1}}],["initramfs",{"2":{"76":1,"77":2,"79":2,"80":1,"99":1,"113":1,"129":1,"132":1,"137":1,"140":2,"220":2,"271":1,"276":1}}],["initial",{"2":{"159":1}}],["initialize",{"2":{"135":1}}],["initialized",{"2":{"106":1}}],["initializer",{"2":{"30":1}}],["initialization",{"2":{"67":1}}],["init",{"0":{"183":1,"193":1,"283":1},"1":{"184":1,"185":1},"2":{"77":5,"90":2,"91":1,"92":1,"99":1,"107":1,"110":1,"113":1,"117":2,"122":1,"138":1,"140":1,"150":1,"152":1,"184":5,"193":7,"196":2,"220":9,"227":2,"228":5,"272":2,"277":2,"283":1,"334":1,"339":2,"342":2,"348":2,"350":2}}],["incpio",{"2":{"347":6}}],["increasingly",{"2":{"322":1,"325":1}}],["increase",{"2":{"95":1,"107":1,"125":1,"144":1}}],["including",{"2":{"135":1,"150":2,"223":2,"290":1,"322":1,"325":1}}],["includes",{"2":{"302":1}}],["include",{"2":{"119":1,"125":1,"156":1,"283":1}}],["included",{"2":{"49":1,"158":1,"290":1}}],["incompatible",{"2":{"281":1,"303":1}}],["incomplete",{"2":{"25":1,"27":1}}],["incorrect",{"2":{"94":1,"102":1,"304":1}}],["incorrectly",{"2":{"71":1,"94":1}}],["intact",{"2":{"322":1,"325":1}}],["introducing",{"0":{"312":1,"317":1}}],["introduction",{"2":{"264":1,"323":1,"326":1}}],["introduced",{"2":{"91":1,"265":1,"281":1,"320":1,"322":2,"325":2,"334":1}}],["introduce",{"2":{"25":2,"51":1,"95":1,"99":2,"108":1,"124":1,"140":1,"144":2,"291":1}}],["int",{"2":{"208":4,"216":2}}],["integration",{"2":{"150":1,"152":1}}],["integrity",{"2":{"58":1}}],["integer",{"2":{"101":1,"306":1}}],["intellij",{"2":{"86":2}}],["intel",{"2":{"83":1}}],["interest",{"2":{"310":1,"315":1}}],["interested",{"2":{"272":1,"277":1}}],["interface",{"2":{"51":1,"151":1,"156":1}}],["internet",{"2":{"49":1}}],["internally",{"2":{"312":1,"317":1}}],["internaldir=$magisktmp",{"2":{"190":2}}],["internal",{"2":{"40":1,"49":2,"50":1,"137":1,"187":1,"198":1,"252":2,"281":1,"290":1,"293":1}}],["intent",{"2":{"44":1,"117":1}}],["into",{"2":{"12":1,"45":1,"47":1,"58":1,"92":1,"93":1,"102":1,"107":1,"135":1,"141":2,"144":2,"145":1,"274":1,"279":1,"281":1,"293":1,"309":1,"314":1,"322":1,"325":1,"327":1}}],["infile",{"2":{"347":4}}],["infinite",{"2":{"16":1,"135":1}}],["inf",{"2":{"214":2}}],["infrastructure",{"2":{"93":1,"327":1}}],["information",{"2":{"89":1,"251":1,"341":1}}],["info",{"2":{"13":1,"46":1,"120":1,"124":1,"135":1,"146":1,"302":1}}],["in",{"2":{"3":2,"13":1,"14":1,"18":1,"19":2,"20":1,"25":3,"26":1,"29":1,"30":1,"31":1,"40":1,"42":1,"43":2,"47":1,"49":2,"51":1,"54":1,"57":1,"61":1,"64":1,"65":1,"67":1,"69":1,"71":1,"90":1,"91":1,"92":3,"94":1,"95":1,"97":1,"99":2,"100":2,"101":2,"104":1,"106":1,"107":1,"108":4,"110":2,"111":1,"112":1,"113":3,"114":1,"115":1,"116":2,"117":3,"119":5,"120":2,"122":3,"123":1,"124":6,"125":2,"127":1,"130":2,"131":1,"132":1,"133":2,"137":3,"140":3,"141":5,"144":3,"145":2,"148":3,"150":1,"151":3,"152":1,"153":3,"156":3,"158":3,"223":2,"251":2,"252":1,"253":1,"256":1,"259":1,"262":3,"263":2,"264":2,"265":1,"266":1,"267":2,"271":2,"272":1,"273":2,"276":2,"277":4,"278":2,"281":2,"283":2,"284":2,"289":1,"290":7,"291":4,"292":1,"299":1,"302":1,"303":1,"306":2,"308":2,"310":4,"311":2,"312":3,"313":1,"315":4,"316":2,"317":3,"318":1,"319":1,"320":1,"322":3,"323":4,"325":3,"326":4,"334":1,"339":1,"342":1}}],["its",{"2":{"153":1,"281":1,"283":2,"292":1,"323":2,"326":2}}],["itself",{"2":{"107":1,"125":1,"281":1,"302":2}}],["items",{"2":{"151":1}}],["it",{"2":{"3":6,"28":1,"92":1,"99":1,"102":3,"104":1,"107":2,"125":2,"144":1,"148":3,"151":1,"155":1,"158":3,"223":6,"251":1,"252":2,"257":2,"260":2,"264":4,"265":1,"270":1,"271":2,"276":2,"281":2,"284":1,"290":2,"292":1,"299":1,"302":1,"309":2,"314":2,"322":1,"323":1,"325":1,"326":1}}],["ioctl",{"2":{"197":1,"349":2}}],["io",{"2":{"0":2,"162":1}}],["is64bit",{"2":{"216":1}}],["isn",{"2":{"148":2,"257":1,"289":1,"302":1}}],["isolate",{"2":{"107":1}}],["isolated",{"2":{"99":2,"104":1,"107":1,"299":1}}],["isolation",{"2":{"107":1,"114":1}}],["issues",{"2":{"15":1,"17":1,"42":1,"50":1,"58":1,"66":1,"68":1,"92":1,"100":1,"115":1,"136":1,"141":2,"143":1,"144":1,"145":1,"146":2,"148":2,"151":1,"153":1,"157":2,"158":1,"266":2,"271":1,"276":1,"283":1,"308":1,"319":1,"327":1}}],["issue",{"2":{"11":1,"37":1,"41":1,"42":1,"45":1,"68":1,"93":1,"103":1,"124":1,"141":1,"148":1,"149":2,"150":1,"283":1,"298":1,"327":1}}],["is",{"0":{"263":1,"302":1},"2":{"0":1,"3":4,"18":1,"26":1,"37":1,"45":2,"46":2,"49":2,"51":1,"55":1,"64":1,"65":1,"70":1,"71":2,"91":1,"93":2,"99":3,"100":1,"102":2,"104":1,"107":2,"108":1,"113":1,"115":1,"119":2,"120":2,"122":1,"124":3,"125":4,"127":1,"132":1,"137":2,"138":1,"141":2,"144":2,"145":2,"148":3,"150":1,"151":3,"158":2,"223":2,"251":1,"252":7,"253":2,"255":1,"256":1,"257":2,"258":1,"259":1,"260":1,"261":1,"262":2,"264":4,"265":2,"267":1,"270":2,"271":8,"272":5,"273":1,"275":1,"276":8,"277":2,"278":1,"281":1,"283":3,"284":3,"289":5,"290":4,"291":1,"292":1,"293":2,"294":1,"295":1,"299":1,"301":1,"302":1,"303":1,"305":2,"307":2,"308":1,"310":2,"311":1,"312":5,"315":2,"316":1,"317":5,"321":1,"322":3,"323":3,"324":1,"325":3,"326":3,"327":2,"334":1}}],["项目的步骤",{"0":{"171":1}}],["项目列表",{"2":{"168":1}}],["项目或",{"0":{"167":1},"1":{"168":1,"169":1,"170":1,"171":1,"172":1}}],["项目不需要配置工具链",{"2":{"86":1}}],["项目中的",{"2":{"85":1}}],["项目",{"2":{"0":1,"86":1,"211":1}}],["这让我们别无选择",{"2":{"329":1,"335":1}}],["这只是一个通用指南",{"2":{"245":1}}],["这种安装方法已被弃用",{"2":{"243":1}}],["这种独立模式的意思是",{"2":{"206":1}}],["这部分现已从官方文档中移除",{"2":{"238":1}}],["这不是拼写错误",{"2":{"242":1}}],["这不是官方支持的",{"2":{"0":1}}],["这不包括在解锁",{"2":{"231":1}}],["这两个文件将被复制到",{"2":{"220":2}}],["这两个实际上非常相似",{"2":{"76":1}}],["这几乎意味着是",{"2":{"219":1}}],["这允许模块开发人员在安装模块之前动态调整其模块",{"2":{"219":1}}],["这里唯一的区别在于odin刷入步骤",{"2":{"236":1}}],["这里",{"2":{"216":1,"254":1,"259":1,"266":1,"267":1,"274":1,"279":1,"281":1,"284":1,"287":1,"293":1,"294":1,"296":1,"299":1,"304":1,"306":1,"308":1,"313":1,"318":1,"319":1,"320":1,"323":1,"326":1,"327":1,"332":1,"338":1,"339":1,"342":1}}],["这样在未经您确认的情况下",{"2":{"246":1}}],["这样",{"2":{"215":1}}],["这样的命令将不使用",{"2":{"206":1}}],["这用于对比版本",{"2":{"208":1}}],["这包括所有启动脚本和模块安装脚本",{"2":{"206":1}}],["这包括决定启动到",{"2":{"79":1}}],["这确保脚本始终在可预测的环境中运行",{"2":{"206":1}}],["这将需要通过电脑",{"2":{"248":1}}],["这将使用您设备的官方映像",{"2":{"248":1}}],["这将使",{"2":{"246":1}}],["这将清除你的数据并自动重启",{"2":{"234":1}}],["这将非常有用",{"2":{"215":1}}],["这将删除所有模块并自动重新启动设备",{"2":{"200":1}}],["这将触发事件",{"2":{"196":1}}],["这就是",{"2":{"197":1}}],["这相当于被检测到",{"2":{"177":1}}],["这完全取决于",{"2":{"80":1}}],["这些只是",{"2":{"248":1}}],["这些命令默认情况下分别为",{"2":{"206":1}}],["这些更改使我们能够保持沙盒完好无损",{"2":{"197":1}}],["这些二进制文件将直接在",{"2":{"190":2}}],["这些类型按首次可用时的时间顺序排序",{"2":{"80":1}}],["这些设备将只使用",{"2":{"79":1}}],["这些参数将为",{"2":{"76":1}}],["这对于不能正常解密",{"2":{"243":1}}],["这对于大多数简单的",{"2":{"214":1}}],["这对于交换整个文件夹非常方便",{"2":{"210":1}}],["这对",{"2":{"79":1}}],["这也是方法",{"2":{"78":1}}],["这意味着每个策略声明都应该用引号括起来",{"2":{"349":2}}],["这意味着它不依赖于外部工具",{"2":{"347":1}}],["这意味着使用第三方",{"2":{"331":1,"337":1}}],["这意味着应用官方",{"2":{"245":1}}],["这意味着",{"2":{"234":1}}],["这意味着该属性将在下次重新启动后恢复",{"2":{"196":1}}],["这意味着当这是",{"2":{"190":2}}],["这意味着我们可以很聪明",{"2":{"79":1}}],["这意味着就",{"2":{"78":1}}],["这意味着从谷歌的角度来看",{"2":{"78":1}}],["这个二进制文件将替换",{"2":{"348":1}}],["这个阶段发生在",{"2":{"219":1}}],["这个文件应该只包含字符串",{"2":{"214":1}}],["这个文档本质上还是机器翻译的",{"2":{"203":1}}],["这个占位应用程序的唯一功能是将完整的",{"2":{"202":1}}],["这个",{"2":{"77":1}}],["这是将要安装",{"2":{"241":1}}],["这是模块的唯一标识符",{"2":{"208":1}}],["这是",{"2":{"91":1,"206":1,"208":1,"220":1,"334":1}}],["这是迄今为止最糟糕的一种设备类型",{"2":{"80":1}}],["这是他们想出引导方法",{"2":{"79":1}}],["这是所有",{"2":{"77":1}}],["这是由",{"2":{"0":1}}],["osm0sis",{"2":{"290":1}}],["obsolete",{"2":{"284":1}}],["obvious",{"2":{"258":1}}],["object",{"2":{"191":1,"217":4,"349":4}}],["obtaining",{"2":{"148":1}}],["obb",{"2":{"124":1}}],["obfuscate",{"2":{"130":2}}],["obfuscated",{"2":{"27":1,"281":2}}],["obfuscation",{"2":{"27":1,"253":1}}],["our",{"2":{"124":1,"301":1}}],["outside",{"2":{"290":1}}],["outright",{"2":{"271":1,"276":1,"283":1}}],["output",{"2":{"124":1}}],["outofmemory",{"2":{"101":1,"306":1}}],["outofmemoryerror",{"2":{"27":1}}],["out",{"2":{"90":1,"99":1,"101":1,"107":1,"117":1,"148":1,"149":1,"252":1,"271":1,"276":1,"292":1,"302":1,"306":1,"322":1,"325":1,"339":1,"342":1,"347":4}}],["oos",{"2":{"122":1}}],["opinion",{"2":{"310":1,"315":1}}],["op",{"2":{"156":1}}],["operation",{"2":{"349":6}}],["operations",{"2":{"124":1,"135":1,"144":1}}],["open",{"2":{"153":1,"156":1}}],["opens",{"2":{"141":1}}],["opt",{"2":{"117":2,"281":1}}],["optimization",{"2":{"122":1}}],["optimize",{"2":{"27":1,"36":1,"107":1}}],["options",{"2":{"36":1,"57":1,"69":1,"90":1,"120":1,"148":1,"339":1,"342":1}}],["option",{"2":{"3":2,"37":1,"62":1,"108":1,"119":1,"135":1,"144":2,"146":2,"148":5,"150":1,"223":2,"291":1}}],["opportunity",{"2":{"253":1}}],["oppo",{"2":{"99":1}}],["oculus",{"2":{"95":1}}],["occurs",{"2":{"49":1}}],["odin4",{"2":{"232":1}}],["odin3",{"2":{"232":1}}],["odin",{"2":{"92":1,"100":1,"235":2,"237":1,"308":1}}],["overcome",{"2":{"124":1}}],["overflow",{"2":{"97":1,"101":1,"306":1,"319":1}}],["overlay",{"2":{"92":1,"113":3,"116":1,"117":1,"124":1,"125":1,"130":1,"220":8,"271":6,"276":6,"293":1}}],["overlayfs",{"2":{"92":1,"330":1,"336":1}}],["over",{"2":{"91":1,"103":1,"292":1,"298":1,"324":1,"334":1}}],["overhaul",{"2":{"20":1,"258":1}}],["oems",{"2":{"281":1}}],["oem",{"2":{"78":1,"80":1,"117":1,"233":4,"234":2,"248":1,"322":1,"325":1,"330":1,"336":1}}],["o",{"2":{"53":1,"55":3,"144":4,"206":1}}],["other",{"2":{"49":1,"99":1,"124":1,"145":1,"251":1,"252":1,"266":1,"267":1,"272":2,"277":1,"292":1}}],["otas",{"2":{"28":1,"48":1,"122":1}}],["ota",{"0":{"245":1},"1":{"246":1,"247":1,"248":1,"249":1},"2":{"24":1,"57":1,"236":1,"239":1,"245":3,"246":2,"247":5,"248":6,"249":1}}],["owner",{"2":{"91":1,"97":1,"217":12,"319":1,"334":1}}],["own",{"2":{"45":1,"124":1,"153":3,"156":1,"266":1,"283":1,"323":1,"326":1}}],["old",{"2":{"43":1,"95":2,"113":1,"123":1,"124":1,"137":1,"141":1,"143":1,"252":1,"253":1,"254":1,"261":1,"271":2,"276":2,"284":2}}],["older",{"2":{"11":1,"95":1,"143":1,"155":1,"294":1,"295":1,"297":1,"305":1}}],["offer",{"2":{"290":1}}],["off",{"2":{"233":1,"350":2}}],["offline",{"2":{"92":1,"302":1}}],["offload",{"2":{"47":1}}],["officially",{"2":{"150":1,"256":1}}],["official",{"2":{"0":1,"144":1,"262":1,"323":1,"326":1}}],["of",{"2":{"3":8,"31":2,"37":1,"42":1,"45":1,"46":1,"49":1,"51":1,"60":2,"67":2,"68":1,"99":2,"104":1,"114":1,"117":2,"119":3,"122":1,"123":1,"124":3,"125":2,"136":1,"140":1,"143":1,"144":3,"148":4,"149":1,"151":1,"156":1,"157":1,"158":2,"223":8,"251":3,"252":3,"253":1,"254":2,"257":1,"258":1,"260":2,"262":1,"264":1,"266":2,"267":1,"270":1,"271":2,"272":1,"274":1,"275":1,"276":2,"277":1,"279":1,"280":1,"281":1,"284":1,"290":1,"292":1,"299":1,"302":1,"310":1,"311":1,"312":2,"315":1,"316":1,"317":2,"321":1,"322":6,"323":3,"324":1,"325":6,"326":3,"349":8}}],["orig",{"2":{"150":1,"347":4}}],["original",{"2":{"107":1,"117":1,"293":1}}],["order",{"2":{"144":1,"281":1}}],["oreo",{"2":{"122":1,"132":1}}],["organizing",{"2":{"26":1}}],["org",{"2":{"3":2,"223":4}}],["or",{"2":{"3":6,"45":1,"94":1,"107":1,"116":1,"141":1,"150":1,"223":6,"227":2,"252":1,"259":1,"271":1,"276":1,"281":1,"290":1}}],["once",{"2":{"322":1,"325":1}}],["ondk",{"2":{"86":4}}],["oneshot",{"2":{"184":2,"220":4}}],["oneplus",{"2":{"89":1,"99":1,"130":1,"341":1}}],["one",{"2":{"69":1,"124":1,"131":1,"144":1,"148":1,"253":1,"256":1,"260":1,"263":1,"271":1,"276":1,"290":3}}],["online",{"2":{"26":1,"27":1,"29":1,"32":1,"41":1,"46":2,"60":1,"65":3,"68":1}}],["only",{"0":{"274":1,"279":1},"2":{"23":1,"24":1,"45":1,"48":1,"62":1,"64":1,"76":2,"80":4,"90":1,"99":1,"108":1,"117":1,"120":1,"123":1,"124":1,"125":1,"131":1,"141":1,"143":2,"144":1,"146":1,"148":3,"158":1,"253":1,"257":1,"263":1,"271":2,"272":2,"274":1,"276":2,"279":1,"291":1,"305":1,"307":1,"314":1,"339":1,"342":1}}],["on",{"2":{"0":1,"11":1,"12":1,"16":1,"23":1,"26":1,"28":3,"31":1,"32":1,"36":1,"38":1,"39":2,"45":2,"47":1,"53":1,"55":3,"62":1,"69":1,"89":1,"92":2,"95":3,"99":3,"101":1,"102":3,"105":1,"106":2,"108":3,"111":1,"113":1,"114":1,"115":1,"119":1,"122":3,"123":3,"124":2,"125":4,"127":1,"128":1,"132":1,"136":1,"141":3,"143":1,"144":1,"145":3,"158":1,"184":2,"220":4,"233":2,"251":2,"252":2,"256":2,"257":1,"259":1,"261":1,"262":1,"263":1,"265":2,"266":3,"271":4,"272":1,"275":1,"276":4,"281":4,"283":1,"284":1,"289":2,"290":1,"291":3,"293":3,"296":1,"297":1,"301":1,"305":1,"306":1,"307":1,"309":1,"310":3,"314":1,"315":3,"322":3,"323":2,"325":3,"326":2,"341":1}}],["bzip2",{"2":{"347":5}}],["b64xz",{"2":{"141":1}}],["brute",{"2":{"138":1}}],["breakthrough",{"2":{"303":1}}],["breaking",{"2":{"157":1,"281":1}}],["breakage",{"2":{"139":1,"150":1}}],["break",{"2":{"125":1,"252":1}}],["breakdown",{"2":{"122":1}}],["bring",{"2":{"122":1}}],["broaden",{"2":{"106":1}}],["broadcasting",{"2":{"124":1}}],["broadcasts",{"2":{"119":1,"281":1}}],["broadcast",{"2":{"55":1,"117":1}}],["broke",{"2":{"103":1,"298":1}}],["broken",{"2":{"89":1,"103":1,"119":1,"141":1,"233":1,"262":1,"293":1,"298":1,"341":1}}],["blkroset",{"2":{"350":2}}],["bl",{"2":{"235":1}}],["blissos",{"2":{"168":1}}],["bluestacks",{"0":{"170":1},"2":{"168":1,"170":2}}],["bloatware",{"2":{"217":3}}],["blocked",{"2":{"256":1,"257":1}}],["blocks",{"2":{"140":1,"350":2}}],["block",{"2":{"105":1,"108":1,"124":2,"140":1,"144":1,"227":4,"281":1,"291":1,"296":1}}],["blocking",{"2":{"97":1,"319":1}}],["blobs",{"2":{"107":1}}],["blob",{"2":{"104":1,"130":1,"299":1}}],["black",{"2":{"148":1}}],["blacklisted",{"2":{"33":1}}],["blastula",{"2":{"113":1}}],["blanket",{"2":{"323":1,"326":1}}],["blank",{"2":{"46":1}}],["b设备将称为a",{"2":{"76":1}}],["b设备",{"2":{"76":1}}],["big",{"2":{"312":1,"317":1}}],["biggest",{"2":{"272":1,"277":1}}],["bifrost",{"2":{"235":1}}],["bixby",{"2":{"230":1}}],["bit",{"0":{"263":1},"2":{"99":3,"117":2,"125":2,"263":3,"267":1}}],["bing",{"2":{"230":1}}],["binaries",{"2":{"106":1,"125":2,"127":1,"136":1,"141":1,"145":1,"263":3}}],["binary",{"2":{"58":1,"84":1,"85":1,"94":1,"107":1,"111":1,"117":1,"124":1,"130":1,"140":2,"141":3,"144":4,"148":3,"149":1,"214":6,"215":1,"218":2,"263":2,"346":8}}],["bin中提取启动映像",{"2":{"90":1,"339":1,"342":1}}],["bind",{"2":{"89":1,"124":1,"148":1,"150":1,"151":1,"341":1}}],["bin",{"2":{"77":1,"86":1,"90":1,"120":1,"151":1,"169":1,"206":3,"290":1,"339":1,"342":1,"351":2}}],["biometricprompt",{"2":{"15":1}}],["battle",{"2":{"310":1,"315":1}}],["bandwagon",{"2":{"259":1}}],["banking",{"2":{"137":1}}],["bad",{"2":{"256":1}}],["backdoor",{"2":{"323":1,"326":1}}],["backward",{"2":{"253":1}}],["backwards",{"2":{"27":1,"126":1,"262":1,"271":1,"276":1}}],["backing",{"2":{"141":1}}],["back",{"0":{"263":1,"301":1},"2":{"122":1,"145":1,"150":2,"157":1,"271":1,"276":1,"303":1}}],["background",{"2":{"115":1,"144":1}}],["backups",{"2":{"141":1}}],["backup",{"2":{"94":1,"110":1,"119":1,"137":1,"140":1,"347":2}}],["backend",{"2":{"92":1}}],["bar",{"2":{"71":1,"99":1,"184":2,"220":4}}],["bash用法",{"2":{"347":1,"349":1,"350":1,"351":1,"352":1}}],["bashui",{"2":{"217":1}}],["bashsecure",{"2":{"191":1}}],["bashln",{"2":{"186":1}}],["bash$",{"2":{"180":1}}],["bashearlymountv2=false",{"2":{"180":1}}],["bash",{"2":{"86":1,"113":1,"184":1,"190":1}}],["bashgit",{"2":{"83":1}}],["basically",{"2":{"257":1}}],["basic",{"2":{"58":1}}],["base",{"0":{"254":1},"2":{"19":1,"118":1,"119":1,"254":1}}],["based",{"0":{"264":1},"2":{"0":1,"47":1,"108":1,"116":1,"122":1,"123":1,"140":1,"144":1,"191":1,"267":1,"271":1,"276":1,"289":1,"291":1}}],["b",{"0":{"247":1,"248":1},"2":{"24":1,"28":1,"47":1,"76":1,"77":4,"78":4,"79":5,"80":6,"99":1,"111":1,"112":1,"113":1,"122":2,"125":1,"132":1,"140":1,"227":1,"228":1}}],["boy",{"2":{"256":1}}],["board",{"2":{"256":1}}],["bool",{"2":{"216":2}}],["boots",{"2":{"283":1,"322":1,"325":1}}],["bootsigner",{"2":{"27":1}}],["bootrecovery",{"2":{"228":1}}],["bootdevice",{"2":{"227":2}}],["bootloaders",{"2":{"256":1}}],["bootloader",{"0":{"234":1},"2":{"227":1,"231":1,"234":2,"238":1,"256":1}}],["bootloop",{"2":{"107":1,"108":2,"124":1,"136":1,"271":1,"276":1,"291":2}}],["bootloops",{"2":{"12":1,"101":1,"104":1,"114":1,"115":1,"120":1,"129":1,"132":1,"133":1,"293":1,"297":1,"299":1,"306":1}}],["bootmode",{"2":{"216":1}}],["bootinit",{"2":{"228":1}}],["booting",{"2":{"81":1,"107":1}}],["bootimg",{"2":{"157":1,"347":4}}],["bootup",{"2":{"156":1}}],["bootconfig",{"2":{"99":1}}],["bootargs",{"2":{"99":1}}],["boot",{"2":{"24":1,"26":1,"28":1,"39":1,"45":1,"48":4,"55":1,"64":1,"69":1,"76":2,"79":3,"80":4,"90":6,"92":3,"99":3,"101":3,"102":1,"106":3,"107":1,"108":1,"111":2,"113":2,"116":1,"119":3,"120":1,"122":1,"123":1,"124":2,"128":1,"132":2,"137":2,"140":2,"141":4,"144":1,"145":1,"146":1,"148":1,"151":5,"156":2,"157":2,"158":1,"220":1,"227":6,"228":11,"230":1,"237":1,"238":1,"241":2,"242":2,"243":1,"248":1,"252":2,"262":1,"277":1,"283":1,"290":1,"291":1,"293":1,"294":1,"304":1,"306":3,"322":1,"325":1,"339":6,"342":6,"347":5,"350":2}}],["both",{"2":{"108":1,"150":1,"153":1,"291":1}}],["bottom",{"2":{"19":1,"99":1}}],["buy",{"2":{"256":1}}],["bundled",{"2":{"144":1}}],["buffers",{"2":{"132":2}}],["buffer",{"2":{"97":1,"319":1}}],["bump",{"2":{"32":1,"92":1}}],["busybox",{"0":{"206":1,"290":1},"2":{"30":1,"49":3,"61":2,"89":2,"95":1,"97":1,"99":1,"100":1,"108":2,"141":5,"144":1,"148":2,"153":1,"191":2,"206":9,"215":1,"219":1,"252":2,"290":7,"291":2,"308":1,"319":1,"341":2}}],["built",{"2":{"25":1,"119":1,"145":1,"150":1}}],["building",{"2":{"313":1,"318":1}}],["builds",{"2":{"70":1,"123":1,"323":1,"326":1}}],["build",{"2":{"1":1,"59":2,"83":1,"84":3,"85":1,"86":1,"99":1,"136":1,"145":1,"146":3,"196":1,"212":1,"323":1,"326":1}}],["bugs",{"2":{"270":1,"294":1,"295":1,"305":1,"307":1,"324":1}}],["buggy",{"2":{"24":1,"25":1,"297":1}}],["bug",{"0":{"304":1,"306":1,"308":1},"2":{"22":1,"23":1,"25":1,"30":1,"31":1,"54":1,"57":1,"68":1,"92":1,"100":1,"102":2,"104":1,"108":1,"112":2,"119":1,"126":1,"129":1,"131":1,"134":1,"135":1,"140":1,"141":1,"148":1,"251":3,"267":1,"275":1,"280":1,"289":1,"291":1,"297":1,"299":1,"304":2,"308":1}}],["buttons",{"2":{"65":1}}],["button",{"2":{"19":1,"67":2}}],["but",{"2":{"3":2,"46":1,"124":1,"125":1,"148":3,"223":2,"252":1,"263":1,"264":1,"266":1,"271":2,"276":2,"284":1,"301":1,"321":1,"323":1,"324":1,"326":1}}],["become",{"2":{"322":1,"325":1}}],["because",{"2":{"144":1,"257":1}}],["beneficial",{"2":{"310":1,"315":1}}],["benefit",{"2":{"145":1}}],["been",{"2":{"309":1,"310":1,"314":1,"315":1,"322":2,"325":2}}],["beefed",{"2":{"290":1}}],["behind",{"2":{"290":1}}],["behaviors",{"2":{"100":1,"141":1,"308":1,"322":1,"325":1}}],["behavior",{"2":{"39":1,"50":1,"103":1,"298":1}}],["being",{"2":{"94":1,"97":1,"111":1,"319":1,"322":1,"325":1}}],["betas",{"2":{"259":1}}],["beta",{"2":{"29":1,"48":1,"116":1,"260":1,"265":1,"270":1,"275":1}}],["between",{"2":{"27":1,"110":1,"124":1}}],["better",{"2":{"17":1,"21":1,"25":1,"93":1,"99":2,"107":1,"108":1,"116":1,"120":1,"255":1,"291":1,"293":1,"310":1,"315":1,"327":1}}],["below",{"2":{"13":1}}],["beforehand",{"2":{"26":1}}],["before",{"0":{"301":1},"2":{"12":1,"23":1,"26":1,"28":1,"101":1,"125":1,"130":1,"155":1,"156":1,"264":1,"270":2,"281":1,"303":1,"306":1,"322":1,"325":1}}],["be",{"2":{"3":2,"28":2,"45":1,"47":1,"56":1,"61":1,"94":1,"99":1,"101":1,"102":1,"114":1,"125":1,"131":1,"135":3,"138":1,"145":1,"148":4,"223":2,"251":1,"252":1,"253":1,"256":1,"259":1,"260":1,"261":1,"262":3,"267":1,"271":1,"276":1,"281":1,"289":2,"290":2,"292":1,"293":1,"306":1,"313":1,"318":1,"323":1,"326":1}}],["bypass",{"2":{"142":1,"151":1,"152":1}}],["bypassing",{"2":{"90":1,"339":1,"342":1}}],["by",{"2":{"0":1,"3":2,"17":1,"61":2,"70":1,"101":1,"108":1,"130":1,"138":1,"144":1,"158":1,"223":2,"227":4,"289":1,"291":1,"306":1,"312":1,"317":1,"322":1,"325":1}}],["t2",{"2":{"349":6}}],["t1",{"2":{"349":6}}],["tuned",{"2":{"259":1,"265":1,"272":1}}],["turn",{"2":{"158":1}}],["tl",{"2":{"251":1}}],["tmpdir",{"2":{"216":1}}],["tmpfs",{"0":{"190":1},"2":{"115":1,"124":1,"125":1,"139":1,"140":1,"151":1,"184":4,"190":1,"220":9,"293":2,"350":2}}],["txtmagiskboot",{"2":{"346":1}}],["txtmagisk",{"2":{"223":2}}],["txtramdisk",{"2":{"220":1}}],["txt模块module",{"2":{"214":1}}],["txt",{"2":{"207":1}}],["txtcopyright",{"2":{"3":1}}],["tweeted",{"2":{"272":1,"277":1}}],["tweaker",{"2":{"170":1}}],["twitter",{"2":{"272":1,"277":1,"310":1,"315":1}}],["twice",{"2":{"120":1}}],["twrp",{"2":{"214":1}}],["tin",{"2":{"323":1,"326":1}}],["tip",{"2":{"182":1,"243":1}}],["tiback",{"2":{"148":1}}],["times",{"2":{"111":1,"145":1}}],["timeout",{"2":{"54":1,"107":1,"144":1}}],["time",{"2":{"46":1,"250":1,"260":1,"264":1,"271":1,"276":1,"283":1,"289":2,"292":1,"301":1,"309":1,"310":1,"311":1,"314":1,"315":1,"316":1,"322":1,"325":1}}],["typo",{"2":{"137":1,"140":1,"141":1}}],["typeattribute",{"2":{"349":2}}],["type",{"2":{"119":2,"146":1,"197":1,"349":56}}],["types",{"2":{"107":1}}],["tampering",{"2":{"271":1,"276":1}}],["tags",{"2":{"146":1}}],["tasker",{"2":{"125":1}}],["take",{"2":{"102":1,"304":1}}],["tab",{"2":{"67":1}}],["taradb",{"2":{"235":1}}],["targeted",{"2":{"251":1}}],["target",{"2":{"122":1,"148":1,"150":1,"217":8,"264":1,"347":4,"349":20}}],["targeting",{"2":{"97":1,"319":1}}],["targets",{"2":{"23":1,"117":1,"119":1,"125":1}}],["tar",{"2":{"12":1,"13":1,"17":1,"100":1,"235":3,"308":1}}],["team",{"2":{"309":1,"314":1}}],["tend",{"2":{"154":1}}],["temporarily",{"2":{"257":2,"289":1}}],["temporary",{"2":{"137":1}}],["template",{"2":{"62":1,"150":1,"154":1,"261":1,"262":1,"284":3}}],["textfile",{"2":{"119":1}}],["tegra",{"2":{"108":1,"291":1}}],["te",{"2":{"107":1,"349":1}}],["techniques",{"2":{"259":1}}],["technique",{"2":{"102":1,"303":1}}],["terminal",{"2":{"122":1}}],["term",{"2":{"102":1,"264":1}}],["terms",{"2":{"3":2,"223":2}}],["testing",{"2":{"289":1}}],["tested",{"2":{"144":1,"145":1,"262":1,"264":1,"267":1,"270":1}}],["test",{"2":{"97":1,"319":1,"347":4}}],["t",{"2":{"37":1,"41":1,"47":1,"90":2,"140":1,"143":1,"148":4,"253":1,"257":2,"260":1,"289":1,"302":1,"321":1,"324":1,"339":2,"342":2}}],["todo",{"0":{"268":1,"269":1}}],["torture",{"2":{"253":1}}],["took",{"2":{"292":1}}],["too",{"2":{"150":1,"292":1}}],["toolchains",{"2":{"86":3}}],["toolchain",{"2":{"86":2,"89":1,"341":1}}],["tools",{"2":{"59":1,"353":1}}],["tool",{"2":{"46":1,"128":1,"141":1,"146":1,"151":1,"156":2,"158":1,"283":1}}],["toggles",{"2":{"287":1}}],["toggle",{"2":{"138":1,"153":1}}],["toggling",{"2":{"14":1,"26":1}}],["toml",{"2":{"86":1}}],["tons",{"2":{"31":1,"42":1,"67":1,"68":1,"143":1,"251":1,"254":1,"258":1,"266":1,"270":1,"271":1,"275":1,"276":1,"284":1,"292":1}}],["top",{"2":{"31":1}}],["topjohnwu",{"2":{"0":2,"83":2,"124":1,"162":1}}],["to",{"0":{"257":1,"301":1},"2":{"12":2,"13":1,"16":2,"18":1,"19":2,"23":1,"24":1,"25":3,"26":2,"27":4,"28":8,"32":1,"37":1,"42":1,"43":2,"44":2,"45":3,"46":5,"47":4,"48":1,"49":3,"50":1,"53":1,"55":1,"60":2,"64":1,"65":1,"67":1,"68":1,"83":1,"89":2,"90":1,"92":2,"93":1,"94":2,"95":2,"96":2,"99":6,"100":2,"102":3,"105":2,"106":2,"107":6,"108":2,"111":3,"113":2,"114":1,"115":1,"116":2,"117":4,"118":1,"119":8,"120":5,"121":4,"122":4,"124":8,"125":5,"127":1,"130":3,"132":1,"134":2,"135":3,"137":5,"138":3,"139":1,"140":4,"141":6,"142":1,"143":2,"144":10,"145":5,"146":2,"148":6,"150":9,"151":5,"152":1,"153":2,"154":1,"155":1,"156":1,"157":6,"158":2,"220":4,"241":2,"242":2,"251":7,"252":4,"253":4,"254":5,"255":1,"256":2,"259":2,"260":1,"261":2,"262":4,"263":2,"264":6,"265":2,"266":1,"267":1,"270":3,"271":13,"273":1,"274":1,"275":1,"276":14,"278":1,"279":1,"281":9,"283":9,"284":2,"289":3,"290":3,"291":2,"292":7,"293":3,"296":2,"302":1,"303":3,"304":1,"305":1,"307":1,"308":2,"310":2,"311":3,"312":2,"315":2,"316":3,"317":2,"320":2,"322":1,"323":6,"325":1,"326":6,"327":1,"339":1,"341":2,"342":1}}],["trusted",{"2":{"323":1,"326":1}}],["true",{"2":{"216":2,"347":2}}],["truncate",{"2":{"12":1}}],["try",{"2":{"119":1}}],["trying",{"2":{"53":1,"130":1}}],["treats",{"2":{"323":1,"326":1}}],["treated",{"2":{"148":1}}],["tree",{"2":{"107":1,"123":1,"151":1}}],["treble",{"2":{"78":1,"129":1,"322":1,"325":1}}],["trigger",{"2":{"350":2}}],["triggered",{"2":{"68":1}}],["tricky",{"2":{"264":1}}],["trim",{"2":{"105":1,"296":1}}],["traversal",{"2":{"151":1}}],["transition",{"2":{"197":1,"349":2}}],["transfer",{"2":{"148":1}}],["translations",{"2":{"14":1,"40":1,"44":1,"53":1,"58":1,"60":1,"63":1,"68":1}}],["translation",{"2":{"0":1,"66":1}}],["tracking",{"2":{"97":1,"319":1,"323":1,"326":1}}],["trash",{"2":{"71":1}}],["thing",{"2":{"272":1,"312":1,"317":1}}],["things",{"2":{"270":1,"271":2,"276":2}}],["this",{"2":{"0":1,"3":6,"12":1,"91":1,"92":1,"100":1,"101":1,"104":1,"107":2,"111":1,"115":1,"124":2,"125":1,"145":3,"148":4,"156":1,"158":1,"223":4,"250":1,"251":2,"253":2,"254":2,"259":1,"260":2,"261":2,"262":1,"264":2,"265":1,"267":1,"270":1,"271":4,"272":1,"273":1,"276":4,"277":1,"278":1,"281":2,"283":4,"289":2,"290":1,"292":1,"293":2,"297":1,"299":1,"301":1,"302":1,"303":2,"305":1,"306":1,"307":1,"308":1,"310":2,"312":1,"315":2,"317":1,"322":4,"323":1,"325":4,"326":1,"334":1}}],["thread",{"2":{"272":1,"277":1}}],["threads",{"2":{"138":1,"144":1,"266":1}}],["through",{"2":{"11":1,"48":1,"49":1,"90":1,"119":1,"138":2,"144":1,"261":1,"264":1,"302":1,"339":1,"342":1}}],["those",{"2":{"135":1,"267":1,"272":1,"277":1,"281":1,"309":1,"310":1,"314":2,"315":1,"320":1}}],["though",{"2":{"24":1,"256":1,"312":1,"317":1}}],["thanks",{"2":{"19":1,"46":2,"60":1,"124":1,"157":1}}],["than",{"2":{"11":1,"24":1,"26":1,"45":1,"49":1,"62":1,"94":1,"102":1,"105":1,"145":1,"255":1,"267":1,"272":1,"292":1,"296":1,"303":1,"310":2,"315":2}}],["that",{"2":{"3":2,"22":1,"23":1,"30":1,"37":1,"41":1,"89":1,"99":1,"100":2,"101":1,"102":1,"103":1,"112":2,"117":1,"124":1,"125":1,"129":1,"131":2,"134":1,"143":1,"146":1,"148":3,"151":1,"158":1,"223":2,"256":3,"259":1,"261":1,"262":3,"264":1,"265":1,"267":3,"271":2,"272":1,"276":2,"281":1,"284":1,"289":2,"290":2,"292":1,"293":3,"298":1,"303":1,"304":1,"306":1,"308":2,"310":1,"311":1,"312":1,"315":1,"316":1,"317":1,"322":4,"325":4,"341":1}}],["thermal",{"2":{"186":4}}],["there",{"2":{"125":1,"256":1,"259":1,"262":1,"266":1,"267":1,"281":1,"289":1}}],["their",{"2":{"153":1,"156":1,"251":1,"283":1,"284":1,"310":1,"311":1,"315":1,"316":1}}],["they",{"2":{"145":2,"148":1,"252":1,"284":1}}],["these",{"2":{"135":1,"251":1,"252":2,"262":1,"266":1,"274":1,"279":1,"292":1}}],["them",{"2":{"125":1,"154":1,"256":1,"322":1,"325":1}}],["theme",{"2":{"26":1,"43":1,"58":1,"64":1,"65":1}}],["then",{"2":{"107":1,"180":2,"281":3,"312":1,"317":1}}],["the",{"0":{"301":1,"302":1},"2":{"3":16,"16":1,"19":1,"20":1,"23":2,"25":1,"28":1,"29":2,"30":1,"31":3,"32":1,"33":1,"37":4,"45":1,"46":1,"47":1,"48":2,"49":1,"58":1,"69":1,"90":1,"91":1,"93":1,"94":1,"95":2,"99":4,"100":2,"102":5,"103":1,"104":1,"105":1,"107":3,"108":1,"115":1,"118":1,"119":1,"122":3,"123":1,"124":3,"125":4,"131":1,"134":1,"135":2,"136":1,"138":3,"141":1,"145":3,"146":1,"148":15,"150":1,"151":1,"152":1,"154":2,"156":5,"157":1,"158":1,"223":16,"251":7,"252":6,"253":4,"254":3,"256":2,"258":2,"259":1,"260":1,"261":5,"262":5,"263":2,"264":5,"265":3,"267":1,"270":1,"271":8,"272":4,"274":2,"275":3,"276":8,"277":2,"279":2,"281":12,"283":2,"284":7,"289":4,"290":9,"291":1,"292":5,"293":4,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"301":2,"302":8,"303":3,"305":2,"307":1,"308":2,"309":2,"310":3,"311":4,"312":3,"313":1,"314":3,"315":3,"316":4,"317":3,"318":1,"320":1,"321":2,"322":4,"323":8,"324":4,"325":4,"326":8,"327":1,"334":1,"339":1,"342":1}}],["aimed",{"2":{"259":1}}],["aware",{"2":{"259":1,"266":1,"271":1,"276":1,"289":1,"322":1,"325":1}}],["ago",{"2":{"310":1,"315":1}}],["against",{"2":{"322":1,"325":1}}],["again",{"2":{"253":1,"256":1,"310":1,"315":1}}],["aggressive",{"2":{"157":1,"259":1}}],["agnostic",{"2":{"111":1}}],["affecting",{"2":{"138":1,"251":1}}],["after",{"2":{"12":1,"25":2,"31":1,"37":1,"43":1,"105":1,"106":1,"111":2,"119":1,"123":1,"124":1,"148":3,"156":1,"296":1,"322":1,"325":1}}],["a1",{"2":{"137":1}}],["auditallowxperm",{"2":{"349":2}}],["auditallow",{"2":{"349":2}}],["auditdeny",{"2":{"119":1}}],["author=",{"2":{"208":2}}],["authenticate",{"2":{"55":1}}],["authentications",{"2":{"28":1}}],["authentication",{"2":{"26":1,"39":1,"58":1}}],["automatically",{"2":{"261":1}}],["auto",{"2":{"25":1,"117":1,"153":2}}],["able",{"2":{"264":1,"271":1,"276":1,"281":1}}],["abused",{"2":{"251":1}}],["above",{"2":{"137":1}}],["about",{"2":{"102":1,"253":1,"313":1,"318":1,"323":1,"326":1}}],["abort",{"2":{"94":1,"157":1,"217":2}}],["abi",{"2":{"215":1}}],["ability",{"2":{"99":1}}],["abis",{"2":{"99":1}}],["abrupt",{"2":{"19":1}}],["ambitious",{"2":{"260":1}}],["am",{"2":{"145":1,"266":1,"309":1,"310":1,"314":1,"315":1,"323":1,"326":1}}],["amonet",{"2":{"92":1}}],["amount",{"2":{"60":1,"124":1,"125":1}}],["amp",{"2":{"86":1,"148":1}}],["args",{"2":{"349":2,"350":2}}],["arguments",{"2":{"352":2}}],["argument",{"2":{"92":1}}],["around",{"2":{"289":1}}],["article",{"2":{"251":1}}],["arbitrarily",{"2":{"251":1}}],["architecture",{"2":{"322":1,"325":1}}],["archive",{"2":{"97":1,"319":1}}],["arch",{"2":{"141":1,"216":1}}],["arrives",{"2":{"101":1,"306":1}}],["arm",{"2":{"216":1}}],["armeabi",{"2":{"207":2}}],["arm32",{"2":{"89":2,"341":2}}],["arm64",{"2":{"83":1,"207":2,"216":2}}],["aren",{"2":{"257":1,"321":1,"324":1}}],["area",{"2":{"196":4}}],["are",{"2":{"28":1,"31":1,"45":1,"99":1,"117":1,"119":1,"125":1,"148":1,"156":3,"223":2,"252":2,"256":2,"258":1,"259":3,"261":1,"262":3,"263":1,"266":2,"267":2,"271":2,"273":1,"275":1,"276":2,"278":1,"281":2,"284":2,"292":2,"293":2,"302":1,"310":1,"314":1,"315":1,"323":1,"324":1,"326":1}}],["av",{"2":{"119":1}}],["avoid",{"2":{"104":1,"299":1}}],["available",{"2":{"65":1,"71":1,"132":1,"156":1,"289":1,"290":1}}],["avb",{"2":{"45":1,"90":2,"101":1,"107":1,"137":2,"271":1,"276":1,"306":1,"322":2,"325":2,"339":2,"342":2,"347":2}}],["achieve",{"2":{"312":1,"317":1}}],["across",{"2":{"253":1}}],["ack",{"2":{"120":1}}],["accurate",{"2":{"323":1,"326":1}}],["accordingly",{"2":{"135":1}}],["acclaim",{"2":{"128":1}}],["acct",{"2":{"111":1}}],["accept",{"2":{"157":1}}],["accepted",{"2":{"70":1}}],["accessible",{"2":{"283":1}}],["access",{"2":{"25":1,"46":1,"138":1,"148":2,"323":1,"326":1}}],["actual",{"2":{"125":1,"138":1,"271":2,"276":2,"281":1}}],["actually",{"2":{"51":1,"124":1,"271":2,"276":2,"284":2,"321":1,"324":1}}],["active",{"2":{"233":1}}],["activity",{"2":{"51":1,"264":1}}],["action",{"2":{"117":1,"138":1,"148":1}}],["aosp",{"2":{"38":1,"121":1,"125":1,"144":1,"196":1}}],["ado",{"2":{"309":1,"314":1}}],["adventurous",{"2":{"259":1}}],["advanced",{"2":{"18":1,"41":1,"69":1,"102":1,"293":1,"303":1}}],["adblock",{"2":{"158":1}}],["adbd",{"2":{"124":1}}],["adb",{"2":{"113":1,"119":1,"122":1,"123":1,"134":1,"135":1,"148":3,"182":1,"185":1,"186":3,"190":2,"191":4,"200":5,"206":3,"207":3,"219":2,"227":3,"228":1,"235":1,"243":1,"252":1}}],["adjust",{"2":{"64":1,"270":1}}],["adjusted",{"2":{"56":1}}],["adjustments",{"2":{"32":1,"40":1,"45":1,"137":1,"141":1,"292":1}}],["adapt",{"2":{"55":1,"148":1}}],["adapters",{"2":{"51":1}}],["adaptive",{"2":{"45":1}}],["adds",{"2":{"297":2}}],["addressing",{"2":{"294":1,"295":1}}],["address",{"2":{"283":1}}],["addon",{"2":{"108":1,"122":2,"124":2,"144":1,"191":2,"291":1}}],["addition",{"2":{"148":3,"323":1,"326":1}}],["additional",{"2":{"107":1}}],["additions",{"2":{"0":1}}],["adding",{"2":{"96":1,"116":1,"150":3,"151":1,"154":1,"251":1,"267":1,"275":1,"294":1,"320":1}}],["added",{"2":{"49":1,"138":1,"141":1,"144":2,"151":1,"258":1}}],["add",{"2":{"13":1,"18":1,"25":2,"32":1,"35":1,"37":1,"39":1,"43":3,"44":1,"45":2,"47":1,"48":4,"49":1,"57":1,"58":3,"62":1,"64":1,"65":1,"67":4,"69":2,"70":2,"71":2,"83":1,"94":1,"95":1,"99":1,"106":2,"107":1,"108":3,"113":2,"115":1,"117":1,"119":4,"122":2,"124":2,"125":1,"128":2,"129":1,"131":1,"132":1,"134":1,"137":5,"138":3,"140":2,"141":2,"144":6,"145":3,"146":1,"147":1,"148":3,"150":1,"151":2,"152":1,"153":4,"157":1,"158":3,"283":1,"291":3,"323":1,"326":1,"347":2,"350":2}}],["although",{"2":{"254":1,"262":1,"267":1,"271":1,"276":1,"289":1}}],["alternative",{"2":{"271":1,"276":1}}],["alter",{"2":{"138":1}}],["algorithm",{"2":{"154":1}}],["already",{"2":{"125":1,"281":1}}],["aligned",{"2":{"65":1}}],["alert",{"2":{"65":1}}],["allocated",{"2":{"148":1}}],["allowxperm",{"2":{"349":2}}],["allows",{"2":{"254":1,"323":1,"326":1}}],["allowing",{"2":{"104":1,"299":1,"312":1,"317":1}}],["allowed",{"2":{"46":1}}],["allow",{"2":{"16":1,"46":1,"97":1,"99":1,"113":1,"116":2,"119":1,"146":1,"148":1,"251":1,"283":3,"319":1,"349":13}}],["all",{"2":{"60":1,"67":1,"84":1,"99":1,"100":1,"107":2,"113":2,"119":3,"122":3,"124":2,"125":2,"132":1,"135":4,"137":2,"138":2,"141":2,"144":5,"145":1,"148":2,"149":1,"151":1,"153":2,"156":2,"157":1,"158":2,"223":2,"251":3,"252":1,"253":1,"257":3,"260":1,"261":3,"262":3,"263":2,"264":1,"281":1,"290":2,"293":1,"308":1,"313":1,"318":1,"322":2,"325":2,"349":10}}],["always",{"2":{"49":1,"91":1,"92":1,"94":1,"101":1,"122":1,"251":1,"253":1,"271":1,"276":1,"290":1,"293":1,"302":1,"306":1,"334":1}}],["also",{"2":{"47":1,"113":1,"124":1,"125":1,"148":2,"253":1,"257":1,"258":1,"262":1,"265":1,"266":1,"281":1,"290":1,"293":1,"303":1,"323":1,"326":1}}],["along",{"2":{"3":2,"124":1,"137":1,"223":2,"275":1,"283":1}}],["apex",{"2":{"102":1,"106":1,"113":1,"304":1}}],["apis",{"2":{"350":2}}],["api",{"2":{"19":1,"28":1,"60":1,"76":2,"92":1,"96":1,"100":1,"108":1,"151":1,"153":1,"156":1,"211":1,"216":3,"261":1,"291":1,"308":1,"320":1,"332":3,"338":3}}],["apks",{"2":{"16":1}}],["apk",{"2":{"15":1,"27":1,"49":1,"59":1,"84":1,"87":2,"99":1,"100":1,"102":1,"111":1,"124":1,"125":1,"165":1,"166":1,"202":3,"227":1,"229":1,"243":4,"281":2,"302":2,"308":1,"323":1,"326":1}}],["appearance",{"2":{"292":1}}],["appended",{"2":{"140":1}}],["apparently",{"2":{"148":1}}],["approach",{"2":{"92":1,"157":1,"262":1,"264":1}}],["apply",{"2":{"349":4}}],["applying",{"2":{"48":1}}],["applied",{"2":{"148":1}}],["applications",{"2":{"251":1}}],["application",{"2":{"23":1,"25":1,"58":2,"97":1,"110":1,"117":1,"251":1,"319":1}}],["applet",{"2":{"124":1,"206":1}}],["applets",{"2":{"108":1,"291":1}}],["apple",{"2":{"83":1}}],["appspecializeargs",{"2":{"96":1,"320":1}}],["apps",{"2":{"31":1,"33":1,"70":1,"95":2,"103":1,"106":1,"115":1,"124":2,"125":2,"137":2,"144":1,"145":1,"148":1,"149":1,"158":1,"251":2,"252":1,"259":1,"271":1,"276":1,"298":1,"312":1,"317":1}}],["app",{"0":{"202":1,"302":1,"303":1},"2":{"13":1,"14":1,"16":1,"18":1,"25":2,"29":1,"32":1,"45":3,"47":2,"48":2,"55":1,"80":1,"89":1,"90":2,"91":1,"92":2,"94":2,"95":4,"96":2,"97":4,"98":1,"99":7,"100":6,"101":2,"102":7,"115":2,"125":1,"148":3,"149":1,"168":1,"191":4,"200":1,"202":4,"206":1,"208":1,"216":1,"217":6,"239":1,"243":1,"246":1,"247":4,"248":1,"251":1,"258":1,"270":1,"281":5,"287":1,"302":4,"303":2,"306":2,"308":6,"311":1,"314":1,"316":1,"319":4,"320":2,"323":6,"326":6,"334":1,"339":2,"341":1,"342":2}}],["ap",{"2":{"12":2,"13":1,"21":1,"235":4,"236":1,"237":2}}],["announcement",{"2":{"310":1,"315":1}}],["annoying",{"2":{"100":1,"308":1}}],["ancient",{"2":{"148":1}}],["angela",{"2":{"130":1}}],["another",{"2":{"124":1,"252":1,"301":1,"303":1,"321":1,"324":1}}],["analysis",{"2":{"27":1}}],["an",{"2":{"11":1,"42":1,"46":1,"99":1,"115":1,"129":1,"141":1,"148":2,"262":2,"271":2,"273":1,"276":2,"278":1,"281":1,"311":1,"316":1}}],["anymore",{"2":{"289":1}}],["anything",{"2":{"150":1,"284":1}}],["any",{"2":{"3":4,"28":1,"70":1,"80":3,"101":1,"150":2,"223":4,"252":1,"290":1,"306":1,"323":2,"326":2}}],["androidboot",{"2":{"106":1}}],["androidx",{"2":{"27":1}}],["android",{"0":{"75":1,"86":1,"167":2,"171":1,"257":1,"265":1,"272":1,"277":1,"329":1,"335":1},"1":{"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"168":2,"169":2,"170":2,"171":2,"172":2},"2":{"11":1,"16":1,"24":2,"28":1,"32":1,"35":1,"53":1,"55":3,"76":12,"77":4,"78":3,"79":5,"80":3,"81":1,"83":6,"85":2,"86":2,"92":4,"95":3,"99":1,"100":1,"102":2,"106":2,"107":4,"108":2,"112":1,"113":4,"116":1,"117":3,"118":1,"123":1,"125":2,"127":1,"128":3,"137":1,"143":1,"144":4,"155":1,"168":1,"190":1,"197":3,"200":2,"206":2,"211":1,"214":2,"216":2,"219":1,"220":2,"222":1,"227":1,"236":1,"238":1,"243":1,"251":5,"257":1,"265":1,"271":2,"272":3,"273":1,"274":1,"275":1,"276":2,"277":2,"278":1,"279":1,"281":3,"283":1,"291":2,"292":2,"293":4,"303":1,"305":1,"307":1,"308":1,"309":1,"312":1,"314":1,"317":1,"322":2,"325":2,"329":2,"335":2,"349":1}}],["and",{"2":{"3":2,"24":1,"25":1,"27":1,"29":1,"31":2,"38":1,"43":2,"45":2,"47":1,"49":2,"50":1,"51":2,"56":1,"58":1,"65":1,"69":2,"70":1,"72":1,"90":2,"92":1,"94":2,"95":2,"97":1,"99":1,"100":1,"101":2,"102":3,"104":1,"106":3,"107":5,"108":2,"110":1,"114":1,"115":1,"117":1,"120":2,"124":3,"125":3,"130":1,"133":1,"134":1,"135":1,"137":2,"138":2,"140":2,"141":5,"142":1,"143":1,"144":2,"148":4,"150":3,"151":1,"153":3,"154":1,"223":2,"251":1,"252":1,"254":1,"256":2,"257":4,"258":1,"261":2,"262":1,"264":1,"266":1,"270":1,"271":2,"272":1,"273":1,"276":2,"277":2,"278":1,"280":1,"281":7,"283":2,"284":2,"289":2,"290":3,"291":2,"292":2,"293":4,"294":2,"295":1,"299":1,"302":3,"305":3,"306":2,"307":3,"308":1,"310":2,"311":3,"312":1,"313":1,"315":2,"316":3,"317":1,"318":1,"319":1,"322":4,"323":5,"325":4,"326":5,"339":2,"342":2}}],["attr",{"2":{"350":2}}],["attribute",{"2":{"349":8}}],["attributes",{"2":{"107":1,"117":1,"139":1,"141":1}}],["attestation",{"2":{"289":1}}],["attention",{"2":{"261":1,"292":1}}],["attack",{"2":{"323":1,"326":1}}],["attacks",{"2":{"95":1}}],["attach",{"2":{"86":1}}],["at",{"2":{"3":2,"145":1,"148":1,"223":2,"262":2,"263":1,"309":1,"314":1,"321":1,"322":1,"324":1,"325":1}}],["aside",{"2":{"258":1}}],["ash",{"2":{"206":4,"215":1,"219":1,"290":2}}],["ash独立外壳模式",{"2":{"206":1}}],["asap",{"2":{"125":1,"150":1,"252":1,"253":2,"261":2,"271":1,"276":1}}],["asus",{"2":{"104":1,"130":1,"299":1}}],["asynctasks",{"2":{"50":1}}],["asynchronous",{"2":{"45":1}}],["asked",{"2":{"204":1}}],["ask",{"2":{"23":1,"26":1}}],["assist",{"2":{"13":1}}],["as",{"0":{"271":1,"274":1,"276":1,"279":1},"2":{"3":2,"27":2,"76":1,"79":1,"95":2,"97":1,"100":1,"102":1,"104":1,"107":1,"113":4,"117":1,"119":1,"122":1,"124":1,"125":3,"135":1,"141":2,"144":1,"148":3,"190":2,"193":1,"220":1,"223":2,"252":1,"257":1,"259":2,"267":1,"271":8,"272":3,"274":1,"275":1,"276":8,"277":3,"279":1,"281":2,"283":1,"284":1,"299":1,"308":1,"311":1,"316":1,"319":1,"324":1,"348":1}}],["a",{"0":{"247":1,"248":1,"274":1,"279":1},"2":{"0":1,"3":4,"12":1,"22":1,"24":1,"28":1,"30":1,"31":2,"46":1,"47":1,"49":1,"51":1,"57":1,"76":2,"77":2,"78":1,"79":5,"80":10,"90":1,"91":1,"93":1,"95":1,"99":2,"100":1,"102":1,"104":2,"107":1,"108":2,"111":1,"112":2,"113":1,"114":1,"117":1,"119":2,"120":1,"122":2,"124":3,"125":1,"126":1,"130":1,"132":2,"135":2,"140":3,"141":4,"144":2,"146":1,"148":4,"150":3,"154":1,"158":1,"208":6,"223":4,"227":1,"228":1,"250":2,"251":3,"253":2,"254":1,"255":2,"257":2,"260":1,"261":1,"262":3,"264":3,"265":1,"267":1,"270":1,"271":3,"272":2,"274":2,"276":3,"277":1,"279":2,"281":6,"282":1,"283":1,"284":3,"290":2,"291":2,"292":2,"293":2,"294":1,"295":1,"297":1,"299":2,"302":3,"304":1,"308":1,"309":2,"310":1,"311":1,"312":1,"314":2,"315":1,"316":1,"317":1,"321":2,"322":5,"323":3,"324":2,"325":5,"326":3,"327":1,"334":1,"339":1,"342":1}}],["翻译的中文文档",{"2":{"0":1}}],["|",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1},"2":{"180":2,"207":6,"220":2}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/VPLocalSearchBox.6e49b274.js b/assets/chunks/VPLocalSearchBox.6e49b274.js new file mode 100644 index 00000000..a933b1ff --- /dev/null +++ b/assets/chunks/VPLocalSearchBox.6e49b274.js @@ -0,0 +1,7 @@ +import{V as vt,h as ne,x as ze,ag as Nt,ah as kt,d as Tt,E as me,ai as Xe,g as Te,aj as It,ak as Dt,y as _t,al as Ot,j as Ie,O as fe,S as be,a1 as Rt,am as Mt,W as Lt,s as Pt,an as zt,o as Z,b as Bt,k as S,$ as Vt,l as W,ao as $t,ap as Wt,aq as Kt,c as ee,n as et,e as we,D as tt,F as rt,a as de,t as he,ar as jt,p as Jt,m as Ut,as as at,at as Ht,a5 as Gt,ab as qt,_ as Qt}from"./framework.ed90c782.js";import{u as Yt,c as Zt}from"./theme.98402b24.js";const Xt={root:()=>vt(()=>import("./@localSearchIndexroot.93b308b9.js"),[])};/*! +* tabbable 6.2.0 +* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE +*/var pt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Ee=pt.join(","),yt=typeof Element>"u",oe=yt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Se=!yt&&Element.prototype.getRootNode?function(o){var e;return o==null||(e=o.getRootNode)===null||e===void 0?void 0:e.call(o)}:function(o){return o==null?void 0:o.ownerDocument},Ae=function o(e,t){var r;t===void 0&&(t=!0);var n=e==null||(r=e.getAttribute)===null||r===void 0?void 0:r.call(e,"inert"),a=n===""||n==="true",i=a||t&&e&&o(e.parentNode);return i},er=function(e){var t,r=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return r===""||r==="true"},gt=function(e,t,r){if(Ae(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Ee));return t&&oe.call(e,Ee)&&n.unshift(e),n=n.filter(r),n},mt=function o(e,t,r){for(var n=[],a=Array.from(e);a.length;){var i=a.shift();if(!Ae(i,!1))if(i.tagName==="SLOT"){var s=i.assignedElements(),u=s.length?s:i.children,l=o(u,!0,r);r.flatten?n.push.apply(n,l):n.push({scopeParent:i,candidates:l})}else{var h=oe.call(i,Ee);h&&r.filter(i)&&(t||!e.includes(i))&&n.push(i);var d=i.shadowRoot||typeof r.getShadowRoot=="function"&&r.getShadowRoot(i),v=!Ae(d,!1)&&(!r.shadowRootFilter||r.shadowRootFilter(i));if(d&&v){var y=o(d===!0?i.children:d.children,!0,r);r.flatten?n.push.apply(n,y):n.push({scopeParent:i,candidates:y})}else a.unshift.apply(a,i.children)}}return n},bt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},ie=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||er(e))&&!bt(e)?0:e.tabIndex},tr=function(e,t){var r=ie(e);return r<0&&t&&!bt(e)?0:r},rr=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},wt=function(e){return e.tagName==="INPUT"},ar=function(e){return wt(e)&&e.type==="hidden"},nr=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(r){return r.tagName==="SUMMARY"});return t},ir=function(e,t){for(var r=0;rsummary:first-of-type"),i=a?e.parentElement:e;if(oe.call(i,"details:not([open]) *"))return!0;if(!r||r==="full"||r==="legacy-full"){if(typeof n=="function"){for(var s=e;e;){var u=e.parentElement,l=Se(e);if(u&&!u.shadowRoot&&n(u)===!0)return nt(e);e.assignedSlot?e=e.assignedSlot:!u&&l!==e.ownerDocument?e=l.host:e=u}e=s}if(lr(e))return!e.getClientRects().length;if(r!=="legacy-full")return!0}else if(r==="non-zero-area")return nt(e);return!1},fr=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var r=0;r=0)},hr=function o(e){var t=[],r=[];return e.forEach(function(n,a){var i=!!n.scopeParent,s=i?n.scopeParent:n,u=tr(s,i),l=i?o(n.candidates):s;u===0?i?t.push.apply(t,l):t.push(s):r.push({documentOrder:a,tabIndex:u,item:n,isScope:i,content:l})}),r.sort(rr).reduce(function(n,a){return a.isScope?n.push.apply(n,a.content):n.push(a.content),n},[]).concat(t)},vr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=mt([e],t.includeContainer,{filter:Be.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:dr}):r=gt(e,t.includeContainer,Be.bind(null,t)),hr(r)},pr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=mt([e],t.includeContainer,{filter:Ce.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):r=gt(e,t.includeContainer,Ce.bind(null,t)),r},se=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return oe.call(e,Ee)===!1?!1:Be(t,e)},yr=pt.concat("iframe").join(","),De=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return oe.call(e,yr)===!1?!1:Ce(t,e)};/*! +* focus-trap 7.5.2 +* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE +*/function it(o,e){var t=Object.keys(o);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(o);e&&(r=r.filter(function(n){return Object.getOwnPropertyDescriptor(o,n).enumerable})),t.push.apply(t,r)}return t}function ot(o){for(var e=1;e0){var r=e[e.length-1];r!==t&&r.pause()}var n=e.indexOf(t);n===-1||e.splice(n,1),e.push(t)},deactivateTrap:function(e,t){var r=e.indexOf(t);r!==-1&&e.splice(r,1),e.length>0&&e[e.length-1].unpause()}},wr=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},xr=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},ye=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Fr=function(e){return ye(e)&&!e.shiftKey},Er=function(e){return ye(e)&&e.shiftKey},ut=function(e){return setTimeout(e,0)},lt=function(e,t){var r=-1;return e.every(function(n,a){return t(n)?(r=a,!1):!0}),r},ve=function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n1?p-1:0),T=1;T=0)c=r.activeElement;else{var f=i.tabbableGroups[0],p=f&&f.firstTabbableNode;c=p||h("fallbackFocus")}if(!c)throw new Error("Your focus-trap needs to have at least one focusable element");return c},v=function(){if(i.containerGroups=i.containers.map(function(c){var f=vr(c,a.tabbableOptions),p=pr(c,a.tabbableOptions),w=f.length>0?f[0]:void 0,T=f.length>0?f[f.length-1]:void 0,O=p.find(function(b){return se(b)}),P=p.slice().reverse().find(function(b){return se(b)}),g=!!f.find(function(b){return ie(b)>0});return{container:c,tabbableNodes:f,focusableNodes:p,posTabIndexesFound:g,firstTabbableNode:w,lastTabbableNode:T,firstDomTabbableNode:O,lastDomTabbableNode:P,nextTabbableNode:function(z){var G=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,j=f.indexOf(z);return j<0?G?p.slice(p.indexOf(z)+1).find(function(J){return se(J)}):p.slice(0,p.indexOf(z)).reverse().find(function(J){return se(J)}):f[j+(G?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(c){return c.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!h("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(c){return c.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},y=function F(c){if(c!==!1&&c!==r.activeElement){if(!c||!c.focus){F(d());return}c.focus({preventScroll:!!a.preventScroll}),i.mostRecentlyFocusedNode=c,wr(c)&&c.select()}},m=function(c){var f=h("setReturnFocus",c);return f||(f===!1?!1:c)},E=function(c){var f=c.target,p=c.event,w=c.isBackward,T=w===void 0?!1:w;f=f||xe(p),v();var O=null;if(i.tabbableGroups.length>0){var P=l(f,p),g=P>=0?i.containerGroups[P]:void 0;if(P<0)T?O=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:O=i.tabbableGroups[0].firstTabbableNode;else if(T){var b=lt(i.tabbableGroups,function(U){var H=U.firstTabbableNode;return f===H});if(b<0&&(g.container===f||De(f,a.tabbableOptions)&&!se(f,a.tabbableOptions)&&!g.nextTabbableNode(f,!1))&&(b=P),b>=0){var z=b===0?i.tabbableGroups.length-1:b-1,G=i.tabbableGroups[z];O=ie(f)>=0?G.lastTabbableNode:G.lastDomTabbableNode}else ye(p)||(O=g.nextTabbableNode(f,!1))}else{var j=lt(i.tabbableGroups,function(U){var H=U.lastTabbableNode;return f===H});if(j<0&&(g.container===f||De(f,a.tabbableOptions)&&!se(f,a.tabbableOptions)&&!g.nextTabbableNode(f))&&(j=P),j>=0){var J=j===i.tabbableGroups.length-1?0:j+1,B=i.tabbableGroups[J];O=ie(f)>=0?B.firstTabbableNode:B.firstDomTabbableNode}else ye(p)||(O=g.nextTabbableNode(f))}}else O=h("fallbackFocus");return O},x=function(c){var f=xe(c);if(!(l(f,c)>=0)){if(ve(a.clickOutsideDeactivates,c)){s.deactivate({returnFocus:a.returnFocusOnDeactivate});return}ve(a.allowOutsideClick,c)||c.preventDefault()}},C=function(c){var f=xe(c),p=l(f,c)>=0;if(p||f instanceof Document)p&&(i.mostRecentlyFocusedNode=f);else{c.stopImmediatePropagation();var w,T=!0;if(i.mostRecentlyFocusedNode)if(ie(i.mostRecentlyFocusedNode)>0){var O=l(i.mostRecentlyFocusedNode),P=i.containerGroups[O].tabbableNodes;if(P.length>0){var g=P.findIndex(function(b){return b===i.mostRecentlyFocusedNode});g>=0&&(a.isKeyForward(i.recentNavEvent)?g+1=0&&(w=P[g-1],T=!1))}}else i.containerGroups.some(function(b){return b.tabbableNodes.some(function(z){return ie(z)>0})})||(T=!1);else T=!1;T&&(w=E({target:i.mostRecentlyFocusedNode,isBackward:a.isKeyBackward(i.recentNavEvent)})),y(w||i.mostRecentlyFocusedNode||d())}i.recentNavEvent=void 0},N=function(c){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=c;var p=E({event:c,isBackward:f});p&&(ye(c)&&c.preventDefault(),y(p))},A=function(c){if(xr(c)&&ve(a.escapeDeactivates,c)!==!1){c.preventDefault(),s.deactivate();return}(a.isKeyForward(c)||a.isKeyBackward(c))&&N(c,a.isKeyBackward(c))},M=function(c){var f=xe(c);l(f,c)>=0||ve(a.clickOutsideDeactivates,c)||ve(a.allowOutsideClick,c)||(c.preventDefault(),c.stopImmediatePropagation())},L=function(){if(i.active)return st.activateTrap(n,s),i.delayInitialFocusTimer=a.delayInitialFocus?ut(function(){y(d())}):y(d()),r.addEventListener("focusin",C,!0),r.addEventListener("mousedown",x,{capture:!0,passive:!1}),r.addEventListener("touchstart",x,{capture:!0,passive:!1}),r.addEventListener("click",M,{capture:!0,passive:!1}),r.addEventListener("keydown",A,{capture:!0,passive:!1}),s},D=function(){if(i.active)return r.removeEventListener("focusin",C,!0),r.removeEventListener("mousedown",x,!0),r.removeEventListener("touchstart",x,!0),r.removeEventListener("click",M,!0),r.removeEventListener("keydown",A,!0),s},k=function(c){var f=c.some(function(p){var w=Array.from(p.removedNodes);return w.some(function(T){return T===i.mostRecentlyFocusedNode})});f&&y(d())},I=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(k):void 0,R=function(){I&&(I.disconnect(),i.active&&!i.paused&&i.containers.map(function(c){I.observe(c,{subtree:!0,childList:!0})}))};return s={get active(){return i.active},get paused(){return i.paused},activate:function(c){if(i.active)return this;var f=u(c,"onActivate"),p=u(c,"onPostActivate"),w=u(c,"checkCanFocusTrap");w||v(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=r.activeElement,f==null||f();var T=function(){w&&v(),L(),R(),p==null||p()};return w?(w(i.containers.concat()).then(T,T),this):(T(),this)},deactivate:function(c){if(!i.active)return this;var f=ot({onDeactivate:a.onDeactivate,onPostDeactivate:a.onPostDeactivate,checkCanReturnFocus:a.checkCanReturnFocus},c);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,D(),i.active=!1,i.paused=!1,R(),st.deactivateTrap(n,s);var p=u(f,"onDeactivate"),w=u(f,"onPostDeactivate"),T=u(f,"checkCanReturnFocus"),O=u(f,"returnFocus","returnFocusOnDeactivate");p==null||p();var P=function(){ut(function(){O&&y(m(i.nodeFocusedBeforeActivation)),w==null||w()})};return O&&T?(T(m(i.nodeFocusedBeforeActivation)).then(P,P),this):(P(),this)},pause:function(c){if(i.paused||!i.active)return this;var f=u(c,"onPause"),p=u(c,"onPostPause");return i.paused=!0,f==null||f(),D(),R(),p==null||p(),this},unpause:function(c){if(!i.paused||!i.active)return this;var f=u(c,"onUnpause"),p=u(c,"onPostUnpause");return i.paused=!1,f==null||f(),v(),L(),R(),p==null||p(),this},updateContainerElements:function(c){var f=[].concat(c).filter(Boolean);return i.containers=f.map(function(p){return typeof p=="string"?r.querySelector(p):p}),i.active&&v(),R(),this}},s.updateContainerElements(e),s};function Cr(o,e={}){let t;const{immediate:r,...n}=e,a=ne(!1),i=ne(!1),s=d=>t&&t.activate(d),u=d=>t&&t.deactivate(d),l=()=>{t&&(t.pause(),i.value=!0)},h=()=>{t&&(t.unpause(),i.value=!1)};return ze(()=>Nt(o),d=>{d&&(t=Ar(d,{...n,onActivate(){a.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){a.value=!1,e.onDeactivate&&e.onDeactivate()}}),r&&s())},{flush:"post"}),kt(()=>u()),{hasFocus:a,isPaused:i,activate:s,deactivate:u,pause:l,unpause:h}}class le{constructor(e,t=!0,r=[],n=5e3){this.ctx=e,this.iframes=t,this.exclude=r,this.iframesTimeout=n}static matches(e,t){const r=typeof t=="string"?[t]:t,n=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(n){let a=!1;return r.every(i=>n.call(e,i)?(a=!0,!1):!0),a}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(r=>{const n=t.filter(a=>a.contains(r)).length>0;t.indexOf(r)===-1&&!n&&t.push(r)}),t}getIframeContents(e,t,r=()=>{}){let n;try{const a=e.contentWindow;if(n=a.document,!a||!n)throw new Error("iframe inaccessible")}catch{r()}n&&t(n)}isIframeBlank(e){const t="about:blank",r=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&r!==t&&r}observeIframeLoad(e,t,r){let n=!1,a=null;const i=()=>{if(!n){n=!0,clearTimeout(a);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,r))}catch{r()}}};e.addEventListener("load",i),a=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,r){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,r):this.getIframeContents(e,t,r):this.observeIframeLoad(e,t,r)}catch{r()}}waitForIframes(e,t){let r=0;this.forEachIframe(e,()=>!0,n=>{r++,this.waitForIframes(n.querySelector("html"),()=>{--r||t()})},n=>{n||t()})}forEachIframe(e,t,r,n=()=>{}){let a=e.querySelectorAll("iframe"),i=a.length,s=0;a=Array.prototype.slice.call(a);const u=()=>{--i<=0&&n(s)};i||u(),a.forEach(l=>{le.matches(l,this.exclude)?u():this.onIframeReady(l,h=>{t(l)&&(s++,r(h)),u()},u)})}createIterator(e,t,r){return document.createNodeIterator(e,t,r,!1)}createInstanceOnIframe(e){return new le(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,r){const n=e.compareDocumentPosition(r),a=Node.DOCUMENT_POSITION_PRECEDING;if(n&a)if(t!==null){const i=t.compareDocumentPosition(r),s=Node.DOCUMENT_POSITION_FOLLOWING;if(i&s)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let r;return t===null?r=e.nextNode():r=e.nextNode()&&e.nextNode(),{prevNode:t,node:r}}checkIframeFilter(e,t,r,n){let a=!1,i=!1;return n.forEach((s,u)=>{s.val===r&&(a=u,i=s.handled)}),this.compareNodeIframe(e,t,r)?(a===!1&&!i?n.push({val:r,handled:!0}):a!==!1&&!i&&(n[a].handled=!0),!0):(a===!1&&n.push({val:r,handled:!1}),!1)}handleOpenIframes(e,t,r,n){e.forEach(a=>{a.handled||this.getIframeContents(a.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,r,n)})})}iterateThroughNodes(e,t,r,n,a){const i=this.createIterator(t,e,n);let s=[],u=[],l,h,d=()=>({prevNode:h,node:l}=this.getIteratorNode(i),l);for(;d();)this.iframes&&this.forEachIframe(t,v=>this.checkIframeFilter(l,h,v,s),v=>{this.createInstanceOnIframe(v).forEachNode(e,y=>u.push(y),n)}),u.push(l);u.forEach(v=>{r(v)}),this.iframes&&this.handleOpenIframes(s,e,r,n),a()}forEachNode(e,t,r,n=()=>{}){const a=this.getContexts();let i=a.length;i||n(),a.forEach(s=>{const u=()=>{this.iterateThroughNodes(e,s,t,r,()=>{--i<=0&&n()})};this.iframes?this.waitForIframes(s,u):u()})}}let Nr=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new le(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const r=this.opt.log;this.opt.debug&&typeof r=="object"&&typeof r[t]=="function"&&r[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,r=this.opt.caseSensitive?"":"i",n=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let a in t)if(t.hasOwnProperty(a)){const i=t[a],s=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(a):this.escapeStr(a),u=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);s!==""&&u!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(s)}|${this.escapeStr(u)})`,`gm${r}`),n+`(${this.processSynomyms(s)}|${this.processSynomyms(u)})`+n))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,r,n)=>{let a=n.charAt(r+1);return/[(|)\\]/.test(a)||a===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const r=this.opt.ignorePunctuation;return Array.isArray(r)&&r.length&&t.push(this.escapeStr(r.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",r=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let n=[];return e.split("").forEach(a=>{r.every(i=>{if(i.indexOf(a)!==-1){if(n.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),n.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let r=this.opt.accuracy,n=typeof r=="string"?r:r.value,a=typeof r=="string"?[]:r.limiters,i="";switch(a.forEach(s=>{i+=`|${this.escapeStr(s)}`}),n){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(r=>{this.opt.separateWordSearch?r.split(" ").forEach(n=>{n.trim()&&t.indexOf(n)===-1&&t.push(n)}):r.trim()&&t.indexOf(r)===-1&&t.push(r)}),{keywords:t.sort((r,n)=>n.length-r.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let r=0;return e.sort((n,a)=>n.start-a.start).forEach(n=>{let{start:a,end:i,valid:s}=this.callNoMatchOnInvalidRanges(n,r);s&&(n.start=a,n.length=i-a,t.push(n),r=i)}),t}callNoMatchOnInvalidRanges(e,t){let r,n,a=!1;return e&&typeof e.start<"u"?(r=parseInt(e.start,10),n=r+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&n-t>0&&n-r>0?a=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:r,end:n,valid:a}}checkWhitespaceRanges(e,t,r){let n,a=!0,i=r.length,s=t-i,u=parseInt(e.start,10)-s;return u=u>i?i:u,n=u+parseInt(e.length,10),n>i&&(n=i,this.log(`End range automatically set to the max value of ${i}`)),u<0||n-u<0||u>i||n>i?(a=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):r.substring(u,n).replace(/\s+/g,"")===""&&(a=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:u,end:n,valid:a}}getTextNodes(e){let t="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,n=>{r.push({start:t.length,end:(t+=n.textContent).length,node:n})},n=>this.matchesExclude(n.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:r})})}matchesExclude(e){return le.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,r){const n=this.opt.element?this.opt.element:"mark",a=e.splitText(t),i=a.splitText(r-t);let s=document.createElement(n);return s.setAttribute("data-markjs","true"),this.opt.className&&s.setAttribute("class",this.opt.className),s.textContent=a.textContent,a.parentNode.replaceChild(s,a),i}wrapRangeInMappedTextNode(e,t,r,n,a){e.nodes.every((i,s)=>{const u=e.nodes[s+1];if(typeof u>"u"||u.start>t){if(!n(i.node))return!1;const l=t-i.start,h=(r>i.end?i.end:r)-i.start,d=e.value.substr(0,i.start),v=e.value.substr(h+i.start);if(i.node=this.wrapRangeInTextNode(i.node,l,h),e.value=d+v,e.nodes.forEach((y,m)=>{m>=s&&(e.nodes[m].start>0&&m!==s&&(e.nodes[m].start-=h),e.nodes[m].end-=h)}),r-=h,a(i.node.previousSibling,i.start),r>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,r,n,a){const i=t===0?0:t+1;this.getTextNodes(s=>{s.nodes.forEach(u=>{u=u.node;let l;for(;(l=e.exec(u.textContent))!==null&&l[i]!=="";){if(!r(l[i],u))continue;let h=l.index;if(i!==0)for(let d=1;d{let u;for(;(u=e.exec(s.value))!==null&&u[i]!=="";){let l=u.index;if(i!==0)for(let d=1;dr(u[i],d),(d,v)=>{e.lastIndex=v,n(d)})}a()})}wrapRangeFromIndex(e,t,r,n){this.getTextNodes(a=>{const i=a.value.length;e.forEach((s,u)=>{let{start:l,end:h,valid:d}=this.checkWhitespaceRanges(s,i,a.value);d&&this.wrapRangeInMappedTextNode(a,l,h,v=>t(v,s,a.value.substring(l,h),u),v=>{r(v,s)})}),n()})}unwrapMatches(e){const t=e.parentNode;let r=document.createDocumentFragment();for(;e.firstChild;)r.appendChild(e.removeChild(e.firstChild));t.replaceChild(r,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let r=0,n="wrapMatches";const a=i=>{r++,this.opt.each(i)};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),this[n](e,this.opt.ignoreGroups,(i,s)=>this.opt.filter(s,i,r),a,()=>{r===0&&this.opt.noMatch(e),this.opt.done(r)})}mark(e,t){this.opt=t;let r=0,n="wrapMatches";const{keywords:a,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),s=this.opt.caseSensitive?"":"i",u=l=>{let h=new RegExp(this.createRegExp(l),`gm${s}`),d=0;this.log(`Searching with expression "${h}"`),this[n](h,1,(v,y)=>this.opt.filter(y,l,r,d),v=>{d++,r++,this.opt.each(v)},()=>{d===0&&this.opt.noMatch(l),a[i-1]===l?this.opt.done(r):u(a[a.indexOf(l)+1])})};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),i===0?this.opt.done(r):u(a[0])}markRanges(e,t){this.opt=t;let r=0,n=this.checkRanges(e);n&&n.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(n)),this.wrapRangeFromIndex(n,(a,i,s,u)=>this.opt.filter(a,i,s,u),(a,i)=>{r++,this.opt.each(a,i)},()=>{this.opt.done(r)})):this.opt.done(r)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,r=>{this.unwrapMatches(r)},r=>{const n=le.matches(r,t),a=this.matchesExclude(r);return!n||a?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function kr(o){const e=new Nr(o);return this.mark=(t,r)=>(e.mark(t,r),this),this.markRegExp=(t,r)=>(e.markRegExp(t,r),this),this.markRanges=(t,r)=>(e.markRanges(t,r),this),this.unmark=t=>(e.unmark(t),this),this}var V=function(){return V=Object.assign||function(e){for(var t,r=1,n=arguments.length;r0&&a[a.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!a||l[1]>a[0]&&l[1]=o.length&&(o=void 0),{value:o&&o[r++],done:!o}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function $(o,e){var t=typeof Symbol=="function"&&o[Symbol.iterator];if(!t)return o;var r=t.call(o),n,a=[],i;try{for(;(e===void 0||e-- >0)&&!(n=r.next()).done;)a.push(n.value)}catch(s){i={error:s}}finally{try{n&&!n.done&&(t=r.return)&&t.call(r)}finally{if(i)throw i.error}}return a}var Dr="ENTRIES",xt="KEYS",Ft="VALUES",K="",_e=function(){function o(e,t){var r=e._tree,n=Array.from(r.keys());this.set=e,this._type=t,this._path=n.length>0?[{node:r,keys:n}]:[]}return o.prototype.next=function(){var e=this.dive();return this.backtrack(),e},o.prototype.dive=function(){if(this._path.length===0)return{done:!0,value:void 0};var e=ue(this._path),t=e.node,r=e.keys;if(ue(r)===K)return{done:!1,value:this.result()};var n=t.get(ue(r));return this._path.push({node:n,keys:Array.from(n.keys())}),this.dive()},o.prototype.backtrack=function(){if(this._path.length!==0){var e=ue(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}},o.prototype.key=function(){return this.set._prefix+this._path.map(function(e){var t=e.keys;return ue(t)}).filter(function(e){return e!==K}).join("")},o.prototype.value=function(){return ue(this._path).node.get(K)},o.prototype.result=function(){switch(this._type){case Ft:return this.value();case xt:return this.key();default:return[this.key(),this.value()]}},o.prototype[Symbol.iterator]=function(){return this},o}(),ue=function(o){return o[o.length-1]},_r=function(o,e,t){var r=new Map;if(e===void 0)return r;for(var n=e.length+1,a=n+t,i=new Uint8Array(a*n).fill(t+1),s=0;st)continue e}Et(o.get(y),e,t,r,n,E,i,s+y)}}}catch(p){u={error:p}}finally{try{v&&!v.done&&(l=d.return)&&l.call(d)}finally{if(u)throw u.error}}},Oe=function(){function o(e,t){e===void 0&&(e=new Map),t===void 0&&(t=""),this._size=void 0,this._tree=e,this._prefix=t}return o.prototype.atPrefix=function(e){var t,r;if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");var n=$(Ne(this._tree,e.slice(this._prefix.length)),2),a=n[0],i=n[1];if(a===void 0){var s=$(Ke(i),2),u=s[0],l=s[1];try{for(var h=_(u.keys()),d=h.next();!d.done;d=h.next()){var v=d.value;if(v!==K&&v.startsWith(l)){var y=new Map;return y.set(v.slice(l.length),u.get(v)),new o(y,e)}}}catch(m){t={error:m}}finally{try{d&&!d.done&&(r=h.return)&&r.call(h)}finally{if(t)throw t.error}}}return new o(a,e)},o.prototype.clear=function(){this._size=void 0,this._tree.clear()},o.prototype.delete=function(e){return this._size=void 0,Or(this._tree,e)},o.prototype.entries=function(){return new _e(this,Dr)},o.prototype.forEach=function(e){var t,r;try{for(var n=_(this),a=n.next();!a.done;a=n.next()){var i=$(a.value,2),s=i[0],u=i[1];e(s,u,this)}}catch(l){t={error:l}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},o.prototype.fuzzyGet=function(e,t){return _r(this._tree,e,t)},o.prototype.get=function(e){var t=Ve(this._tree,e);return t!==void 0?t.get(K):void 0},o.prototype.has=function(e){var t=Ve(this._tree,e);return t!==void 0&&t.has(K)},o.prototype.keys=function(){return new _e(this,xt)},o.prototype.set=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Re(this._tree,e);return r.set(K,t),this},Object.defineProperty(o.prototype,"size",{get:function(){if(this._size)return this._size;this._size=0;for(var e=this.entries();!e.next().done;)this._size+=1;return this._size},enumerable:!1,configurable:!0}),o.prototype.update=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Re(this._tree,e);return r.set(K,t(r.get(K))),this},o.prototype.fetch=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Re(this._tree,e),n=r.get(K);return n===void 0&&r.set(K,n=t()),n},o.prototype.values=function(){return new _e(this,Ft)},o.prototype[Symbol.iterator]=function(){return this.entries()},o.from=function(e){var t,r,n=new o;try{for(var a=_(e),i=a.next();!i.done;i=a.next()){var s=$(i.value,2),u=s[0],l=s[1];n.set(u,l)}}catch(h){t={error:h}}finally{try{i&&!i.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}return n},o.fromObject=function(e){return o.from(Object.entries(e))},o}(),Ne=function(o,e,t){var r,n;if(t===void 0&&(t=[]),e.length===0||o==null)return[o,t];try{for(var a=_(o.keys()),i=a.next();!i.done;i=a.next()){var s=i.value;if(s!==K&&e.startsWith(s))return t.push([o,s]),Ne(o.get(s),e.slice(s.length),t)}}catch(u){r={error:u}}finally{try{i&&!i.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}return t.push([o,e]),Ne(void 0,"",t)},Ve=function(o,e){var t,r;if(e.length===0||o==null)return o;try{for(var n=_(o.keys()),a=n.next();!a.done;a=n.next()){var i=a.value;if(i!==K&&e.startsWith(i))return Ve(o.get(i),e.slice(i.length))}}catch(s){t={error:s}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},Re=function(o,e){var t,r,n=e.length;e:for(var a=0;o&&a0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new Oe,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}},o.prototype.discard=function(e){var t=this,r=this._idToShortId.get(e);if(r==null)throw new Error("MiniSearch: cannot discard document with ID ".concat(e,": it is not in the index"));this._idToShortId.delete(e),this._documentIds.delete(r),this._storedFields.delete(r),(this._fieldLength.get(r)||[]).forEach(function(n,a){t.removeFieldLength(r,a,t._documentCount,n)}),this._fieldLength.delete(r),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()},o.prototype.maybeAutoVacuum=function(){if(this._options.autoVacuum!==!1){var e=this._options.autoVacuum,t=e.minDirtFactor,r=e.minDirtCount,n=e.batchSize,a=e.batchWait;this.conditionalVacuum({batchSize:n,batchWait:a},{minDirtCount:r,minDirtFactor:t})}},o.prototype.discardAll=function(e){var t,r,n=this._options.autoVacuum;try{this._options.autoVacuum=!1;try{for(var a=_(e),i=a.next();!i.done;i=a.next()){var s=i.value;this.discard(s)}}catch(u){t={error:u}}finally{try{i&&!i.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}}finally{this._options.autoVacuum=n}this.maybeAutoVacuum()},o.prototype.replace=function(e){var t=this._options,r=t.idField,n=t.extractField,a=n(e,r);this.discard(a),this.add(e)},o.prototype.vacuum=function(e){return e===void 0&&(e={}),this.conditionalVacuum(e)},o.prototype.conditionalVacuum=function(e,t){var r=this;return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(function(){var n=r._enqueuedVacuumConditions;return r._enqueuedVacuumConditions=We,r.performVacuuming(e,n)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)},o.prototype.performVacuuming=function(e,t){return Tr(this,void 0,void 0,function(){var r,n,a,i,s,u,l,h,d,v,y,m,E,x,C,N,A,M,L,D,k,I,R,F,c;return Ir(this,function(f){switch(f.label){case 0:if(r=this._dirtCount,!this.vacuumConditionsMet(t))return[3,10];n=e.batchSize||$e.batchSize,a=e.batchWait||$e.batchWait,i=1,f.label=1;case 1:f.trys.push([1,7,8,9]),s=_(this._index),u=s.next(),f.label=2;case 2:if(u.done)return[3,6];l=$(u.value,2),h=l[0],d=l[1];try{for(v=(I=void 0,_(d)),y=v.next();!y.done;y=v.next()){m=$(y.value,2),E=m[0],x=m[1];try{for(C=(F=void 0,_(x)),N=C.next();!N.done;N=C.next())A=$(N.value,1),M=A[0],!this._documentIds.has(M)&&(x.size<=1?d.delete(E):x.delete(M))}catch(p){F={error:p}}finally{try{N&&!N.done&&(c=C.return)&&c.call(C)}finally{if(F)throw F.error}}}}catch(p){I={error:p}}finally{try{y&&!y.done&&(R=v.return)&&R.call(v)}finally{if(I)throw I.error}}return this._index.get(h).size===0&&this._index.delete(h),i%n!==0?[3,4]:[4,new Promise(function(p){return setTimeout(p,a)})];case 3:f.sent(),f.label=4;case 4:i+=1,f.label=5;case 5:return u=s.next(),[3,2];case 6:return[3,9];case 7:return L=f.sent(),D={error:L},[3,9];case 8:try{u&&!u.done&&(k=s.return)&&k.call(s)}finally{if(D)throw D.error}return[7];case 9:this._dirtCount-=r,f.label=10;case 10:return[4,null];case 11:return f.sent(),this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null,[2]}})})},o.prototype.vacuumConditionsMet=function(e){if(e==null)return!0;var t=e.minDirtCount,r=e.minDirtFactor;return t=t||Pe.minDirtCount,r=r||Pe.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=r},Object.defineProperty(o.prototype,"isVacuuming",{get:function(){return this._currentVacuum!=null},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtCount",{get:function(){return this._dirtCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtFactor",{get:function(){return this._dirtCount/(1+this._documentCount+this._dirtCount)},enumerable:!1,configurable:!0}),o.prototype.has=function(e){return this._idToShortId.has(e)},o.prototype.getStoredFields=function(e){var t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)},o.prototype.search=function(e,t){var r,n;t===void 0&&(t={});var a=this.executeQuery(e,t),i=[];try{for(var s=_(a),u=s.next();!u.done;u=s.next()){var l=$(u.value,2),h=l[0],d=l[1],v=d.score,y=d.terms,m=d.match,E=y.length,x={id:this._documentIds.get(h),score:v*E,terms:Object.keys(m),match:m};Object.assign(x,this._storedFields.get(h)),(t.filter==null||t.filter(x))&&i.push(x)}}catch(C){r={error:C}}finally{try{u&&!u.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}return i.sort(dt),i},o.prototype.autoSuggest=function(e,t){var r,n,a,i;t===void 0&&(t={}),t=V(V({},this._options.autoSuggestOptions),t);var s=new Map;try{for(var u=_(this.search(e,t)),l=u.next();!l.done;l=u.next()){var h=l.value,d=h.score,v=h.terms,y=v.join(" "),m=s.get(y);m!=null?(m.score+=d,m.count+=1):s.set(y,{score:d,terms:v,count:1})}}catch(L){r={error:L}}finally{try{l&&!l.done&&(n=u.return)&&n.call(u)}finally{if(r)throw r.error}}var E=[];try{for(var x=_(s),C=x.next();!C.done;C=x.next()){var N=$(C.value,2),m=N[0],A=N[1],d=A.score,v=A.terms,M=A.count;E.push({suggestion:m,terms:v,score:d/M})}}catch(L){a={error:L}}finally{try{C&&!C.done&&(i=x.return)&&i.call(x)}finally{if(a)throw a.error}}return E.sort(dt),E},Object.defineProperty(o.prototype,"documentCount",{get:function(){return this._documentCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"termCount",{get:function(){return this._index.size},enumerable:!1,configurable:!0}),o.loadJSON=function(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)},o.getDefault=function(e){if(Le.hasOwnProperty(e))return Me(Le,e);throw new Error('MiniSearch: unknown option "'.concat(e,'"'))},o.loadJS=function(e,t){var r,n,a,i,s,u,l=e.index,h=e.documentCount,d=e.nextId,v=e.documentIds,y=e.fieldIds,m=e.fieldLength,E=e.averageFieldLength,x=e.storedFields,C=e.dirtCount,N=e.serializationVersion;if(N!==1&&N!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");var A=new o(t);A._documentCount=h,A._nextId=d,A._documentIds=Fe(v),A._idToShortId=new Map,A._fieldIds=y,A._fieldLength=Fe(m),A._avgFieldLength=E,A._storedFields=Fe(x),A._dirtCount=C||0,A._index=new Oe;try{for(var M=_(A._documentIds),L=M.next();!L.done;L=M.next()){var D=$(L.value,2),k=D[0],I=D[1];A._idToShortId.set(I,k)}}catch(b){r={error:b}}finally{try{L&&!L.done&&(n=M.return)&&n.call(M)}finally{if(r)throw r.error}}try{for(var R=_(l),F=R.next();!F.done;F=R.next()){var c=$(F.value,2),f=c[0],p=c[1],w=new Map;try{for(var T=(s=void 0,_(Object.keys(p))),O=T.next();!O.done;O=T.next()){var P=O.value,g=p[P];N===1&&(g=g.ds),w.set(parseInt(P,10),Fe(g))}}catch(b){s={error:b}}finally{try{O&&!O.done&&(u=T.return)&&u.call(T)}finally{if(s)throw s.error}}A._index.set(f,w)}}catch(b){a={error:b}}finally{try{F&&!F.done&&(i=R.return)&&i.call(R)}finally{if(a)throw a.error}}return A},o.prototype.executeQuery=function(e,t){var r=this;if(t===void 0&&(t={}),typeof e!="string"){var n=V(V(V({},t),e),{queries:void 0}),a=e.queries.map(function(x){return r.executeQuery(x,n)});return this.combineResults(a,n.combineWith)}var i=this._options,s=i.tokenize,u=i.processTerm,l=i.searchOptions,h=V(V({tokenize:s,processTerm:u},l),t),d=h.tokenize,v=h.processTerm,y=d(e).flatMap(function(x){return v(x)}).filter(function(x){return!!x}),m=y.map(Br(h)),E=m.map(function(x){return r.executeQuerySpec(x,h)});return this.combineResults(E,h.combineWith)},o.prototype.executeQuerySpec=function(e,t){var r,n,a,i,s=V(V({},this._options.searchOptions),t),u=(s.fields||this._options.fields).reduce(function(P,g){var b;return V(V({},P),(b={},b[g]=Me(s.boost,g)||1,b))},{}),l=s.boostDocument,h=s.weights,d=s.maxFuzzy,v=s.bm25,y=V(V({},ct.weights),h),m=y.fuzzy,E=y.prefix,x=this._index.get(e.term),C=this.termResults(e.term,e.term,1,x,u,l,v),N,A;if(e.prefix&&(N=this._index.atPrefix(e.term)),e.fuzzy){var M=e.fuzzy===!0?.2:e.fuzzy,L=M<1?Math.min(d,Math.round(e.term.length*M)):M;L&&(A=this._index.fuzzyGet(e.term,L))}if(N)try{for(var D=_(N),k=D.next();!k.done;k=D.next()){var I=$(k.value,2),R=I[0],F=I[1],c=R.length-e.term.length;if(c){A==null||A.delete(R);var f=E*R.length/(R.length+.3*c);this.termResults(e.term,R,f,F,u,l,v,C)}}}catch(P){r={error:P}}finally{try{k&&!k.done&&(n=D.return)&&n.call(D)}finally{if(r)throw r.error}}if(A)try{for(var p=_(A.keys()),w=p.next();!w.done;w=p.next()){var R=w.value,T=$(A.get(R),2),O=T[0],c=T[1];if(c){var f=m*R.length/(R.length+c);this.termResults(e.term,R,f,O,u,l,v,C)}}}catch(P){a={error:P}}finally{try{w&&!w.done&&(i=p.return)&&i.call(p)}finally{if(a)throw a.error}}return C},o.prototype.combineResults=function(e,t){if(t===void 0&&(t=je),e.length===0)return new Map;var r=t.toLowerCase();return e.reduce(Lr[r])||new Map},o.prototype.toJSON=function(){var e,t,r,n,a=[];try{for(var i=_(this._index),s=i.next();!s.done;s=i.next()){var u=$(s.value,2),l=u[0],h=u[1],d={};try{for(var v=(r=void 0,_(h)),y=v.next();!y.done;y=v.next()){var m=$(y.value,2),E=m[0],x=m[1];d[E]=Object.fromEntries(x)}}catch(C){r={error:C}}finally{try{y&&!y.done&&(n=v.return)&&n.call(v)}finally{if(r)throw r.error}}a.push([l,d])}}catch(C){e={error:C}}finally{try{s&&!s.done&&(t=i.return)&&t.call(i)}finally{if(e)throw e.error}}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:a,serializationVersion:2}},o.prototype.termResults=function(e,t,r,n,a,i,s,u){var l,h,d,v,y;if(u===void 0&&(u=new Map),n==null)return u;try{for(var m=_(Object.keys(a)),E=m.next();!E.done;E=m.next()){var x=E.value,C=a[x],N=this._fieldIds[x],A=n.get(N);if(A!=null){var M=A.size,L=this._avgFieldLength[N];try{for(var D=(d=void 0,_(A.keys())),k=D.next();!k.done;k=D.next()){var I=k.value;if(!this._documentIds.has(I)){this.removeTerm(N,I,t),M-=1;continue}var R=i?i(this._documentIds.get(I),t,this._storedFields.get(I)):1;if(R){var F=A.get(I),c=this._fieldLength.get(I)[N],f=zr(F,M,this._documentCount,c,L,s),p=r*C*R*f,w=u.get(I);if(w){w.score+=p,$r(w.terms,e);var T=Me(w.match,t);T?T.push(x):w.match[t]=[x]}else u.set(I,{score:p,terms:[e],match:(y={},y[t]=[x],y)})}}}catch(O){d={error:O}}finally{try{k&&!k.done&&(v=D.return)&&v.call(D)}finally{if(d)throw d.error}}}}}catch(O){l={error:O}}finally{try{E&&!E.done&&(h=m.return)&&h.call(m)}finally{if(l)throw l.error}}return u},o.prototype.addTerm=function(e,t,r){var n=this._index.fetch(r,ht),a=n.get(e);if(a==null)a=new Map,a.set(t,1),n.set(e,a);else{var i=a.get(t);a.set(t,(i||0)+1)}},o.prototype.removeTerm=function(e,t,r){if(!this._index.has(r)){this.warnDocumentChanged(t,e,r);return}var n=this._index.fetch(r,ht),a=n.get(e);a==null||a.get(t)==null?this.warnDocumentChanged(t,e,r):a.get(t)<=1?a.size<=1?n.delete(e):a.delete(t):a.set(t,a.get(t)-1),this._index.get(r).size===0&&this._index.delete(r)},o.prototype.warnDocumentChanged=function(e,t,r){var n,a;try{for(var i=_(Object.keys(this._fieldIds)),s=i.next();!s.done;s=i.next()){var u=s.value;if(this._fieldIds[u]===t){this._options.logger("warn","MiniSearch: document with ID ".concat(this._documentIds.get(e),' has changed before removal: term "').concat(r,'" was not present in field "').concat(u,'". Removing a document after it has changed can corrupt the index!'),"version_conflict");return}}}catch(l){n={error:l}}finally{try{s&&!s.done&&(a=i.return)&&a.call(i)}finally{if(n)throw n.error}}},o.prototype.addDocumentId=function(e){var t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t},o.prototype.addFields=function(e){for(var t=0;t(Jt("data-v-007ef435"),o=o(),Ut(),o),Kr=["aria-owns"],jr={class:"shell"},Jr=["title"],Ur=Q(()=>S("svg",{class:"search-icon",width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("g",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[S("circle",{cx:"11",cy:"11",r:"8"}),S("path",{d:"m21 21l-4.35-4.35"})])],-1)),Hr=[Ur],Gr={class:"search-actions before"},qr=["title"],Qr=Q(()=>S("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 12H5m7 7l-7-7l7-7"})],-1)),Yr=[Qr],Zr=["placeholder"],Xr={class:"search-actions"},ea=["title"],ta=Q(()=>S("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 14h7v7H3zM3 3h7v7H3zm11 1h7m-7 5h7m-7 6h7m-7 5h7"})],-1)),ra=[ta],aa=["disabled","title"],na=Q(()=>S("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20 5H9l-7 7l7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2Zm-2 4l-6 6m0-6l6 6"})],-1)),ia=[na],oa=["id","role","aria-labelledby"],sa=["aria-selected"],ua=["href","aria-label","onMouseenter","onFocusin"],la={class:"titles"},ca=Q(()=>S("span",{class:"title-icon"},"#",-1)),fa=["innerHTML"],da=Q(()=>S("svg",{width:"18",height:"18",viewBox:"0 0 24 24"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"m9 18l6-6l-6-6"})],-1)),ha={class:"title main"},va=["innerHTML"],pa={key:0,class:"excerpt-wrapper"},ya={key:0,class:"excerpt",inert:""},ga=["innerHTML"],ma=Q(()=>S("div",{class:"excerpt-gradient-bottom"},null,-1)),ba=Q(()=>S("div",{class:"excerpt-gradient-top"},null,-1)),wa={key:0,class:"no-results"},xa={class:"search-keyboard-shortcuts"},Fa=["aria-label"],Ea=Q(()=>S("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 19V5m-7 7l7-7l7 7"})],-1)),Sa=[Ea],Aa=["aria-label"],Ca=Q(()=>S("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 5v14m7-7l-7 7l-7-7"})],-1)),Na=[Ca],ka=["aria-label"],Ta=Q(()=>S("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[S("g",{fill:"none",stroke:"currentcolor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[S("path",{d:"m9 10l-5 5l5 5"}),S("path",{d:"M20 4v7a4 4 0 0 1-4 4H4"})])],-1)),Ia=[Ta],Da=["aria-label"],_a=Tt({__name:"VPLocalSearchBox",props:{placeholder:{}},emits:["close"],setup(o,{emit:e}){var T,O,P;const t=me(),r=me(),n=me(Xt),a=Yt(),{activate:i}=Cr(t,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:s,theme:u}=a,l=Xe(async()=>{var g,b,z,G,j,J,B,U,H;return at(Mr.loadJSON((z=await((b=(g=n.value)[s.value])==null?void 0:b.call(g)))==null?void 0:z.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((G=u.value.search)==null?void 0:G.provider)==="local"&&((J=(j=u.value.search.options)==null?void 0:j.miniSearch)==null?void 0:J.searchOptions)},...((B=u.value.search)==null?void 0:B.provider)==="local"&&((H=(U=u.value.search.options)==null?void 0:U.miniSearch)==null?void 0:H.options)}))}),d=Te(()=>{var g,b;return((g=u.value.search)==null?void 0:g.provider)==="local"&&((b=u.value.search.options)==null?void 0:b.disableQueryPersistence)===!0}).value?ne(""):It("vitepress:local-search-filter",""),v=Dt("vitepress:local-search-detailed-list",((T=u.value.search)==null?void 0:T.provider)==="local"&&((O=u.value.search.options)==null?void 0:O.detailedView)===!0),y=Te(()=>{var g,b,z;return((g=u.value.search)==null?void 0:g.provider)==="local"&&(((b=u.value.search.options)==null?void 0:b.disableDetailedView)===!0||((z=u.value.search.options)==null?void 0:z.detailedView)===!1)});_t(()=>{y.value&&(v.value=!1)});const m=me([]),E=ne(!1);ze(d,()=>{E.value=!1});const x=Xe(async()=>{if(r.value)return at(new kr(r.value))},null);Ot(()=>[l.value,d.value,v.value],async([g,b,z],G,j)=>{var Je,Ue,He,Ge;let J=!1;if(j(()=>{J=!0}),!g)return;m.value=g.search(b).slice(0,16),E.value=!0;const B=z?await Promise.all(m.value.map(q=>C(q.id))):[];if(J)return;const U=new Map;for(const{id:q,mod:te}of B){const re=q.slice(0,q.indexOf("#"));let X=U.get(re);if(X)continue;X=new Map,U.set(re,X);const Y=te.default??te;if(Y!=null&&Y.render||Y!=null&&Y.setup){const ae=Ht(Y);ae.config.warnHandler=()=>{},ae.provide(Gt,a),Object.defineProperties(ae.config.globalProperties,{$frontmatter:{get(){return a.frontmatter.value}},$params:{get(){return a.page.value.params}}});const qe=document.createElement("div");ae.mount(qe),qe.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(ce=>{var Ze;const ge=(Ze=ce.querySelector("a"))==null?void 0:Ze.getAttribute("href"),Qe=(ge==null?void 0:ge.startsWith("#"))&&ge.slice(1);if(!Qe)return;let Ye="";for(;(ce=ce.nextElementSibling)&&!/^h[1-6]$/i.test(ce.tagName);)Ye+=ce.outerHTML;X.set(Qe,Ye)}),ae.unmount()}if(J)return}const H=new Set;if(m.value=m.value.map(q=>{const[te,re]=q.id.split("#"),X=U.get(te),Y=(X==null?void 0:X.get(re))??"";for(const ae in q.match)H.add(ae);return{...q,text:Y}}),await fe(),J)return;await new Promise(q=>{var te;(te=x.value)==null||te.unmark({done:()=>{var re;(re=x.value)==null||re.markRegExp(w(H),{done:q})}})});const ke=((Je=t.value)==null?void 0:Je.querySelectorAll(".result .excerpt"))??[];for(const q of ke)(Ue=q.querySelector('mark[data-markjs="true"]'))==null||Ue.scrollIntoView({block:"center"});(Ge=(He=r.value)==null?void 0:He.firstElementChild)==null||Ge.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function C(g){const b=qt(g.slice(0,g.indexOf("#")));try{if(!b)throw new Error(`Cannot find file for id: ${g}`);return{id:g,mod:await vt(()=>import(b),[])}}catch(z){return console.error(z),{id:g,mod:{}}}}const N=ne(),A=Te(()=>{var g;return((g=d.value)==null?void 0:g.length)<=0});function M(g=!0){var b,z;(b=N.value)==null||b.focus(),g&&((z=N.value)==null||z.select())}Ie(()=>{M()});function L(g){g.pointerType==="mouse"&&M()}const D=ne(-1),k=ne(!1);ze(m,g=>{D.value=g.length?0:-1,I()});function I(){fe(()=>{const g=document.querySelector(".result.selected");g&&g.scrollIntoView({block:"nearest"})})}be("ArrowUp",g=>{g.preventDefault(),D.value--,D.value<0&&(D.value=m.value.length-1),k.value=!0,I()}),be("ArrowDown",g=>{g.preventDefault(),D.value++,D.value>=m.value.length&&(D.value=0),k.value=!0,I()});const R=Rt();be("Enter",g=>{if(g.target instanceof HTMLButtonElement&&g.target.type!=="submit")return;const b=m.value[D.value];if(g.target instanceof HTMLInputElement&&!b){g.preventDefault();return}b&&(R.go(b.id),e("close"))}),be("Escape",()=>{e("close")});const F={modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}},c=Zt((P=u.value.search)==null?void 0:P.options,F);Ie(()=>{window.history.pushState(null,"",null)}),Mt("popstate",g=>{g.preventDefault(),e("close")});const f=Lt(Pt?document.body:null);Ie(()=>{fe(()=>{f.value=!0,fe().then(()=>i())})}),zt(()=>{f.value=!1});function p(){d.value="",fe().then(()=>M(!1))}function w(g){return new RegExp([...g].sort((b,z)=>z.length-b.length).map(b=>`(${b.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")})`).join("|"),"gi")}return(g,b)=>{var z,G,j,J;return Z(),Bt(jt,{to:"body"},[S("div",{ref_key:"el",ref:t,role:"button","aria-owns":(z=m.value)!=null&&z.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[S("div",{class:"backdrop",onClick:b[0]||(b[0]=B=>g.$emit("close"))}),S("div",jr,[S("form",{class:"search-bar",onPointerup:b[4]||(b[4]=B=>L(B)),onSubmit:b[5]||(b[5]=Vt(()=>{},["prevent"]))},[S("label",{title:g.placeholder,id:"localsearch-label",for:"localsearch-input"},Hr,8,Jr),S("div",Gr,[S("button",{class:"back-button",title:W(c)("modal.backButtonTitle"),onClick:b[1]||(b[1]=B=>g.$emit("close"))},Yr,8,qr)]),$t(S("input",{ref_key:"searchInput",ref:N,"onUpdate:modelValue":b[2]||(b[2]=B=>Kt(d)?d.value=B:null),placeholder:g.placeholder,id:"localsearch-input","aria-labelledby":"localsearch-label",class:"search-input"},null,8,Zr),[[Wt,W(d)]]),S("div",Xr,[y.value?we("",!0):(Z(),ee("button",{key:0,class:et(["toggle-layout-button",{"detailed-list":W(v)}]),type:"button",title:W(c)("modal.displayDetails"),onClick:b[3]||(b[3]=B=>D.value>-1&&(v.value=!W(v)))},ra,10,ea)),S("button",{class:"clear-button",type:"reset",disabled:A.value,title:W(c)("modal.resetButtonTitle"),onClick:p},ia,8,aa)])],32),S("ul",{ref_key:"resultsEl",ref:r,id:(G=m.value)!=null&&G.length?"localsearch-list":void 0,role:(j=m.value)!=null&&j.length?"listbox":void 0,"aria-labelledby":(J=m.value)!=null&&J.length?"localsearch-label":void 0,class:"results",onMousemove:b[7]||(b[7]=B=>k.value=!1)},[(Z(!0),ee(rt,null,tt(m.value,(B,U)=>(Z(),ee("li",{key:B.id,role:"option","aria-selected":D.value===U?"true":"false"},[S("a",{href:B.id,class:et(["result",{selected:D.value===U}]),"aria-label":[...B.titles,B.title].join(" > "),onMouseenter:H=>!k.value&&(D.value=U),onFocusin:H=>D.value=U,onClick:b[6]||(b[6]=H=>g.$emit("close"))},[S("div",null,[S("div",la,[ca,(Z(!0),ee(rt,null,tt(B.titles,(H,ke)=>(Z(),ee("span",{key:ke,class:"title"},[S("span",{class:"text",innerHTML:H},null,8,fa),da]))),128)),S("span",ha,[S("span",{class:"text",innerHTML:B.title},null,8,va)])]),W(v)?(Z(),ee("div",pa,[B.text?(Z(),ee("div",ya,[S("div",{class:"vp-doc",innerHTML:B.text},null,8,ga)])):we("",!0),ma,ba])):we("",!0)])],42,ua)],8,sa))),128)),W(d)&&!m.value.length&&E.value?(Z(),ee("li",wa,[de(he(W(c)("modal.noResultsText"))+' "',1),S("strong",null,he(W(d)),1),de('" ')])):we("",!0)],40,oa),S("div",xa,[S("span",null,[S("kbd",{"aria-label":W(c)("modal.footer.navigateUpKeyAriaLabel")},Sa,8,Fa),S("kbd",{"aria-label":W(c)("modal.footer.navigateDownKeyAriaLabel")},Na,8,Aa),de(" "+he(W(c)("modal.footer.navigateText")),1)]),S("span",null,[S("kbd",{"aria-label":W(c)("modal.footer.selectKeyAriaLabel")},Ia,8,ka),de(" "+he(W(c)("modal.footer.selectText")),1)]),S("span",null,[S("kbd",{"aria-label":W(c)("modal.footer.closeKeyAriaLabel")},"esc",8,Da),de(" "+he(W(c)("modal.footer.closeText")),1)])])])],8,Kr)])}}});const Pa=Qt(_a,[["__scopeId","data-v-007ef435"]]);export{Pa as default}; diff --git a/assets/chunks/VPLocalSearchBox.9fe80cd9.js b/assets/chunks/VPLocalSearchBox.9fe80cd9.js deleted file mode 100644 index 1ec2eedb..00000000 --- a/assets/chunks/VPLocalSearchBox.9fe80cd9.js +++ /dev/null @@ -1 +0,0 @@ -import{M as $e,d as Ze,s as Z,l as Me,h as X,k as Xe,w as ze,q as he,v as fe,aj as et,ak as tt,o as U,D as rt,C as m,b as R,al as nt,am as it,m as at,c as K,n as De,G as oe,R as Te,F as Ne,a as ee,t as te,an as ot,S as st,U as lt,ao as Le,ap as ut,a8 as ct,ae as ht,aq as ft,_ as dt}from"./framework.fc84ac3a.js";import{u as vt,c as Oe,a as pt,b as yt,w as mt,o as se,d as gt,e as xt,f as wt}from"./theme.1c7a0dc0.js";const Ft={root:()=>$e(()=>import("./@localSearchIndexroot.44f29214.js"),[])};class Y{constructor(e,t=!0,r=[],i=5e3){this.ctx=e,this.iframes=t,this.exclude=r,this.iframesTimeout=i}static matches(e,t){const r=typeof t=="string"?[t]:t,i=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(i){let n=!1;return r.every(a=>i.call(e,a)?(n=!0,!1):!0),n}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(r=>{const i=t.filter(n=>n.contains(r)).length>0;t.indexOf(r)===-1&&!i&&t.push(r)}),t}getIframeContents(e,t,r=()=>{}){let i;try{const n=e.contentWindow;if(i=n.document,!n||!i)throw new Error("iframe inaccessible")}catch{r()}i&&t(i)}isIframeBlank(e){const t="about:blank",r=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&r!==t&&r}observeIframeLoad(e,t,r){let i=!1,n=null;const a=()=>{if(!i){i=!0,clearTimeout(n);try{this.isIframeBlank(e)||(e.removeEventListener("load",a),this.getIframeContents(e,t,r))}catch{r()}}};e.addEventListener("load",a),n=setTimeout(a,this.iframesTimeout)}onIframeReady(e,t,r){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,r):this.getIframeContents(e,t,r):this.observeIframeLoad(e,t,r)}catch{r()}}waitForIframes(e,t){let r=0;this.forEachIframe(e,()=>!0,i=>{r++,this.waitForIframes(i.querySelector("html"),()=>{--r||t()})},i=>{i||t()})}forEachIframe(e,t,r,i=()=>{}){let n=e.querySelectorAll("iframe"),a=n.length,s=0;n=Array.prototype.slice.call(n);const l=()=>{--a<=0&&i(s)};a||l(),n.forEach(u=>{Y.matches(u,this.exclude)?l():this.onIframeReady(u,c=>{t(u)&&(s++,r(c)),l()},l)})}createIterator(e,t,r){return document.createNodeIterator(e,t,r,!1)}createInstanceOnIframe(e){return new Y(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,r){const i=e.compareDocumentPosition(r),n=Node.DOCUMENT_POSITION_PRECEDING;if(i&n)if(t!==null){const a=t.compareDocumentPosition(r),s=Node.DOCUMENT_POSITION_FOLLOWING;if(a&s)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let r;return t===null?r=e.nextNode():r=e.nextNode()&&e.nextNode(),{prevNode:t,node:r}}checkIframeFilter(e,t,r,i){let n=!1,a=!1;return i.forEach((s,l)=>{s.val===r&&(n=l,a=s.handled)}),this.compareNodeIframe(e,t,r)?(n===!1&&!a?i.push({val:r,handled:!0}):n!==!1&&!a&&(i[n].handled=!0),!0):(n===!1&&i.push({val:r,handled:!1}),!1)}handleOpenIframes(e,t,r,i){e.forEach(n=>{n.handled||this.getIframeContents(n.val,a=>{this.createInstanceOnIframe(a).forEachNode(t,r,i)})})}iterateThroughNodes(e,t,r,i,n){const a=this.createIterator(t,e,i);let s=[],l=[],u,c,h=()=>({prevNode:c,node:u}=this.getIteratorNode(a),u);for(;h();)this.iframes&&this.forEachIframe(t,f=>this.checkIframeFilter(u,c,f,s),f=>{this.createInstanceOnIframe(f).forEachNode(e,v=>l.push(v),i)}),l.push(u);l.forEach(f=>{r(f)}),this.iframes&&this.handleOpenIframes(s,e,r,i),n()}forEachNode(e,t,r,i=()=>{}){const n=this.getContexts();let a=n.length;a||i(),n.forEach(s=>{const l=()=>{this.iterateThroughNodes(e,s,t,r,()=>{--a<=0&&i()})};this.iframes?this.waitForIframes(s,l):l()})}}let bt=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new Y(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const r=this.opt.log;this.opt.debug&&typeof r=="object"&&typeof r[t]=="function"&&r[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,r=this.opt.caseSensitive?"":"i",i=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let n in t)if(t.hasOwnProperty(n)){const a=t[n],s=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(n):this.escapeStr(n),l=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(a):this.escapeStr(a);s!==""&&l!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(s)}|${this.escapeStr(l)})`,`gm${r}`),i+`(${this.processSynomyms(s)}|${this.processSynomyms(l)})`+i))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,r,i)=>{let n=i.charAt(r+1);return/[(|)\\]/.test(n)||n===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const r=this.opt.ignorePunctuation;return Array.isArray(r)&&r.length&&t.push(this.escapeStr(r.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",r=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let i=[];return e.split("").forEach(n=>{r.every(a=>{if(a.indexOf(n)!==-1){if(i.indexOf(a)>-1)return!1;e=e.replace(new RegExp(`[${a}]`,`gm${t}`),`[${a}]`),i.push(a)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let r=this.opt.accuracy,i=typeof r=="string"?r:r.value,n=typeof r=="string"?[]:r.limiters,a="";switch(n.forEach(s=>{a+=`|${this.escapeStr(s)}`}),i){case"partially":default:return`()(${e})`;case"complementary":return a="\\s"+(a||this.escapeStr(t)),`()([^${a}]*${e}[^${a}]*)`;case"exactly":return`(^|\\s${a})(${e})(?=$|\\s${a})`}}getSeparatedKeywords(e){let t=[];return e.forEach(r=>{this.opt.separateWordSearch?r.split(" ").forEach(i=>{i.trim()&&t.indexOf(i)===-1&&t.push(i)}):r.trim()&&t.indexOf(r)===-1&&t.push(r)}),{keywords:t.sort((r,i)=>i.length-r.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let r=0;return e.sort((i,n)=>i.start-n.start).forEach(i=>{let{start:n,end:a,valid:s}=this.callNoMatchOnInvalidRanges(i,r);s&&(i.start=n,i.length=a-n,t.push(i),r=a)}),t}callNoMatchOnInvalidRanges(e,t){let r,i,n=!1;return e&&typeof e.start<"u"?(r=parseInt(e.start,10),i=r+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&i-t>0&&i-r>0?n=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:r,end:i,valid:n}}checkWhitespaceRanges(e,t,r){let i,n=!0,a=r.length,s=t-a,l=parseInt(e.start,10)-s;return l=l>a?a:l,i=l+parseInt(e.length,10),i>a&&(i=a,this.log(`End range automatically set to the max value of ${a}`)),l<0||i-l<0||l>a||i>a?(n=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):r.substring(l,i).replace(/\s+/g,"")===""&&(n=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:l,end:i,valid:n}}getTextNodes(e){let t="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,i=>{r.push({start:t.length,end:(t+=i.textContent).length,node:i})},i=>this.matchesExclude(i.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:r})})}matchesExclude(e){return Y.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,r){const i=this.opt.element?this.opt.element:"mark",n=e.splitText(t),a=n.splitText(r-t);let s=document.createElement(i);return s.setAttribute("data-markjs","true"),this.opt.className&&s.setAttribute("class",this.opt.className),s.textContent=n.textContent,n.parentNode.replaceChild(s,n),a}wrapRangeInMappedTextNode(e,t,r,i,n){e.nodes.every((a,s)=>{const l=e.nodes[s+1];if(typeof l>"u"||l.start>t){if(!i(a.node))return!1;const u=t-a.start,c=(r>a.end?a.end:r)-a.start,h=e.value.substr(0,a.start),f=e.value.substr(c+a.start);if(a.node=this.wrapRangeInTextNode(a.node,u,c),e.value=h+f,e.nodes.forEach((v,p)=>{p>=s&&(e.nodes[p].start>0&&p!==s&&(e.nodes[p].start-=c),e.nodes[p].end-=c)}),r-=c,n(a.node.previousSibling,a.start),r>a.end)t=a.end;else return!1}return!0})}wrapMatches(e,t,r,i,n){const a=t===0?0:t+1;this.getTextNodes(s=>{s.nodes.forEach(l=>{l=l.node;let u;for(;(u=e.exec(l.textContent))!==null&&u[a]!=="";){if(!r(u[a],l))continue;let c=u.index;if(a!==0)for(let h=1;h{let l;for(;(l=e.exec(s.value))!==null&&l[a]!=="";){let u=l.index;if(a!==0)for(let h=1;hr(l[a],h),(h,f)=>{e.lastIndex=f,i(h)})}n()})}wrapRangeFromIndex(e,t,r,i){this.getTextNodes(n=>{const a=n.value.length;e.forEach((s,l)=>{let{start:u,end:c,valid:h}=this.checkWhitespaceRanges(s,a,n.value);h&&this.wrapRangeInMappedTextNode(n,u,c,f=>t(f,s,n.value.substring(u,c),l),f=>{r(f,s)})}),i()})}unwrapMatches(e){const t=e.parentNode;let r=document.createDocumentFragment();for(;e.firstChild;)r.appendChild(e.removeChild(e.firstChild));t.replaceChild(r,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let r=0,i="wrapMatches";const n=a=>{r++,this.opt.each(a)};this.opt.acrossElements&&(i="wrapMatchesAcrossElements"),this[i](e,this.opt.ignoreGroups,(a,s)=>this.opt.filter(s,a,r),n,()=>{r===0&&this.opt.noMatch(e),this.opt.done(r)})}mark(e,t){this.opt=t;let r=0,i="wrapMatches";const{keywords:n,length:a}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),s=this.opt.caseSensitive?"":"i",l=u=>{let c=new RegExp(this.createRegExp(u),`gm${s}`),h=0;this.log(`Searching with expression "${c}"`),this[i](c,1,(f,v)=>this.opt.filter(v,u,r,h),f=>{h++,r++,this.opt.each(f)},()=>{h===0&&this.opt.noMatch(u),n[a-1]===u?this.opt.done(r):l(n[n.indexOf(u)+1])})};this.opt.acrossElements&&(i="wrapMatchesAcrossElements"),a===0?this.opt.done(r):l(n[0])}markRanges(e,t){this.opt=t;let r=0,i=this.checkRanges(e);i&&i.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(i)),this.wrapRangeFromIndex(i,(n,a,s,l)=>this.opt.filter(n,a,s,l),(n,a)=>{r++,this.opt.each(n,a)},()=>{this.opt.done(r)})):this.opt.done(r)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,r=>{this.unwrapMatches(r)},r=>{const i=Y.matches(r,t),n=this.matchesExclude(r);return!i||n?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function Et(o){const e=new bt(o);return this.mark=(t,r)=>(e.mark(t,r),this),this.markRegExp=(t,r)=>(e.markRegExp(t,r),this),this.markRanges=(t,r)=>(e.markRanges(t,r),this),this.unmark=t=>(e.unmark(t),this),this}var L=function(){return L=Object.assign||function(e){for(var t,r=1,i=arguments.length;r0&&n[n.length-1])&&(u[0]===6||u[0]===2)){t=0;continue}if(u[0]===3&&(!n||u[1]>n[0]&&u[1]=o.length&&(o=void 0),{value:o&&o[r++],done:!o}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function O(o,e){var t=typeof Symbol=="function"&&o[Symbol.iterator];if(!t)return o;var r=t.call(o),i,n=[],a;try{for(;(e===void 0||e-- >0)&&!(i=r.next()).done;)n.push(i.value)}catch(s){a={error:s}}finally{try{i&&!i.done&&(t=r.return)&&t.call(r)}finally{if(a)throw a.error}}return n}var _t="ENTRIES",We="KEYS",Je="VALUES",V="",de=function(){function o(e,t){var r=e._tree,i=Array.from(r.keys());this.set=e,this._type=t,this._path=i.length>0?[{node:r,keys:i}]:[]}return o.prototype.next=function(){var e=this.dive();return this.backtrack(),e},o.prototype.dive=function(){if(this._path.length===0)return{done:!0,value:void 0};var e=q(this._path),t=e.node,r=e.keys;if(q(r)===V)return{done:!1,value:this.result()};var i=t.get(q(r));return this._path.push({node:i,keys:Array.from(i.keys())}),this.dive()},o.prototype.backtrack=function(){if(this._path.length!==0){var e=q(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}},o.prototype.key=function(){return this.set._prefix+this._path.map(function(e){var t=e.keys;return q(t)}).filter(function(e){return e!==V}).join("")},o.prototype.value=function(){return q(this._path).node.get(V)},o.prototype.result=function(){switch(this._type){case Je:return this.value();case We:return this.key();default:return[this.key(),this.value()]}},o.prototype[Symbol.iterator]=function(){return this},o}(),q=function(o){return o[o.length-1]},Ct=function(o,e,t){var r=new Map;if(e===void 0)return r;for(var i=e.length+1,n=i+t,a=new Uint8Array(n*i).fill(t+1),s=0;st)continue e}je(o.get(v),e,t,r,i,g,a,s+v)}}}catch(N){l={error:N}}finally{try{f&&!f.done&&(u=h.return)&&u.call(h)}finally{if(l)throw l.error}}},ve=function(){function o(e,t){e===void 0&&(e=new Map),t===void 0&&(t=""),this._size=void 0,this._tree=e,this._prefix=t}return o.prototype.atPrefix=function(e){var t,r;if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");var i=O(ue(this._tree,e.slice(this._prefix.length)),2),n=i[0],a=i[1];if(n===void 0){var s=O(be(a),2),l=s[0],u=s[1];try{for(var c=C(l.keys()),h=c.next();!h.done;h=c.next()){var f=h.value;if(f!==V&&f.startsWith(u)){var v=new Map;return v.set(f.slice(u.length),l.get(f)),new o(v,e)}}}catch(p){t={error:p}}finally{try{h&&!h.done&&(r=c.return)&&r.call(c)}finally{if(t)throw t.error}}}return new o(n,e)},o.prototype.clear=function(){this._size=void 0,this._tree.clear()},o.prototype.delete=function(e){return this._size=void 0,kt(this._tree,e)},o.prototype.entries=function(){return new de(this,_t)},o.prototype.forEach=function(e){var t,r;try{for(var i=C(this),n=i.next();!n.done;n=i.next()){var a=O(n.value,2),s=a[0],l=a[1];e(s,l,this)}}catch(u){t={error:u}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(t)throw t.error}}},o.prototype.fuzzyGet=function(e,t){return Ct(this._tree,e,t)},o.prototype.get=function(e){var t=xe(this._tree,e);return t!==void 0?t.get(V):void 0},o.prototype.has=function(e){var t=xe(this._tree,e);return t!==void 0&&t.has(V)},o.prototype.keys=function(){return new de(this,We)},o.prototype.set=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=pe(this._tree,e);return r.set(V,t),this},Object.defineProperty(o.prototype,"size",{get:function(){if(this._size)return this._size;this._size=0;for(var e=this.entries();!e.next().done;)this._size+=1;return this._size},enumerable:!1,configurable:!0}),o.prototype.update=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=pe(this._tree,e);return r.set(V,t(r.get(V))),this},o.prototype.fetch=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=pe(this._tree,e),i=r.get(V);return i===void 0&&r.set(V,i=t()),i},o.prototype.values=function(){return new de(this,Je)},o.prototype[Symbol.iterator]=function(){return this.entries()},o.from=function(e){var t,r,i=new o;try{for(var n=C(e),a=n.next();!a.done;a=n.next()){var s=O(a.value,2),l=s[0],u=s[1];i.set(l,u)}}catch(c){t={error:c}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}return i},o.fromObject=function(e){return o.from(Object.entries(e))},o}(),ue=function(o,e,t){var r,i;if(t===void 0&&(t=[]),e.length===0||o==null)return[o,t];try{for(var n=C(o.keys()),a=n.next();!a.done;a=n.next()){var s=a.value;if(s!==V&&e.startsWith(s))return t.push([o,s]),ue(o.get(s),e.slice(s.length),t)}}catch(l){r={error:l}}finally{try{a&&!a.done&&(i=n.return)&&i.call(n)}finally{if(r)throw r.error}}return t.push([o,e]),ue(void 0,"",t)},xe=function(o,e){var t,r;if(e.length===0||o==null)return o;try{for(var i=C(o.keys()),n=i.next();!n.done;n=i.next()){var a=n.value;if(a!==V&&e.startsWith(a))return xe(o.get(a),e.slice(a.length))}}catch(s){t={error:s}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(t)throw t.error}}},pe=function(o,e){var t,r,i=e.length;e:for(var n=0;o&&n0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new ve,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}},o.prototype.discard=function(e){var t=this,r=this._idToShortId.get(e);if(r==null)throw new Error("MiniSearch: cannot discard document with ID ".concat(e,": it is not in the index"));this._idToShortId.delete(e),this._documentIds.delete(r),this._storedFields.delete(r),(this._fieldLength.get(r)||[]).forEach(function(i,n){t.removeFieldLength(r,n,t._documentCount,i)}),this._fieldLength.delete(r),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()},o.prototype.maybeAutoVacuum=function(){if(this._options.autoVacuum!==!1){var e=this._options.autoVacuum,t=e.minDirtFactor,r=e.minDirtCount,i=e.batchSize,n=e.batchWait;this.conditionalVacuum({batchSize:i,batchWait:n},{minDirtCount:r,minDirtFactor:t})}},o.prototype.discardAll=function(e){var t,r,i=this._options.autoVacuum;try{this._options.autoVacuum=!1;try{for(var n=C(e),a=n.next();!a.done;a=n.next()){var s=a.value;this.discard(s)}}catch(l){t={error:l}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}}finally{this._options.autoVacuum=i}this.maybeAutoVacuum()},o.prototype.replace=function(e){var t=this._options,r=t.idField,i=t.extractField,n=i(e,r);this.discard(n),this.add(e)},o.prototype.vacuum=function(e){return e===void 0&&(e={}),this.conditionalVacuum(e)},o.prototype.conditionalVacuum=function(e,t){var r=this;return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(function(){var i=r._enqueuedVacuumConditions;return r._enqueuedVacuumConditions=Fe,r.performVacuuming(e,i)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)},o.prototype.performVacuuming=function(e,t){return St(this,void 0,void 0,function(){var r,i,n,a,s,l,u,c,h,f,v,p,g,y,F,b,w,M,E,T,S,I,z,A,D;return At(this,function(k){switch(k.label){case 0:if(r=this._dirtCount,!this.vacuumConditionsMet(t))return[3,10];i=e.batchSize||we.batchSize,n=e.batchWait||we.batchWait,a=1,k.label=1;case 1:k.trys.push([1,7,8,9]),s=C(this._index),l=s.next(),k.label=2;case 2:if(l.done)return[3,6];u=O(l.value,2),c=u[0],h=u[1];try{for(f=(I=void 0,C(h)),v=f.next();!v.done;v=f.next()){p=O(v.value,2),g=p[0],y=p[1];try{for(F=(A=void 0,C(y)),b=F.next();!b.done;b=F.next())w=O(b.value,1),M=w[0],!this._documentIds.has(M)&&(y.size<=1?h.delete(g):y.delete(M))}catch(N){A={error:N}}finally{try{b&&!b.done&&(D=F.return)&&D.call(F)}finally{if(A)throw A.error}}}}catch(N){I={error:N}}finally{try{v&&!v.done&&(z=f.return)&&z.call(f)}finally{if(I)throw I.error}}return this._index.get(c).size===0&&this._index.delete(c),a%i!==0?[3,4]:[4,new Promise(function(N){return setTimeout(N,n)})];case 3:k.sent(),k.label=4;case 4:a+=1,k.label=5;case 5:return l=s.next(),[3,2];case 6:return[3,9];case 7:return E=k.sent(),T={error:E},[3,9];case 8:try{l&&!l.done&&(S=s.return)&&S.call(s)}finally{if(T)throw T.error}return[7];case 9:this._dirtCount-=r,k.label=10;case 10:return[4,null];case 11:return k.sent(),this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null,[2]}})})},o.prototype.vacuumConditionsMet=function(e){if(e==null)return!0;var t=e.minDirtCount,r=e.minDirtFactor;return t=t||ge.minDirtCount,r=r||ge.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=r},Object.defineProperty(o.prototype,"isVacuuming",{get:function(){return this._currentVacuum!=null},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtCount",{get:function(){return this._dirtCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtFactor",{get:function(){return this._dirtCount/(1+this._documentCount+this._dirtCount)},enumerable:!1,configurable:!0}),o.prototype.has=function(e){return this._idToShortId.has(e)},o.prototype.search=function(e,t){var r,i;t===void 0&&(t={});var n=this.executeQuery(e,t),a=[];try{for(var s=C(n),l=s.next();!l.done;l=s.next()){var u=O(l.value,2),c=u[0],h=u[1],f=h.score,v=h.terms,p=h.match,g=v.length,y={id:this._documentIds.get(c),score:f*g,terms:Object.keys(p),match:p};Object.assign(y,this._storedFields.get(c)),(t.filter==null||t.filter(y))&&a.push(y)}}catch(F){r={error:F}}finally{try{l&&!l.done&&(i=s.return)&&i.call(s)}finally{if(r)throw r.error}}return a.sort(Be),a},o.prototype.autoSuggest=function(e,t){var r,i,n,a;t===void 0&&(t={}),t=L(L({},this._options.autoSuggestOptions),t);var s=new Map;try{for(var l=C(this.search(e,t)),u=l.next();!u.done;u=l.next()){var c=u.value,h=c.score,f=c.terms,v=f.join(" "),p=s.get(v);p!=null?(p.score+=h,p.count+=1):s.set(v,{score:h,terms:f,count:1})}}catch(E){r={error:E}}finally{try{u&&!u.done&&(i=l.return)&&i.call(l)}finally{if(r)throw r.error}}var g=[];try{for(var y=C(s),F=y.next();!F.done;F=y.next()){var b=O(F.value,2),p=b[0],w=b[1],h=w.score,f=w.terms,M=w.count;g.push({suggestion:p,terms:f,score:h/M})}}catch(E){n={error:E}}finally{try{F&&!F.done&&(a=y.return)&&a.call(y)}finally{if(n)throw n.error}}return g.sort(Be),g},Object.defineProperty(o.prototype,"documentCount",{get:function(){return this._documentCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"termCount",{get:function(){return this._index.size},enumerable:!1,configurable:!0}),o.loadJSON=function(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)},o.getDefault=function(e){if(me.hasOwnProperty(e))return ye(me,e);throw new Error('MiniSearch: unknown option "'.concat(e,'"'))},o.loadJS=function(e,t){var r,i,n,a,s,l,u=e.index,c=e.documentCount,h=e.nextId,f=e.documentIds,v=e.fieldIds,p=e.fieldLength,g=e.averageFieldLength,y=e.storedFields,F=e.dirtCount,b=e.serializationVersion;if(b!==1&&b!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");var w=new o(t);w._documentCount=c,w._nextId=h,w._documentIds=le(f),w._idToShortId=new Map,w._fieldIds=v,w._fieldLength=le(p),w._avgFieldLength=g,w._storedFields=le(y),w._dirtCount=F||0,w._index=new ve;try{for(var M=C(w._documentIds),E=M.next();!E.done;E=M.next()){var T=O(E.value,2),S=T[0],I=T[1];w._idToShortId.set(I,S)}}catch(B){r={error:B}}finally{try{E&&!E.done&&(i=M.return)&&i.call(M)}finally{if(r)throw r.error}}try{for(var z=C(u),A=z.next();!A.done;A=z.next()){var D=O(A.value,2),k=D[0],N=D[1],d=new Map;try{for(var x=(s=void 0,C(Object.keys(N))),_=x.next();!_.done;_=x.next()){var P=_.value,$=N[P];b===1&&($=$.ds),d.set(parseInt(P,10),le($))}}catch(B){s={error:B}}finally{try{_&&!_.done&&(l=x.return)&&l.call(x)}finally{if(s)throw s.error}}w._index.set(k,d)}}catch(B){n={error:B}}finally{try{A&&!A.done&&(a=z.return)&&a.call(z)}finally{if(n)throw n.error}}return w},o.prototype.executeQuery=function(e,t){var r=this;if(t===void 0&&(t={}),typeof e!="string"){var i=L(L(L({},t),e),{queries:void 0}),n=e.queries.map(function(y){return r.executeQuery(y,i)});return this.combineResults(n,i.combineWith)}var a=this._options,s=a.tokenize,l=a.processTerm,u=a.searchOptions,c=L(L({tokenize:s,processTerm:l},u),t),h=c.tokenize,f=c.processTerm,v=h(e).flatMap(function(y){return f(y)}).filter(function(y){return!!y}),p=v.map(Nt(c)),g=p.map(function(y){return r.executeQuerySpec(y,c)});return this.combineResults(g,c.combineWith)},o.prototype.executeQuerySpec=function(e,t){var r,i,n,a,s=L(L({},this._options.searchOptions),t),l=(s.fields||this._options.fields).reduce(function(P,$){var B;return L(L({},P),(B={},B[$]=ye(s.boost,$)||1,B))},{}),u=s.boostDocument,c=s.weights,h=s.maxFuzzy,f=s.bm25,v=L(L({},Re.weights),c),p=v.fuzzy,g=v.prefix,y=this._index.get(e.term),F=this.termResults(e.term,e.term,1,y,l,u,f),b,w;if(e.prefix&&(b=this._index.atPrefix(e.term)),e.fuzzy){var M=e.fuzzy===!0?.2:e.fuzzy,E=M<1?Math.min(h,Math.round(e.term.length*M)):M;E&&(w=this._index.fuzzyGet(e.term,E))}if(b)try{for(var T=C(b),S=T.next();!S.done;S=T.next()){var I=O(S.value,2),z=I[0],A=I[1],D=z.length-e.term.length;if(D){w==null||w.delete(z);var k=g*z.length/(z.length+.3*D);this.termResults(e.term,z,k,A,l,u,f,F)}}}catch(P){r={error:P}}finally{try{S&&!S.done&&(i=T.return)&&i.call(T)}finally{if(r)throw r.error}}if(w)try{for(var N=C(w.keys()),d=N.next();!d.done;d=N.next()){var z=d.value,x=O(w.get(z),2),_=x[0],D=x[1];if(D){var k=p*z.length/(z.length+D);this.termResults(e.term,z,k,_,l,u,f,F)}}}catch(P){n={error:P}}finally{try{d&&!d.done&&(a=N.return)&&a.call(N)}finally{if(n)throw n.error}}return F},o.prototype.combineResults=function(e,t){if(t===void 0&&(t=Ee),e.length===0)return new Map;var r=t.toLowerCase();return e.reduce(zt[r])||new Map},o.prototype.toJSON=function(){var e,t,r,i,n=[];try{for(var a=C(this._index),s=a.next();!s.done;s=a.next()){var l=O(s.value,2),u=l[0],c=l[1],h={};try{for(var f=(r=void 0,C(c)),v=f.next();!v.done;v=f.next()){var p=O(v.value,2),g=p[0],y=p[1];h[g]=Object.fromEntries(y)}}catch(F){r={error:F}}finally{try{v&&!v.done&&(i=f.return)&&i.call(f)}finally{if(r)throw r.error}}n.push([u,h])}}catch(F){e={error:F}}finally{try{s&&!s.done&&(t=a.return)&&t.call(a)}finally{if(e)throw e.error}}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:n,serializationVersion:2}},o.prototype.termResults=function(e,t,r,i,n,a,s,l){var u,c,h,f,v;if(l===void 0&&(l=new Map),i==null)return l;try{for(var p=C(Object.keys(n)),g=p.next();!g.done;g=p.next()){var y=g.value,F=n[y],b=this._fieldIds[y],w=i.get(b);if(w!=null){var M=w.size,E=this._avgFieldLength[b];try{for(var T=(h=void 0,C(w.keys())),S=T.next();!S.done;S=T.next()){var I=S.value;if(!this._documentIds.has(I)){this.removeTerm(b,I,t),M-=1;continue}var z=a?a(this._documentIds.get(I),t):1;if(z){var A=w.get(I),D=this._fieldLength.get(I)[b],k=Tt(A,M,this._documentCount,D,E,s),N=r*F*z*k,d=l.get(I);if(d){d.score+=N,Ot(d.terms,e);var x=ye(d.match,t);x?x.push(y):d.match[t]=[y]}else l.set(I,{score:N,terms:[e],match:(v={},v[t]=[y],v)})}}}catch(_){h={error:_}}finally{try{S&&!S.done&&(f=T.return)&&f.call(T)}finally{if(h)throw h.error}}}}}catch(_){u={error:_}}finally{try{g&&!g.done&&(c=p.return)&&c.call(p)}finally{if(u)throw u.error}}return l},o.prototype.addTerm=function(e,t,r){var i=this._index.fetch(r,Pe),n=i.get(e);if(n==null)n=new Map,n.set(t,1),i.set(e,n);else{var a=n.get(t);n.set(t,(a||0)+1)}},o.prototype.removeTerm=function(e,t,r){if(!this._index.has(r)){this.warnDocumentChanged(t,e,r);return}var i=this._index.fetch(r,Pe),n=i.get(e);n==null||n.get(t)==null?this.warnDocumentChanged(t,e,r):n.get(t)<=1?n.size<=1?i.delete(e):n.delete(t):n.set(t,n.get(t)-1),this._index.get(r).size===0&&this._index.delete(r)},o.prototype.warnDocumentChanged=function(e,t,r){var i,n;try{for(var a=C(Object.keys(this._fieldIds)),s=a.next();!s.done;s=a.next()){var l=s.value;if(this._fieldIds[l]===t){this._options.logger("warn","MiniSearch: document with ID ".concat(this._documentIds.get(e),' has changed before removal: term "').concat(r,'" was not present in field "').concat(l,'". Removing a document after it has changed can corrupt the index!'),"version_conflict");return}}}catch(u){i={error:u}}finally{try{s&&!s.done&&(n=a.return)&&n.call(a)}finally{if(i)throw i.error}}},o.prototype.addDocumentId=function(e){var t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t},o.prototype.addFields=function(e){for(var t=0;t(st("data-v-264b389a"),o=o(),lt(),o),Vt={class:"shell"},Bt=J(()=>m("svg",{class:"search-icon",width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[m("g",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[m("circle",{cx:"11",cy:"11",r:"8"}),m("path",{d:"m21 21l-4.35-4.35"})])],-1)),Pt={class:"search-actions before"},$t=["title"],Wt=J(()=>m("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[m("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 12H5m7 7l-7-7l7-7"})],-1)),Jt=[Wt],jt=["placeholder"],Ut={class:"search-actions"},Ht=["title"],Kt=J(()=>m("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[m("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 14h7v7H3zM3 3h7v7H3zm11 1h7m-7 5h7m-7 6h7m-7 5h7"})],-1)),Qt=[Kt],Gt=["title"],qt=J(()=>m("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[m("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20 5H9l-7 7l7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2Zm-2 4l-6 6m0-6l6 6"})],-1)),Yt=[qt],Zt=["href","aria-label","onMouseenter"],Xt={class:"titles"},er=J(()=>m("span",{class:"title-icon"},"#",-1)),tr=["innerHTML"],rr=J(()=>m("svg",{width:"18",height:"18",viewBox:"0 0 24 24"},[m("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"m9 18l6-6l-6-6"})],-1)),nr={class:"title main"},ir=["innerHTML"],ar={key:0,class:"excerpt-wrapper"},or={key:0,class:"excerpt"},sr=["innerHTML"],lr=J(()=>m("div",{class:"excerpt-gradient-bottom"},null,-1)),ur=J(()=>m("div",{class:"excerpt-gradient-top"},null,-1)),cr={key:0,class:"no-results"},hr={class:"search-keyboard-shortcuts"},fr=["aria-label"],dr=J(()=>m("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[m("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 19V5m-7 7l7-7l7 7"})],-1)),vr=[dr],pr=["aria-label"],yr=J(()=>m("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[m("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 5v14m7-7l-7 7l-7-7"})],-1)),mr=[yr],gr=["aria-label"],xr=J(()=>m("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[m("g",{fill:"none",stroke:"currentcolor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[m("path",{d:"m9 10l-5 5l5 5"}),m("path",{d:"M20 4v7a4 4 0 0 1-4 4H4"})])],-1)),wr=[xr],Fr=["aria-label"],br=/.*?.*?<\/a><\/h\1>/gi,Er=Ze({__name:"VPLocalSearchBox",props:{placeholder:{}},emits:["close"],setup(o,{emit:e}){var N;const t=Z(),r=Z(),i=Z(),n=Z(Ft),a=vt(),{localeIndex:s,theme:l}=a,u=Oe(async()=>{var d,x,_;return Le(Mt.loadJSON((_=await((x=(d=n.value)[s.value])==null?void 0:x.call(d)))==null?void 0:_.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1}}}))}),h=Me(()=>{var d,x;return((d=l.value.search)==null?void 0:d.provider)==="local"&&((x=l.value.search.options)==null?void 0:x.disableQueryPersistence)===!0}).value?X(""):pt("vitepress:local-search-filter",""),f=yt("vitepress:local-search-detailed-list",!1),v=Me(()=>{var d,x;return((d=l.value.search)==null?void 0:d.provider)==="local"&&((x=l.value.search.options)==null?void 0:x.disableDetailedView)===!0});Xe(()=>{v.value&&(f.value=!1)});const p=Z([]),g=X(!1);ze(h,()=>{g.value=!1});const y=Oe(async()=>{if(r.value)return Le(new Et(r.value))},null);mt(()=>[u.value,h.value,f.value],async([d,x,_],P,$)=>{var Ae,_e,Ce,ke;let B=!1;if($(()=>{B=!0}),!d)return;p.value=d.search(x).slice(0,16),g.value=!0;const Qe=_?await Promise.all(p.value.map(W=>F(W.id))):[];if(B)return;const ce=new Map;for(const{id:W,mod:Q}of Qe){const j=Q.default??Q;if(j!=null&&j.render){const H=ut(j);H.config.warnHandler=()=>{},H.provide(ct,a);const ne=document.createElement("div");H.mount(ne);const G=ne.innerHTML.split(br);H.unmount(),G.shift();const Ie=W.slice(0,W.indexOf("#"));let ie=ce.get(Ie);ie||(ie=new Map,ce.set(Ie,ie));for(let ae=0;ae{const[Q,j]=W.id.split("#"),H=ce.get(Q),ne=(H==null?void 0:H.get(j))??"";for(const G in W.match)Se.add(G);return{...W,text:ne}}),await fe(),B)return;await new Promise(W=>{var Q;(Q=y.value)==null||Q.unmark({done:()=>{var j;(j=y.value)==null||j.markRegExp(k(Se),{done:W})}})});const Ge=((Ae=t.value)==null?void 0:Ae.querySelectorAll(".result .excerpt"))??[];for(const W of Ge)(_e=W.querySelector('mark[data-markjs="true"]'))==null||_e.scrollIntoView({block:"center"});(ke=(Ce=r.value)==null?void 0:Ce.firstElementChild)==null||ke.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function F(d){const x=ht(ft(d.slice(0,d.indexOf("#"))));try{return{id:d,mod:await $e(()=>import(x),[])}}catch(_){return console.error(_),{id:d,mod:{}}}}const b=X();function w(){var d,x;(d=b.value)==null||d.focus(),(x=b.value)==null||x.select()}he(()=>{w()});function M(d){d.pointerType==="mouse"&&w()}const E=X(0),T=X(!1);ze(p,()=>{E.value=0,S()});function S(){fe(()=>{const d=document.querySelector(".result.selected");d&&d.scrollIntoView({block:"nearest"})})}se("ArrowUp",d=>{d.preventDefault(),E.value--,E.value<0&&(E.value=p.value.length-1),T.value=!0,S()}),se("ArrowDown",d=>{d.preventDefault(),E.value++,E.value>=p.value.length&&(E.value=0),T.value=!0,S()});const I=et();se("Enter",()=>{const d=p.value[E.value];d&&(I.go(d.id),e("close"))}),se("Escape",()=>{e("close")});const z={modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}},A=gt((N=l.value.search)==null?void 0:N.options,z);he(()=>{window.history.pushState(null,"",null)}),xt("popstate",d=>{d.preventDefault(),e("close")});const D=wt(i);he(()=>{i.value=document.body,fe(()=>{D.value=!0})}),tt(()=>{D.value=!1});function k(d){return new RegExp([...d].sort((x,_)=>_.length-x.length).map(x=>`(${x.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")})`).join("|"),"gi")}return(d,x)=>(U(),rt(ot,{to:"body"},[m("div",{ref_key:"el",ref:t,class:"VPLocalSearchBox","aria-modal":"true"},[m("div",{class:"backdrop",onClick:x[0]||(x[0]=_=>d.$emit("close"))}),m("div",Vt,[m("div",{class:"search-bar",onPointerup:x[5]||(x[5]=_=>M(_))},[Bt,m("div",Pt,[m("button",{class:"back-button",title:R(A)("modal.backButtonTitle"),onClick:x[1]||(x[1]=_=>d.$emit("close"))},Jt,8,$t)]),nt(m("input",{ref_key:"searchInput",ref:b,"onUpdate:modelValue":x[2]||(x[2]=_=>at(h)?h.value=_:null),placeholder:d.placeholder,class:"search-input"},null,8,jt),[[it,R(h)]]),m("div",Ut,[v.value?oe("",!0):(U(),K("button",{key:0,class:De(["toggle-layout-button",{"detailed-list":R(f)}]),title:R(A)("modal.displayDetails"),onClick:x[3]||(x[3]=_=>f.value=!R(f))},Qt,10,Ht)),m("button",{class:"clear-button",title:R(A)("modal.resetButtonTitle"),onClick:x[4]||(x[4]=_=>h.value="")},Yt,8,Gt)])],32),m("div",{ref_key:"resultsEl",ref:r,class:"results",onMousemove:x[7]||(x[7]=_=>T.value=!1)},[(U(!0),K(Ne,null,Te(p.value,(_,P)=>(U(),K("a",{key:_.id,href:_.id,class:De(["result",{selected:E.value===P}]),"aria-label":[..._.titles,_.title].join(" > "),onMouseenter:$=>!T.value&&(E.value=P),onClick:x[6]||(x[6]=$=>d.$emit("close"))},[m("div",null,[m("div",Xt,[er,(U(!0),K(Ne,null,Te(_.titles,($,B)=>(U(),K("span",{key:B,class:"title"},[m("span",{class:"text",innerHTML:$},null,8,tr),rr]))),128)),m("span",nr,[m("span",{class:"text",innerHTML:_.title},null,8,ir)])]),R(f)?(U(),K("div",ar,[_.text?(U(),K("div",or,[m("div",{class:"vp-doc",innerHTML:_.text},null,8,sr)])):oe("",!0),lr,ur])):oe("",!0)])],42,Zt))),128)),R(h)&&!p.value.length&&g.value?(U(),K("div",cr,[ee(te(R(A)("modal.noResultsText"))+' "',1),m("strong",null,te(R(h)),1),ee('" ')])):oe("",!0)],544),m("div",hr,[m("span",null,[m("kbd",{"aria-label":R(A)("modal.footer.navigateUpKeyAriaLabel")},vr,8,fr),m("kbd",{"aria-label":R(A)("modal.footer.navigateDownKeyAriaLabel")},mr,8,pr),ee(" "+te(R(A)("modal.footer.navigateText")),1)]),m("span",null,[m("kbd",{"aria-label":R(A)("modal.footer.selectKeyAriaLabel")},wr,8,gr),ee(" "+te(R(A)("modal.footer.selectText")),1)]),m("span",null,[m("kbd",{"aria-label":R(A)("modal.footer.closeKeyAriaLabel")},"esc",8,Fr),ee(" "+te(R(A)("modal.footer.closeText")),1)])])])],512)]))}});const Cr=dt(Er,[["__scopeId","data-v-264b389a"]]);export{Cr as default}; diff --git a/assets/chunks/framework.ed90c782.js b/assets/chunks/framework.ed90c782.js new file mode 100644 index 00000000..8e061b05 --- /dev/null +++ b/assets/chunks/framework.ed90c782.js @@ -0,0 +1,2 @@ +function ur(e,t){const n=Object.create(null),r=e.split(",");for(let s=0;s!!n[s.toLowerCase()]:s=>!!n[s]}const te={},pt=[],Pe=()=>{},ii=()=>!1,li=/^on[^a-z]/,Vt=e=>li.test(e),fr=e=>e.startsWith("onUpdate:"),ie=Object.assign,dr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},ci=Object.prototype.hasOwnProperty,Y=(e,t)=>ci.call(e,t),k=Array.isArray,gt=e=>Cn(e)==="[object Map]",Bs=e=>Cn(e)==="[object Set]",K=e=>typeof e=="function",re=e=>typeof e=="string",hr=e=>typeof e=="symbol",ee=e=>e!==null&&typeof e=="object",ks=e=>ee(e)&&K(e.then)&&K(e.catch),Us=Object.prototype.toString,Cn=e=>Us.call(e),ai=e=>Cn(e).slice(8,-1),Ks=e=>Cn(e)==="[object Object]",pr=e=>re(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Mt=ur(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),En=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},ui=/-(\w)/g,Ne=En(e=>e.replace(ui,(t,n)=>n?n.toUpperCase():"")),fi=/\B([A-Z])/g,at=En(e=>e.replace(fi,"-$1").toLowerCase()),xn=En(e=>e.charAt(0).toUpperCase()+e.slice(1)),an=En(e=>e?`on${xn(e)}`:""),Dt=(e,t)=>!Object.is(e,t),un=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Jn=e=>{const t=parseFloat(e);return isNaN(t)?e:t},di=e=>{const t=re(e)?Number(e):NaN;return isNaN(t)?e:t};let Kr;const Xn=()=>Kr||(Kr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function gr(e){if(k(e)){const t={};for(let n=0;n{if(n){const r=n.split(pi);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function mr(e){let t="";if(re(e))t=e;else if(k(e))for(let n=0;nre(e)?e:e==null?"":k(e)||ee(e)&&(e.toString===Us||!K(e.toString))?JSON.stringify(e,Vs,2):String(e),Vs=(e,t)=>t&&t.__v_isRef?Vs(e,t.value):gt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s])=>(n[`${r} =>`]=s,n),{})}:Bs(t)?{[`Set(${t.size})`]:[...t.values()]}:ee(t)&&!k(t)&&!Ks(t)?String(t):t;let be;class bi{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=be,!t&&be&&(this.index=(be.scopes||(be.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=be;try{return be=this,t()}finally{be=n}}}on(){be=this}off(){be=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},zs=e=>(e.w&Je)>0,Ys=e=>(e.n&Je)>0,Ci=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r{(f==="length"||f>=c)&&l.push(a)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":k(e)?pr(n)&&l.push(i.get("length")):(l.push(i.get(lt)),gt(e)&&l.push(i.get(Zn)));break;case"delete":k(e)||(l.push(i.get(lt)),gt(e)&&l.push(i.get(Zn)));break;case"set":gt(e)&&l.push(i.get(lt));break}if(l.length===1)l[0]&&Gn(l[0]);else{const c=[];for(const a of l)a&&c.push(...a);Gn(_r(c))}}function Gn(e,t){const n=k(e)?e:[...e];for(const r of n)r.computed&&Vr(r);for(const r of n)r.computed||Vr(r)}function Vr(e,t){(e!==Se||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function xi(e,t){var n;return(n=pn.get(e))==null?void 0:n.get(t)}const Ti=ur("__proto__,__v_isRef,__isVue"),Qs=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(hr)),Ai=br(),Si=br(!1,!0),Oi=br(!0),qr=Pi();function Pi(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=J(this);for(let o=0,i=this.length;o{e[t]=function(...n){xt();const r=J(this)[t].apply(this,n);return Tt(),r}}),e}function Ri(e){const t=J(this);return me(t,"has",e),t.hasOwnProperty(e)}function br(e=!1,t=!1){return function(r,s,o){if(s==="__v_isReactive")return!e;if(s==="__v_isReadonly")return e;if(s==="__v_isShallow")return t;if(s==="__v_raw"&&o===(e?t?qi:no:t?to:eo).get(r))return r;const i=k(r);if(!e){if(i&&Y(qr,s))return Reflect.get(qr,s,o);if(s==="hasOwnProperty")return Ri}const l=Reflect.get(r,s,o);return(hr(s)?Qs.has(s):Ti(s))||(e||me(r,"get",s),t)?l:ce(l)?i&&pr(s)?l:l.value:ee(l)?e?Sn(l):An(l):l}}const Mi=Zs(),Fi=Zs(!0);function Zs(e=!1){return function(n,r,s,o){let i=n[r];if(vt(i)&&ce(i)&&!ce(s))return!1;if(!e&&(!gn(s)&&!vt(s)&&(i=J(i),s=J(s)),!k(n)&&ce(i)&&!ce(s)))return i.value=s,!0;const l=k(n)&&pr(r)?Number(r)e,Tn=e=>Reflect.getPrototypeOf(e);function Xt(e,t,n=!1,r=!1){e=e.__v_raw;const s=J(e),o=J(t);n||(t!==o&&me(s,"get",t),me(s,"get",o));const{has:i}=Tn(s),l=r?vr:n?Er:jt;if(i.call(s,t))return l(e.get(t));if(i.call(s,o))return l(e.get(o));e!==s&&e.get(t)}function Qt(e,t=!1){const n=this.__v_raw,r=J(n),s=J(e);return t||(e!==s&&me(r,"has",e),me(r,"has",s)),e===s?n.has(e):n.has(e)||n.has(s)}function Zt(e,t=!1){return e=e.__v_raw,!t&&me(J(e),"iterate",lt),Reflect.get(e,"size",e)}function zr(e){e=J(e);const t=J(this);return Tn(t).has.call(t,e)||(t.add(e),De(t,"add",e,e)),this}function Yr(e,t){t=J(t);const n=J(this),{has:r,get:s}=Tn(n);let o=r.call(n,e);o||(e=J(e),o=r.call(n,e));const i=s.call(n,e);return n.set(e,t),o?Dt(t,i)&&De(n,"set",e,t):De(n,"add",e,t),this}function Jr(e){const t=J(this),{has:n,get:r}=Tn(t);let s=n.call(t,e);s||(e=J(e),s=n.call(t,e)),r&&r.call(t,e);const o=t.delete(e);return s&&De(t,"delete",e,void 0),o}function Xr(){const e=J(this),t=e.size!==0,n=e.clear();return t&&De(e,"clear",void 0,void 0),n}function Gt(e,t){return function(r,s){const o=this,i=o.__v_raw,l=J(i),c=t?vr:e?Er:jt;return!e&&me(l,"iterate",lt),i.forEach((a,f)=>r.call(s,c(a),c(f),o))}}function en(e,t,n){return function(...r){const s=this.__v_raw,o=J(s),i=gt(o),l=e==="entries"||e===Symbol.iterator&&i,c=e==="keys"&&i,a=s[e](...r),f=n?vr:t?Er:jt;return!t&&me(o,"iterate",c?Zn:lt),{next(){const{value:h,done:g}=a.next();return g?{value:h,done:g}:{value:l?[f(h[0]),f(h[1])]:f(h),done:g}},[Symbol.iterator](){return this}}}}function ke(e){return function(...t){return e==="delete"?!1:this}}function Di(){const e={get(o){return Xt(this,o)},get size(){return Zt(this)},has:Qt,add:zr,set:Yr,delete:Jr,clear:Xr,forEach:Gt(!1,!1)},t={get(o){return Xt(this,o,!1,!0)},get size(){return Zt(this)},has:Qt,add:zr,set:Yr,delete:Jr,clear:Xr,forEach:Gt(!1,!0)},n={get(o){return Xt(this,o,!0)},get size(){return Zt(this,!0)},has(o){return Qt.call(this,o,!0)},add:ke("add"),set:ke("set"),delete:ke("delete"),clear:ke("clear"),forEach:Gt(!0,!1)},r={get(o){return Xt(this,o,!0,!0)},get size(){return Zt(this,!0)},has(o){return Qt.call(this,o,!0)},add:ke("add"),set:ke("set"),delete:ke("delete"),clear:ke("clear"),forEach:Gt(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(o=>{e[o]=en(o,!1,!1),n[o]=en(o,!0,!1),t[o]=en(o,!1,!0),r[o]=en(o,!0,!0)}),[e,n,t,r]}const[ji,Bi,ki,Ui]=Di();function wr(e,t){const n=t?e?Ui:ki:e?Bi:ji;return(r,s,o)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(Y(n,s)&&s in r?n:r,s,o)}const Ki={get:wr(!1,!1)},Wi={get:wr(!1,!0)},Vi={get:wr(!0,!1)},eo=new WeakMap,to=new WeakMap,no=new WeakMap,qi=new WeakMap;function zi(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Yi(e){return e.__v_skip||!Object.isExtensible(e)?0:zi(ai(e))}function An(e){return vt(e)?e:Cr(e,!1,Gs,Ki,eo)}function Ji(e){return Cr(e,!1,$i,Wi,to)}function Sn(e){return Cr(e,!0,Hi,Vi,no)}function Cr(e,t,n,r,s){if(!ee(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=s.get(e);if(o)return o;const i=Yi(e);if(i===0)return e;const l=new Proxy(e,i===2?r:n);return s.set(e,l),l}function mt(e){return vt(e)?mt(e.__v_raw):!!(e&&e.__v_isReactive)}function vt(e){return!!(e&&e.__v_isReadonly)}function gn(e){return!!(e&&e.__v_isShallow)}function ro(e){return mt(e)||vt(e)}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function Ft(e){return hn(e,"__v_skip",!0),e}const jt=e=>ee(e)?An(e):e,Er=e=>ee(e)?Sn(e):e;function xr(e){qe&&Se&&(e=J(e),Xs(e.dep||(e.dep=_r())))}function Tr(e,t){e=J(e);const n=e.dep;n&&Gn(n)}function ce(e){return!!(e&&e.__v_isRef===!0)}function ae(e){return so(e,!1)}function Ar(e){return so(e,!0)}function so(e,t){return ce(e)?e:new Xi(e,t)}class Xi{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:J(t),this._value=n?t:jt(t)}get value(){return xr(this),this._value}set value(t){const n=this.__v_isShallow||gn(t)||vt(t);t=n?t:J(t),Dt(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:jt(t),Tr(this))}}function oo(e){return ce(e)?e.value:e}const Qi={get:(e,t,n)=>oo(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return ce(s)&&!ce(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function io(e){return mt(e)?e:new Proxy(e,Qi)}class Zi{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>xr(this),()=>Tr(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function Gi(e){return new Zi(e)}class el{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return xi(J(this._object),this._key)}}class tl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function nl(e,t,n){return ce(e)?e:K(e)?new tl(e):ee(e)&&arguments.length>1?rl(e,t,n):ae(e)}function rl(e,t,n){const r=e[t];return ce(r)?r:new el(e,t,n)}class sl{constructor(t,n,r,s){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new yr(t,()=>{this._dirty||(this._dirty=!0,Tr(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!s,this.__v_isReadonly=r}get value(){const t=J(this);return xr(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function ol(e,t,n=!1){let r,s;const o=K(e);return o?(r=e,s=Pe):(r=e.get,s=e.set),new sl(r,s,o||!s,n)}function ze(e,t,n,r){let s;try{s=r?e(...r):e()}catch(o){qt(o,t,n)}return s}function xe(e,t,n,r){if(K(e)){const o=ze(e,t,n,r);return o&&ks(o)&&o.catch(i=>{qt(i,t,n)}),o}const s=[];for(let o=0;o>>1;kt(de[r])Ie&&de.splice(t,1)}function al(e){k(e)?_t.push(...e):(!$e||!$e.includes(e,e.allowRecurse?nt+1:nt))&&_t.push(e),co()}function Qr(e,t=Bt?Ie+1:0){for(;tkt(n)-kt(r)),nt=0;nt<$e.length;nt++)$e[nt]();$e=null,nt=0}}const kt=e=>e.id==null?1/0:e.id,ul=(e,t)=>{const n=kt(e)-kt(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function ao(e){er=!1,Bt=!0,de.sort(ul);const t=Pe;try{for(Ie=0;Iere(w)?w.trim():w)),h&&(s=n.map(Jn))}let l,c=r[l=an(t)]||r[l=an(Ne(t))];!c&&o&&(c=r[l=an(at(t))]),c&&xe(c,e,6,s);const a=r[l+"Once"];if(a){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,xe(a,e,6,s)}}function uo(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const o=e.emits;let i={},l=!1;if(!K(e)){const c=a=>{const f=uo(a,t,!0);f&&(l=!0,ie(i,f))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!o&&!l?(ee(e)&&r.set(e,null),null):(k(o)?o.forEach(c=>i[c]=null):ie(i,o),ee(e)&&r.set(e,i),i)}function Rn(e,t){return!e||!Vt(t)?!1:(t=t.slice(2).replace(/Once$/,""),Y(e,t[0].toLowerCase()+t.slice(1))||Y(e,at(t))||Y(e,t))}let fe=null,Mn=null;function _n(e){const t=fe;return fe=e,Mn=e&&e.type.__scopeId||null,t}function La(e){Mn=e}function Na(){Mn=null}function dl(e,t=fe,n){if(!t||e._n)return e;const r=(...s)=>{r._d&&us(-1);const o=_n(t);let i;try{i=e(...s)}finally{_n(o),r._d&&us(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function Bn(e){const{type:t,vnode:n,proxy:r,withProxy:s,props:o,propsOptions:[i],slots:l,attrs:c,emit:a,render:f,renderCache:h,data:g,setupState:w,ctx:E,inheritAttrs:S}=e;let H,m;const y=_n(e);try{if(n.shapeFlag&4){const A=s||r;H=Ae(f.call(A,A,h,o,w,g,E)),m=c}else{const A=t;H=Ae(A.length>1?A(o,{attrs:c,slots:l,emit:a}):A(o,null)),m=t.props?c:hl(c)}}catch(A){Ht.length=0,qt(A,e,1),H=se(ve)}let N=H;if(m&&S!==!1){const A=Object.keys(m),{shapeFlag:B}=N;A.length&&B&7&&(i&&A.some(fr)&&(m=pl(m,i)),N=Xe(N,m))}return n.dirs&&(N=Xe(N),N.dirs=N.dirs?N.dirs.concat(n.dirs):n.dirs),n.transition&&(N.transition=n.transition),H=N,_n(y),H}const hl=e=>{let t;for(const n in e)(n==="class"||n==="style"||Vt(n))&&((t||(t={}))[n]=e[n]);return t},pl=(e,t)=>{const n={};for(const r in e)(!fr(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function gl(e,t,n){const{props:r,children:s,component:o}=e,{props:i,children:l,patchFlag:c}=t,a=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?Zr(r,i,a):!!i;if(c&8){const f=t.dynamicProps;for(let h=0;he.__isSuspense;function fo(e,t){t&&t.pendingBranch?k(e)?t.effects.push(...e):t.effects.push(e):al(e)}function Or(e,t){return Fn(e,null,t)}function Ha(e,t){return Fn(e,null,{flush:"post"})}const tn={};function Ye(e,t,n){return Fn(e,t,n)}function Fn(e,t,{immediate:n,deep:r,flush:s,onTrack:o,onTrigger:i}=te){var l;const c=qs()===((l=le)==null?void 0:l.scope)?le:null;let a,f=!1,h=!1;if(ce(e)?(a=()=>e.value,f=gn(e)):mt(e)?(a=()=>e,r=!0):k(e)?(h=!0,f=e.some(A=>mt(A)||gn(A)),a=()=>e.map(A=>{if(ce(A))return A.value;if(mt(A))return ot(A);if(K(A))return ze(A,c,2)})):K(e)?t?a=()=>ze(e,c,2):a=()=>{if(!(c&&c.isUnmounted))return g&&g(),xe(e,c,3,[w])}:a=Pe,t&&r){const A=a;a=()=>ot(A())}let g,w=A=>{g=y.onStop=()=>{ze(A,c,4)}},E;if(Et)if(w=Pe,t?n&&xe(t,c,3,[a(),h?[]:void 0,w]):a(),s==="sync"){const A=hc();E=A.__watcherHandles||(A.__watcherHandles=[])}else return Pe;let S=h?new Array(e.length).fill(tn):tn;const H=()=>{if(y.active)if(t){const A=y.run();(r||f||(h?A.some((B,W)=>Dt(B,S[W])):Dt(A,S)))&&(g&&g(),xe(t,c,3,[A,S===tn?void 0:h&&S[0]===tn?[]:S,w]),S=A)}else y.run()};H.allowRecurse=!!t;let m;s==="sync"?m=H:s==="post"?m=()=>pe(H,c&&c.suspense):(H.pre=!0,c&&(H.id=c.uid),m=()=>Pn(H));const y=new yr(a,m);t?n?H():S=y.run():s==="post"?pe(y.run.bind(y),c&&c.suspense):y.run();const N=()=>{y.stop(),c&&c.scope&&dr(c.scope.effects,y)};return E&&E.push(N),N}function yl(e,t,n){const r=this.proxy,s=re(e)?e.includes(".")?ho(r,e):()=>r[e]:e.bind(r,r);let o;K(t)?o=t:(o=t.handler,n=t);const i=le;Ct(this);const l=Fn(s,o.bind(r),n);return i?Ct(i):ct(),l}function ho(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;s{ot(n,t)});else if(Ks(e))for(const n in e)ot(e[n],t);return e}function $a(e,t){const n=fe;if(n===null)return e;const r=$n(n)||n.proxy,s=e.dirs||(e.dirs=[]);for(let o=0;o{e.isMounted=!0}),yo(()=>{e.isUnmounting=!0}),e}const we=[Function,Array],po={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:we,onEnter:we,onAfterEnter:we,onEnterCancelled:we,onBeforeLeave:we,onLeave:we,onAfterLeave:we,onLeaveCancelled:we,onBeforeAppear:we,onAppear:we,onAfterAppear:we,onAppearCancelled:we},vl={name:"BaseTransition",props:po,setup(e,{slots:t}){const n=Hn(),r=bl();let s;return()=>{const o=t.default&&mo(t.default(),!0);if(!o||!o.length)return;let i=o[0];if(o.length>1){for(const S of o)if(S.type!==ve){i=S;break}}const l=J(e),{mode:c}=l;if(r.isLeaving)return kn(i);const a=Gr(i);if(!a)return kn(i);const f=tr(a,l,r,n);nr(a,f);const h=n.subTree,g=h&&Gr(h);let w=!1;const{getTransitionKey:E}=a.type;if(E){const S=E();s===void 0?s=S:S!==s&&(s=S,w=!0)}if(g&&g.type!==ve&&(!rt(a,g)||w)){const S=tr(g,l,r,n);if(nr(g,S),c==="out-in")return r.isLeaving=!0,S.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&n.update()},kn(i);c==="in-out"&&a.type!==ve&&(S.delayLeave=(H,m,y)=>{const N=go(r,g);N[String(g.key)]=g,H._leaveCb=()=>{m(),H._leaveCb=void 0,delete f.delayedLeave},f.delayedLeave=y})}return i}}},wl=vl;function go(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function tr(e,t,n,r){const{appear:s,mode:o,persisted:i=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:a,onEnterCancelled:f,onBeforeLeave:h,onLeave:g,onAfterLeave:w,onLeaveCancelled:E,onBeforeAppear:S,onAppear:H,onAfterAppear:m,onAppearCancelled:y}=t,N=String(e.key),A=go(n,e),B=(_,R)=>{_&&xe(_,r,9,R)},W=(_,R)=>{const I=R[1];B(_,R),k(_)?_.every(V=>V.length<=1)&&I():_.length<=1&&I()},j={mode:o,persisted:i,beforeEnter(_){let R=l;if(!n.isMounted)if(s)R=S||l;else return;_._leaveCb&&_._leaveCb(!0);const I=A[N];I&&rt(e,I)&&I.el._leaveCb&&I.el._leaveCb(),B(R,[_])},enter(_){let R=c,I=a,V=f;if(!n.isMounted)if(s)R=H||c,I=m||a,V=y||f;else return;let M=!1;const q=_._enterCb=L=>{M||(M=!0,L?B(V,[_]):B(I,[_]),j.delayedLeave&&j.delayedLeave(),_._enterCb=void 0)};R?W(R,[_,q]):q()},leave(_,R){const I=String(e.key);if(_._enterCb&&_._enterCb(!0),n.isUnmounting)return R();B(h,[_]);let V=!1;const M=_._leaveCb=q=>{V||(V=!0,R(),q?B(E,[_]):B(w,[_]),_._leaveCb=void 0,A[I]===e&&delete A[I])};A[I]=e,g?W(g,[_,M]):M()},clone(_){return tr(_,t,n,r)}};return j}function kn(e){if(zt(e))return e=Xe(e),e.children=null,e}function Gr(e){return zt(e)?e.children?e.children[0]:void 0:e}function nr(e,t){e.shapeFlag&6&&e.component?nr(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 mo(e,t=!1,n){let r=[],s=0;for(let o=0;o1)for(let o=0;oie({name:e.name},t,{setup:e}))():e}const yt=e=>!!e.type.__asyncLoader;function Da(e){K(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:s=200,timeout:o,suspensible:i=!0,onError:l}=e;let c=null,a,f=0;const h=()=>(f++,c=null,g()),g=()=>{let w;return c||(w=c=t().catch(E=>{if(E=E instanceof Error?E:new Error(String(E)),l)return new Promise((S,H)=>{l(E,()=>S(h()),()=>H(E),f+1)});throw E}).then(E=>w!==c&&c?c:(E&&(E.__esModule||E[Symbol.toStringTag]==="Module")&&(E=E.default),a=E,E)))};return Pr({name:"AsyncComponentWrapper",__asyncLoader:g,get __asyncResolved(){return a},setup(){const w=le;if(a)return()=>Un(a,w);const E=y=>{c=null,qt(y,w,13,!r)};if(i&&w.suspense||Et)return g().then(y=>()=>Un(y,w)).catch(y=>(E(y),()=>r?se(r,{error:y}):null));const S=ae(!1),H=ae(),m=ae(!!s);return s&&setTimeout(()=>{m.value=!1},s),o!=null&&setTimeout(()=>{if(!S.value&&!H.value){const y=new Error(`Async component timed out after ${o}ms.`);E(y),H.value=y}},o),g().then(()=>{S.value=!0,w.parent&&zt(w.parent.vnode)&&Pn(w.parent.update)}).catch(y=>{E(y),H.value=y}),()=>{if(S.value&&a)return Un(a,w);if(H.value&&r)return se(r,{error:H.value});if(n&&!m.value)return se(n)}}})}function Un(e,t){const{ref:n,props:r,children:s,ce:o}=t.vnode,i=se(e,r,s);return i.ref=n,i.ce=o,delete t.vnode.ce,i}const zt=e=>e.type.__isKeepAlive;function Cl(e,t){_o(e,"a",t)}function El(e,t){_o(e,"da",t)}function _o(e,t,n=le){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(In(t,r,n),n){let s=n.parent;for(;s&&s.parent;)zt(s.parent.vnode)&&xl(r,t,n,s),s=s.parent}}function xl(e,t,n,r){const s=In(t,e,r,!0);Ln(()=>{dr(r[t],s)},n)}function In(e,t,n=le,r=!1){if(n){const s=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;xt(),Ct(n);const l=xe(t,n,e,i);return ct(),Tt(),l});return r?s.unshift(o):s.push(o),o}}const Be=e=>(t,n=le)=>(!Et||e==="sp")&&In(e,(...r)=>t(...r),n),Tl=Be("bm"),At=Be("m"),Al=Be("bu"),Sl=Be("u"),yo=Be("bum"),Ln=Be("um"),Ol=Be("sp"),Pl=Be("rtg"),Rl=Be("rtc");function Ml(e,t=le){In("ec",e,t)}const Rr="components";function ja(e,t){return vo(Rr,e,!0,t)||e}const bo=Symbol.for("v-ndc");function Ba(e){return re(e)?vo(Rr,e,!1)||e:e||bo}function vo(e,t,n=!0,r=!1){const s=fe||le;if(s){const o=s.type;if(e===Rr){const l=uc(o,!1);if(l&&(l===t||l===Ne(t)||l===xn(Ne(t))))return o}const i=es(s[e]||o[e],t)||es(s.appContext[e],t);return!i&&r?o:i}}function es(e,t){return e&&(e[t]||e[Ne(t)]||e[xn(Ne(t))])}function ka(e,t,n,r){let s;const o=n&&n[r];if(k(e)||re(e)){s=new Array(e.length);for(let i=0,l=e.length;it(i,l,void 0,o&&o[l]));else{const i=Object.keys(e);s=new Array(i.length);for(let l=0,c=i.length;lwn(t)?!(t.type===ve||t.type===ge&&!wo(t.children)):!0)?e:null}function Ka(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:an(r)]=e[r];return n}const rr=e=>e?$o(e)?$n(e)||e.proxy:rr(e.parent):null,It=ie(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=>rr(e.parent),$root:e=>rr(e.root),$emit:e=>e.emit,$options:e=>Mr(e),$forceUpdate:e=>e.f||(e.f=()=>Pn(e.update)),$nextTick:e=>e.n||(e.n=On.bind(e.proxy)),$watch:e=>yl.bind(e)}),Kn=(e,t)=>e!==te&&!e.__isScriptSetup&&Y(e,t),Fl={get({_:e},t){const{ctx:n,setupState:r,data:s,props:o,accessCache:i,type:l,appContext:c}=e;let a;if(t[0]!=="$"){const w=i[t];if(w!==void 0)switch(w){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return o[t]}else{if(Kn(r,t))return i[t]=1,r[t];if(s!==te&&Y(s,t))return i[t]=2,s[t];if((a=e.propsOptions[0])&&Y(a,t))return i[t]=3,o[t];if(n!==te&&Y(n,t))return i[t]=4,n[t];sr&&(i[t]=0)}}const f=It[t];let h,g;if(f)return t==="$attrs"&&me(e,"get",t),f(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==te&&Y(n,t))return i[t]=4,n[t];if(g=c.config.globalProperties,Y(g,t))return g[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:o}=e;return Kn(s,t)?(s[t]=n,!0):r!==te&&Y(r,t)?(r[t]=n,!0):Y(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:o}},i){let l;return!!n[i]||e!==te&&Y(e,i)||Kn(t,i)||(l=o[0])&&Y(l,i)||Y(r,i)||Y(It,i)||Y(s.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Y(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Wa(){return Il().slots}function Il(){const e=Hn();return e.setupContext||(e.setupContext=jo(e))}function ts(e){return k(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let sr=!0;function Ll(e){const t=Mr(e),n=e.proxy,r=e.ctx;sr=!1,t.beforeCreate&&ns(t.beforeCreate,e,"bc");const{data:s,computed:o,methods:i,watch:l,provide:c,inject:a,created:f,beforeMount:h,mounted:g,beforeUpdate:w,updated:E,activated:S,deactivated:H,beforeDestroy:m,beforeUnmount:y,destroyed:N,unmounted:A,render:B,renderTracked:W,renderTriggered:j,errorCaptured:_,serverPrefetch:R,expose:I,inheritAttrs:V,components:M,directives:q,filters:L}=t;if(a&&Nl(a,r,null),i)for(const ne in i){const Z=i[ne];K(Z)&&(r[ne]=Z.bind(n))}if(s){const ne=s.call(n,n);ee(ne)&&(e.data=An(ne))}if(sr=!0,o)for(const ne in o){const Z=o[ne],Qe=K(Z)?Z.bind(n,n):K(Z.get)?Z.get.bind(n,n):Pe,Yt=!K(Z)&&K(Z.set)?Z.set.bind(n):Pe,Ze=ue({get:Qe,set:Yt});Object.defineProperty(r,ne,{enumerable:!0,configurable:!0,get:()=>Ze.value,set:Re=>Ze.value=Re})}if(l)for(const ne in l)Co(l[ne],r,n,ne);if(c){const ne=K(c)?c.call(n):c;Reflect.ownKeys(ne).forEach(Z=>{kl(Z,ne[Z])})}f&&ns(f,e,"c");function X(ne,Z){k(Z)?Z.forEach(Qe=>ne(Qe.bind(n))):Z&&ne(Z.bind(n))}if(X(Tl,h),X(At,g),X(Al,w),X(Sl,E),X(Cl,S),X(El,H),X(Ml,_),X(Rl,W),X(Pl,j),X(yo,y),X(Ln,A),X(Ol,R),k(I))if(I.length){const ne=e.exposed||(e.exposed={});I.forEach(Z=>{Object.defineProperty(ne,Z,{get:()=>n[Z],set:Qe=>n[Z]=Qe})})}else e.exposed||(e.exposed={});B&&e.render===Pe&&(e.render=B),V!=null&&(e.inheritAttrs=V),M&&(e.components=M),q&&(e.directives=q)}function Nl(e,t,n=Pe){k(e)&&(e=or(e));for(const r in e){const s=e[r];let o;ee(s)?"default"in s?o=bt(s.from||r,s.default,!0):o=bt(s.from||r):o=bt(s),ce(o)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>o.value,set:i=>o.value=i}):t[r]=o}}function ns(e,t,n){xe(k(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Co(e,t,n,r){const s=r.includes(".")?ho(n,r):()=>n[r];if(re(e)){const o=t[e];K(o)&&Ye(s,o)}else if(K(e))Ye(s,e.bind(n));else if(ee(e))if(k(e))e.forEach(o=>Co(o,t,n,r));else{const o=K(e.handler)?e.handler.bind(n):t[e.handler];K(o)&&Ye(s,o,e)}}function Mr(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,l=o.get(t);let c;return l?c=l:!s.length&&!n&&!r?c=t:(c={},s.length&&s.forEach(a=>yn(c,a,i,!0)),yn(c,t,i)),ee(t)&&o.set(t,c),c}function yn(e,t,n,r=!1){const{mixins:s,extends:o}=t;o&&yn(e,o,n,!0),s&&s.forEach(i=>yn(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const l=Hl[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const Hl={data:rs,props:ss,emits:ss,methods:Rt,computed:Rt,beforeCreate:he,created:he,beforeMount:he,mounted:he,beforeUpdate:he,updated:he,beforeDestroy:he,beforeUnmount:he,destroyed:he,unmounted:he,activated:he,deactivated:he,errorCaptured:he,serverPrefetch:he,components:Rt,directives:Rt,watch:Dl,provide:rs,inject:$l};function rs(e,t){return t?e?function(){return ie(K(e)?e.call(this,this):e,K(t)?t.call(this,this):t)}:t:e}function $l(e,t){return Rt(or(e),or(t))}function or(e){if(k(e)){const t={};for(let n=0;n1)return n&&K(t)?t.call(r&&r.proxy):t}}function Ul(e,t,n,r=!1){const s={},o={};hn(o,Nn,1),e.propsDefaults=Object.create(null),xo(e,t,s,o);for(const i in e.propsOptions[0])i in s||(s[i]=void 0);n?e.props=r?s:Ji(s):e.type.props?e.props=s:e.props=o,e.attrs=o}function Kl(e,t,n,r){const{props:s,attrs:o,vnode:{patchFlag:i}}=e,l=J(s),[c]=e.propsOptions;let a=!1;if((r||i>0)&&!(i&16)){if(i&8){const f=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[g,w]=To(h,t,!0);ie(i,g),w&&l.push(...w)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!o&&!c)return ee(e)&&r.set(e,pt),pt;if(k(o))for(let f=0;f-1,w[1]=S<0||E-1||Y(w,"default"))&&l.push(h)}}}const a=[i,l];return ee(e)&&r.set(e,a),a}function os(e){return e[0]!=="$"}function is(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function ls(e,t){return is(e)===is(t)}function cs(e,t){return k(t)?t.findIndex(n=>ls(n,e)):K(t)&&ls(t,e)?0:-1}const Ao=e=>e[0]==="_"||e==="$stable",Fr=e=>k(e)?e.map(Ae):[Ae(e)],Wl=(e,t,n)=>{if(t._n)return t;const r=dl((...s)=>Fr(t(...s)),n);return r._c=!1,r},So=(e,t,n)=>{const r=e._ctx;for(const s in e){if(Ao(s))continue;const o=e[s];if(K(o))t[s]=Wl(s,o,r);else if(o!=null){const i=Fr(o);t[s]=()=>i}}},Oo=(e,t)=>{const n=Fr(t);e.slots.default=()=>n},Vl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=J(t),hn(t,"_",n)):So(t,e.slots={})}else e.slots={},t&&Oo(e,t);hn(e.slots,Nn,1)},ql=(e,t,n)=>{const{vnode:r,slots:s}=e;let o=!0,i=te;if(r.shapeFlag&32){const l=t._;l?n&&l===1?o=!1:(ie(s,t),!n&&l===1&&delete s._):(o=!t.$stable,So(t,s)),i=t}else t&&(Oo(e,t),i={default:1});if(o)for(const l in s)!Ao(l)&&!(l in i)&&delete s[l]};function vn(e,t,n,r,s=!1){if(k(e)){e.forEach((g,w)=>vn(g,t&&(k(t)?t[w]:t),n,r,s));return}if(yt(r)&&!s)return;const o=r.shapeFlag&4?$n(r.component)||r.component.proxy:r.el,i=s?null:o,{i:l,r:c}=e,a=t&&t.r,f=l.refs===te?l.refs={}:l.refs,h=l.setupState;if(a!=null&&a!==c&&(re(a)?(f[a]=null,Y(h,a)&&(h[a]=null)):ce(a)&&(a.value=null)),K(c))ze(c,l,12,[i,f]);else{const g=re(c),w=ce(c);if(g||w){const E=()=>{if(e.f){const S=g?Y(h,c)?h[c]:f[c]:c.value;s?k(S)&&dr(S,o):k(S)?S.includes(o)||S.push(o):g?(f[c]=[o],Y(h,c)&&(h[c]=f[c])):(c.value=[o],e.k&&(f[e.k]=c.value))}else g?(f[c]=i,Y(h,c)&&(h[c]=i)):w&&(c.value=i,e.k&&(f[e.k]=i))};i?(E.id=-1,pe(E,n)):E()}}}let Ue=!1;const nn=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",rn=e=>e.nodeType===8;function zl(e){const{mt:t,p:n,o:{patchProp:r,createText:s,nextSibling:o,parentNode:i,remove:l,insert:c,createComment:a}}=e,f=(m,y)=>{if(!y.hasChildNodes()){n(null,m,y),mn(),y._vnode=m;return}Ue=!1,h(y.firstChild,m,null,null,null),mn(),y._vnode=m,Ue&&console.error("Hydration completed but contains mismatches.")},h=(m,y,N,A,B,W=!1)=>{const j=rn(m)&&m.data==="[",_=()=>S(m,y,N,A,B,j),{type:R,ref:I,shapeFlag:V,patchFlag:M}=y;let q=m.nodeType;y.el=m,M===-2&&(W=!1,y.dynamicChildren=null);let L=null;switch(R){case wt:q!==3?y.children===""?(c(y.el=s(""),i(m),m),L=m):L=_():(m.data!==y.children&&(Ue=!0,m.data=y.children),L=o(m));break;case ve:q!==8||j?L=_():L=o(m);break;case Nt:if(j&&(m=o(m),q=m.nodeType),q===1||q===3){L=m;const _e=!y.children.length;for(let X=0;X{W=W||!!y.dynamicChildren;const{type:j,props:_,patchFlag:R,shapeFlag:I,dirs:V}=y,M=j==="input"&&V||j==="option";if(M||R!==-1){if(V&&Fe(y,null,N,"created"),_)if(M||!W||R&48)for(const L in _)(M&&L.endsWith("value")||Vt(L)&&!Mt(L))&&r(m,L,null,_[L],!1,void 0,N);else _.onClick&&r(m,"onClick",null,_.onClick,!1,void 0,N);let q;if((q=_&&_.onVnodeBeforeMount)&&Ce(q,N,y),V&&Fe(y,null,N,"beforeMount"),((q=_&&_.onVnodeMounted)||V)&&fo(()=>{q&&Ce(q,N,y),V&&Fe(y,null,N,"mounted")},A),I&16&&!(_&&(_.innerHTML||_.textContent))){let L=w(m.firstChild,y,m,N,A,B,W);for(;L;){Ue=!0;const _e=L;L=L.nextSibling,l(_e)}}else I&8&&m.textContent!==y.children&&(Ue=!0,m.textContent=y.children)}return m.nextSibling},w=(m,y,N,A,B,W,j)=>{j=j||!!y.dynamicChildren;const _=y.children,R=_.length;for(let I=0;I{const{slotScopeIds:j}=y;j&&(B=B?B.concat(j):j);const _=i(m),R=w(o(m),y,_,N,A,B,W);return R&&rn(R)&&R.data==="]"?o(y.anchor=R):(Ue=!0,c(y.anchor=a("]"),_,R),R)},S=(m,y,N,A,B,W)=>{if(Ue=!0,y.el=null,W){const R=H(m);for(;;){const I=o(m);if(I&&I!==R)l(I);else break}}const j=o(m),_=i(m);return l(m),n(null,y,_,j,N,A,nn(_),B),j},H=m=>{let y=0;for(;m;)if(m=o(m),m&&rn(m)&&(m.data==="["&&y++,m.data==="]")){if(y===0)return o(m);y--}return m};return[f,h]}const pe=fo;function Yl(e){return Po(e)}function Jl(e){return Po(e,zl)}function Po(e,t){const n=Xn();n.__VUE__=!0;const{insert:r,remove:s,patchProp:o,createElement:i,createText:l,createComment:c,setText:a,setElementText:f,parentNode:h,nextSibling:g,setScopeId:w=Pe,insertStaticContent:E}=e,S=(u,d,p,v=null,b=null,T=null,P=!1,x=null,O=!!d.dynamicChildren)=>{if(u===d)return;u&&!rt(u,d)&&(v=Jt(u),Re(u,b,T,!0),u=null),d.patchFlag===-2&&(O=!1,d.dynamicChildren=null);const{type:C,ref:$,shapeFlag:F}=d;switch(C){case wt:H(u,d,p,v);break;case ve:m(u,d,p,v);break;case Nt:u==null&&y(d,p,v,P);break;case ge:M(u,d,p,v,b,T,P,x,O);break;default:F&1?B(u,d,p,v,b,T,P,x,O):F&6?q(u,d,p,v,b,T,P,x,O):(F&64||F&128)&&C.process(u,d,p,v,b,T,P,x,O,ut)}$!=null&&b&&vn($,u&&u.ref,T,d||u,!d)},H=(u,d,p,v)=>{if(u==null)r(d.el=l(d.children),p,v);else{const b=d.el=u.el;d.children!==u.children&&a(b,d.children)}},m=(u,d,p,v)=>{u==null?r(d.el=c(d.children||""),p,v):d.el=u.el},y=(u,d,p,v)=>{[u.el,u.anchor]=E(u.children,d,p,v,u.el,u.anchor)},N=({el:u,anchor:d},p,v)=>{let b;for(;u&&u!==d;)b=g(u),r(u,p,v),u=b;r(d,p,v)},A=({el:u,anchor:d})=>{let p;for(;u&&u!==d;)p=g(u),s(u),u=p;s(d)},B=(u,d,p,v,b,T,P,x,O)=>{P=P||d.type==="svg",u==null?W(d,p,v,b,T,P,x,O):R(u,d,b,T,P,x,O)},W=(u,d,p,v,b,T,P,x)=>{let O,C;const{type:$,props:F,shapeFlag:D,transition:U,dirs:z}=u;if(O=u.el=i(u.type,T,F&&F.is,F),D&8?f(O,u.children):D&16&&_(u.children,O,null,v,b,T&&$!=="foreignObject",P,x),z&&Fe(u,null,v,"created"),j(O,u,u.scopeId,P,v),F){for(const Q in F)Q!=="value"&&!Mt(Q)&&o(O,Q,null,F[Q],T,u.children,v,b,He);"value"in F&&o(O,"value",null,F.value),(C=F.onVnodeBeforeMount)&&Ce(C,v,u)}z&&Fe(u,null,v,"beforeMount");const G=(!b||b&&!b.pendingBranch)&&U&&!U.persisted;G&&U.beforeEnter(O),r(O,d,p),((C=F&&F.onVnodeMounted)||G||z)&&pe(()=>{C&&Ce(C,v,u),G&&U.enter(O),z&&Fe(u,null,v,"mounted")},b)},j=(u,d,p,v,b)=>{if(p&&w(u,p),v)for(let T=0;T{for(let C=O;C{const x=d.el=u.el;let{patchFlag:O,dynamicChildren:C,dirs:$}=d;O|=u.patchFlag&16;const F=u.props||te,D=d.props||te;let U;p&&Ge(p,!1),(U=D.onVnodeBeforeUpdate)&&Ce(U,p,d,u),$&&Fe(d,u,p,"beforeUpdate"),p&&Ge(p,!0);const z=b&&d.type!=="foreignObject";if(C?I(u.dynamicChildren,C,x,p,v,z,T):P||Z(u,d,x,null,p,v,z,T,!1),O>0){if(O&16)V(x,d,F,D,p,v,b);else if(O&2&&F.class!==D.class&&o(x,"class",null,D.class,b),O&4&&o(x,"style",F.style,D.style,b),O&8){const G=d.dynamicProps;for(let Q=0;Q{U&&Ce(U,p,d,u),$&&Fe(d,u,p,"updated")},v)},I=(u,d,p,v,b,T,P)=>{for(let x=0;x{if(p!==v){if(p!==te)for(const x in p)!Mt(x)&&!(x in v)&&o(u,x,p[x],null,P,d.children,b,T,He);for(const x in v){if(Mt(x))continue;const O=v[x],C=p[x];O!==C&&x!=="value"&&o(u,x,C,O,P,d.children,b,T,He)}"value"in v&&o(u,"value",p.value,v.value)}},M=(u,d,p,v,b,T,P,x,O)=>{const C=d.el=u?u.el:l(""),$=d.anchor=u?u.anchor:l("");let{patchFlag:F,dynamicChildren:D,slotScopeIds:U}=d;U&&(x=x?x.concat(U):U),u==null?(r(C,p,v),r($,p,v),_(d.children,p,$,b,T,P,x,O)):F>0&&F&64&&D&&u.dynamicChildren?(I(u.dynamicChildren,D,p,b,T,P,x),(d.key!=null||b&&d===b.subTree)&&Ir(u,d,!0)):Z(u,d,p,$,b,T,P,x,O)},q=(u,d,p,v,b,T,P,x,O)=>{d.slotScopeIds=x,u==null?d.shapeFlag&512?b.ctx.activate(d,p,v,P,O):L(d,p,v,b,T,P,O):_e(u,d,O)},L=(u,d,p,v,b,T,P)=>{const x=u.component=ic(u,v,b);if(zt(u)&&(x.ctx.renderer=ut),lc(x),x.asyncDep){if(b&&b.registerDep(x,X),!u.el){const O=x.subTree=se(ve);m(null,O,d,p)}return}X(x,u,d,p,b,T,P)},_e=(u,d,p)=>{const v=d.component=u.component;if(gl(u,d,p))if(v.asyncDep&&!v.asyncResolved){ne(v,d,p);return}else v.next=d,cl(v.update),v.update();else d.el=u.el,v.vnode=d},X=(u,d,p,v,b,T,P)=>{const x=()=>{if(u.isMounted){let{next:$,bu:F,u:D,parent:U,vnode:z}=u,G=$,Q;Ge(u,!1),$?($.el=z.el,ne(u,$,P)):$=z,F&&un(F),(Q=$.props&&$.props.onVnodeBeforeUpdate)&&Ce(Q,U,$,z),Ge(u,!0);const oe=Bn(u),Te=u.subTree;u.subTree=oe,S(Te,oe,h(Te.el),Jt(Te),u,b,T),$.el=oe.el,G===null&&ml(u,oe.el),D&&pe(D,b),(Q=$.props&&$.props.onVnodeUpdated)&&pe(()=>Ce(Q,U,$,z),b)}else{let $;const{el:F,props:D}=d,{bm:U,m:z,parent:G}=u,Q=yt(d);if(Ge(u,!1),U&&un(U),!Q&&($=D&&D.onVnodeBeforeMount)&&Ce($,G,d),Ge(u,!0),F&&jn){const oe=()=>{u.subTree=Bn(u),jn(F,u.subTree,u,b,null)};Q?d.type.__asyncLoader().then(()=>!u.isUnmounted&&oe()):oe()}else{const oe=u.subTree=Bn(u);S(null,oe,p,v,u,b,T),d.el=oe.el}if(z&&pe(z,b),!Q&&($=D&&D.onVnodeMounted)){const oe=d;pe(()=>Ce($,G,oe),b)}(d.shapeFlag&256||G&&yt(G.vnode)&&G.vnode.shapeFlag&256)&&u.a&&pe(u.a,b),u.isMounted=!0,d=p=v=null}},O=u.effect=new yr(x,()=>Pn(C),u.scope),C=u.update=()=>O.run();C.id=u.uid,Ge(u,!0),C()},ne=(u,d,p)=>{d.component=u;const v=u.vnode.props;u.vnode=d,u.next=null,Kl(u,d.props,v,p),ql(u,d.children,p),xt(),Qr(),Tt()},Z=(u,d,p,v,b,T,P,x,O=!1)=>{const C=u&&u.children,$=u?u.shapeFlag:0,F=d.children,{patchFlag:D,shapeFlag:U}=d;if(D>0){if(D&128){Yt(C,F,p,v,b,T,P,x,O);return}else if(D&256){Qe(C,F,p,v,b,T,P,x,O);return}}U&8?($&16&&He(C,b,T),F!==C&&f(p,F)):$&16?U&16?Yt(C,F,p,v,b,T,P,x,O):He(C,b,T,!0):($&8&&f(p,""),U&16&&_(F,p,v,b,T,P,x,O))},Qe=(u,d,p,v,b,T,P,x,O)=>{u=u||pt,d=d||pt;const C=u.length,$=d.length,F=Math.min(C,$);let D;for(D=0;D$?He(u,b,T,!0,!1,F):_(d,p,v,b,T,P,x,O,F)},Yt=(u,d,p,v,b,T,P,x,O)=>{let C=0;const $=d.length;let F=u.length-1,D=$-1;for(;C<=F&&C<=D;){const U=u[C],z=d[C]=O?Ve(d[C]):Ae(d[C]);if(rt(U,z))S(U,z,p,null,b,T,P,x,O);else break;C++}for(;C<=F&&C<=D;){const U=u[F],z=d[D]=O?Ve(d[D]):Ae(d[D]);if(rt(U,z))S(U,z,p,null,b,T,P,x,O);else break;F--,D--}if(C>F){if(C<=D){const U=D+1,z=U<$?d[U].el:v;for(;C<=D;)S(null,d[C]=O?Ve(d[C]):Ae(d[C]),p,z,b,T,P,x,O),C++}}else if(C>D)for(;C<=F;)Re(u[C],b,T,!0),C++;else{const U=C,z=C,G=new Map;for(C=z;C<=D;C++){const ye=d[C]=O?Ve(d[C]):Ae(d[C]);ye.key!=null&&G.set(ye.key,C)}let Q,oe=0;const Te=D-z+1;let ft=!1,Br=0;const St=new Array(Te);for(C=0;C=Te){Re(ye,b,T,!0);continue}let Me;if(ye.key!=null)Me=G.get(ye.key);else for(Q=z;Q<=D;Q++)if(St[Q-z]===0&&rt(ye,d[Q])){Me=Q;break}Me===void 0?Re(ye,b,T,!0):(St[Me-z]=C+1,Me>=Br?Br=Me:ft=!0,S(ye,d[Me],p,null,b,T,P,x,O),oe++)}const kr=ft?Xl(St):pt;for(Q=kr.length-1,C=Te-1;C>=0;C--){const ye=z+C,Me=d[ye],Ur=ye+1<$?d[ye+1].el:v;St[C]===0?S(null,Me,p,Ur,b,T,P,x,O):ft&&(Q<0||C!==kr[Q]?Ze(Me,p,Ur,2):Q--)}}},Ze=(u,d,p,v,b=null)=>{const{el:T,type:P,transition:x,children:O,shapeFlag:C}=u;if(C&6){Ze(u.component.subTree,d,p,v);return}if(C&128){u.suspense.move(d,p,v);return}if(C&64){P.move(u,d,p,ut);return}if(P===ge){r(T,d,p);for(let F=0;Fx.enter(T),b);else{const{leave:F,delayLeave:D,afterLeave:U}=x,z=()=>r(T,d,p),G=()=>{F(T,()=>{z(),U&&U()})};D?D(T,z,G):G()}else r(T,d,p)},Re=(u,d,p,v=!1,b=!1)=>{const{type:T,props:P,ref:x,children:O,dynamicChildren:C,shapeFlag:$,patchFlag:F,dirs:D}=u;if(x!=null&&vn(x,null,p,u,!0),$&256){d.ctx.deactivate(u);return}const U=$&1&&D,z=!yt(u);let G;if(z&&(G=P&&P.onVnodeBeforeUnmount)&&Ce(G,d,u),$&6)oi(u.component,p,v);else{if($&128){u.suspense.unmount(p,v);return}U&&Fe(u,null,d,"beforeUnmount"),$&64?u.type.remove(u,d,p,b,ut,v):C&&(T!==ge||F>0&&F&64)?He(C,d,p,!1,!0):(T===ge&&F&384||!b&&$&16)&&He(O,d,p),v&&Dr(u)}(z&&(G=P&&P.onVnodeUnmounted)||U)&&pe(()=>{G&&Ce(G,d,u),U&&Fe(u,null,d,"unmounted")},p)},Dr=u=>{const{type:d,el:p,anchor:v,transition:b}=u;if(d===ge){si(p,v);return}if(d===Nt){A(u);return}const T=()=>{s(p),b&&!b.persisted&&b.afterLeave&&b.afterLeave()};if(u.shapeFlag&1&&b&&!b.persisted){const{leave:P,delayLeave:x}=b,O=()=>P(p,T);x?x(u.el,T,O):O()}else T()},si=(u,d)=>{let p;for(;u!==d;)p=g(u),s(u),u=p;s(d)},oi=(u,d,p)=>{const{bum:v,scope:b,update:T,subTree:P,um:x}=u;v&&un(v),b.stop(),T&&(T.active=!1,Re(P,u,d,p)),x&&pe(x,d),pe(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},He=(u,d,p,v=!1,b=!1,T=0)=>{for(let P=T;Pu.shapeFlag&6?Jt(u.component.subTree):u.shapeFlag&128?u.suspense.next():g(u.anchor||u.el),jr=(u,d,p)=>{u==null?d._vnode&&Re(d._vnode,null,null,!0):S(d._vnode||null,u,d,null,null,null,p),Qr(),mn(),d._vnode=u},ut={p:S,um:Re,m:Ze,r:Dr,mt:L,mc:_,pc:Z,pbc:I,n:Jt,o:e};let Dn,jn;return t&&([Dn,jn]=t(ut)),{render:jr,hydrate:Dn,createApp:Bl(jr,Dn)}}function Ge({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Ir(e,t,n=!1){const r=e.children,s=t.children;if(k(r)&&k(s))for(let o=0;o>1,e[n[l]]0&&(t[r]=n[o-1]),n[o]=r)}}for(o=n.length,i=n[o-1];o-- >0;)n[o]=i,i=t[i];return n}const Ql=e=>e.__isTeleport,Lt=e=>e&&(e.disabled||e.disabled===""),as=e=>typeof SVGElement<"u"&&e instanceof SVGElement,lr=(e,t)=>{const n=e&&e.to;return re(n)?t?t(n):null:n},Zl={__isTeleport:!0,process(e,t,n,r,s,o,i,l,c,a){const{mc:f,pc:h,pbc:g,o:{insert:w,querySelector:E,createText:S,createComment:H}}=a,m=Lt(t.props);let{shapeFlag:y,children:N,dynamicChildren:A}=t;if(e==null){const B=t.el=S(""),W=t.anchor=S("");w(B,n,r),w(W,n,r);const j=t.target=lr(t.props,E),_=t.targetAnchor=S("");j&&(w(_,j),i=i||as(j));const R=(I,V)=>{y&16&&f(N,I,V,s,o,i,l,c)};m?R(n,W):j&&R(j,_)}else{t.el=e.el;const B=t.anchor=e.anchor,W=t.target=e.target,j=t.targetAnchor=e.targetAnchor,_=Lt(e.props),R=_?n:W,I=_?B:j;if(i=i||as(W),A?(g(e.dynamicChildren,A,R,s,o,i,l),Ir(e,t,!0)):c||h(e,t,R,I,s,o,i,l,!1),m)_||sn(t,n,B,a,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const V=t.target=lr(t.props,E);V&&sn(t,V,null,a,0)}else _&&sn(t,W,j,a,1)}Ro(t)},remove(e,t,n,r,{um:s,o:{remove:o}},i){const{shapeFlag:l,children:c,anchor:a,targetAnchor:f,target:h,props:g}=e;if(h&&o(f),(i||!Lt(g))&&(o(a),l&16))for(let w=0;w0?Oe||pt:null,ec(),Ut>0&&Oe&&Oe.push(e),e}function qa(e,t,n,r,s,o){return Fo(No(e,t,n,r,s,o,!0))}function Io(e,t,n,r,s){return Fo(se(e,t,n,r,s,!0))}function wn(e){return e?e.__v_isVNode===!0:!1}function rt(e,t){return e.type===t.type&&e.key===t.key}const Nn="__vInternal",Lo=({key:e})=>e??null,fn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?re(e)||ce(e)||K(e)?{i:fe,r:e,k:t,f:!!n}:e:null);function No(e,t=null,n=null,r=0,s=null,o=e===ge?0:1,i=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Lo(t),ref:t&&fn(t),scopeId:Mn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:fe};return l?(Lr(c,n),o&128&&e.normalize(c)):n&&(c.shapeFlag|=re(n)?8:16),Ut>0&&!i&&Oe&&(c.patchFlag>0||o&6)&&c.patchFlag!==32&&Oe.push(c),c}const se=tc;function tc(e,t=null,n=null,r=0,s=null,o=!1){if((!e||e===bo)&&(e=ve),wn(e)){const l=Xe(e,t,!0);return n&&Lr(l,n),Ut>0&&!o&&Oe&&(l.shapeFlag&6?Oe[Oe.indexOf(e)]=l:Oe.push(l)),l.patchFlag|=-2,l}if(fc(e)&&(e=e.__vccOpts),t){t=nc(t);let{class:l,style:c}=t;l&&!re(l)&&(t.class=mr(l)),ee(c)&&(ro(c)&&!k(c)&&(c=ie({},c)),t.style=gr(c))}const i=re(e)?1:_l(e)?128:Ql(e)?64:ee(e)?4:K(e)?2:0;return No(e,t,n,r,s,i,o,!0)}function nc(e){return e?ro(e)||Nn in e?ie({},e):e:null}function Xe(e,t,n=!1){const{props:r,ref:s,patchFlag:o,children:i}=e,l=t?rc(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Lo(l),ref:t&&t.ref?n&&s?k(s)?s.concat(fn(t)):[s,fn(t)]:fn(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ge?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Xe(e.ssContent),ssFallback:e.ssFallback&&Xe(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Ho(e=" ",t=0){return se(wt,null,e,t)}function za(e,t){const n=se(Nt,null,e);return n.staticCount=t,n}function Ya(e="",t=!1){return t?(Mo(),Io(ve,null,e)):se(ve,null,e)}function Ae(e){return e==null||typeof e=="boolean"?se(ve):k(e)?se(ge,null,e.slice()):typeof e=="object"?Ve(e):se(wt,null,String(e))}function Ve(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Xe(e)}function Lr(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(k(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),Lr(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!(Nn in t)?t._ctx=fe:s===3&&fe&&(fe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else K(t)?(t={default:t,_ctx:fe},n=32):(t=String(t),r&64?(n=16,t=[Ho(t)]):n=8);e.children=t,e.shapeFlag|=n}function rc(...e){const t={};for(let n=0;nle||fe;let Nr,dt,fs="__VUE_INSTANCE_SETTERS__";(dt=Xn()[fs])||(dt=Xn()[fs]=[]),dt.push(e=>le=e),Nr=e=>{dt.length>1?dt.forEach(t=>t(e)):dt[0](e)};const Ct=e=>{Nr(e),e.scope.on()},ct=()=>{le&&le.scope.off(),Nr(null)};function $o(e){return e.vnode.shapeFlag&4}let Et=!1;function lc(e,t=!1){Et=t;const{props:n,children:r}=e.vnode,s=$o(e);Ul(e,n,s,t),Vl(e,r);const o=s?cc(e,t):void 0;return Et=!1,o}function cc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Ft(new Proxy(e.ctx,Fl));const{setup:r}=n;if(r){const s=e.setupContext=r.length>1?jo(e):null;Ct(e),xt();const o=ze(r,e,0,[e.props,s]);if(Tt(),ct(),ks(o)){if(o.then(ct,ct),t)return o.then(i=>{ds(e,i,t)}).catch(i=>{qt(i,e,0)});e.asyncDep=o}else ds(e,o,t)}else Do(e,t)}function ds(e,t,n){K(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ee(t)&&(e.setupState=io(t)),Do(e,n)}let hs;function Do(e,t,n){const r=e.type;if(!e.render){if(!t&&hs&&!r.render){const s=r.template||Mr(e).template;if(s){const{isCustomElement:o,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:c}=r,a=ie(ie({isCustomElement:o,delimiters:l},i),c);r.render=hs(s,a)}}e.render=r.render||Pe}Ct(e),xt(),Ll(e),Tt(),ct()}function ac(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return me(e,"get","$attrs"),t[n]}}))}function jo(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return ac(e)},slots:e.slots,emit:e.emit,expose:t}}function $n(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(io(Ft(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in It)return It[n](e)},has(t,n){return n in t||n in It}}))}function uc(e,t=!0){return K(e)?e.displayName||e.name:e.name||t&&e.__name}function fc(e){return K(e)&&"__vccOpts"in e}const ue=(e,t)=>ol(e,t,Et);function cr(e,t,n){const r=arguments.length;return r===2?ee(t)&&!k(t)?wn(t)?se(e,null,[t]):se(e,t):se(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&wn(n)&&(n=[n]),se(e,t,n))}const dc=Symbol.for("v-scx"),hc=()=>bt(dc),pc="3.3.4",gc="http://www.w3.org/2000/svg",st=typeof document<"u"?document:null,ps=st&&st.createElement("template"),mc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t?st.createElementNS(gc,e):st.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>st.createTextNode(e),createComment:e=>st.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>st.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,o){const i=n?n.previousSibling:t.lastChild;if(s&&(s===o||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===o||!(s=s.nextSibling)););else{ps.innerHTML=r?`${e}`:e;const l=ps.content;if(r){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function _c(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function yc(e,t,n){const r=e.style,s=re(n);if(n&&!s){if(t&&!re(t))for(const o in t)n[o]==null&&ar(r,o,"");for(const o in n)ar(r,o,n[o])}else{const o=r.display;s?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=o)}}const gs=/\s*!important$/;function ar(e,t,n){if(k(n))n.forEach(r=>ar(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=bc(e,t);gs.test(n)?e.setProperty(at(r),n.replace(gs,""),"important"):e[r]=n}}const ms=["Webkit","Moz","ms"],Wn={};function bc(e,t){const n=Wn[t];if(n)return n;let r=Ne(t);if(r!=="filter"&&r in e)return Wn[t]=r;r=xn(r);for(let s=0;sVn||(Tc.then(()=>Vn=0),Vn=Date.now());function Sc(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;xe(Oc(r,n.value),t,5,[r])};return n.value=e,n.attached=Ac(),n}function Oc(e,t){if(k(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const bs=/^on[a-z]/,Pc=(e,t,n,r,s=!1,o,i,l,c)=>{t==="class"?_c(e,r,s):t==="style"?yc(e,n,r):Vt(t)?fr(t)||Ec(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Rc(e,t,r,s))?wc(e,t,r,o,i,l,c):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),vc(e,t,r,s))};function Rc(e,t,n,r){return r?!!(t==="innerHTML"||t==="textContent"||t in e&&bs.test(t)&&K(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||bs.test(t)&&re(n)?!1:t in e}const Ke="transition",Ot="animation",Bo=(e,{slots:t})=>cr(wl,Mc(e),t);Bo.displayName="Transition";const ko={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};Bo.props=ie({},po,ko);const et=(e,t=[])=>{k(e)?e.forEach(n=>n(...t)):e&&e(...t)},vs=e=>e?k(e)?e.some(t=>t.length>1):e.length>1:!1;function Mc(e){const t={};for(const M in e)M in ko||(t[M]=e[M]);if(e.css===!1)return t;const{name:n="v",type:r,duration:s,enterFromClass:o=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=o,appearActiveClass:a=i,appearToClass:f=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:g=`${n}-leave-active`,leaveToClass:w=`${n}-leave-to`}=e,E=Fc(s),S=E&&E[0],H=E&&E[1],{onBeforeEnter:m,onEnter:y,onEnterCancelled:N,onLeave:A,onLeaveCancelled:B,onBeforeAppear:W=m,onAppear:j=y,onAppearCancelled:_=N}=t,R=(M,q,L)=>{tt(M,q?f:l),tt(M,q?a:i),L&&L()},I=(M,q)=>{M._isLeaving=!1,tt(M,h),tt(M,w),tt(M,g),q&&q()},V=M=>(q,L)=>{const _e=M?j:y,X=()=>R(q,M,L);et(_e,[q,X]),ws(()=>{tt(q,M?c:o),We(q,M?f:l),vs(_e)||Cs(q,r,S,X)})};return ie(t,{onBeforeEnter(M){et(m,[M]),We(M,o),We(M,i)},onBeforeAppear(M){et(W,[M]),We(M,c),We(M,a)},onEnter:V(!1),onAppear:V(!0),onLeave(M,q){M._isLeaving=!0;const L=()=>I(M,q);We(M,h),Nc(),We(M,g),ws(()=>{M._isLeaving&&(tt(M,h),We(M,w),vs(A)||Cs(M,r,H,L))}),et(A,[M,L])},onEnterCancelled(M){R(M,!1),et(N,[M])},onAppearCancelled(M){R(M,!0),et(_,[M])},onLeaveCancelled(M){I(M),et(B,[M])}})}function Fc(e){if(e==null)return null;if(ee(e))return[qn(e.enter),qn(e.leave)];{const t=qn(e);return[t,t]}}function qn(e){return di(e)}function We(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function tt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function ws(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Ic=0;function Cs(e,t,n,r){const s=e._endId=++Ic,o=()=>{s===e._endId&&r()};if(n)return setTimeout(o,n);const{type:i,timeout:l,propCount:c}=Lc(e,t);if(!i)return r();const a=i+"end";let f=0;const h=()=>{e.removeEventListener(a,g),o()},g=w=>{w.target===e&&++f>=c&&h()};setTimeout(()=>{f(n[E]||"").split(", "),s=r(`${Ke}Delay`),o=r(`${Ke}Duration`),i=Es(s,o),l=r(`${Ot}Delay`),c=r(`${Ot}Duration`),a=Es(l,c);let f=null,h=0,g=0;t===Ke?i>0&&(f=Ke,h=i,g=o.length):t===Ot?a>0&&(f=Ot,h=a,g=c.length):(h=Math.max(i,a),f=h>0?i>a?Ke:Ot:null,g=f?f===Ke?o.length:c.length:0);const w=f===Ke&&/\b(transform|all)(,|$)/.test(r(`${Ke}Property`).toString());return{type:f,timeout:h,propCount:g,hasTransform:w}}function Es(e,t){for(;e.lengthxs(n)+xs(e[r])))}function xs(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function Nc(){return document.body.offsetHeight}const Ts=e=>{const t=e.props["onUpdate:modelValue"]||!1;return k(t)?n=>un(t,n):t};function Hc(e){e.target.composing=!0}function As(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Ja={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e._assign=Ts(s);const o=r||s.props&&s.props.type==="number";ht(e,t?"change":"input",i=>{if(i.target.composing)return;let l=e.value;n&&(l=l.trim()),o&&(l=Jn(l)),e._assign(l)}),n&&ht(e,"change",()=>{e.value=e.value.trim()}),t||(ht(e,"compositionstart",Hc),ht(e,"compositionend",As),ht(e,"change",As))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:s}},o){if(e._assign=Ts(o),e.composing||document.activeElement===e&&e.type!=="range"&&(n||r&&e.value.trim()===t||(s||e.type==="number")&&Jn(e.value)===t))return;const i=t??"";e.value!==i&&(e.value=i)}},$c=["ctrl","shift","alt","meta"],Dc={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)=>$c.some(n=>e[`${n}Key`]&&!t.includes(n))},Xa=(e,t)=>(n,...r)=>{for(let s=0;sn=>{if(!("key"in n))return;const r=at(n.key);if(t.some(s=>s===r||jc[s]===r))return e(n)},Uo=ie({patchProp:Pc},mc);let $t,Ss=!1;function Bc(){return $t||($t=Yl(Uo))}function kc(){return $t=Ss?$t:Jl(Uo),Ss=!0,$t}const Za=(...e)=>{const t=Bc().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=Ko(r);if(!s)return;const o=t._component;!K(o)&&!o.render&&!o.template&&(o.template=s.innerHTML),s.innerHTML="";const i=n(s,!1,s instanceof SVGElement);return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),i},t},Ga=(...e)=>{const t=kc().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=Ko(r);if(s)return n(s,!0,s instanceof SVGElement)},t};function Ko(e){return re(e)?document.querySelector(e):e}const eu=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},Uc=window.__VP_SITE_DATA__;function Hr(e){return qs()?(wi(e),!0):!1}function Le(e){return typeof e=="function"?e():oo(e)}const Wo=typeof window<"u"&&typeof document<"u",Kc=Object.prototype.toString,Wc=e=>Kc.call(e)==="[object Object]",Kt=()=>{},Os=Vc();function Vc(){var e;return Wo&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent)}function qc(e,t){function n(...r){return new Promise((s,o)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(s).catch(o)})}return n}const Vo=e=>e();function zc(e,t={}){let n,r,s=Kt;const o=l=>{clearTimeout(l),s(),s=Kt};return l=>{const c=Le(e),a=Le(t.maxWait);return n&&o(n),c<=0||a!==void 0&&a<=0?(r&&(o(r),r=null),Promise.resolve(l())):new Promise((f,h)=>{s=t.rejectOnCancel?h:f,a&&!r&&(r=setTimeout(()=>{n&&o(n),r=null,f(l())},a)),n=setTimeout(()=>{r&&o(r),r=null,f(l())},c)})}}function Yc(e=Vo){const t=ae(!0);function n(){t.value=!1}function r(){t.value=!0}const s=(...o)=>{t.value&&e(...o)};return{isActive:Sn(t),pause:n,resume:r,eventFilter:s}}function qo(...e){if(e.length!==1)return nl(...e);const t=e[0];return typeof t=="function"?Sn(Gi(()=>({get:t,set:Kt}))):ae(t)}function zo(e,t,n={}){const{eventFilter:r=Vo,...s}=n;return Ye(e,qc(r,t),s)}function Jc(e,t,n={}){const{eventFilter:r,...s}=n,{eventFilter:o,pause:i,resume:l,isActive:c}=Yc(r);return{stop:zo(e,t,{...s,eventFilter:o}),pause:i,resume:l,isActive:c}}function Xc(e,t=!0){Hn()?At(e):t?e():On(e)}function tu(e,t,n={}){const{debounce:r=0,maxWait:s=void 0,...o}=n;return zo(e,t,{...o,eventFilter:zc(r,{maxWait:s})})}function nu(e,t,n){let r;ce(n)?r={evaluating:n}:r=n||{};const{lazy:s=!1,evaluating:o=void 0,shallow:i=!0,onError:l=Kt}=r,c=ae(!s),a=i?Ar(t):ae(t);let f=0;return Or(async h=>{if(!c.value)return;f++;const g=f;let w=!1;o&&Promise.resolve().then(()=>{o.value=!0});try{const E=await e(S=>{h(()=>{o&&(o.value=!1),w||S()})});g===f&&(a.value=E)}catch(E){l(E)}finally{o&&g===f&&(o.value=!1),w=!0}}),s?ue(()=>(c.value=!0,a.value)):a}function Yo(e){var t;const n=Le(e);return(t=n==null?void 0:n.$el)!=null?t:n}const je=Wo?window:void 0;function Wt(...e){let t,n,r,s;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,s]=e,t=je):[t,n,r,s]=e,!t)return Kt;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const o=[],i=()=>{o.forEach(f=>f()),o.length=0},l=(f,h,g,w)=>(f.addEventListener(h,g,w),()=>f.removeEventListener(h,g,w)),c=Ye(()=>[Yo(t),Le(s)],([f,h])=>{if(i(),!f)return;const g=Wc(h)?{...h}:h;o.push(...n.flatMap(w=>r.map(E=>l(f,w,E,g))))},{immediate:!0,flush:"post"}),a=()=>{c(),i()};return Hr(a),a}function Qc(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function ru(...e){let t,n,r={};e.length===3?(t=e[0],n=e[1],r=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],r=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:s=je,eventName:o="keydown",passive:i=!1,dedupe:l=!1}=r,c=Qc(t);return Wt(s,o,f=>{f.repeat&&Le(l)||c(f)&&n(f)},i)}function Zc(){const e=ae(!1);return Hn()&&At(()=>{e.value=!0}),e}function Gc(e){const t=Zc();return ue(()=>(t.value,!!e()))}function ea(e,t={}){const{window:n=je}=t,r=Gc(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const o=ae(!1),i=a=>{o.value=a.matches},l=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",i):s.removeListener(i))},c=Or(()=>{r.value&&(l(),s=n.matchMedia(Le(e)),"addEventListener"in s?s.addEventListener("change",i):s.addListener(i),o.value=s.matches)});return Hr(()=>{c(),l(),s=void 0}),o}const on=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},ln="__vueuse_ssr_handlers__",ta=na();function na(){return ln in on||(on[ln]=on[ln]||{}),on[ln]}function Jo(e,t){return ta[e]||t}function ra(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 sa={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()}},Ps="vueuse-storage";function $r(e,t,n,r={}){var s;const{flush:o="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:a=!1,shallow:f,window:h=je,eventFilter:g,onError:w=_=>{console.error(_)}}=r,E=(f?Ar:ae)(t);if(!n)try{n=Jo("getDefaultStorage",()=>{var _;return(_=je)==null?void 0:_.localStorage})()}catch(_){w(_)}if(!n)return E;const S=Le(t),H=ra(S),m=(s=r.serializer)!=null?s:sa[H],{pause:y,resume:N}=Jc(E,()=>A(E.value),{flush:o,deep:i,eventFilter:g});return h&&l&&(Wt(h,"storage",j),Wt(h,Ps,W)),j(),E;function A(_){try{if(_==null)n.removeItem(e);else{const R=m.write(_),I=n.getItem(e);I!==R&&(n.setItem(e,R),h&&h.dispatchEvent(new CustomEvent(Ps,{detail:{key:e,oldValue:I,newValue:R,storageArea:n}})))}}catch(R){w(R)}}function B(_){const R=_?_.newValue:n.getItem(e);if(R==null)return c&&S!==null&&n.setItem(e,m.write(S)),S;if(!_&&a){const I=m.read(R);return typeof a=="function"?a(I,S):H==="object"&&!Array.isArray(I)?{...S,...I}:I}else return typeof R!="string"?R:m.read(R)}function W(_){j(_.detail)}function j(_){if(!(_&&_.storageArea!==n)){if(_&&_.key==null){E.value=S;return}if(!(_&&_.key!==e)){y();try{(_==null?void 0:_.newValue)!==m.write(E.value)&&(E.value=B(_))}catch(R){w(R)}finally{_?On(N):N()}}}}}function oa(e){return ea("(prefers-color-scheme: dark)",e)}function ia(e={}){const{selector:t="html",attribute:n="class",initialValue:r="auto",window:s=je,storage:o,storageKey:i="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:a,disableTransition:f=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},g=oa({window:s}),w=ue(()=>g.value?"dark":"light"),E=c||(i==null?qo(r):$r(i,r,o,{window:s,listenToStorageChanges:l})),S=ue(()=>E.value==="auto"?w.value:E.value),H=Jo("updateHTMLAttrs",(A,B,W)=>{const j=typeof A=="string"?s==null?void 0:s.document.querySelector(A):Yo(A);if(!j)return;let _;if(f){_=s.document.createElement("style");const R="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";_.appendChild(document.createTextNode(R)),s.document.head.appendChild(_)}if(B==="class"){const R=W.split(/\s/g);Object.values(h).flatMap(I=>(I||"").split(/\s/g)).filter(Boolean).forEach(I=>{R.includes(I)?j.classList.add(I):j.classList.remove(I)})}else j.setAttribute(B,W);f&&(s.getComputedStyle(_).opacity,document.head.removeChild(_))});function m(A){var B;H(t,n,(B=h[A])!=null?B:A)}function y(A){e.onChanged?e.onChanged(A,m):m(A)}Ye(S,y,{flush:"post",immediate:!0}),Xc(()=>y(S.value));const N=ue({get(){return a?E.value:S.value},set(A){E.value=A}});try{return Object.assign(N,{store:E,system:w,state:S})}catch{return N}}function la(e={}){const{valueDark:t="dark",valueLight:n=""}=e,r=ia({...e,onChanged:(o,i)=>{var l;e.onChanged?(l=e.onChanged)==null||l.call(e,o==="dark",i,o):i(o)},modes:{dark:t,light:n}});return ue({get(){return r.value==="dark"},set(o){const i=o?"dark":"light";r.system.value===i?r.value="auto":r.value=i}})}function zn(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function su(e,t,n={}){const{window:r=je}=n;return $r(e,t,r==null?void 0:r.localStorage,n)}function Xo(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}function ou(e,t=!1){const n=ae(t);let r=null,s;Ye(qo(e),l=>{const c=zn(Le(l));if(c){const a=c;s=a.style.overflow,n.value&&(a.style.overflow="hidden")}},{immediate:!0});const o=()=>{const l=zn(Le(e));!l||n.value||(Os&&(r=Wt(l,"touchmove",c=>{ca(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},i=()=>{const l=zn(Le(e));!l||!n.value||(Os&&(r==null||r()),l.style.overflow=s,n.value=!1)};return Hr(i),ue({get(){return n.value},set(l){l?o():i()}})}function iu(e,t,n={}){const{window:r=je}=n;return $r(e,t,r==null?void 0:r.sessionStorage,n)}function lu({window:e=je}={}){if(!e)return{x:ae(0),y:ae(0)};const t=ae(e.scrollX),n=ae(e.scrollY);return Wt(e,"scroll",()=>{t.value=e.scrollX,n.value=e.scrollY},{capture:!1,passive:!0}),{x:t,y:n}}const Qo=/^[a-z]+:/i,aa="vitepress-theme-appearance",Zo=/#.*$/,ua=/(index)?\.(md|html)$/,Ee=typeof document<"u",Go={relativePath:"",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function fa(e,t,n=!1){if(t===void 0)return!1;if(e=Rs(`/${e}`),n)return new RegExp(t).test(e);if(Rs(t)!==e)return!1;const r=t.match(Zo);return r?(Ee?location.hash:"")===r[0]:!0}function Rs(e){return decodeURI(e).replace(Zo,"").replace(ua,"")}function da(e){return Qo.test(e)}function ha(e,t){var r,s,o,i,l,c,a;const n=Object.keys(e.locales).find(f=>f!=="root"&&!da(f)&&fa(t,`/${f}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((r=e.locales[n])==null?void 0:r.lang)??e.lang,dir:((s=e.locales[n])==null?void 0:s.dir)??e.dir,title:((o=e.locales[n])==null?void 0:o.title)??e.title,titleTemplate:((i=e.locales[n])==null?void 0:i.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:ti(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(a=e.locales[n])==null?void 0:a.themeConfig}})}function ei(e,t){const n=t.title||e.title,r=t.titleTemplate??e.titleTemplate;if(typeof r=="string"&&r.includes(":title"))return r.replace(/:title/g,n);const s=pa(e.title,r);return`${n}${s}`}function pa(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function ga(e,t){const[n,r]=t;if(n!=="meta")return!1;const s=Object.entries(r)[0];return s==null?!1:e.some(([o,i])=>o===n&&i[s[0]]===s[1])}function ti(e,t){return[...e.filter(n=>!ga(t,n)),...t]}const ma=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,_a=/^[a-z]:/i;function Ms(e){const t=_a.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(ma,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const ya=Symbol(),it=Ar(Uc);function cu(e){const t=ue(()=>ha(it.value,e.data.relativePath)),n=t.value.appearance,r=n==="force-dark"?ae(!0):n?la({storageKey:aa,initialValue:()=>typeof n=="string"?n:"auto",...typeof n=="object"?n:{}}):ae(!1);return{site:t,theme:ue(()=>t.value.themeConfig),page:ue(()=>e.data),frontmatter:ue(()=>e.data.frontmatter),params:ue(()=>e.data.params),lang:ue(()=>t.value.lang),dir:ue(()=>t.value.dir),localeIndex:ue(()=>t.value.localeIndex||"root"),title:ue(()=>ei(t.value,e.data)),description:ue(()=>e.data.description||t.value.description),isDark:r}}function ba(){const e=bt(ya);if(!e)throw new Error("vitepress data not properly injected in app");return e}function va(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function Fs(e){return Qo.test(e)||!e.startsWith("/")?e:va(it.value.base,e)}function wa(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),Ee){const n="/MagiskChineseDocument/";t=Ms(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let r=__VP_HASH_MAP__[t.toLowerCase()];if(r||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",r=__VP_HASH_MAP__[t.toLowerCase()]),!r)return null;t=`${n}assets/${t}.${r}.js`}else t=`./${Ms(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let dn=[];function au(e){dn.push(e),Ln(()=>{dn=dn.filter(t=>t!==e)})}const Ca=Symbol(),Is="http://a.com",Ea=()=>({path:"/",component:null,data:Go});function uu(e,t){const n=An(Ea()),r={route:n,go:s};async function s(l=Ee?location.href:"/"){var a,f;if(await((a=r.onBeforeRouteChange)==null?void 0:a.call(r,l))===!1)return;const c=new URL(l,Is);it.value.cleanUrls||!c.pathname.endsWith("/")&&!c.pathname.endsWith(".html")&&(c.pathname+=".html",l=c.pathname+c.search+c.hash),Hs(l),await i(l),await((f=r.onAfterRouteChanged)==null?void 0:f.call(r,l))}let o=null;async function i(l,c=0,a=!1){var g;if(await((g=r.onBeforePageLoad)==null?void 0:g.call(r,l))===!1)return;const f=new URL(l,Is),h=o=f.pathname;try{let w=await e(h);if(!w)throw new Error(`Page not found: ${h}`);if(o===h){o=null;const{default:E,__pageData:S}=w;if(!E)throw new Error(`Invalid route component: ${E}`);n.path=Ee?h:Fs(h),n.component=Ft(E),n.data=Ft(S),Ee&&On(()=>{let H=it.value.base+S.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!it.value.cleanUrls&&!H.endsWith("/")&&(H+=".html"),H!==f.pathname&&(f.pathname=H,l=H+f.search+f.hash,history.replaceState(null,"",l)),f.hash&&!c){let m=null;try{m=document.getElementById(decodeURIComponent(f.hash).slice(1))}catch(y){console.warn(y)}if(m){Ls(m,f.hash);return}}window.scrollTo(0,c)})}}catch(w){if(!/fetch|Page not found/.test(w.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(w),!a)try{const E=await fetch(it.value.base+"hashmap.json");window.__VP_HASH_MAP__=await E.json(),await i(l,c,!0);return}catch{}o===h&&(o=null,n.path=Ee?h:Fs(h),n.component=t?Ft(t):null,n.data=Go)}}return Ee&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const a=l.target.closest("a");if(a&&!a.closest(".vp-raw")&&(a instanceof SVGElement||!a.download)){const{target:f}=a,{href:h,origin:g,pathname:w,hash:E,search:S}=new URL(a.href instanceof SVGAnimatedString?a.href.animVal:a.href,a.baseURI),H=window.location,m=w.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&!f&&g===H.origin&&!(m&&m[0]!==".html")&&(l.preventDefault(),w===H.pathname&&S===H.search?(E!==H.hash&&(history.pushState(null,"",E),window.dispatchEvent(new Event("hashchange"))),E?Ls(a,E,a.classList.contains("header-anchor")):(Hs(h),window.scrollTo(0,0))):s(h))}},{capture:!0}),window.addEventListener("popstate",l=>{i(location.href,l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),r}function xa(){const e=bt(Ca);if(!e)throw new Error("useRouter() is called without provider.");return e}function ni(){return xa().route}function Ls(e,t,n=!1){let r=null;try{r=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(s){console.warn(s)}if(r){let a=function(){!n||Math.abs(c-window.scrollY)>window.innerHeight?window.scrollTo(0,c):window.scrollTo({left:0,top:c,behavior:"smooth"})},s=it.value.scrollOffset,o=0,i=24;if(typeof s=="object"&&"padding"in s&&(i=s.padding,s=s.selector),typeof s=="number")o=s;else if(typeof s=="string")o=Ns(s,i);else if(Array.isArray(s))for(const f of s){const h=Ns(f,i);if(h){o=h;break}}const l=parseInt(window.getComputedStyle(r).paddingTop,10),c=window.scrollY+r.getBoundingClientRect().top-o+l;requestAnimationFrame(a)}}function Ns(e,t){const n=document.querySelector(e);if(!n)return 0;const r=n.getBoundingClientRect().bottom;return r<0?0:r+t}function Hs(e){Ee&&e!==location.href&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",e))}const $s=()=>dn.forEach(e=>e()),fu=Pr({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=ni(),{site:n}=ba();return()=>cr(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?cr(t.component,{onVnodeMounted:$s,onVnodeUpdated:$s}):"404 Page Not Found"])}}),Ta="modulepreload",Aa=function(e){return"/MagiskChineseDocument/"+e},Ds={},du=function(t,n,r){if(!n||n.length===0)return t();const s=document.getElementsByTagName("link");return Promise.all(n.map(o=>{if(o=Aa(o),o in Ds)return;Ds[o]=!0;const i=o.endsWith(".css"),l=i?'[rel="stylesheet"]':"";if(!!r)for(let f=s.length-1;f>=0;f--){const h=s[f];if(h.href===o&&(!i||h.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${o}"]${l}`))return;const a=document.createElement("link");if(a.rel=i?"stylesheet":Ta,i||(a.as="script",a.crossOrigin=""),a.href=o,document.head.appendChild(a),i)return new Promise((f,h)=>{a.addEventListener("load",f),a.addEventListener("error",()=>h(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>t()).catch(o=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=o,window.dispatchEvent(i),!i.defaultPrevented)throw o})},hu=Pr({setup(e,{slots:t}){const n=ae(!1);return At(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function pu(){Ee&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement;if(!r)return;const s=Array.from(r.querySelectorAll("input")).indexOf(t);if(s<0)return;const o=r.querySelector(".blocks");if(!o)return;const i=Array.from(o.children).find(a=>a.classList.contains("active"));if(!i)return;const l=o.children[s];if(!l||i===l)return;i.classList.remove("active"),l.classList.add("active");const c=r==null?void 0:r.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function gu(){if(Ee){const e=new WeakMap;window.addEventListener("click",t=>{var r;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const s=n.parentElement,o=(r=n.nextElementSibling)==null?void 0:r.nextElementSibling;if(!s||!o)return;const i=/language-(shellscript|shell|bash|sh|zsh)/.test(s.className);let l="";o.querySelectorAll("span.line:not(.diff.remove)").forEach(c=>l+=(c.textContent||"")+` +`),l=l.slice(0,-1),i&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),Sa(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 Sa(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const r=document.getSelection(),s=r?r.rangeCount>0&&r.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),s&&(r.removeAllRanges(),r.addRange(s)),n&&n.focus()}}function mu(e,t){let n=[],r=!0;const s=o=>{if(r){r=!1;return}n.forEach(i=>document.head.removeChild(i)),n=[],o.forEach(i=>{const l=js(i);document.head.appendChild(l),n.push(l)})};Or(()=>{const o=e.data,i=t.value,l=o&&o.description,c=o&&o.frontmatter.head||[];document.title=ei(i,o);const a=l||i.description;let f=document.querySelector("meta[name=description]");f?f.setAttribute("content",a):js(["meta",{name:"description",content:a}]),s(ti(i.head,Pa(c)))})}function js([e,t,n]){const r=document.createElement(e);for(const s in t)r.setAttribute(s,t[s]);return n&&(r.innerHTML=n),e==="script"&&!t.async&&(r.async=!1),r}function Oa(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Pa(e){return e.filter(t=>!Oa(t))}const Yn=new Set,ri=()=>document.createElement("link"),Ra=e=>{const t=ri();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Ma=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let cn;const Fa=Ee&&(cn=ri())&&cn.relList&&cn.relList.supports&&cn.relList.supports("prefetch")?Ra:Ma;function _u(){if(!Ee||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const r=()=>{n&&n.disconnect(),n=new IntersectionObserver(o=>{o.forEach(i=>{if(i.isIntersecting){const l=i.target;n.unobserve(l);const{pathname:c}=l;if(!Yn.has(c)){Yn.add(c);const a=wa(c);a&&Fa(a)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(o=>{const{hostname:i,pathname:l}=new URL(o.href instanceof SVGAnimatedString?o.href.animVal:o.href,o.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||o.target!=="_blank"&&i===location.hostname&&(l!==location.pathname?n.observe(o):Yn.add(l))})})};At(r);const s=ni();Ye(()=>s.path,r),Ln(()=>{n&&n.disconnect()})}export{Xa as $,Ha as A,Sl as B,ja as C,ka as D,Ar as E,ge as F,au as G,se as H,Ba as I,Qo as J,ni as K,rc as L,bt as M,gr as N,On as O,lu as P,za as Q,Sn as R,ru as S,Bo as T,Da as U,du as V,ou as W,kl as X,Qa as Y,Ka as Z,eu as _,Ho as a,Wa as a0,xa as a1,mu as a2,Ca as a3,cu as a4,ya as a5,fu as a6,hu as a7,it as a8,Ga as a9,uu as aa,wa as ab,_u as ac,gu as ad,pu as ae,cr as af,Yo as ag,Hr as ah,nu as ai,iu as aj,su as ak,tu as al,Wt as am,yo as an,$a as ao,Ja as ap,ce as aq,Va as ar,Ft as as,Za as at,Io as b,qa as c,Pr as d,Ya as e,Fs as f,ue as g,ae as h,da as i,At as j,No as k,oo as l,Na as m,mr as n,Mo as o,La as p,fa as q,Ua as r,Ee as s,Ia as t,ba as u,ea as v,dl as w,Ye as x,Or as y,Ln as z}; diff --git a/assets/chunks/framework.fc84ac3a.js b/assets/chunks/framework.fc84ac3a.js deleted file mode 100644 index 3c4d66ac..00000000 --- a/assets/chunks/framework.fc84ac3a.js +++ /dev/null @@ -1,2 +0,0 @@ -function es(e,t){const n=Object.create(null),s=e.split(",");for(let r=0;r!!n[r.toLowerCase()]:r=>!!n[r]}const te={},ft=[],Pe=()=>{},Ni=()=>!1,Hi=/^on[^a-z]/,jt=e=>Hi.test(e),ts=e=>e.startsWith("onUpdate:"),oe=Object.assign,ns=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},$i=Object.prototype.hasOwnProperty,Y=(e,t)=>$i.call(e,t),N=Array.isArray,ut=e=>gn(e)==="[object Map]",wr=e=>gn(e)==="[object Set]",D=e=>typeof e=="function",se=e=>typeof e=="string",ss=e=>typeof e=="symbol",ee=e=>e!==null&&typeof e=="object",xr=e=>ee(e)&&D(e.then)&&D(e.catch),Er=Object.prototype.toString,gn=e=>Er.call(e),Ui=e=>gn(e).slice(8,-1),Tr=e=>gn(e)==="[object Object]",rs=e=>se(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Rt=es(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),mn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},ji=/-(\w)/g,Se=mn(e=>e.replace(ji,(t,n)=>n?n.toUpperCase():"")),Bi=/\B([A-Z])/g,it=mn(e=>e.replace(Bi,"-$1").toLowerCase()),_n=mn(e=>e.charAt(0).toUpperCase()+e.slice(1)),en=mn(e=>e?`on${_n(e)}`:""),Lt=(e,t)=>!Object.is(e,t),tn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},jn=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Di=e=>{const t=se(e)?Number(e):NaN;return isNaN(t)?e:t};let Is;const Bn=()=>Is||(Is=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function is(e){if(N(e)){const t={};for(let n=0;n{if(n){const s=n.split(ki);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function os(e){let t="";if(se(e))t=e;else if(N(e))for(let n=0;nse(e)?e:e==null?"":N(e)||ee(e)&&(e.toString===Er||!D(e.toString))?JSON.stringify(e,Rr,2):String(e),Rr=(e,t)=>t&&t.__v_isRef?Rr(e,t.value):ut(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r])=>(n[`${s} =>`]=r,n),{})}:wr(t)?{[`Set(${t.size})`]:[...t.values()]}:ee(t)&&!N(t)&&!Tr(t)?String(t):t;let _e;class Yi{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=_e,!t&&_e&&(this.index=(_e.scopes||(_e.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=_e;try{return _e=this,t()}finally{_e=n}}}on(){_e=this}off(){_e=this.parent}stop(t){if(this._active){let n,s;for(n=0,s=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},Pr=e=>(e.w&Ve)>0,Ir=e=>(e.n&Ve)>0,Zi=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let s=0;s{(d==="length"||d>=c)&&l.push(f)})}else switch(n!==void 0&&l.push(o.get(n)),t){case"add":N(e)?rs(n)&&l.push(o.get("length")):(l.push(o.get(st)),ut(e)&&l.push(o.get(Kn)));break;case"delete":N(e)||(l.push(o.get(st)),ut(e)&&l.push(o.get(Kn)));break;case"set":ut(e)&&l.push(o.get(st));break}if(l.length===1)l[0]&&kn(l[0]);else{const c=[];for(const f of l)f&&c.push(...f);kn(ls(c))}}function kn(e,t){const n=N(e)?e:[...e];for(const s of n)s.computed&&Fs(s);for(const s of n)s.computed||Fs(s)}function Fs(e,t){(e!==Ae||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function Gi(e,t){var n;return(n=ln.get(e))==null?void 0:n.get(t)}const eo=es("__proto__,__v_isRef,__isVue"),Mr=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(ss)),to=as(),no=as(!1,!0),so=as(!0),Ms=ro();function ro(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=J(this);for(let i=0,o=this.length;i{e[t]=function(...n){Ct();const s=J(this)[t].apply(this,n);return wt(),s}}),e}function io(e){const t=J(this);return pe(t,"has",e),t.hasOwnProperty(e)}function as(e=!1,t=!1){return function(s,r,i){if(r==="__v_isReactive")return!e;if(r==="__v_isReadonly")return e;if(r==="__v_isShallow")return t;if(r==="__v_raw"&&i===(e?t?wo:$r:t?Hr:Nr).get(s))return s;const o=N(s);if(!e){if(o&&Y(Ms,r))return Reflect.get(Ms,r,i);if(r==="hasOwnProperty")return io}const l=Reflect.get(s,r,i);return(ss(r)?Mr.has(r):eo(r))||(e||pe(s,"get",r),t)?l:ce(l)?o&&rs(r)?l:l.value:ee(l)?e?Ur(l):yn(l):l}}const oo=Sr(),lo=Sr(!0);function Sr(e=!1){return function(n,s,r,i){let o=n[s];if(_t(o)&&ce(o)&&!ce(r))return!1;if(!e&&(!cn(r)&&!_t(r)&&(o=J(o),r=J(r)),!N(n)&&ce(o)&&!ce(r)))return o.value=r,!0;const l=N(n)&&rs(s)?Number(s)e,bn=e=>Reflect.getPrototypeOf(e);function Wt(e,t,n=!1,s=!1){e=e.__v_raw;const r=J(e),i=J(t);n||(t!==i&&pe(r,"get",t),pe(r,"get",i));const{has:o}=bn(r),l=s?fs:n?hs:Nt;if(o.call(r,t))return l(e.get(t));if(o.call(r,i))return l(e.get(i));e!==r&&e.get(t)}function Vt(e,t=!1){const n=this.__v_raw,s=J(n),r=J(e);return t||(e!==r&&pe(s,"has",e),pe(s,"has",r)),e===r?n.has(e):n.has(e)||n.has(r)}function qt(e,t=!1){return e=e.__v_raw,!t&&pe(J(e),"iterate",st),Reflect.get(e,"size",e)}function Ss(e){e=J(e);const t=J(this);return bn(t).has.call(t,e)||(t.add(e),He(t,"add",e,e)),this}function Ls(e,t){t=J(t);const n=J(this),{has:s,get:r}=bn(n);let i=s.call(n,e);i||(e=J(e),i=s.call(n,e));const o=r.call(n,e);return n.set(e,t),i?Lt(t,o)&&He(n,"set",e,t):He(n,"add",e,t),this}function Ns(e){const t=J(this),{has:n,get:s}=bn(t);let r=n.call(t,e);r||(e=J(e),r=n.call(t,e)),s&&s.call(t,e);const i=t.delete(e);return r&&He(t,"delete",e,void 0),i}function Hs(){const e=J(this),t=e.size!==0,n=e.clear();return t&&He(e,"clear",void 0,void 0),n}function zt(e,t){return function(s,r){const i=this,o=i.__v_raw,l=J(o),c=t?fs:e?hs:Nt;return!e&&pe(l,"iterate",st),o.forEach((f,d)=>s.call(r,c(f),c(d),i))}}function Yt(e,t,n){return function(...s){const r=this.__v_raw,i=J(r),o=ut(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,f=r[e](...s),d=n?fs:t?hs:Nt;return!t&&pe(i,"iterate",c?Kn:st),{next(){const{value:p,done:g}=f.next();return g?{value:p,done:g}:{value:l?[d(p[0]),d(p[1])]:d(p),done:g}},[Symbol.iterator](){return this}}}}function Ue(e){return function(...t){return e==="delete"?!1:this}}function po(){const e={get(i){return Wt(this,i)},get size(){return qt(this)},has:Vt,add:Ss,set:Ls,delete:Ns,clear:Hs,forEach:zt(!1,!1)},t={get(i){return Wt(this,i,!1,!0)},get size(){return qt(this)},has:Vt,add:Ss,set:Ls,delete:Ns,clear:Hs,forEach:zt(!1,!0)},n={get(i){return Wt(this,i,!0)},get size(){return qt(this,!0)},has(i){return Vt.call(this,i,!0)},add:Ue("add"),set:Ue("set"),delete:Ue("delete"),clear:Ue("clear"),forEach:zt(!0,!1)},s={get(i){return Wt(this,i,!0,!0)},get size(){return qt(this,!0)},has(i){return Vt.call(this,i,!0)},add:Ue("add"),set:Ue("set"),delete:Ue("delete"),clear:Ue("clear"),forEach:zt(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=Yt(i,!1,!1),n[i]=Yt(i,!0,!1),t[i]=Yt(i,!1,!0),s[i]=Yt(i,!0,!0)}),[e,n,t,s]}const[go,mo,_o,bo]=po();function us(e,t){const n=t?e?bo:_o:e?mo:go;return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(Y(n,r)&&r in s?n:s,r,i)}const yo={get:us(!1,!1)},vo={get:us(!1,!0)},Co={get:us(!0,!1)},Nr=new WeakMap,Hr=new WeakMap,$r=new WeakMap,wo=new WeakMap;function xo(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Eo(e){return e.__v_skip||!Object.isExtensible(e)?0:xo(Ui(e))}function yn(e){return _t(e)?e:ds(e,!1,Lr,yo,Nr)}function To(e){return ds(e,!1,ho,vo,Hr)}function Ur(e){return ds(e,!0,uo,Co,$r)}function ds(e,t,n,s,r){if(!ee(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=r.get(e);if(i)return i;const o=Eo(e);if(o===0)return e;const l=new Proxy(e,o===2?s:n);return r.set(e,l),l}function dt(e){return _t(e)?dt(e.__v_raw):!!(e&&e.__v_isReactive)}function _t(e){return!!(e&&e.__v_isReadonly)}function cn(e){return!!(e&&e.__v_isShallow)}function jr(e){return dt(e)||_t(e)}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function Pt(e){return on(e,"__v_skip",!0),e}const Nt=e=>ee(e)?yn(e):e,hs=e=>ee(e)?Ur(e):e;function ps(e){ke&&Ae&&(e=J(e),Fr(e.dep||(e.dep=ls())))}function gs(e,t){e=J(e);const n=e.dep;n&&kn(n)}function ce(e){return!!(e&&e.__v_isRef===!0)}function ht(e){return Br(e,!1)}function Ao(e){return Br(e,!0)}function Br(e,t){return ce(e)?e:new Ro(e,t)}class Ro{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:J(t),this._value=n?t:Nt(t)}get value(){return ps(this),this._value}set value(t){const n=this.__v_isShallow||cn(t)||_t(t);t=n?t:J(t),Lt(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Nt(t),gs(this))}}function Po(e){return ce(e)?e.value:e}const Io={get:(e,t,n)=>Po(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return ce(r)&&!ce(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Dr(e){return dt(e)?e:new Proxy(e,Io)}class Oo{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:s}=t(()=>ps(this),()=>gs(this));this._get=n,this._set=s}get value(){return this._get()}set value(t){this._set(t)}}function Vc(e){return new Oo(e)}class Fo{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Gi(J(this._object),this._key)}}class Mo{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function qc(e,t,n){return ce(e)?e:D(e)?new Mo(e):ee(e)&&arguments.length>1?So(e,t,n):ht(e)}function So(e,t,n){const s=e[t];return ce(s)?s:new Fo(e,t,n)}class Lo{constructor(t,n,s,r){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new cs(t,()=>{this._dirty||(this._dirty=!0,gs(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=s}get value(){const t=J(this);return ps(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function No(e,t,n=!1){let s,r;const i=D(e);return i?(s=e,r=Pe):(s=e.get,r=e.set),new Lo(s,r,i||!r,n)}function We(e,t,n,s){let r;try{r=s?e(...s):e()}catch(i){Bt(i,t,n)}return r}function we(e,t,n,s){if(D(e)){const i=We(e,t,n,s);return i&&xr(i)&&i.catch(o=>{Bt(o,t,n)}),i}const r=[];for(let i=0;i>>1;$t(fe[s])Me&&fe.splice(t,1)}function jo(e){N(e)?pt.push(...e):(!Ne||!Ne.includes(e,e.allowRecurse?Qe+1:Qe))&&pt.push(e),Wr()}function $s(e,t=Ht?Me+1:0){for(;t$t(n)-$t(s)),Qe=0;Qee.id==null?1/0:e.id,Bo=(e,t)=>{const n=$t(e)-$t(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Vr(e){Wn=!1,Ht=!0,fe.sort(Bo);const t=Pe;try{for(Me=0;Mese(C)?C.trim():C)),p&&(r=n.map(jn))}let l,c=s[l=en(t)]||s[l=en(Se(t))];!c&&i&&(c=s[l=en(it(t))]),c&&we(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,we(f,e,6,r)}}function qr(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(!D(e)){const c=f=>{const d=qr(f,t,!0);d&&(l=!0,oe(o,d))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(ee(e)&&s.set(e,null),null):(N(i)?i.forEach(c=>o[c]=null):oe(o,i),ee(e)&&s.set(e,o),o)}function Cn(e,t){return!e||!jt(t)?!1:(t=t.slice(2).replace(/Once$/,""),Y(e,t[0].toLowerCase()+t.slice(1))||Y(e,it(t))||Y(e,t))}let ae=null,wn=null;function fn(e){const t=ae;return ae=e,wn=e&&e.type.__scopeId||null,t}function zc(e){wn=e}function Yc(){wn=null}function Ko(e,t=ae,n){if(!t||e._n)return e;const s=(...r)=>{s._d&&Xs(-1);const i=fn(t);let o;try{o=e(...r)}finally{fn(i),s._d&&Xs(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function Fn(e){const{type:t,vnode:n,proxy:s,withProxy:r,props:i,propsOptions:[o],slots:l,attrs:c,emit:f,render:d,renderCache:p,data:g,setupState:C,ctx:R,inheritAttrs:P}=e;let $,_;const y=fn(e);try{if(n.shapeFlag&4){const I=r||s;$=Te(d.call(I,I,p,i,C,g,R)),_=c}else{const I=t;$=Te(I.length>1?I(i,{attrs:c,slots:l,emit:f}):I(i,null)),_=t.props?c:ko(c)}}catch(I){Mt.length=0,Bt(I,e,1),$=re(be)}let H=$;if(_&&P!==!1){const I=Object.keys(_),{shapeFlag:K}=H;I.length&&K&7&&(o&&I.some(ts)&&(_=Wo(_,o)),H=qe(H,_))}return n.dirs&&(H=qe(H),H.dirs=H.dirs?H.dirs.concat(n.dirs):n.dirs),n.transition&&(H.transition=n.transition),$=H,fn(y),$}const ko=e=>{let t;for(const n in e)(n==="class"||n==="style"||jt(n))&&((t||(t={}))[n]=e[n]);return t},Wo=(e,t)=>{const n={};for(const s in e)(!ts(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Vo(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?Us(s,o,f):!!o;if(c&8){const d=t.dynamicProps;for(let p=0;pe.__isSuspense;function zr(e,t){t&&t.pendingBranch?N(e)?t.effects.push(...e):t.effects.push(e):jo(e)}function Yo(e,t){return xn(e,null,t)}function Jc(e,t){return xn(e,null,{flush:"post"})}const Jt={};function nn(e,t,n){return xn(e,t,n)}function xn(e,t,{immediate:n,deep:s,flush:r,onTrack:i,onTrigger:o}=te){var l;const c=Xi()===((l=le)==null?void 0:l.scope)?le:null;let f,d=!1,p=!1;if(ce(e)?(f=()=>e.value,d=cn(e)):dt(e)?(f=()=>e,s=!0):N(e)?(p=!0,d=e.some(I=>dt(I)||cn(I)),f=()=>e.map(I=>{if(ce(I))return I.value;if(dt(I))return tt(I);if(D(I))return We(I,c,2)})):D(e)?t?f=()=>We(e,c,2):f=()=>{if(!(c&&c.isUnmounted))return g&&g(),we(e,c,3,[C])}:f=Pe,t&&s){const I=f;f=()=>tt(I())}let g,C=I=>{g=y.onStop=()=>{We(I,c,4)}},R;if(vt)if(C=Pe,t?n&&we(t,c,3,[f(),p?[]:void 0,C]):f(),r==="sync"){const I=Wl();R=I.__watcherHandles||(I.__watcherHandles=[])}else return Pe;let P=p?new Array(e.length).fill(Jt):Jt;const $=()=>{if(y.active)if(t){const I=y.run();(s||d||(p?I.some((K,q)=>Lt(K,P[q])):Lt(I,P)))&&(g&&g(),we(t,c,3,[I,P===Jt?void 0:p&&P[0]===Jt?[]:P,C]),P=I)}else y.run()};$.allowRecurse=!!t;let _;r==="sync"?_=$:r==="post"?_=()=>de($,c&&c.suspense):($.pre=!0,c&&($.id=c.uid),_=()=>vn($));const y=new cs(f,_);t?n?$():P=y.run():r==="post"?de(y.run.bind(y),c&&c.suspense):y.run();const H=()=>{y.stop(),c&&c.scope&&ns(c.scope.effects,y)};return R&&R.push(H),H}function Jo(e,t,n){const s=this.proxy,r=se(e)?e.includes(".")?Yr(s,e):()=>s[e]:e.bind(s,s);let i;D(t)?i=t:(i=t.handler,n=t);const o=le;yt(this);const l=xn(r,i.bind(s),n);return o?yt(o):rt(),l}function Yr(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;r{tt(n,t)});else if(Tr(e))for(const n in e)tt(e[n],t);return e}function Xc(e,t){const n=ae;if(n===null)return e;const s=Pn(n)||n.proxy,r=e.dirs||(e.dirs=[]);for(let i=0;i{e.isMounted=!0}),Gr(()=>{e.isUnmounting=!0}),e}const ye=[Function,Array],Jr={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ye,onEnter:ye,onAfterEnter:ye,onEnterCancelled:ye,onBeforeLeave:ye,onLeave:ye,onAfterLeave:ye,onLeaveCancelled:ye,onBeforeAppear:ye,onAppear:ye,onAfterAppear:ye,onAppearCancelled:ye},Zo={name:"BaseTransition",props:Jr,setup(e,{slots:t}){const n=bi(),s=Xo();let r;return()=>{const i=t.default&&Zr(t.default(),!0);if(!i||!i.length)return;let o=i[0];if(i.length>1){for(const P of i)if(P.type!==be){o=P;break}}const l=J(e),{mode:c}=l;if(s.isLeaving)return Mn(o);const f=js(o);if(!f)return Mn(o);const d=Vn(f,l,s,n);qn(f,d);const p=n.subTree,g=p&&js(p);let C=!1;const{getTransitionKey:R}=f.type;if(R){const P=R();r===void 0?r=P:P!==r&&(r=P,C=!0)}if(g&&g.type!==be&&(!Ge(f,g)||C)){const P=Vn(g,l,s,n);if(qn(g,P),c==="out-in")return s.isLeaving=!0,P.afterLeave=()=>{s.isLeaving=!1,n.update.active!==!1&&n.update()},Mn(o);c==="in-out"&&f.type!==be&&(P.delayLeave=($,_,y)=>{const H=Xr(s,g);H[String(g.key)]=g,$._leaveCb=()=>{_(),$._leaveCb=void 0,delete d.delayedLeave},d.delayedLeave=y})}return o}}},Qo=Zo;function Xr(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 Vn(e,t,n,s){const{appear:r,mode:i,persisted:o=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:f,onEnterCancelled:d,onBeforeLeave:p,onLeave:g,onAfterLeave:C,onLeaveCancelled:R,onBeforeAppear:P,onAppear:$,onAfterAppear:_,onAppearCancelled:y}=t,H=String(e.key),I=Xr(n,e),K=(E,j)=>{E&&we(E,s,9,j)},q=(E,j)=>{const U=j[1];K(E,j),N(E)?E.every(W=>W.length<=1)&&U():E.length<=1&&U()},k={mode:i,persisted:o,beforeEnter(E){let j=l;if(!n.isMounted)if(r)j=P||l;else return;E._leaveCb&&E._leaveCb(!0);const U=I[H];U&&Ge(e,U)&&U.el._leaveCb&&U.el._leaveCb(),K(j,[E])},enter(E){let j=c,U=f,W=d;if(!n.isMounted)if(r)j=$||c,U=_||f,W=y||d;else return;let O=!1;const V=E._enterCb=M=>{O||(O=!0,M?K(W,[E]):K(U,[E]),k.delayedLeave&&k.delayedLeave(),E._enterCb=void 0)};j?q(j,[E,V]):V()},leave(E,j){const U=String(e.key);if(E._enterCb&&E._enterCb(!0),n.isUnmounting)return j();K(p,[E]);let W=!1;const O=E._leaveCb=V=>{W||(W=!0,j(),V?K(R,[E]):K(C,[E]),E._leaveCb=void 0,I[U]===e&&delete I[U])};I[U]=e,g?q(g,[E,O]):O()},clone(E){return Vn(E,t,n,s)}};return k}function Mn(e){if(Dt(e))return e=qe(e),e.children=null,e}function js(e){return Dt(e)?e.children?e.children[0]:void 0:e}function qn(e,t){e.shapeFlag&6&&e.component?qn(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 Zr(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;ioe({name:e.name},t,{setup:e}))():e}const gt=e=>!!e.type.__asyncLoader;function Zc(e){D(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:r=200,timeout:i,suspensible:o=!0,onError:l}=e;let c=null,f,d=0;const p=()=>(d++,c=null,g()),g=()=>{let C;return c||(C=c=t().catch(R=>{if(R=R instanceof Error?R:new Error(String(R)),l)return new Promise((P,$)=>{l(R,()=>P(p()),()=>$(R),d+1)});throw R}).then(R=>C!==c&&c?c:(R&&(R.__esModule||R[Symbol.toStringTag]==="Module")&&(R=R.default),f=R,R)))};return _s({name:"AsyncComponentWrapper",__asyncLoader:g,get __asyncResolved(){return f},setup(){const C=le;if(f)return()=>Sn(f,C);const R=y=>{c=null,Bt(y,C,13,!s)};if(o&&C.suspense||vt)return g().then(y=>()=>Sn(y,C)).catch(y=>(R(y),()=>s?re(s,{error:y}):null));const P=ht(!1),$=ht(),_=ht(!!r);return r&&setTimeout(()=>{_.value=!1},r),i!=null&&setTimeout(()=>{if(!P.value&&!$.value){const y=new Error(`Async component timed out after ${i}ms.`);R(y),$.value=y}},i),g().then(()=>{P.value=!0,C.parent&&Dt(C.parent.vnode)&&vn(C.parent.update)}).catch(y=>{R(y),$.value=y}),()=>{if(P.value&&f)return Sn(f,C);if($.value&&s)return re(s,{error:$.value});if(n&&!_.value)return re(n)}}})}function Sn(e,t){const{ref:n,props:s,children:r,ce:i}=t.vnode,o=re(e,s,r);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const Dt=e=>e.type.__isKeepAlive;function Go(e,t){Qr(e,"a",t)}function el(e,t){Qr(e,"da",t)}function Qr(e,t,n=le){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(En(t,s,n),n){let r=n.parent;for(;r&&r.parent;)Dt(r.parent.vnode)&&tl(s,t,n,r),r=r.parent}}function tl(e,t,n,s){const r=En(t,e,s,!0);An(()=>{ns(s[t],r)},n)}function En(e,t,n=le,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;Ct(),yt(n);const l=we(t,n,e,o);return rt(),wt(),l});return s?r.unshift(i):r.push(i),i}}const $e=e=>(t,n=le)=>(!vt||e==="sp")&&En(e,(...s)=>t(...s),n),nl=$e("bm"),Tn=$e("m"),sl=$e("bu"),rl=$e("u"),Gr=$e("bum"),An=$e("um"),il=$e("sp"),ol=$e("rtg"),ll=$e("rtc");function cl(e,t=le){En("ec",e,t)}const bs="components";function Qc(e,t){return ti(bs,e,!0,t)||e}const ei=Symbol.for("v-ndc");function Gc(e){return se(e)?ti(bs,e,!1)||e:e||ei}function ti(e,t,n=!0,s=!1){const r=ae||le;if(r){const i=r.type;if(e===bs){const l=Dl(i,!1);if(l&&(l===t||l===Se(t)||l===_n(Se(t))))return i}const o=Bs(r[e]||i[e],t)||Bs(r.appContext[e],t);return!o&&s?i:o}}function Bs(e,t){return e&&(e[t]||e[Se(t)]||e[_n(Se(t))])}function ea(e,t,n,s){let r;const i=n&&n[s];if(N(e)||se(e)){r=new Array(e.length);for(let o=0,l=e.length;ot(o,l,void 0,i&&i[l]));else{const o=Object.keys(e);r=new Array(o.length);for(let l=0,c=o.length;lpn(t)?!(t.type===be||t.type===he&&!ni(t.children)):!0)?e:null}function na(e,t){const n={};for(const s in e)n[t&&/[A-Z]/.test(s)?`on:${s}`:en(s)]=e[s];return n}const zn=e=>e?yi(e)?Pn(e)||e.proxy:zn(e.parent):null,It=oe(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=>zn(e.parent),$root:e=>zn(e.root),$emit:e=>e.emit,$options:e=>ys(e),$forceUpdate:e=>e.f||(e.f=()=>vn(e.update)),$nextTick:e=>e.n||(e.n=kr.bind(e.proxy)),$watch:e=>Jo.bind(e)}),Ln=(e,t)=>e!==te&&!e.__isScriptSetup&&Y(e,t),al={get({_:e},t){const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let f;if(t[0]!=="$"){const C=o[t];if(C!==void 0)switch(C){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(Ln(s,t))return o[t]=1,s[t];if(r!==te&&Y(r,t))return o[t]=2,r[t];if((f=e.propsOptions[0])&&Y(f,t))return o[t]=3,i[t];if(n!==te&&Y(n,t))return o[t]=4,n[t];Yn&&(o[t]=0)}}const d=It[t];let p,g;if(d)return t==="$attrs"&&pe(e,"get",t),d(e);if((p=l.__cssModules)&&(p=p[t]))return p;if(n!==te&&Y(n,t))return o[t]=4,n[t];if(g=c.config.globalProperties,Y(g,t))return g[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return Ln(r,t)?(r[t]=n,!0):s!==te&&Y(s,t)?(s[t]=n,!0):Y(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!==te&&Y(e,o)||Ln(t,o)||(l=i[0])&&Y(l,o)||Y(s,o)||Y(It,o)||Y(r.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Y(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function sa(){return fl().slots}function fl(){const e=bi();return e.setupContext||(e.setupContext=Ci(e))}function Ds(e){return N(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Yn=!0;function ul(e){const t=ys(e),n=e.proxy,s=e.ctx;Yn=!1,t.beforeCreate&&Ks(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:f,created:d,beforeMount:p,mounted:g,beforeUpdate:C,updated:R,activated:P,deactivated:$,beforeDestroy:_,beforeUnmount:y,destroyed:H,unmounted:I,render:K,renderTracked:q,renderTriggered:k,errorCaptured:E,serverPrefetch:j,expose:U,inheritAttrs:W,components:O,directives:V,filters:M}=t;if(f&&dl(f,s,null),o)for(const ne in o){const Q=o[ne];D(Q)&&(s[ne]=Q.bind(n))}if(r){const ne=r.call(n,n);ee(ne)&&(e.data=yn(ne))}if(Yn=!0,i)for(const ne in i){const Q=i[ne],ze=D(Q)?Q.bind(n,n):D(Q.get)?Q.get.bind(n,n):Pe,Kt=!D(Q)&&D(Q.set)?Q.set.bind(n):Pe,Ye=Ee({get:ze,set:Kt});Object.defineProperty(s,ne,{enumerable:!0,configurable:!0,get:()=>Ye.value,set:Ie=>Ye.value=Ie})}if(l)for(const ne in l)si(l[ne],s,n,ne);if(c){const ne=D(c)?c.call(n):c;Reflect.ownKeys(ne).forEach(Q=>{bl(Q,ne[Q])})}d&&Ks(d,e,"c");function X(ne,Q){N(Q)?Q.forEach(ze=>ne(ze.bind(n))):Q&&ne(Q.bind(n))}if(X(nl,p),X(Tn,g),X(sl,C),X(rl,R),X(Go,P),X(el,$),X(cl,E),X(ll,q),X(ol,k),X(Gr,y),X(An,I),X(il,j),N(U))if(U.length){const ne=e.exposed||(e.exposed={});U.forEach(Q=>{Object.defineProperty(ne,Q,{get:()=>n[Q],set:ze=>n[Q]=ze})})}else e.exposed||(e.exposed={});K&&e.render===Pe&&(e.render=K),W!=null&&(e.inheritAttrs=W),O&&(e.components=O),V&&(e.directives=V)}function dl(e,t,n=Pe){N(e)&&(e=Jn(e));for(const s in e){const r=e[s];let i;ee(r)?"default"in r?i=mt(r.from||s,r.default,!0):i=mt(r.from||s):i=mt(r),ce(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function Ks(e,t,n){we(N(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function si(e,t,n,s){const r=s.includes(".")?Yr(n,s):()=>n[s];if(se(e)){const i=t[e];D(i)&&nn(r,i)}else if(D(e))nn(r,e.bind(n));else if(ee(e))if(N(e))e.forEach(i=>si(i,t,n,s));else{const i=D(e.handler)?e.handler.bind(n):t[e.handler];D(i)&&nn(r,i,e)}}function ys(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=>un(c,f,o,!0)),un(c,t,o)),ee(t)&&i.set(t,c),c}function un(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&un(e,i,n,!0),r&&r.forEach(o=>un(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=hl[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const hl={data:ks,props:Ws,emits:Ws,methods:At,computed:At,beforeCreate:ue,created:ue,beforeMount:ue,mounted:ue,beforeUpdate:ue,updated:ue,beforeDestroy:ue,beforeUnmount:ue,destroyed:ue,unmounted:ue,activated:ue,deactivated:ue,errorCaptured:ue,serverPrefetch:ue,components:At,directives:At,watch:gl,provide:ks,inject:pl};function ks(e,t){return t?e?function(){return oe(D(e)?e.call(this,this):e,D(t)?t.call(this,this):t)}:t:e}function pl(e,t){return At(Jn(e),Jn(t))}function Jn(e){if(N(e)){const t={};for(let n=0;n1)return n&&D(t)?t.call(s&&s.proxy):t}}function yl(e,t,n,s=!1){const r={},i={};on(i,Rn,1),e.propsDefaults=Object.create(null),ii(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:To(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function vl(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=J(r),[c]=e.propsOptions;let f=!1;if((s||o>0)&&!(o&16)){if(o&8){const d=e.vnode.dynamicProps;for(let p=0;p{c=!0;const[g,C]=oi(p,t,!0);oe(o,g),C&&l.push(...C)};!n&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!i&&!c)return ee(e)&&s.set(e,ft),ft;if(N(i))for(let d=0;d-1,C[1]=P<0||R-1||Y(C,"default"))&&l.push(p)}}}const f=[o,l];return ee(e)&&s.set(e,f),f}function Vs(e){return e[0]!=="$"}function qs(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function zs(e,t){return qs(e)===qs(t)}function Ys(e,t){return N(t)?t.findIndex(n=>zs(n,e)):D(t)&&zs(t,e)?0:-1}const li=e=>e[0]==="_"||e==="$stable",vs=e=>N(e)?e.map(Te):[Te(e)],Cl=(e,t,n)=>{if(t._n)return t;const s=Ko((...r)=>vs(t(...r)),n);return s._c=!1,s},ci=(e,t,n)=>{const s=e._ctx;for(const r in e){if(li(r))continue;const i=e[r];if(D(i))t[r]=Cl(r,i,s);else if(i!=null){const o=vs(i);t[r]=()=>o}}},ai=(e,t)=>{const n=vs(t);e.slots.default=()=>n},wl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=J(t),on(t,"_",n)):ci(t,e.slots={})}else e.slots={},t&&ai(e,t);on(e.slots,Rn,1)},xl=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=te;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:(oe(r,t),!n&&l===1&&delete r._):(i=!t.$stable,ci(t,r)),o=t}else t&&(ai(e,t),o={default:1});if(i)for(const l in r)!li(l)&&!(l in o)&&delete r[l]};function hn(e,t,n,s,r=!1){if(N(e)){e.forEach((g,C)=>hn(g,t&&(N(t)?t[C]:t),n,s,r));return}if(gt(s)&&!r)return;const i=s.shapeFlag&4?Pn(s.component)||s.component.proxy:s.el,o=r?null:i,{i:l,r:c}=e,f=t&&t.r,d=l.refs===te?l.refs={}:l.refs,p=l.setupState;if(f!=null&&f!==c&&(se(f)?(d[f]=null,Y(p,f)&&(p[f]=null)):ce(f)&&(f.value=null)),D(c))We(c,l,12,[o,d]);else{const g=se(c),C=ce(c);if(g||C){const R=()=>{if(e.f){const P=g?Y(p,c)?p[c]:d[c]:c.value;r?N(P)&&ns(P,i):N(P)?P.includes(i)||P.push(i):g?(d[c]=[i],Y(p,c)&&(p[c]=d[c])):(c.value=[i],e.k&&(d[e.k]=c.value))}else g?(d[c]=o,Y(p,c)&&(p[c]=o)):C&&(c.value=o,e.k&&(d[e.k]=o))};o?(R.id=-1,de(R,n)):R()}}}let je=!1;const Xt=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",Zt=e=>e.nodeType===8;function El(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:f}}=e,d=(_,y)=>{if(!y.hasChildNodes()){n(null,_,y),an(),y._vnode=_;return}je=!1,p(y.firstChild,_,null,null,null),an(),y._vnode=_,je&&console.error("Hydration completed but contains mismatches.")},p=(_,y,H,I,K,q=!1)=>{const k=Zt(_)&&_.data==="[",E=()=>P(_,y,H,I,K,k),{type:j,ref:U,shapeFlag:W,patchFlag:O}=y;let V=_.nodeType;y.el=_,O===-2&&(q=!1,y.dynamicChildren=null);let M=null;switch(j){case bt:V!==3?y.children===""?(c(y.el=r(""),o(_),_),M=_):M=E():(_.data!==y.children&&(je=!0,_.data=y.children),M=i(_));break;case be:V!==8||k?M=E():M=i(_);break;case Ft:if(k&&(_=i(_),V=_.nodeType),V===1||V===3){M=_;const ge=!y.children.length;for(let X=0;X{q=q||!!y.dynamicChildren;const{type:k,props:E,patchFlag:j,shapeFlag:U,dirs:W}=y,O=k==="input"&&W||k==="option";if(O||j!==-1){if(W&&Fe(y,null,H,"created"),E)if(O||!q||j&48)for(const M in E)(O&&M.endsWith("value")||jt(M)&&!Rt(M))&&s(_,M,null,E[M],!1,void 0,H);else E.onClick&&s(_,"onClick",null,E.onClick,!1,void 0,H);let V;if((V=E&&E.onVnodeBeforeMount)&&ve(V,H,y),W&&Fe(y,null,H,"beforeMount"),((V=E&&E.onVnodeMounted)||W)&&zr(()=>{V&&ve(V,H,y),W&&Fe(y,null,H,"mounted")},I),U&16&&!(E&&(E.innerHTML||E.textContent))){let M=C(_.firstChild,y,_,H,I,K,q);for(;M;){je=!0;const ge=M;M=M.nextSibling,l(ge)}}else U&8&&_.textContent!==y.children&&(je=!0,_.textContent=y.children)}return _.nextSibling},C=(_,y,H,I,K,q,k)=>{k=k||!!y.dynamicChildren;const E=y.children,j=E.length;for(let U=0;U{const{slotScopeIds:k}=y;k&&(K=K?K.concat(k):k);const E=o(_),j=C(i(_),y,E,H,I,K,q);return j&&Zt(j)&&j.data==="]"?i(y.anchor=j):(je=!0,c(y.anchor=f("]"),E,j),j)},P=(_,y,H,I,K,q)=>{if(je=!0,y.el=null,q){const j=$(_);for(;;){const U=i(_);if(U&&U!==j)l(U);else break}}const k=i(_),E=o(_);return l(_),n(null,y,E,k,H,I,Xt(E),K),k},$=_=>{let y=0;for(;_;)if(_=i(_),_&&Zt(_)&&(_.data==="["&&y++,_.data==="]")){if(y===0)return i(_);y--}return _};return[d,p]}const de=zr;function Tl(e){return fi(e)}function Al(e){return fi(e,El)}function fi(e,t){const n=Bn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:f,setElementText:d,parentNode:p,nextSibling:g,setScopeId:C=Pe,insertStaticContent:R}=e,P=(a,u,h,b=null,m=null,x=null,A=!1,w=null,T=!!u.dynamicChildren)=>{if(a===u)return;a&&!Ge(a,u)&&(b=kt(a),Ie(a,m,x,!0),a=null),u.patchFlag===-2&&(T=!1,u.dynamicChildren=null);const{type:v,ref:S,shapeFlag:F}=u;switch(v){case bt:$(a,u,h,b);break;case be:_(a,u,h,b);break;case Ft:a==null&&y(u,h,b,A);break;case he:O(a,u,h,b,m,x,A,w,T);break;default:F&1?K(a,u,h,b,m,x,A,w,T):F&6?V(a,u,h,b,m,x,A,w,T):(F&64||F&128)&&v.process(a,u,h,b,m,x,A,w,T,ot)}S!=null&&m&&hn(S,a&&a.ref,x,u||a,!u)},$=(a,u,h,b)=>{if(a==null)s(u.el=l(u.children),h,b);else{const m=u.el=a.el;u.children!==a.children&&f(m,u.children)}},_=(a,u,h,b)=>{a==null?s(u.el=c(u.children||""),h,b):u.el=a.el},y=(a,u,h,b)=>{[a.el,a.anchor]=R(a.children,u,h,b,a.el,a.anchor)},H=({el:a,anchor:u},h,b)=>{let m;for(;a&&a!==u;)m=g(a),s(a,h,b),a=m;s(u,h,b)},I=({el:a,anchor:u})=>{let h;for(;a&&a!==u;)h=g(a),r(a),a=h;r(u)},K=(a,u,h,b,m,x,A,w,T)=>{A=A||u.type==="svg",a==null?q(u,h,b,m,x,A,w,T):j(a,u,m,x,A,w,T)},q=(a,u,h,b,m,x,A,w)=>{let T,v;const{type:S,props:F,shapeFlag:L,transition:B,dirs:z}=a;if(T=a.el=o(a.type,x,F&&F.is,F),L&8?d(T,a.children):L&16&&E(a.children,T,null,b,m,x&&S!=="foreignObject",A,w),z&&Fe(a,null,b,"created"),k(T,a,a.scopeId,A,b),F){for(const Z in F)Z!=="value"&&!Rt(Z)&&i(T,Z,null,F[Z],x,a.children,b,m,Le);"value"in F&&i(T,"value",null,F.value),(v=F.onVnodeBeforeMount)&&ve(v,b,a)}z&&Fe(a,null,b,"beforeMount");const G=(!m||m&&!m.pendingBranch)&&B&&!B.persisted;G&&B.beforeEnter(T),s(T,u,h),((v=F&&F.onVnodeMounted)||G||z)&&de(()=>{v&&ve(v,b,a),G&&B.enter(T),z&&Fe(a,null,b,"mounted")},m)},k=(a,u,h,b,m)=>{if(h&&C(a,h),b)for(let x=0;x{for(let v=T;v{const w=u.el=a.el;let{patchFlag:T,dynamicChildren:v,dirs:S}=u;T|=a.patchFlag&16;const F=a.props||te,L=u.props||te;let B;h&&Je(h,!1),(B=L.onVnodeBeforeUpdate)&&ve(B,h,u,a),S&&Fe(u,a,h,"beforeUpdate"),h&&Je(h,!0);const z=m&&u.type!=="foreignObject";if(v?U(a.dynamicChildren,v,w,h,b,z,x):A||Q(a,u,w,null,h,b,z,x,!1),T>0){if(T&16)W(w,u,F,L,h,b,m);else if(T&2&&F.class!==L.class&&i(w,"class",null,L.class,m),T&4&&i(w,"style",F.style,L.style,m),T&8){const G=u.dynamicProps;for(let Z=0;Z{B&&ve(B,h,u,a),S&&Fe(u,a,h,"updated")},b)},U=(a,u,h,b,m,x,A)=>{for(let w=0;w{if(h!==b){if(h!==te)for(const w in h)!Rt(w)&&!(w in b)&&i(a,w,h[w],null,A,u.children,m,x,Le);for(const w in b){if(Rt(w))continue;const T=b[w],v=h[w];T!==v&&w!=="value"&&i(a,w,v,T,A,u.children,m,x,Le)}"value"in b&&i(a,"value",h.value,b.value)}},O=(a,u,h,b,m,x,A,w,T)=>{const v=u.el=a?a.el:l(""),S=u.anchor=a?a.anchor:l("");let{patchFlag:F,dynamicChildren:L,slotScopeIds:B}=u;B&&(w=w?w.concat(B):B),a==null?(s(v,h,b),s(S,h,b),E(u.children,h,S,m,x,A,w,T)):F>0&&F&64&&L&&a.dynamicChildren?(U(a.dynamicChildren,L,h,m,x,A,w),(u.key!=null||m&&u===m.subTree)&&Cs(a,u,!0)):Q(a,u,h,S,m,x,A,w,T)},V=(a,u,h,b,m,x,A,w,T)=>{u.slotScopeIds=w,a==null?u.shapeFlag&512?m.ctx.activate(u,h,b,A,T):M(u,h,b,m,x,A,T):ge(a,u,T)},M=(a,u,h,b,m,x,A)=>{const w=a.component=$l(a,b,m);if(Dt(a)&&(w.ctx.renderer=ot),Ul(w),w.asyncDep){if(m&&m.registerDep(w,X),!a.el){const T=w.subTree=re(be);_(null,T,u,h)}return}X(w,a,u,h,m,x,A)},ge=(a,u,h)=>{const b=u.component=a.component;if(Vo(a,u,h))if(b.asyncDep&&!b.asyncResolved){ne(b,u,h);return}else b.next=u,Uo(b.update),b.update();else u.el=a.el,b.vnode=u},X=(a,u,h,b,m,x,A)=>{const w=()=>{if(a.isMounted){let{next:S,bu:F,u:L,parent:B,vnode:z}=a,G=S,Z;Je(a,!1),S?(S.el=z.el,ne(a,S,A)):S=z,F&&tn(F),(Z=S.props&&S.props.onVnodeBeforeUpdate)&&ve(Z,B,S,z),Je(a,!0);const ie=Fn(a),xe=a.subTree;a.subTree=ie,P(xe,ie,p(xe.el),kt(xe),a,m,x),S.el=ie.el,G===null&&qo(a,ie.el),L&&de(L,m),(Z=S.props&&S.props.onVnodeUpdated)&&de(()=>ve(Z,B,S,z),m)}else{let S;const{el:F,props:L}=u,{bm:B,m:z,parent:G}=a,Z=gt(u);if(Je(a,!1),B&&tn(B),!Z&&(S=L&&L.onVnodeBeforeMount)&&ve(S,G,u),Je(a,!0),F&&On){const ie=()=>{a.subTree=Fn(a),On(F,a.subTree,a,m,null)};Z?u.type.__asyncLoader().then(()=>!a.isUnmounted&&ie()):ie()}else{const ie=a.subTree=Fn(a);P(null,ie,h,b,a,m,x),u.el=ie.el}if(z&&de(z,m),!Z&&(S=L&&L.onVnodeMounted)){const ie=u;de(()=>ve(S,G,ie),m)}(u.shapeFlag&256||G&>(G.vnode)&&G.vnode.shapeFlag&256)&&a.a&&de(a.a,m),a.isMounted=!0,u=h=b=null}},T=a.effect=new cs(w,()=>vn(v),a.scope),v=a.update=()=>T.run();v.id=a.uid,Je(a,!0),v()},ne=(a,u,h)=>{u.component=a;const b=a.vnode.props;a.vnode=u,a.next=null,vl(a,u.props,b,h),xl(a,u.children,h),Ct(),$s(),wt()},Q=(a,u,h,b,m,x,A,w,T=!1)=>{const v=a&&a.children,S=a?a.shapeFlag:0,F=u.children,{patchFlag:L,shapeFlag:B}=u;if(L>0){if(L&128){Kt(v,F,h,b,m,x,A,w,T);return}else if(L&256){ze(v,F,h,b,m,x,A,w,T);return}}B&8?(S&16&&Le(v,m,x),F!==v&&d(h,F)):S&16?B&16?Kt(v,F,h,b,m,x,A,w,T):Le(v,m,x,!0):(S&8&&d(h,""),B&16&&E(F,h,b,m,x,A,w,T))},ze=(a,u,h,b,m,x,A,w,T)=>{a=a||ft,u=u||ft;const v=a.length,S=u.length,F=Math.min(v,S);let L;for(L=0;LS?Le(a,m,x,!0,!1,F):E(u,h,b,m,x,A,w,T,F)},Kt=(a,u,h,b,m,x,A,w,T)=>{let v=0;const S=u.length;let F=a.length-1,L=S-1;for(;v<=F&&v<=L;){const B=a[v],z=u[v]=T?Ke(u[v]):Te(u[v]);if(Ge(B,z))P(B,z,h,null,m,x,A,w,T);else break;v++}for(;v<=F&&v<=L;){const B=a[F],z=u[L]=T?Ke(u[L]):Te(u[L]);if(Ge(B,z))P(B,z,h,null,m,x,A,w,T);else break;F--,L--}if(v>F){if(v<=L){const B=L+1,z=BL)for(;v<=F;)Ie(a[v],m,x,!0),v++;else{const B=v,z=v,G=new Map;for(v=z;v<=L;v++){const me=u[v]=T?Ke(u[v]):Te(u[v]);me.key!=null&&G.set(me.key,v)}let Z,ie=0;const xe=L-z+1;let lt=!1,As=0;const xt=new Array(xe);for(v=0;v=xe){Ie(me,m,x,!0);continue}let Oe;if(me.key!=null)Oe=G.get(me.key);else for(Z=z;Z<=L;Z++)if(xt[Z-z]===0&&Ge(me,u[Z])){Oe=Z;break}Oe===void 0?Ie(me,m,x,!0):(xt[Oe-z]=v+1,Oe>=As?As=Oe:lt=!0,P(me,u[Oe],h,null,m,x,A,w,T),ie++)}const Rs=lt?Rl(xt):ft;for(Z=Rs.length-1,v=xe-1;v>=0;v--){const me=z+v,Oe=u[me],Ps=me+1{const{el:x,type:A,transition:w,children:T,shapeFlag:v}=a;if(v&6){Ye(a.component.subTree,u,h,b);return}if(v&128){a.suspense.move(u,h,b);return}if(v&64){A.move(a,u,h,ot);return}if(A===he){s(x,u,h);for(let F=0;Fw.enter(x),m);else{const{leave:F,delayLeave:L,afterLeave:B}=w,z=()=>s(x,u,h),G=()=>{F(x,()=>{z(),B&&B()})};L?L(x,z,G):G()}else s(x,u,h)},Ie=(a,u,h,b=!1,m=!1)=>{const{type:x,props:A,ref:w,children:T,dynamicChildren:v,shapeFlag:S,patchFlag:F,dirs:L}=a;if(w!=null&&hn(w,null,h,a,!0),S&256){u.ctx.deactivate(a);return}const B=S&1&&L,z=!gt(a);let G;if(z&&(G=A&&A.onVnodeBeforeUnmount)&&ve(G,u,a),S&6)Li(a.component,h,b);else{if(S&128){a.suspense.unmount(h,b);return}B&&Fe(a,null,u,"beforeUnmount"),S&64?a.type.remove(a,u,h,m,ot,b):v&&(x!==he||F>0&&F&64)?Le(v,u,h,!1,!0):(x===he&&F&384||!m&&S&16)&&Le(T,u,h),b&&Es(a)}(z&&(G=A&&A.onVnodeUnmounted)||B)&&de(()=>{G&&ve(G,u,a),B&&Fe(a,null,u,"unmounted")},h)},Es=a=>{const{type:u,el:h,anchor:b,transition:m}=a;if(u===he){Si(h,b);return}if(u===Ft){I(a);return}const x=()=>{r(h),m&&!m.persisted&&m.afterLeave&&m.afterLeave()};if(a.shapeFlag&1&&m&&!m.persisted){const{leave:A,delayLeave:w}=m,T=()=>A(h,x);w?w(a.el,x,T):T()}else x()},Si=(a,u)=>{let h;for(;a!==u;)h=g(a),r(a),a=h;r(u)},Li=(a,u,h)=>{const{bum:b,scope:m,update:x,subTree:A,um:w}=a;b&&tn(b),m.stop(),x&&(x.active=!1,Ie(A,a,u,h)),w&&de(w,u),de(()=>{a.isUnmounted=!0},u),u&&u.pendingBranch&&!u.isUnmounted&&a.asyncDep&&!a.asyncResolved&&a.suspenseId===u.pendingId&&(u.deps--,u.deps===0&&u.resolve())},Le=(a,u,h,b=!1,m=!1,x=0)=>{for(let A=x;Aa.shapeFlag&6?kt(a.component.subTree):a.shapeFlag&128?a.suspense.next():g(a.anchor||a.el),Ts=(a,u,h)=>{a==null?u._vnode&&Ie(u._vnode,null,null,!0):P(u._vnode||null,a,u,null,null,null,h),$s(),an(),u._vnode=a},ot={p:P,um:Ie,m:Ye,r:Es,mt:M,mc:E,pc:Q,pbc:U,n:kt,o:e};let In,On;return t&&([In,On]=t(ot)),{render:Ts,hydrate:In,createApp:_l(Ts,In)}}function Je({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Cs(e,t,n=!1){const s=e.children,r=t.children;if(N(s)&&N(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}const Pl=e=>e.__isTeleport,Ot=e=>e&&(e.disabled||e.disabled===""),Js=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Zn=(e,t)=>{const n=e&&e.to;return se(n)?t?t(n):null:n},Il={__isTeleport:!0,process(e,t,n,s,r,i,o,l,c,f){const{mc:d,pc:p,pbc:g,o:{insert:C,querySelector:R,createText:P,createComment:$}}=f,_=Ot(t.props);let{shapeFlag:y,children:H,dynamicChildren:I}=t;if(e==null){const K=t.el=P(""),q=t.anchor=P("");C(K,n,s),C(q,n,s);const k=t.target=Zn(t.props,R),E=t.targetAnchor=P("");k&&(C(E,k),o=o||Js(k));const j=(U,W)=>{y&16&&d(H,U,W,r,i,o,l,c)};_?j(n,q):k&&j(k,E)}else{t.el=e.el;const K=t.anchor=e.anchor,q=t.target=e.target,k=t.targetAnchor=e.targetAnchor,E=Ot(e.props),j=E?n:q,U=E?K:k;if(o=o||Js(q),I?(g(e.dynamicChildren,I,j,r,i,o,l),Cs(e,t,!0)):c||p(e,t,j,U,r,i,o,l,!1),_)E||Qt(t,n,K,f,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const W=t.target=Zn(t.props,R);W&&Qt(t,W,null,f,0)}else E&&Qt(t,q,k,f,1)}ui(t)},remove(e,t,n,s,{um:r,o:{remove:i}},o){const{shapeFlag:l,children:c,anchor:f,targetAnchor:d,target:p,props:g}=e;if(p&&i(d),(o||!Ot(g))&&(i(f),l&16))for(let C=0;C0?Re||ft:null,Fl(),Ut>0&&Re&&Re.push(e),e}function ia(e,t,n,s,r,i){return hi(mi(e,t,n,s,r,i,!0))}function pi(e,t,n,s,r){return hi(re(e,t,n,s,r,!0))}function pn(e){return e?e.__v_isVNode===!0:!1}function Ge(e,t){return e.type===t.type&&e.key===t.key}const Rn="__vInternal",gi=({key:e})=>e??null,sn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?se(e)||ce(e)||D(e)?{i:ae,r:e,k:t,f:!!n}:e:null);function mi(e,t=null,n=null,s=0,r=null,i=e===he?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&gi(t),ref:t&&sn(t),scopeId:wn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:ae};return l?(ws(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=se(n)?8:16),Ut>0&&!o&&Re&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Re.push(c),c}const re=Ml;function Ml(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===ei)&&(e=be),pn(e)){const l=qe(e,t,!0);return n&&ws(l,n),Ut>0&&!i&&Re&&(l.shapeFlag&6?Re[Re.indexOf(e)]=l:Re.push(l)),l.patchFlag|=-2,l}if(Kl(e)&&(e=e.__vccOpts),t){t=Sl(t);let{class:l,style:c}=t;l&&!se(l)&&(t.class=os(l)),ee(c)&&(jr(c)&&!N(c)&&(c=oe({},c)),t.style=is(c))}const o=se(e)?1:zo(e)?128:Pl(e)?64:ee(e)?4:D(e)?2:0;return mi(e,t,n,s,r,o,i,!0)}function Sl(e){return e?jr(e)||Rn in e?oe({},e):e:null}function qe(e,t,n=!1){const{props:s,ref:r,patchFlag:i,children:o}=e,l=t?Ll(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&gi(l),ref:t&&t.ref?n&&r?N(r)?r.concat(sn(t)):[r,sn(t)]:sn(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==he?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&qe(e.ssContent),ssFallback:e.ssFallback&&qe(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function _i(e=" ",t=0){return re(bt,null,e,t)}function oa(e,t){const n=re(Ft,null,e);return n.staticCount=t,n}function la(e="",t=!1){return t?(di(),pi(be,null,e)):re(be,null,e)}function Te(e){return e==null||typeof e=="boolean"?re(be):N(e)?re(he,null,e.slice()):typeof e=="object"?Ke(e):re(bt,null,String(e))}function Ke(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:qe(e)}function ws(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(N(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),ws(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!(Rn in t)?t._ctx=ae:r===3&&ae&&(ae.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else D(t)?(t={default:t,_ctx:ae},n=32):(t=String(t),s&64?(n=16,t=[_i(t)]):n=8);e.children=t,e.shapeFlag|=n}function Ll(...e){const t={};for(let n=0;nle||ae;let xs,ct,Zs="__VUE_INSTANCE_SETTERS__";(ct=Bn()[Zs])||(ct=Bn()[Zs]=[]),ct.push(e=>le=e),xs=e=>{ct.length>1?ct.forEach(t=>t(e)):ct[0](e)};const yt=e=>{xs(e),e.scope.on()},rt=()=>{le&&le.scope.off(),xs(null)};function yi(e){return e.vnode.shapeFlag&4}let vt=!1;function Ul(e,t=!1){vt=t;const{props:n,children:s}=e.vnode,r=yi(e);yl(e,n,r,t),wl(e,s);const i=r?jl(e,t):void 0;return vt=!1,i}function jl(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Pt(new Proxy(e.ctx,al));const{setup:s}=n;if(s){const r=e.setupContext=s.length>1?Ci(e):null;yt(e),Ct();const i=We(s,e,0,[e.props,r]);if(wt(),rt(),xr(i)){if(i.then(rt,rt),t)return i.then(o=>{Qs(e,o,t)}).catch(o=>{Bt(o,e,0)});e.asyncDep=i}else Qs(e,i,t)}else vi(e,t)}function Qs(e,t,n){D(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ee(t)&&(e.setupState=Dr(t)),vi(e,n)}let Gs;function vi(e,t,n){const s=e.type;if(!e.render){if(!t&&Gs&&!s.render){const r=s.template||ys(e).template;if(r){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,f=oe(oe({isCustomElement:i,delimiters:l},o),c);s.render=Gs(r,f)}}e.render=s.render||Pe}yt(e),Ct(),ul(e),wt(),rt()}function Bl(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return pe(e,"get","$attrs"),t[n]}}))}function Ci(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return Bl(e)},slots:e.slots,emit:e.emit,expose:t}}function Pn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Dr(Pt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in It)return It[n](e)},has(t,n){return n in t||n in It}}))}function Dl(e,t=!0){return D(e)?e.displayName||e.name:e.name||t&&e.__name}function Kl(e){return D(e)&&"__vccOpts"in e}const Ee=(e,t)=>No(e,t,vt);function Qn(e,t,n){const s=arguments.length;return s===2?ee(t)&&!N(t)?pn(t)?re(e,null,[t]):re(e,t):re(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&pn(n)&&(n=[n]),re(e,t,n))}const kl=Symbol.for("v-scx"),Wl=()=>mt(kl),Vl="3.3.2",ql="http://www.w3.org/2000/svg",et=typeof document<"u"?document:null,er=et&&et.createElement("template"),zl={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?et.createElementNS(ql,e):et.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>et.createTextNode(e),createComment:e=>et.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>et.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{er.innerHTML=s?`${e}`:e;const l=er.content;if(s){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]}};function Yl(e,t,n){const s=e._vtc;s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function Jl(e,t,n){const s=e.style,r=se(n);if(n&&!r){if(t&&!se(t))for(const i in t)n[i]==null&&Gn(s,i,"");for(const i in n)Gn(s,i,n[i])}else{const i=s.display;r?t!==n&&(s.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(s.display=i)}}const tr=/\s*!important$/;function Gn(e,t,n){if(N(n))n.forEach(s=>Gn(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Xl(e,t);tr.test(n)?e.setProperty(it(s),n.replace(tr,""),"important"):e[s]=n}}const nr=["Webkit","Moz","ms"],Nn={};function Xl(e,t){const n=Nn[t];if(n)return n;let s=Se(t);if(s!=="filter"&&s in e)return Nn[t]=s;s=_n(s);for(let r=0;rHn||(nc.then(()=>Hn=0),Hn=Date.now());function rc(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;we(ic(s,n.value),t,5,[s])};return n.value=e,n.attached=sc(),n}function ic(e,t){if(N(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 ir=/^on[a-z]/,oc=(e,t,n,s,r=!1,i,o,l,c)=>{t==="class"?Yl(e,s,r):t==="style"?Jl(e,n,s):jt(t)?ts(t)||ec(e,t,n,s,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):lc(e,t,s,r))?Ql(e,t,s,i,o,l,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Zl(e,t,s,r))};function lc(e,t,n,s){return s?!!(t==="innerHTML"||t==="textContent"||t in e&&ir.test(t)&&D(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||ir.test(t)&&se(n)?!1:t in e}const Be="transition",Et="animation",wi=(e,{slots:t})=>Qn(Qo,cc(e),t);wi.displayName="Transition";const xi={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};wi.props=oe({},Jr,xi);const Xe=(e,t=[])=>{N(e)?e.forEach(n=>n(...t)):e&&e(...t)},or=e=>e?N(e)?e.some(t=>t.length>1):e.length>1:!1;function cc(e){const t={};for(const O in e)O in xi||(t[O]=e[O]);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:d=l,leaveFromClass:p=`${n}-leave-from`,leaveActiveClass:g=`${n}-leave-active`,leaveToClass:C=`${n}-leave-to`}=e,R=ac(r),P=R&&R[0],$=R&&R[1],{onBeforeEnter:_,onEnter:y,onEnterCancelled:H,onLeave:I,onLeaveCancelled:K,onBeforeAppear:q=_,onAppear:k=y,onAppearCancelled:E=H}=t,j=(O,V,M)=>{Ze(O,V?d:l),Ze(O,V?f:o),M&&M()},U=(O,V)=>{O._isLeaving=!1,Ze(O,p),Ze(O,C),Ze(O,g),V&&V()},W=O=>(V,M)=>{const ge=O?k:y,X=()=>j(V,O,M);Xe(ge,[V,X]),lr(()=>{Ze(V,O?c:i),De(V,O?d:l),or(ge)||cr(V,s,P,X)})};return oe(t,{onBeforeEnter(O){Xe(_,[O]),De(O,i),De(O,o)},onBeforeAppear(O){Xe(q,[O]),De(O,c),De(O,f)},onEnter:W(!1),onAppear:W(!0),onLeave(O,V){O._isLeaving=!0;const M=()=>U(O,V);De(O,p),dc(),De(O,g),lr(()=>{O._isLeaving&&(Ze(O,p),De(O,C),or(I)||cr(O,s,$,M))}),Xe(I,[O,M])},onEnterCancelled(O){j(O,!1),Xe(H,[O])},onAppearCancelled(O){j(O,!0),Xe(E,[O])},onLeaveCancelled(O){U(O),Xe(K,[O])}})}function ac(e){if(e==null)return null;if(ee(e))return[$n(e.enter),$n(e.leave)];{const t=$n(e);return[t,t]}}function $n(e){return Di(e)}function De(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function Ze(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function lr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let fc=0;function cr(e,t,n,s){const r=e._endId=++fc,i=()=>{r===e._endId&&s()};if(n)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=uc(e,t);if(!o)return s();const f=o+"end";let d=0;const p=()=>{e.removeEventListener(f,g),i()},g=C=>{C.target===e&&++d>=c&&p()};setTimeout(()=>{d(n[R]||"").split(", "),r=s(`${Be}Delay`),i=s(`${Be}Duration`),o=ar(r,i),l=s(`${Et}Delay`),c=s(`${Et}Duration`),f=ar(l,c);let d=null,p=0,g=0;t===Be?o>0&&(d=Be,p=o,g=i.length):t===Et?f>0&&(d=Et,p=f,g=c.length):(p=Math.max(o,f),d=p>0?o>f?Be:Et:null,g=d?d===Be?i.length:c.length:0);const C=d===Be&&/\b(transform|all)(,|$)/.test(s(`${Be}Property`).toString());return{type:d,timeout:p,propCount:g,hasTransform:C}}function ar(e,t){for(;e.lengthfr(n)+fr(e[s])))}function fr(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function dc(){return document.body.offsetHeight}const ur=e=>{const t=e.props["onUpdate:modelValue"]||!1;return N(t)?n=>tn(t,n):t};function hc(e){e.target.composing=!0}function dr(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const ca={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e._assign=ur(r);const i=s||r.props&&r.props.type==="number";at(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=jn(l)),e._assign(l)}),n&&at(e,"change",()=>{e.value=e.value.trim()}),t||(at(e,"compositionstart",hc),at(e,"compositionend",dr),at(e,"change",dr))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:s,number:r}},i){if(e._assign=ur(i),e.composing||document.activeElement===e&&e.type!=="range"&&(n||s&&e.value.trim()===t||(r||e.type==="number")&&jn(e.value)===t))return;const o=t??"";e.value!==o&&(e.value=o)}},pc=["ctrl","shift","alt","meta"],gc={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)=>pc.some(n=>e[`${n}Key`]&&!t.includes(n))},aa=(e,t)=>(n,...s)=>{for(let r=0;rn=>{if(!("key"in n))return;const s=it(n.key);if(t.some(r=>r===s||mc[r]===s))return e(n)},Ei=oe({patchProp:oc},zl);let St,hr=!1;function _c(){return St||(St=Tl(Ei))}function bc(){return St=hr?St:Al(Ei),hr=!0,St}const ua=(...e)=>{const t=_c().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Ti(s);if(!r)return;const i=t._component;!D(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.innerHTML="";const o=n(r,!1,r instanceof SVGElement);return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t},da=(...e)=>{const t=bc().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Ti(s);if(r)return n(r,!0,r instanceof SVGElement)},t};function Ti(e){return se(e)?document.querySelector(e):e}const ha=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},yc=window.__VP_SITE_DATA__,Ai=/^[a-z]+:/i,pa=/^pathname:\/\//,ga="vitepress-theme-appearance",Ri=/#.*$/,vc=/(index)?\.(md|html)$/,Ce=typeof document<"u",Pi={relativePath:"",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function Cc(e,t,n=!1){if(t===void 0)return!1;if(e=pr(`/${e}`),n)return new RegExp(t).test(e);if(pr(t)!==e)return!1;const s=t.match(Ri);return s?(Ce?location.hash:"")===s[0]:!0}function pr(e){return decodeURI(e).replace(Ri,"").replace(vc,"")}function wc(e){return Ai.test(e)}function xc(e,t){var s,r,i,o,l,c,f;const n=Object.keys(e.locales).find(d=>d!=="root"&&!wc(d)&&Cc(t,`/${d}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Oi(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(f=e.locales[n])==null?void 0:f.themeConfig}})}function Ii(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=Ec(e.title,s);return`${n}${r}`}function Ec(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Tc(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,o])=>i===n&&o[r[0]]===r[1])}function Oi(e,t){return[...e.filter(n=>!Tc(t,n)),...t]}const Ac=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Rc=/^[a-z]:/i;function gr(e){const t=Rc.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Ac,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}function ma(e){return e.replace(/\\/g,"/")}const Pc=Symbol(),nt=Ao(yc);function _a(e){const t=Ee(()=>xc(nt.value,e.data.relativePath));return{site:t,theme:Ee(()=>t.value.themeConfig),page:Ee(()=>e.data),frontmatter:Ee(()=>e.data.frontmatter),params:Ee(()=>e.data.params),lang:Ee(()=>t.value.lang),dir:Ee(()=>t.value.dir),localeIndex:Ee(()=>t.value.localeIndex||"root"),title:Ee(()=>Ii(t.value,e.data)),description:Ee(()=>e.data.description||t.value.description),isDark:ht(!1)}}function ba(){const e=mt(Pc);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Ic(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function mr(e){return Ai.test(e)||e.startsWith(".")?e:Ic(nt.value.base,e)}function Oc(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),Ce){const n="/MagiskChineseDocument/";t=gr(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),t=`${n}assets/${t}.${s}.js`}else t=`./${gr(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let rn=[];function ya(e){rn.push(e),An(()=>{rn=rn.filter(t=>t!==e)})}const Fc=Symbol(),_r="http://a.com",Mc=()=>({path:"/",component:null,data:Pi});function va(e,t){const n=yn(Mc()),s={route:n,go:r};async function r(l=Ce?location.href:"/"){var f,d;await((f=s.onBeforeRouteChange)==null?void 0:f.call(s,l));const c=new URL(l,_r);nt.value.cleanUrls||!c.pathname.endsWith("/")&&!c.pathname.endsWith(".html")&&(c.pathname+=".html",l=c.pathname+c.search+c.hash),Ce&&l!==location.href&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",l)),await o(l),await((d=s.onAfterRouteChanged)==null?void 0:d.call(s,l))}let i=null;async function o(l,c=0,f=!1){const d=new URL(l,_r),p=i=d.pathname;try{let g=await e(p);if(i===p){i=null;const{default:C,__pageData:R}=g;if(!C)throw new Error(`Invalid route component: ${C}`);n.path=Ce?p:mr(p),n.component=Pt(C),n.data=Pt(R),Ce&&kr(()=>{let P=nt.value.base+R.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!nt.value.cleanUrls&&!P.endsWith("/")&&(P+=".html"),P!==d.pathname&&(d.pathname=P,l=P+d.search+d.hash,history.replaceState(null,"",l)),d.hash&&!c){let $=null;try{$=document.querySelector(decodeURIComponent(d.hash))}catch(_){console.warn(_)}if($){br($,d.hash);return}}window.scrollTo(0,c)})}}catch(g){if(!/fetch/.test(g.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(g),!f)try{const C=await fetch(nt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await C.json(),await o(l,c,!0);return}catch{}i===p&&(i=null,n.path=Ce?p:mr(p),n.component=t?Pt(t):null,n.data=Pi)}}return Ce&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const f=l.target.closest("a");if(f&&!f.closest(".vp-raw")&&(f instanceof SVGElement||!f.download)){const{target:d}=f,{href:p,origin:g,pathname:C,hash:R,search:P}=new URL(f.href instanceof SVGAnimatedString?f.href.animVal:f.href,f.baseURI),$=window.location,_=C.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&d!=="_blank"&&g===$.origin&&!(_&&_[0]!==".html")&&(l.preventDefault(),C===$.pathname&&P===$.search?R&&(R!==$.hash&&(history.pushState(null,"",R),window.dispatchEvent(new Event("hashchange"))),br(f,R,f.classList.contains("header-anchor"))):r(p))}},{capture:!0}),window.addEventListener("popstate",l=>{o(location.href,l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function Sc(){const e=mt(Fc);if(!e)throw new Error("useRouter() is called without provider.");return e}function Fi(){return Sc().route}function br(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.querySelector(decodeURIComponent(t))}catch(r){console.warn(r)}if(s){const r=nt.value.scrollOffset;let i=0;if(typeof r=="number")i=r;else if(typeof r=="string")i=yr(r);else if(Array.isArray(r))for(const c of r){const f=yr(c);if(f){i=f;break}}const o=parseInt(window.getComputedStyle(s).paddingTop,10),l=window.scrollY+s.getBoundingClientRect().top-i+o;!n||Math.abs(l-window.scrollY)>window.innerHeight?window.scrollTo(0,l):window.scrollTo({left:0,top:l,behavior:"smooth"})}}function yr(e){const t=document.querySelector(e);if(!t)return 0;const n=t.getBoundingClientRect().bottom;return n<0?0:n+24}const vr=()=>rn.forEach(e=>e()),Ca=_s({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Fi();return()=>Qn(e.as,{style:{position:"relative"}},[t.component?Qn(t.component,{onVnodeMounted:vr,onVnodeUpdated:vr}):"404 Page Not Found"])}}),Lc="modulepreload",Nc=function(e){return"/MagiskChineseDocument/"+e},Cr={},wa=function(t,n,s){if(!n||n.length===0)return t();const r=document.getElementsByTagName("link");return Promise.all(n.map(i=>{if(i=Nc(i),i in Cr)return;Cr[i]=!0;const o=i.endsWith(".css"),l=o?'[rel="stylesheet"]':"";if(!!s)for(let d=r.length-1;d>=0;d--){const p=r[d];if(p.href===i&&(!o||p.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${l}`))return;const f=document.createElement("link");if(f.rel=o?"stylesheet":Lc,o||(f.as="script",f.crossOrigin=""),f.href=i,document.head.appendChild(f),o)return new Promise((d,p)=>{f.addEventListener("load",d),f.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${i}`)))})})).then(()=>t())};function xa(e,t){let n=[],s=!0;const r=i=>{if(s){s=!1;return}n.forEach(o=>document.head.removeChild(o)),n=[],i.forEach(o=>{const l=Hc(o);document.head.appendChild(l),n.push(l)})};Yo(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[];document.title=Ii(o,i),document.querySelector("meta[name=description]").setAttribute("content",l||o.description),r(Oi(o.head,Uc(c)))})}function Hc([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),s}function $c(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Uc(e){return e.filter(t=>!$c(t))}const Un=new Set,Mi=()=>document.createElement("link"),jc=e=>{const t=Mi();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Bc=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let Gt;const Dc=Ce&&(Gt=Mi())&&Gt.relList&&Gt.relList.supports&&Gt.relList.supports("prefetch")?jc:Bc;function Ea(){if(!Ce||!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(!Un.has(c)){Un.add(c);const f=Oc(c);Dc(f)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{target:o}=i,{hostname:l,pathname:c}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),f=c.match(/\.\w+$/);f&&f[0]!==".html"||o!=="_blank"&&l===location.hostname&&(c!==location.pathname?n.observe(i):Un.add(c))})})};Tn(s);const r=Fi();nn(()=>r.path,s),An(()=>{n&&n.disconnect()})}const Ta=_s({setup(e,{slots:t}){const n=ht(!1);return Tn(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Aa(){if(Ce){const e=new Map;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);let l="";i.querySelectorAll("span.line:not(.diff.remove)").forEach(c=>l+=(c.textContent||"")+` -`),l=l.slice(0,-1),o&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),Kc(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 Kc(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 Ra(){Ce&&window.addEventListener("click",e=>{var n,s;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement,i=Array.from((r==null?void 0:r.querySelectorAll("input"))||[]).indexOf(t),o=r==null?void 0:r.querySelector('div[class*="language-"].active'),l=(s=r==null?void 0:r.querySelectorAll('div[class*="language-"]:not(.language-id)'))==null?void 0:s[i];o&&l&&o!==l&&(o.classList.remove("active"),l.classList.add("active"))}})}export{ya as $,Fi as A,An as B,mi as C,pi as D,Ko as E,he as F,la as G,Qc as H,Ll as I,re as J,is as K,Zc as L,wa as M,Gc as N,Ai as O,pa as P,Ce as Q,ea as R,zc as S,wi as T,Yc as U,oa as V,ga as W,mt as X,bl as Y,rl as Z,ha as _,_i as a,fa as a0,na as a1,Jc as a2,aa as a3,sa as a4,xa as a5,Fc as a6,_a as a7,Pc as a8,Ca as a9,Ta as aa,nt as ab,da as ac,va as ad,Oc as ae,Ea as af,Aa as ag,Ra as ah,Qn as ai,Sc as aj,Gr as ak,Xc as al,ca as am,ra as an,Pt as ao,ua as ap,ma as aq,Po as b,ia as c,_s as d,qc as e,Ur as f,Vc as g,ht as h,Xi as i,Wc as j,Yo as k,Ee as l,ce as m,os as n,di as o,bi as p,Tn as q,ta as r,Ao as s,kc as t,ba as u,kr as v,nn as w,wc as x,mr as y,Cc as z}; diff --git a/assets/chunks/theme.1c7a0dc0.js b/assets/chunks/theme.1c7a0dc0.js deleted file mode 100644 index f877c828..00000000 --- a/assets/chunks/theme.1c7a0dc0.js +++ /dev/null @@ -1,7 +0,0 @@ -import{d as y,o as a,c as l,r as d,n as A,a as O,t as I,_ as m,u as Mt,b as i,e as It,f as Le,g as xt,h as S,i as Nt,j as Ct,w as K,k as ee,l as w,m as At,s as le,p as Tt,q as R,v as nt,x as Bt,P as Ot,y as Me,z as te,A as ce,B as Ie,C as _,F as C,D as $,E as p,T as xe,G as g,H as X,I as ve,J as f,K as ot,L as Et,M as Ht,N as Q,O as st,Q as Dt,R as E,S as F,U as j,V as zt,W as Re,X as Ne,Y as pe,Z as Ft,$ as se,a0 as jt,a1 as Gt,a2 as Rt,a3 as Ut,a4 as Wt}from"./framework.fc84ac3a.js";const Kt=y({__name:"VPBadge",props:{text:{},type:{}},setup(t){return(e,n)=>(a(),l("span",{class:A(["VPBadge",e.type??"tip"])},[d(e.$slots,"default",{},()=>[O(I(e.text),1)],!0)],2))}});const qt=m(Kt,[["__scopeId","data-v-ce917cfb"]]),M=Mt;function Ce(t){return Nt()?(Ct(t),!0):!1}function U(t){return typeof t=="function"?t():i(t)}const at=typeof window<"u",ae=()=>{},Ue=Yt();function Yt(){var t;return at&&((t=window==null?void 0:window.navigator)==null?void 0:t.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent)}function Jt(t,e){function n(...o){return new Promise((s,r)=>{Promise.resolve(t(()=>e.apply(this,o),{fn:e,thisArg:this,args:o})).then(s).catch(r)})}return n}const rt=t=>t();function Xt(t,e={}){let n,o,s=ae;const r=v=>{clearTimeout(v),s(),s=ae};return v=>{const u=U(t),h=U(e.maxWait);return n&&r(n),u<=0||h!==void 0&&h<=0?(o&&(r(o),o=null),Promise.resolve(v())):new Promise((b,V)=>{s=e.rejectOnCancel?V:b,h&&!o&&(o=setTimeout(()=>{n&&r(n),o=null,b(v())},h)),n=setTimeout(()=>{o&&r(o),o=null,b(v())},u)})}}function Qt(t=rt){const e=S(!0);function n(){e.value=!1}function o(){e.value=!0}const s=(...r)=>{e.value&&t(...r)};return{isActive:Le(e),pause:n,resume:o,eventFilter:s}}function it(...t){if(t.length!==1)return It(...t);const e=t[0];return typeof e=="function"?Le(xt(()=>({get:e,set:ae}))):S(e)}var We=Object.getOwnPropertySymbols,Zt=Object.prototype.hasOwnProperty,en=Object.prototype.propertyIsEnumerable,tn=(t,e)=>{var n={};for(var o in t)Zt.call(t,o)&&e.indexOf(o)<0&&(n[o]=t[o]);if(t!=null&&We)for(var o of We(t))e.indexOf(o)<0&&en.call(t,o)&&(n[o]=t[o]);return n};function lt(t,e,n={}){const o=n,{eventFilter:s=rt}=o,r=tn(o,["eventFilter"]);return K(t,Jt(s,e),r)}var nn=Object.defineProperty,on=Object.defineProperties,sn=Object.getOwnPropertyDescriptors,fe=Object.getOwnPropertySymbols,ct=Object.prototype.hasOwnProperty,ut=Object.prototype.propertyIsEnumerable,Ke=(t,e,n)=>e in t?nn(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,an=(t,e)=>{for(var n in e||(e={}))ct.call(e,n)&&Ke(t,n,e[n]);if(fe)for(var n of fe(e))ut.call(e,n)&&Ke(t,n,e[n]);return t},rn=(t,e)=>on(t,sn(e)),ln=(t,e)=>{var n={};for(var o in t)ct.call(t,o)&&e.indexOf(o)<0&&(n[o]=t[o]);if(t!=null&&fe)for(var o of fe(t))e.indexOf(o)<0&&ut.call(t,o)&&(n[o]=t[o]);return n};function Wl(t,e,n={}){const o=n,{debounce:s=0,maxWait:r=void 0}=o,c=ln(o,["debounce","maxWait"]);return lt(t,e,rn(an({},c),{eventFilter:Xt(s,{maxWait:r})}))}var cn=Object.defineProperty,un=Object.defineProperties,dn=Object.getOwnPropertyDescriptors,he=Object.getOwnPropertySymbols,dt=Object.prototype.hasOwnProperty,_t=Object.prototype.propertyIsEnumerable,qe=(t,e,n)=>e in t?cn(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,_n=(t,e)=>{for(var n in e||(e={}))dt.call(e,n)&&qe(t,n,e[n]);if(he)for(var n of he(e))_t.call(e,n)&&qe(t,n,e[n]);return t},vn=(t,e)=>un(t,dn(e)),pn=(t,e)=>{var n={};for(var o in t)dt.call(t,o)&&e.indexOf(o)<0&&(n[o]=t[o]);if(t!=null&&he)for(var o of he(t))e.indexOf(o)<0&&_t.call(t,o)&&(n[o]=t[o]);return n};function fn(t,e,n={}){const o=n,{eventFilter:s}=o,r=pn(o,["eventFilter"]),{eventFilter:c,pause:v,resume:u,isActive:h}=Qt(s);return{stop:lt(t,e,vn(_n({},r),{eventFilter:c})),pause:v,resume:u,isActive:h}}function Kl(t,e,n){let o;At(n)?o={evaluating:n}:o=n||{};const{lazy:s=!1,evaluating:r=void 0,shallow:c=!0,onError:v=ae}=o,u=S(!s),h=c?le(e):S(e);let b=0;return ee(async V=>{if(!u.value)return;b++;const k=b;let P=!1;r&&Promise.resolve().then(()=>{r.value=!0});try{const x=await t(N=>{V(()=>{r&&(r.value=!1),P||N()})});k===b&&(h.value=x)}catch(x){v(x)}finally{r&&k===b&&(r.value=!1),P=!0}}),s?w(()=>(u.value=!0,h.value)):h}function hn(t){var e;const n=U(t);return(e=n==null?void 0:n.$el)!=null?e:n}const W=at?window:void 0;function re(...t){let e,n,o,s;if(typeof t[0]=="string"||Array.isArray(t[0])?([n,o,s]=t,e=W):[e,n,o,s]=t,!e)return ae;Array.isArray(n)||(n=[n]),Array.isArray(o)||(o=[o]);const r=[],c=()=>{r.forEach(b=>b()),r.length=0},v=(b,V,k,P)=>(b.addEventListener(V,k,P),()=>b.removeEventListener(V,k,P)),u=K(()=>[hn(e),U(s)],([b,V])=>{c(),b&&r.push(...n.flatMap(k=>o.map(P=>v(b,k,P,V))))},{immediate:!0,flush:"post"}),h=()=>{u(),c()};return Ce(h),h}function mn(t){return typeof t=="function"?t:typeof t=="string"?e=>e.key===t:Array.isArray(t)?e=>t.includes(e.key):()=>!0}function gn(...t){let e,n,o={};t.length===3?(e=t[0],n=t[1],o=t[2]):t.length===2?typeof t[1]=="object"?(e=!0,n=t[0],o=t[1]):(e=t[0],n=t[1]):(e=!0,n=t[0]);const{target:s=W,eventName:r="keydown",passive:c=!1,dedupe:v=!1}=o,u=mn(e);return re(s,r,b=>{b.repeat&&U(v)||u(b)&&n(b)},c)}function yn(){const t=S(!1);return Tt()&&R(()=>{t.value=!0}),t}function bn(t){const e=yn();return w(()=>(e.value,!!t()))}function we(t,e={}){const{window:n=W}=e,o=bn(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const r=S(!1),c=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",v):s.removeListener(v))},v=()=>{o.value&&(c(),s=n.matchMedia(it(t).value),r.value=!!(s!=null&&s.matches),s&&("addEventListener"in s?s.addEventListener("change",v):s.addListener(v)))};return ee(v),Ce(()=>c()),r}const de=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},_e="__vueuse_ssr_handlers__",$n=kn();function kn(){return _e in de||(de[_e]=de[_e]||{}),de[_e]}function Pn(t,e){return $n[t]||e}function wn(t){return t==null?"any":t instanceof Set?"set":t instanceof Map?"map":t instanceof Date?"date":typeof t=="boolean"?"boolean":typeof t=="string"?"string":typeof t=="object"?"object":Number.isNaN(t)?"any":"number"}var Vn=Object.defineProperty,Ye=Object.getOwnPropertySymbols,Sn=Object.prototype.hasOwnProperty,Ln=Object.prototype.propertyIsEnumerable,Je=(t,e,n)=>e in t?Vn(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,Xe=(t,e)=>{for(var n in e||(e={}))Sn.call(e,n)&&Je(t,n,e[n]);if(Ye)for(var n of Ye(e))Ln.call(e,n)&&Je(t,n,e[n]);return t};const Mn={boolean:{read:t=>t==="true",write:t=>String(t)},object:{read:t=>JSON.parse(t),write:t=>JSON.stringify(t)},number:{read:t=>Number.parseFloat(t),write:t=>String(t)},any:{read:t=>t,write:t=>String(t)},string:{read:t=>t,write:t=>String(t)},map:{read:t=>new Map(JSON.parse(t)),write:t=>JSON.stringify(Array.from(t.entries()))},set:{read:t=>new Set(JSON.parse(t)),write:t=>JSON.stringify(Array.from(t))},date:{read:t=>new Date(t),write:t=>t.toISOString()}},Qe="vueuse-storage";function vt(t,e,n,o={}){var s;const{flush:r="pre",deep:c=!0,listenToStorageChanges:v=!0,writeDefaults:u=!0,mergeDefaults:h=!1,shallow:b,window:V=W,eventFilter:k,onError:P=T=>{console.error(T)}}=o,x=(b?le:S)(e);if(!n)try{n=Pn("getDefaultStorage",()=>{var T;return(T=W)==null?void 0:T.localStorage})()}catch(T){P(T)}if(!n)return x;const N=U(e),L=wn(N),B=(s=o.serializer)!=null?s:Mn[L],{pause:z,resume:D}=fn(x,()=>Vt(x.value),{flush:r,deep:c,eventFilter:k});return V&&v&&(re(V,"storage",ke),re(V,Qe,Lt)),ke(),x;function Vt(T){try{if(T==null)n.removeItem(t);else{const H=B.write(T),Y=n.getItem(t);Y!==H&&(n.setItem(t,H),V&&V.dispatchEvent(new CustomEvent(Qe,{detail:{key:t,oldValue:Y,newValue:H,storageArea:n}})))}}catch(H){P(H)}}function St(T){const H=T?T.newValue:n.getItem(t);if(H==null)return u&&N!==null&&n.setItem(t,B.write(N)),N;if(!T&&h){const Y=B.read(H);return typeof h=="function"?h(Y,N):L==="object"&&!Array.isArray(Y)?Xe(Xe({},N),Y):Y}else return typeof H!="string"?H:B.read(H)}function Lt(T){ke(T.detail)}function ke(T){if(!(T&&T.storageArea!==n)){if(T&&T.key==null){x.value=N;return}if(!(T&&T.key!==t)){z();try{x.value=St(T)}catch(H){P(H)}finally{T?nt(D):D()}}}}}function ql(t,e,n={}){const{window:o=W}=n;return vt(t,e,o==null?void 0:o.localStorage,n)}function pt(t){const e=window.getComputedStyle(t);if(e.overflowX==="scroll"||e.overflowY==="scroll"||e.overflowX==="auto"&&t.clientHeight1?!0:(e.preventDefault&&e.preventDefault(),!1)}function Yl(t,e=!1){const n=S(e);let o=null,s;K(it(t),v=>{if(v){const u=v;s=u.style.overflow,n.value&&(u.style.overflow="hidden")}},{immediate:!0});const r=()=>{const v=U(t);!v||n.value||(Ue&&(o=re(v,"touchmove",u=>{In(u)},{passive:!1})),v.style.overflow="hidden",n.value=!0)},c=()=>{const v=U(t);!v||!n.value||(Ue&&(o==null||o()),v.style.overflow=s,n.value=!1)};return Ce(c),w({get(){return n.value},set(v){v?r():c()}})}function Jl(t,e,n={}){const{window:o=W}=n;return vt(t,e,o==null?void 0:o.sessionStorage,n)}function xn({window:t=W}={}){if(!t)return{x:S(0),y:S(0)};const e=S(t.scrollX),n=S(t.scrollY);return re(t,"scroll",()=>{e.value=t.scrollX,n.value=t.scrollY},{capture:!1,passive:!0}),{x:e,y:n}}function Nn(t,e){let n,o=!1;return()=>{n&&clearTimeout(n),o?n=setTimeout(t,e):(t(),o=!0,setTimeout(()=>{o=!1},e))}}function Ve(t){return/^\//.test(t)?t:`/${t}`}function ie(t){if(Bt(t))return t.replace(Ot,"");const{site:e}=M(),{pathname:n,search:o,hash:s}=new URL(t,"http://example.com"),r=n.endsWith("/")||n.endsWith(".html")?t:t.replace(/(?:(^\.+)\/)?.*$/,`$1${n.replace(/(\.md)?$/,e.value.cleanUrls?"":".html")}${o}${s}`);return Me(r)}function ft(t,e){if(Array.isArray(t))return t;if(t==null)return[];e=Ve(e);const n=Object.keys(t).sort((o,s)=>s.split("/").length-o.split("/").length).find(o=>e.startsWith(Ve(o)));return n?t[n]:[]}function Cn(t){const e=[];let n=0;for(const o in t){const s=t[o];if(s.items){n=e.push(s);continue}e[n]||e.push({items:[]}),e[n].items.push(s)}return e}function An(t){const e=[];function n(o){for(const s of o)s.text&&s.link&&e.push({text:s.text,link:s.link}),s.items&&n(s.items)}return n(t),e}function Se(t,e){return Array.isArray(e)?e.some(n=>Se(t,n)):te(t,e.link)?!0:e.items?Se(t,e.items):!1}function G(){const t=ce(),{theme:e,frontmatter:n}=M(),o=we("(min-width: 960px)"),s=S(!1),r=w(()=>{const x=e.value.sidebar,N=t.data.relativePath;return x?ft(x,N):[]}),c=w(()=>n.value.sidebar!==!1&&r.value.length>0&&n.value.layout!=="home"),v=w(()=>u?n.value.aside==null?e.value.aside==="left":n.value.aside==="left":!1),u=w(()=>n.value.layout==="home"?!1:n.value.aside!=null?!!n.value.aside:e.value.aside!==!1),h=w(()=>c.value&&o.value),b=w(()=>c.value?Cn(r.value):[]);function V(){s.value=!0}function k(){s.value=!1}function P(){s.value?k():V()}return{isOpen:s,sidebar:r,sidebarGroups:b,hasSidebar:c,hasAside:u,leftAside:v,isSidebarEnabled:h,open:V,close:k,toggle:P}}function Tn(t,e){let n;ee(()=>{n=t.value?document.activeElement:void 0}),R(()=>{window.addEventListener("keyup",o)}),Ie(()=>{window.removeEventListener("keyup",o)});function o(s){s.key==="Escape"&&t.value&&(e(),n==null||n.focus())}}function Bn(t){const{page:e}=M(),n=S(!1),o=w(()=>t.value.collapsed!=null),s=w(()=>!!t.value.link),r=w(()=>te(e.value.relativePath,t.value.link)),c=w(()=>r.value?!0:t.value.items?Se(e.value.relativePath,t.value.items):!1),v=w(()=>!!(t.value.items&&t.value.items.length));ee(()=>{n.value=!!(o.value&&t.value.collapsed)}),ee(()=>{(r.value||c.value)&&(n.value=!1)});function u(){o.value&&(n.value=!n.value)}return{collapsed:n,collapsible:o,isLink:s,isActiveLink:r,hasActiveLink:c,hasChildren:v,toggle:u}}const On=y({__name:"VPSkipLink",setup(t){const e=ce(),n=S();K(()=>e.path,()=>n.value.focus());function o({target:s}){const r=document.querySelector(decodeURIComponent(s.hash));if(r){const c=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",c)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",c),r.focus(),window.scrollTo(0,0)}}return(s,r)=>(a(),l(C,null,[_("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),_("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o}," Skip to content ")],64))}});const En=m(On,[["__scopeId","data-v-73e3a132"]]),Hn={key:0,class:"VPBackdrop"},Dn=y({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(t){return(e,n)=>(a(),$(xe,{name:"fade"},{default:p(()=>[e.show?(a(),l("div",Hn)):g("",!0)]),_:1}))}});const zn=m(Dn,[["__scopeId","data-v-54a304ca"]]);function Fn(){const t=S(!1);function e(){t.value=!0,window.addEventListener("resize",s)}function n(){t.value=!1,window.removeEventListener("resize",s)}function o(){t.value?n():e()}function s(){window.outerWidth>=768&&n()}const r=ce();return K(()=>r.path,n),{isScreenOpen:t,openScreen:e,closeScreen:n,toggleScreen:o}}function ue({removeCurrent:t=!0,correspondingLink:e=!1}={}){const{site:n,localeIndex:o,page:s,theme:r}=M(),c=w(()=>{var u,h;return{label:(u=n.value.locales[o.value])==null?void 0:u.label,link:((h=n.value.locales[o.value])==null?void 0:h.link)||(o.value==="root"?"/":`/${o.value}/`)}});return{localeLinks:w(()=>Object.entries(n.value.locales).flatMap(([u,h])=>t&&c.value.label===h.label?[]:{text:h.label,link:jn(h.link||(u==="root"?"/":`/${u}/`),r.value.i18nRouting!==!1&&e,s.value.relativePath.slice(c.value.link.length-1),!n.value.cleanUrls)})),currentLang:c}}function jn(t,e,n,o){return e?t.replace(/\/$/,"")+Ve(n.replace(/(^|\/)?index.md$/,"$1").replace(/\.md$/,o?".html":"")):t}const Gn=["src","alt"],Rn={inheritAttrs:!1},Un=y({...Rn,__name:"VPImage",props:{image:{},alt:{}},setup(t){return(e,n)=>{const o=X("VPImage",!0);return e.image?(a(),l(C,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),l("img",ve({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:i(Me)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,Gn)):(a(),l(C,{key:1},[f(o,ve({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),f(o,ve({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):g("",!0)}}});const Ae=m(Un,[["__scopeId","data-v-dc109a54"]]),Wn=["href"],Kn=y({__name:"VPNavBarTitle",setup(t){const{site:e,theme:n}=M(),{hasSidebar:o}=G(),{currentLang:s}=ue();return(r,c)=>(a(),l("div",{class:A(["VPNavBarTitle",{"has-sidebar":i(o)}])},[_("a",{class:"title",href:i(ie)(i(s).link)},[d(r.$slots,"nav-bar-title-before",{},void 0,!0),i(n).logo?(a(),$(Ae,{key:0,class:"logo",image:i(n).logo},null,8,["image"])):g("",!0),i(n).siteTitle?(a(),l(C,{key:1},[O(I(i(n).siteTitle),1)],64)):i(n).siteTitle===void 0?(a(),l(C,{key:2},[O(I(i(e).title),1)],64)):g("",!0),d(r.$slots,"nav-bar-title-after",{},void 0,!0)],8,Wn)],2))}});const qn=m(Kn,[["__scopeId","data-v-1ab7b21f"]]);const Yn={type:"button",class:"DocSearch DocSearch-Button","aria-label":"Search"},Jn={class:"DocSearch-Button-Container"},Xn=_("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[_("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),Qn={class:"DocSearch-Button-Placeholder"},Zn=_("span",{class:"DocSearch-Button-Keys"},[_("kbd",{class:"DocSearch-Button-Key"}),_("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Ze=y({__name:"VPNavBarSearchButton",props:{placeholder:{}},setup(t){return(e,n)=>(a(),l("button",Yn,[_("span",Jn,[Xn,_("span",Qn,I(e.placeholder),1)]),Zn]))}});const eo={id:"local-search"},to={key:1,id:"docsearch"},no=y({__name:"VPNavBarSearch",setup(t){const e=Et(()=>Ht(()=>import("./VPLocalSearchBox.9fe80cd9.js"),["assets/chunks/VPLocalSearchBox.9fe80cd9.js","assets/chunks/framework.fc84ac3a.js"])),n=()=>null,{theme:o,localeIndex:s}=M(),r=S(!1),c=w(()=>{var P,x,N,L,B,z,D;const k=((P=o.value.search)==null?void 0:P.options)??o.value.algolia;return((B=(L=(N=(x=k==null?void 0:k.locales)==null?void 0:x[s.value])==null?void 0:N.translations)==null?void 0:L.button)==null?void 0:B.buttonText)||((D=(z=k==null?void 0:k.translations)==null?void 0:z.button)==null?void 0:D.buttonText)||"Search"});R(()=>{});function v(){r.value||(r.value=!0,setTimeout(u,16))}function u(){const k=new Event("keydown");k.key="k",k.metaKey=!0,window.dispatchEvent(k),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||u()},16)}const h=S(!1);gn("k",k=>{(k.ctrlKey||k.metaKey)&&(k.preventDefault(),h.value=!0)});const b=S("'Meta'");R(()=>{b.value=/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"'⌘'":"'Ctrl'"});const V="local";return(k,P)=>{var x;return a(),l("div",{class:"VPNavBarSearch",style:ot({"--vp-meta-key":b.value})},[i(V)==="local"?(a(),l(C,{key:0},[h.value?(a(),$(i(e),{key:0,placeholder:c.value,onClose:P[0]||(P[0]=N=>h.value=!1)},null,8,["placeholder"])):g("",!0),_("div",eo,[f(Ze,{placeholder:c.value,onClick:P[1]||(P[1]=N=>h.value=!0)},null,8,["placeholder"])])],64)):i(V)==="algolia"?(a(),l(C,{key:1},[r.value?(a(),$(i(n),{key:0,algolia:((x=i(o).search)==null?void 0:x.options)??i(o).algolia},null,8,["algolia"])):(a(),l("div",to,[f(Ze,{placeholder:c.value,onClick:v},null,8,["placeholder"])]))],64)):g("",!0)],4)}}});const oo={},so={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",height:"24px",viewBox:"0 0 24 24",width:"24px"},ao=_("path",{d:"M0 0h24v24H0V0z",fill:"none"},null,-1),ro=_("path",{d:"M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z"},null,-1),io=[ao,ro];function lo(t,e){return a(),l("svg",so,io)}const co=m(oo,[["render",lo]]),uo=y({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(t){const e=t,n=w(()=>e.tag??e.href?"a":"span"),o=w(()=>e.href&&st.test(e.href));return(s,r)=>(a(),$(Q(n.value),{class:A(["VPLink",{link:s.href}]),href:s.href?i(ie)(s.href):void 0,target:s.target||(o.value?"_blank":void 0),rel:s.rel||(o.value?"noreferrer":void 0)},{default:p(()=>[d(s.$slots,"default",{},void 0,!0),o.value&&!s.noIcon?(a(),$(co,{key:0,class:"icon"})):g("",!0)]),_:3},8,["class","href","target","rel"]))}});const q=m(uo,[["__scopeId","data-v-f3ed0000"]]),_o=y({__name:"VPNavBarMenuLink",props:{item:{}},setup(t){const{page:e}=M();return(n,o)=>(a(),$(q,{class:A({VPNavBarMenuLink:!0,active:i(te)(i(e).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel,tabindex:"0"},{default:p(()=>[O(I(n.item.text),1)]),_:1},8,["class","href","target","rel"]))}});const vo=m(_o,[["__scopeId","data-v-b7aed9c7"]]),Te=S();let ht=!1,Pe=0;function po(t){const e=S(!1);if(Dt){!ht&&fo(),Pe++;const n=K(Te,o=>{var s,r,c;o===t.el.value||(s=t.el.value)!=null&&s.contains(o)?(e.value=!0,(r=t.onFocus)==null||r.call(t)):(e.value=!1,(c=t.onBlur)==null||c.call(t))});Ie(()=>{n(),Pe--,Pe||ho()})}return Le(e)}function fo(){document.addEventListener("focusin",mt),ht=!0,Te.value=document.activeElement}function ho(){document.removeEventListener("focusin",mt)}function mt(){Te.value=document.activeElement}const mo={},go={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},yo=_("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),bo=[yo];function $o(t,e){return a(),l("svg",go,bo)}const gt=m(mo,[["render",$o]]),ko={},Po={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},wo=_("circle",{cx:"12",cy:"12",r:"2"},null,-1),Vo=_("circle",{cx:"19",cy:"12",r:"2"},null,-1),So=_("circle",{cx:"5",cy:"12",r:"2"},null,-1),Lo=[wo,Vo,So];function Mo(t,e){return a(),l("svg",Po,Lo)}const Io=m(ko,[["render",Mo]]),xo={class:"VPMenuLink"},No=y({__name:"VPMenuLink",props:{item:{}},setup(t){const{page:e}=M();return(n,o)=>(a(),l("div",xo,[f(q,{class:A({active:i(te)(i(e).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel},{default:p(()=>[O(I(n.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const be=m(No,[["__scopeId","data-v-fd8d5e7a"]]),Co={class:"VPMenuGroup"},Ao={key:0,class:"title"},To=y({__name:"VPMenuGroup",props:{text:{},items:{}},setup(t){return(e,n)=>(a(),l("div",Co,[e.text?(a(),l("p",Ao,I(e.text),1)):g("",!0),(a(!0),l(C,null,E(e.items,o=>(a(),l(C,null,["link"in o?(a(),$(be,{key:0,item:o},null,8,["item"])):g("",!0)],64))),256))]))}});const Bo=m(To,[["__scopeId","data-v-a6b0397c"]]),Oo={class:"VPMenu"},Eo={key:0,class:"items"},Ho=y({__name:"VPMenu",props:{items:{}},setup(t){return(e,n)=>(a(),l("div",Oo,[e.items?(a(),l("div",Eo,[(a(!0),l(C,null,E(e.items,o=>(a(),l(C,{key:o.text},["link"in o?(a(),$(be,{key:0,item:o},null,8,["item"])):(a(),$(Bo,{key:1,text:o.text,items:o.items},null,8,["text","items"]))],64))),128))])):g("",!0),d(e.$slots,"default",{},void 0,!0)]))}});const Do=m(Ho,[["__scopeId","data-v-e42ed9b3"]]),zo=["aria-expanded","aria-label"],Fo={key:0,class:"text"},jo={class:"menu"},Go=y({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(t){const e=S(!1),n=S();po({el:n,onBlur:o});function o(){e.value=!1}return(s,r)=>(a(),l("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:r[1]||(r[1]=c=>e.value=!0),onMouseleave:r[2]||(r[2]=c=>e.value=!1)},[_("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(),l("span",Fo,[s.icon?(a(),$(Q(s.icon),{key:0,class:"option-icon"})):g("",!0),O(" "+I(s.button)+" ",1),f(gt,{class:"text-icon"})])):(a(),$(Io,{key:1,class:"icon"}))],8,zo),_("div",jo,[f(Do,{items:s.items},{default:p(()=>[d(s.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const Be=m(Go,[["__scopeId","data-v-6afe904b"]]),Ro=y({__name:"VPNavBarMenuGroup",props:{item:{}},setup(t){const{page:e}=M();return(n,o)=>(a(),$(Be,{class:A({VPNavBarMenuGroup:!0,active:i(te)(i(e).relativePath,n.item.activeMatch,!!n.item.activeMatch)}),button:n.item.text,items:n.item.items},null,8,["class","button","items"]))}}),Uo=t=>(F("data-v-f732b5d0"),t=t(),j(),t),Wo={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Ko=Uo(()=>_("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),qo=y({__name:"VPNavBarMenu",setup(t){const{theme:e}=M();return(n,o)=>i(e).nav?(a(),l("nav",Wo,[Ko,(a(!0),l(C,null,E(i(e).nav,s=>(a(),l(C,{key:s.text},["link"in s?(a(),$(vo,{key:0,item:s},null,8,["item"])):(a(),$(Ro,{key:1,item:s},null,8,["item"]))],64))),128))])):g("",!0)}});const Yo=m(qo,[["__scopeId","data-v-f732b5d0"]]),Jo={},Xo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Qo=_("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Zo=_("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),es=[Qo,Zo];function ts(t,e){return a(),l("svg",Xo,es)}const yt=m(Jo,[["render",ts]]),ns={class:"items"},os={class:"title"},ss=y({__name:"VPNavBarTranslations",setup(t){const{theme:e}=M(),{localeLinks:n,currentLang:o}=ue({correspondingLink:!0});return(s,r)=>i(n).length&&i(o).label?(a(),$(Be,{key:0,class:"VPNavBarTranslations",icon:yt,label:i(e).langMenuLabel||"Change language"},{default:p(()=>[_("div",ns,[_("p",os,I(i(o).label),1),(a(!0),l(C,null,E(i(n),c=>(a(),$(be,{key:c.link,item:c},null,8,["item"]))),128))])]),_:1},8,["label"])):g("",!0)}});const as=m(ss,[["__scopeId","data-v-ff4524ae"]]);const rs={},is={class:"VPSwitch",type:"button",role:"switch"},ls={class:"check"},cs={key:0,class:"icon"};function us(t,e){return a(),l("button",is,[_("span",ls,[t.$slots.default?(a(),l("span",cs,[d(t.$slots,"default",{},void 0,!0)])):g("",!0)])])}const ds=m(rs,[["render",us],["__scopeId","data-v-92d8f6fb"]]),_s={},vs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ps=zt('',9),fs=[ps];function hs(t,e){return a(),l("svg",vs,fs)}const ms=m(_s,[["render",hs]]),gs={},ys={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},bs=_("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),$s=[bs];function ks(t,e){return a(),l("svg",ys,$s)}const Ps=m(gs,[["render",ks]]),ws={title:"toggle dark mode"},Vs=y({__name:"VPSwitchAppearance",setup(t){const{site:e,isDark:n}=M(),o=S(!1),s=typeof localStorage<"u"?r():()=>{};R(()=>{o.value=document.documentElement.classList.contains("dark")});function r(){const c=window.matchMedia("(prefers-color-scheme: dark)"),v=document.documentElement.classList;let u=localStorage.getItem(Re),h=e.value.appearance==="dark"&&u==null||(u==="auto"||u==null?c.matches:u==="dark");c.onchange=k=>{u==="auto"&&V(h=k.matches)};function b(){V(h=!h),u=h?c.matches?"auto":"dark":c.matches?"light":"auto",localStorage.setItem(Re,u)}function V(k){const P=document.createElement("style");P.type="text/css",P.appendChild(document.createTextNode(`:not(.VPSwitchAppearance):not(.VPSwitchAppearance *) { - -webkit-transition: none !important; - -moz-transition: none !important; - -o-transition: none !important; - -ms-transition: none !important; - transition: none !important; -}`)),document.head.appendChild(P),o.value=k,v[k?"add":"remove"]("dark"),window.getComputedStyle(P).opacity,document.head.removeChild(P)}return b}return K(o,c=>{n.value=c}),(c,v)=>(a(),l("label",ws,[f(ds,{class:"VPSwitchAppearance","aria-checked":o.value,onClick:i(s)},{default:p(()=>[f(ms,{class:"sun"}),f(Ps,{class:"moon"})]),_:1},8,["aria-checked","onClick"])]))}});const Oe=m(Vs,[["__scopeId","data-v-67878c63"]]),Ss={key:0,class:"VPNavBarAppearance"},Ls=y({__name:"VPNavBarAppearance",setup(t){const{site:e}=M();return(n,o)=>i(e).appearance?(a(),l("div",Ss,[f(Oe)])):g("",!0)}});const Ms=m(Ls,[["__scopeId","data-v-5e9f0637"]]),Is={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',youtube:'YouTube'},xs=["href","aria-label","innerHTML"],Ns=y({__name:"VPSocialLink",props:{icon:{},link:{}},setup(t){const e=t,n=w(()=>typeof e.icon=="object"?e.icon.svg:Is[e.icon]);return(o,s)=>(a(),l("a",{class:"VPSocialLink",href:o.link,"aria-label":typeof o.icon=="string"?o.icon:"",target:"_blank",rel:"noopener",innerHTML:n.value},null,8,xs))}});const Cs=m(Ns,[["__scopeId","data-v-dbecf575"]]),As={class:"VPSocialLinks"},Ts=y({__name:"VPSocialLinks",props:{links:{}},setup(t){return(e,n)=>(a(),l("div",As,[(a(!0),l(C,null,E(e.links,({link:o,icon:s})=>(a(),$(Cs,{key:o,icon:s,link:o},null,8,["icon","link"]))),128))]))}});const Ee=m(Ts,[["__scopeId","data-v-b8f6762d"]]),Bs=y({__name:"VPNavBarSocialLinks",setup(t){const{theme:e}=M();return(n,o)=>i(e).socialLinks?(a(),$(Ee,{key:0,class:"VPNavBarSocialLinks",links:i(e).socialLinks},null,8,["links"])):g("",!0)}});const Os=m(Bs,[["__scopeId","data-v-ef6192dc"]]),Es={key:0,class:"group translations"},Hs={class:"trans-title"},Ds={key:1,class:"group"},zs={class:"item appearance"},Fs={class:"label"},js={class:"appearance-action"},Gs={key:2,class:"group"},Rs={class:"item social-links"},Us=y({__name:"VPNavBarExtra",setup(t){const{site:e,theme:n}=M(),{localeLinks:o,currentLang:s}=ue({correspondingLink:!0}),r=w(()=>o.value.length&&s.value.label||e.value.appearance||n.value.socialLinks);return(c,v)=>r.value?(a(),$(Be,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:p(()=>[i(o).length&&i(s).label?(a(),l("div",Es,[_("p",Hs,I(i(s).label),1),(a(!0),l(C,null,E(i(o),u=>(a(),$(be,{key:u.link,item:u},null,8,["item"]))),128))])):g("",!0),i(e).appearance?(a(),l("div",Ds,[_("div",zs,[_("p",Fs,I(i(n).darkModeSwitchLabel||"Appearance"),1),_("div",js,[f(Oe)])])])):g("",!0),i(n).socialLinks?(a(),l("div",Gs,[_("div",Rs,[f(Ee,{class:"social-links-list",links:i(n).socialLinks},null,8,["links"])])])):g("",!0)]),_:1})):g("",!0)}});const Ws=m(Us,[["__scopeId","data-v-c8c2ae4b"]]),Ks=t=>(F("data-v-6bee1efd"),t=t(),j(),t),qs=["aria-expanded"],Ys=Ks(()=>_("span",{class:"container"},[_("span",{class:"top"}),_("span",{class:"middle"}),_("span",{class:"bottom"})],-1)),Js=[Ys],Xs=y({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(t){return(e,n)=>(a(),l("button",{type:"button",class:A(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=o=>e.$emit("click"))},Js,10,qs))}});const Qs=m(Xs,[["__scopeId","data-v-6bee1efd"]]),Zs=t=>(F("data-v-c388e33c"),t=t(),j(),t),ea={class:"container"},ta={class:"title"},na={class:"content"},oa=Zs(()=>_("div",{class:"curtain"},null,-1)),sa={class:"content-body"},aa=y({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(t){const{y:e}=xn(),{hasSidebar:n}=G(),o=w(()=>({"has-sidebar":n.value,fill:e.value>0}));return(s,r)=>(a(),l("div",{class:A(["VPNavBar",o.value])},[_("div",ea,[_("div",ta,[f(qn,null,{"nav-bar-title-before":p(()=>[d(s.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[d(s.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),_("div",na,[oa,_("div",sa,[d(s.$slots,"nav-bar-content-before",{},void 0,!0),f(no,{class:"search"}),f(Yo,{class:"menu"}),f(as,{class:"translations"}),f(Ms,{class:"appearance"}),f(Os,{class:"social-links"}),f(Ws,{class:"extra"}),d(s.$slots,"nav-bar-content-after",{},void 0,!0),f(Qs,{class:"hamburger",active:s.isScreenOpen,onClick:r[0]||(r[0]=c=>s.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const ra=m(aa,[["__scopeId","data-v-c388e33c"]]);function ia(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1),Z=[],ge=!1,De=-1,ne=void 0,J=void 0,oe=void 0,bt=function(e){return Z.some(function(n){return!!(n.options.allowTouchMove&&n.options.allowTouchMove(e))})},ye=function(e){var n=e||window.event;return bt(n.target)||n.touches.length>1?!0:(n.preventDefault&&n.preventDefault(),!1)},la=function(e){if(oe===void 0){var n=!!e&&e.reserveScrollBarGap===!0,o=window.innerWidth-document.documentElement.clientWidth;if(n&&o>0){var s=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right"),10);oe=document.body.style.paddingRight,document.body.style.paddingRight=s+o+"px"}}ne===void 0&&(ne=document.body.style.overflow,document.body.style.overflow="hidden")},ca=function(){oe!==void 0&&(document.body.style.paddingRight=oe,oe=void 0),ne!==void 0&&(document.body.style.overflow=ne,ne=void 0)},ua=function(){return window.requestAnimationFrame(function(){if(J===void 0){J={position:document.body.style.position,top:document.body.style.top,left:document.body.style.left};var e=window,n=e.scrollY,o=e.scrollX,s=e.innerHeight;document.body.style.position="fixed",document.body.style.top=-n,document.body.style.left=-o,setTimeout(function(){return window.requestAnimationFrame(function(){var r=s-window.innerHeight;r&&n>=s&&(document.body.style.top=-(n+r))})},300)}})},da=function(){if(J!==void 0){var e=-parseInt(document.body.style.top,10),n=-parseInt(document.body.style.left,10);document.body.style.position=J.position,document.body.style.top=J.top,document.body.style.left=J.left,window.scrollTo(n,e),J=void 0}},_a=function(e){return e?e.scrollHeight-e.scrollTop<=e.clientHeight:!1},va=function(e,n){var o=e.targetTouches[0].clientY-De;return bt(e.target)?!1:n&&n.scrollTop===0&&o>0||_a(n)&&o<0?ye(e):(e.stopPropagation(),!0)},$t=function(e,n){if(!e){console.error("disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.");return}if(!Z.some(function(s){return s.targetElement===e})){var o={targetElement:e,options:n||{}};Z=[].concat(ia(Z),[o]),me?ua():la(n),me&&(e.ontouchstart=function(s){s.targetTouches.length===1&&(De=s.targetTouches[0].clientY)},e.ontouchmove=function(s){s.targetTouches.length===1&&va(s,e)},ge||(document.addEventListener("touchmove",ye,He?{passive:!1}:void 0),ge=!0))}},kt=function(){me&&(Z.forEach(function(e){e.targetElement.ontouchstart=null,e.targetElement.ontouchmove=null}),ge&&(document.removeEventListener("touchmove",ye,He?{passive:!1}:void 0),ge=!1),De=-1),me?da():ca(),Z=[]};const pa=y({__name:"VPNavScreenMenuLink",props:{text:{},link:{}},setup(t){const e=Ne("close-screen");return(n,o)=>(a(),$(q,{class:"VPNavScreenMenuLink",href:n.link,onClick:i(e)},{default:p(()=>[O(I(n.text),1)]),_:1},8,["href","onClick"]))}});const fa=m(pa,[["__scopeId","data-v-a3572c96"]]),ha={},ma={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ga=_("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),ya=[ga];function ba(t,e){return a(),l("svg",ma,ya)}const $a=m(ha,[["render",ba]]),ka=y({__name:"VPNavScreenMenuGroupLink",props:{text:{},link:{}},setup(t){const e=Ne("close-screen");return(n,o)=>(a(),$(q,{class:"VPNavScreenMenuGroupLink",href:n.link,onClick:i(e)},{default:p(()=>[O(I(n.text),1)]),_:1},8,["href","onClick"]))}});const Pt=m(ka,[["__scopeId","data-v-d67c9e09"]]),Pa={class:"VPNavScreenMenuGroupSection"},wa={key:0,class:"title"},Va=y({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(t){return(e,n)=>(a(),l("div",Pa,[e.text?(a(),l("p",wa,I(e.text),1)):g("",!0),(a(!0),l(C,null,E(e.items,o=>(a(),$(Pt,{key:o.text,text:o.text,link:o.link},null,8,["text","link"]))),128))]))}});const Sa=m(Va,[["__scopeId","data-v-1f191989"]]),La=["aria-controls","aria-expanded"],Ma={class:"button-text"},Ia=["id"],xa={key:1,class:"group"},Na=y({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(t){const e=t,n=S(!1),o=w(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function s(){n.value=!n.value}return(r,c)=>(a(),l("div",{class:A(["VPNavScreenMenuGroup",{open:n.value}])},[_("button",{class:"button","aria-controls":o.value,"aria-expanded":n.value,onClick:s},[_("span",Ma,I(r.text),1),f($a,{class:"button-icon"})],8,La),_("div",{id:o.value,class:"items"},[(a(!0),l(C,null,E(r.items,v=>(a(),l(C,{key:v.text},["link"in v?(a(),l("div",{key:v.text,class:"item"},[f(Pt,{text:v.text,link:v.link},null,8,["text","link"])])):(a(),l("div",xa,[f(Sa,{text:v.text,items:v.items},null,8,["text","items"])]))],64))),128))],8,Ia)],2))}});const Ca=m(Na,[["__scopeId","data-v-76b97020"]]),Aa={key:0,class:"VPNavScreenMenu"},Ta=y({__name:"VPNavScreenMenu",setup(t){const{theme:e}=M();return(n,o)=>i(e).nav?(a(),l("nav",Aa,[(a(!0),l(C,null,E(i(e).nav,s=>(a(),l(C,{key:s.text},["link"in s?(a(),$(fa,{key:0,text:s.text,link:s.link},null,8,["text","link"])):(a(),$(Ca,{key:1,text:s.text||"",items:s.items},null,8,["text","items"]))],64))),128))])):g("",!0)}}),Ba={key:0,class:"VPNavScreenAppearance"},Oa={class:"text"},Ea=y({__name:"VPNavScreenAppearance",setup(t){const{site:e,theme:n}=M();return(o,s)=>i(e).appearance?(a(),l("div",Ba,[_("p",Oa,I(i(n).darkModeSwitchLabel||"Appearance"),1),f(Oe)])):g("",!0)}});const Ha=m(Ea,[["__scopeId","data-v-0dc5cf49"]]),Da={class:"list"},za=y({__name:"VPNavScreenTranslations",setup(t){const{localeLinks:e,currentLang:n}=ue({correspondingLink:!0}),o=S(!1);function s(){o.value=!o.value}return(r,c)=>i(e).length&&i(n).label?(a(),l("div",{key:0,class:A(["VPNavScreenTranslations",{open:o.value}])},[_("button",{class:"title",onClick:s},[f(yt,{class:"icon lang"}),O(" "+I(i(n).label)+" ",1),f(gt,{class:"icon chevron"})]),_("ul",Da,[(a(!0),l(C,null,E(i(e),v=>(a(),l("li",{key:v.link,class:"item"},[f(q,{class:"link",href:v.link},{default:p(()=>[O(I(v.text),1)]),_:2},1032,["href"])]))),128))])],2)):g("",!0)}});const Fa=m(za,[["__scopeId","data-v-41505286"]]),ja=y({__name:"VPNavScreenSocialLinks",setup(t){const{theme:e}=M();return(n,o)=>i(e).socialLinks?(a(),$(Ee,{key:0,class:"VPNavScreenSocialLinks",links:i(e).socialLinks},null,8,["links"])):g("",!0)}}),Ga={class:"container"},Ra=y({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(t){const e=S(null);function n(){$t(e.value,{reserveScrollBarGap:!0})}function o(){kt()}return(s,r)=>(a(),$(xe,{name:"fade",onEnter:n,onAfterLeave:o},{default:p(()=>[s.open?(a(),l("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e},[_("div",Ga,[d(s.$slots,"nav-screen-content-before",{},void 0,!0),f(Ta,{class:"menu"}),f(Fa,{class:"translations"}),f(Ha,{class:"appearance"}),f(ja,{class:"social-links"}),d(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):g("",!0)]),_:3}))}});const Ua=m(Ra,[["__scopeId","data-v-183ec3ec"]]),Wa={class:"VPNav"},Ka=y({__name:"VPNav",setup(t){const{isScreenOpen:e,closeScreen:n,toggleScreen:o}=Fn();return pe("close-screen",n),(s,r)=>(a(),l("header",Wa,[f(ra,{"is-screen-open":i(e),onToggleScreen:i(o)},{"nav-bar-title-before":p(()=>[d(s.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[d(s.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[d(s.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[d(s.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),f(Ua,{open:i(e)},{"nav-screen-content-before":p(()=>[d(s.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[d(s.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])]))}});const qa=m(Ka,[["__scopeId","data-v-5bdc5df3"]]),Ya={},Ja={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Xa=_("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),Qa=_("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),Za=_("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),er=_("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),tr=[Xa,Qa,Za,er];function nr(t,e){return a(),l("svg",Ja,tr)}const or=m(Ya,[["render",nr]]);function sr(){const{hasSidebar:t}=G(),e=we("(min-width: 960px)"),n=we("(min-width: 1280px)");return{isAsideEnabled:w(()=>!n.value&&!e.value?!1:t.value?n.value:e.value)}}const ar=71;function ze(t){return typeof t.outline=="object"&&!Array.isArray(t.outline)&&t.outline.label||t.outlineTitle||"On this page"}function Fe(t){const e=[...document.querySelectorAll(".VPDoc h2,h3,h4,h5,h6")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const o=Number(n.tagName[1]);return{title:rr(n),link:"#"+n.id,level:o}});return ir(e,t)}function rr(t){let e="";for(const n of t.childNodes)if(n.nodeType===1){if(n.classList.contains("VPBadge")||n.classList.contains("header-anchor"))continue;e+=n.textContent}else n.nodeType===3&&(e+=n.textContent);return e.trim()}function ir(t,e){if(e===!1)return[];const n=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[o,s]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;t=t.filter(c=>c.level>=o&&c.level<=s);const r=[];e:for(let c=0;c=0;u--){const h=t[u];if(h.level{requestAnimationFrame(r),window.addEventListener("scroll",o)}),Ft(()=>{c(location.hash)}),Ie(()=>{window.removeEventListener("scroll",o)});function r(){if(!n.value)return;const v=[].slice.call(t.value.querySelectorAll(".outline-link")),u=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(P=>v.some(x=>x.hash===P.hash&&P.offsetParent!==null)),h=window.scrollY,b=window.innerHeight,V=document.body.offsetHeight,k=Math.abs(h+b-V)<1;if(u.length&&k){c(u[u.length-1].hash);return}for(let P=0;P{const s=X("VPDocOutlineItem",!0);return a(),l("ul",{class:A(n.root?"root":"nested")},[(a(!0),l(C,null,E(n.headers,({children:r,link:c,title:v})=>(a(),l("li",null,[_("a",{class:"outline-link",href:c,onClick:e,title:v},I(v),9,ur),r!=null&&r.length?(a(),$(s,{key:0,headers:r},null,8,["headers"])):g("",!0)]))),256))],2)}}});const je=m(dr,[["__scopeId","data-v-a379eb72"]]),_r={},vr={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},pr=_("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),fr=[pr];function hr(t,e){return a(),l("svg",vr,fr)}const Ge=m(_r,[["render",hr]]),mr=y({__name:"VPLocalNavOutlineDropdown",setup(t){const{frontmatter:e,theme:n}=M(),o=S(!1),s=S(0),r=S();se(()=>{o.value=!1});function c(){o.value=!o.value,s.value=window.innerHeight+Math.min(window.scrollY-64,0)}function v(b){b.target.classList.contains("outline-link")&&(r.value&&(r.value.style.transition="none"),nt(()=>{o.value=!1}))}function u(){o.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}const h=le([]);return se(()=>{h.value=Fe(e.value.outline??n.value.outline)}),(b,V)=>(a(),l("div",{class:"VPLocalNavOutlineDropdown",style:ot({"--vp-vh":s.value+"px"})},[h.value.length>0?(a(),l("button",{key:0,onClick:c,class:A({open:o.value})},[O(I(i(ze)(i(n)))+" ",1),f(Ge,{class:"icon"})],2)):(a(),l("button",{key:1,onClick:u},I(i(n).returnToTopLabel||"Return to top"),1)),f(xe,{name:"flyout"},{default:p(()=>[o.value?(a(),l("div",{key:0,ref_key:"items",ref:r,class:"items",onClick:v},[_("a",{class:"top-link",href:"#",onClick:u},I(i(n).returnToTopLabel||"Return to top"),1),f(je,{headers:h.value},null,8,["headers"])],512)):g("",!0)]),_:1})],4))}});const gr=m(mr,[["__scopeId","data-v-fb63c957"]]),yr={key:0,class:"VPLocalNav"},br=["aria-expanded"],$r={class:"menu-text"},kr=y({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(t){const{theme:e,frontmatter:n}=M(),{hasSidebar:o}=G();return(s,r)=>i(n).layout!=="home"?(a(),l("div",yr,[i(o)?(a(),l("button",{key:0,class:"menu","aria-expanded":s.open,"aria-controls":"VPSidebarNav",onClick:r[0]||(r[0]=c=>s.$emit("open-menu"))},[f(or,{class:"menu-icon"}),_("span",$r,I(i(e).sidebarMenuLabel||"Menu"),1)],8,br)):g("",!0),f(gr)])):g("",!0)}});const Pr=m(kr,[["__scopeId","data-v-d1e27b08"]]),wr=t=>(F("data-v-0bb349fd"),t=t(),j(),t),Vr=["role","tabindex"],Sr=wr(()=>_("div",{class:"indicator"},null,-1)),Lr=["onKeydown"],Mr={key:1,class:"items"},Ir=y({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(t){const e=t,{collapsed:n,collapsible:o,isLink:s,isActiveLink:r,hasActiveLink:c,hasChildren:v,toggle:u}=Bn(w(()=>e.item)),h=w(()=>v.value?"section":"div"),b=w(()=>s.value?"a":"div"),V=w(()=>v.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),k=w(()=>s.value?void 0:"button"),P=w(()=>[[`level-${e.depth}`],{collapsible:o.value},{collapsed:n.value},{"is-link":s.value},{"is-active":r.value},{"has-active":c.value}]);function x(L){"key"in L&&L.key!=="Enter"||!e.item.link&&u()}function N(){e.item.link&&u()}return(L,B)=>{const z=X("VPSidebarItem",!0);return a(),$(Q(h.value),{class:A(["VPSidebarItem",P.value])},{default:p(()=>[L.item.text?(a(),l("div",ve({key:0,class:"item",role:k.value},Gt(L.item.items?{click:x,keydown:x}:{},!0),{tabindex:L.item.items&&0}),[Sr,L.item.link?(a(),$(q,{key:0,tag:b.value,class:"link",href:L.item.link},{default:p(()=>[(a(),$(Q(V.value),{class:"text",innerHTML:L.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href"])):(a(),$(Q(V.value),{key:1,class:"text",innerHTML:L.item.text},null,8,["innerHTML"])),L.item.collapsed!=null?(a(),l("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:N,onKeydown:jt(N,["enter"]),tabindex:"0"},[f(Ge,{class:"caret-icon"})],40,Lr)):g("",!0)],16,Vr)):g("",!0),L.item.items&&L.item.items.length?(a(),l("div",Mr,[L.depth<5?(a(!0),l(C,{key:0},E(L.item.items,D=>(a(),$(z,{key:D.text,item:D,depth:L.depth+1},null,8,["item","depth"]))),128)):g("",!0)])):g("",!0)]),_:1},8,["class"])}}});const xr=m(Ir,[["__scopeId","data-v-0bb349fd"]]),wt=t=>(F("data-v-fe05da0a"),t=t(),j(),t),Nr=wt(()=>_("div",{class:"curtain"},null,-1)),Cr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Ar=wt(()=>_("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Tr=y({__name:"VPSidebar",props:{open:{type:Boolean}},setup(t){const e=t,{sidebarGroups:n,hasSidebar:o}=G();let s=S(null);function r(){$t(s.value,{reserveScrollBarGap:!0})}function c(){kt()}return Rt(async()=>{var v;e.open?(r(),(v=s.value)==null||v.focus()):c()}),(v,u)=>i(o)?(a(),l("aside",{key:0,class:A(["VPSidebar",{open:v.open}]),ref_key:"navEl",ref:s,onClick:u[0]||(u[0]=Ut(()=>{},["stop"]))},[Nr,_("nav",Cr,[Ar,d(v.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),l(C,null,E(i(n),h=>(a(),l("div",{key:h.text,class:"group"},[f(xr,{item:h,depth:0},null,8,["item"])]))),128)),d(v.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):g("",!0)}});const Br=m(Tr,[["__scopeId","data-v-fe05da0a"]]),Or={},Er={class:"VPPage"};function Hr(t,e){const n=X("Content");return a(),l("div",Er,[d(t.$slots,"page-top"),f(n),d(t.$slots,"page-bottom")])}const Dr=m(Or,[["render",Hr]]),zr=y({__name:"VPButton",props:{tag:{},size:{},theme:{},text:{},href:{}},setup(t){const e=t,n=w(()=>[e.size??"medium",e.theme??"brand"]),o=w(()=>e.href&&st.test(e.href)),s=w(()=>e.tag?e.tag:e.href?"a":"button");return(r,c)=>(a(),$(Q(s.value),{class:A(["VPButton",n.value]),href:r.href?i(ie)(r.href):void 0,target:o.value?"_blank":void 0,rel:o.value?"noreferrer":void 0},{default:p(()=>[O(I(r.text),1)]),_:1},8,["class","href","target","rel"]))}});const Fr=m(zr,[["__scopeId","data-v-fa1633a1"]]),jr=t=>(F("data-v-73fffaef"),t=t(),j(),t),Gr={class:"container"},Rr={class:"main"},Ur={key:0,class:"name"},Wr={class:"clip"},Kr={key:1,class:"text"},qr={key:2,class:"tagline"},Yr={key:0,class:"actions"},Jr={key:0,class:"image"},Xr={class:"image-container"},Qr=jr(()=>_("div",{class:"image-bg"},null,-1)),Zr=y({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(t){const e=Ne("hero-image-slot-exists");return(n,o)=>(a(),l("div",{class:A(["VPHero",{"has-image":n.image||i(e)}])},[_("div",Gr,[_("div",Rr,[d(n.$slots,"home-hero-info",{},()=>[n.name?(a(),l("h1",Ur,[_("span",Wr,I(n.name),1)])):g("",!0),n.text?(a(),l("p",Kr,I(n.text),1)):g("",!0),n.tagline?(a(),l("p",qr,I(n.tagline),1)):g("",!0)],!0),n.actions?(a(),l("div",Yr,[(a(!0),l(C,null,E(n.actions,s=>(a(),l("div",{key:s.link,class:"action"},[f(Fr,{tag:"a",size:"medium",theme:s.theme,text:s.text,href:s.link},null,8,["theme","text","href"])]))),128))])):g("",!0)]),n.image||i(e)?(a(),l("div",Jr,[_("div",Xr,[Qr,d(n.$slots,"home-hero-image",{},()=>[n.image?(a(),$(Ae,{key:0,class:"image-src",image:n.image},null,8,["image"])):g("",!0)],!0)])])):g("",!0)])],2))}});const ei=m(Zr,[["__scopeId","data-v-73fffaef"]]),ti=y({__name:"VPHomeHero",setup(t){const{frontmatter:e}=M();return(n,o)=>i(e).hero?(a(),$(ei,{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":p(()=>[d(n.$slots,"home-hero-info")]),"home-hero-image":p(()=>[d(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):g("",!0)}}),ni={},oi={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},si=_("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),ai=[si];function ri(t,e){return a(),l("svg",oi,ai)}const ii=m(ni,[["render",ri]]),li={class:"box"},ci=["innerHTML"],ui=["innerHTML"],di=["innerHTML"],_i={key:3,class:"link-text"},vi={class:"link-text-value"},pi=y({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{}},setup(t){return(e,n)=>(a(),$(q,{class:"VPFeature",href:e.link,"no-icon":!0},{default:p(()=>[_("article",li,[typeof e.icon=="object"?(a(),$(Ae,{key:0,image:e.icon,alt:e.icon.alt,height:e.icon.height,width:e.icon.width},null,8,["image","alt","height","width"])):e.icon?(a(),l("div",{key:1,class:"icon",innerHTML:e.icon},null,8,ci)):g("",!0),_("h2",{class:"title",innerHTML:e.title},null,8,ui),e.details?(a(),l("p",{key:2,class:"details",innerHTML:e.details},null,8,di)):g("",!0),e.linkText?(a(),l("div",_i,[_("p",vi,[O(I(e.linkText)+" ",1),f(ii,{class:"link-text-icon"})])])):g("",!0)])]),_:1},8,["href"]))}});const fi=m(pi,[["__scopeId","data-v-5f01e926"]]),hi={key:0,class:"VPFeatures"},mi={class:"container"},gi={class:"items"},yi=y({__name:"VPFeatures",props:{features:{}},setup(t){const e=t,n=w(()=>{const o=e.features.length;if(o){if(o===2)return"grid-2";if(o===3)return"grid-3";if(o%3===0)return"grid-6";if(o%2===0)return"grid-4"}else return});return(o,s)=>o.features?(a(),l("div",hi,[_("div",mi,[_("div",gi,[(a(!0),l(C,null,E(o.features,r=>(a(),l("div",{key:r.title,class:A(["item",[n.value]])},[f(fi,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText},null,8,["icon","title","details","link","link-text"])],2))),128))])])])):g("",!0)}});const bi=m(yi,[["__scopeId","data-v-5df66ecb"]]),$i=y({__name:"VPHomeFeatures",setup(t){const{frontmatter:e}=M();return(n,o)=>i(e).features?(a(),$(bi,{key:0,class:"VPHomeFeatures",features:i(e).features},null,8,["features"])):g("",!0)}}),ki={class:"VPHome"},Pi=y({__name:"VPHome",setup(t){return(e,n)=>{const o=X("Content");return a(),l("div",ki,[d(e.$slots,"home-hero-before",{},void 0,!0),f(ti,null,{"home-hero-info":p(()=>[d(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[d(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),d(e.$slots,"home-hero-after",{},void 0,!0),d(e.$slots,"home-features-before",{},void 0,!0),f($i),d(e.$slots,"home-features-after",{},void 0,!0),f(o)])}}});const wi=m(Pi,[["__scopeId","data-v-20eabd3a"]]),Vi=t=>(F("data-v-c834746b"),t=t(),j(),t),Si={class:"content"},Li={class:"outline-title"},Mi={"aria-labelledby":"doc-outline-aria-label"},Ii=Vi(()=>_("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),xi=y({__name:"VPDocAsideOutline",setup(t){const{frontmatter:e,theme:n}=M(),o=le([]);se(()=>{o.value=Fe(e.value.outline??n.value.outline)});const s=S(),r=S();return lr(s,r),(c,v)=>(a(),l("div",{class:A(["VPDocAsideOutline",{"has-outline":o.value.length>0}]),ref_key:"container",ref:s},[_("div",Si,[_("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),_("div",Li,I(i(ze)(i(n))),1),_("nav",Mi,[Ii,f(je,{headers:o.value,root:!0},null,8,["headers"])])])],2))}});const Ni=m(xi,[["__scopeId","data-v-c834746b"]]),Ci={class:"VPDocAsideCarbonAds"},Ai=y({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(t){const e=()=>null;return(n,o)=>(a(),l("div",Ci,[f(i(e),{"carbon-ads":n.carbonAds},null,8,["carbon-ads"])]))}}),Ti=t=>(F("data-v-cb998dce"),t=t(),j(),t),Bi={class:"VPDocAside"},Oi=Ti(()=>_("div",{class:"spacer"},null,-1)),Ei=y({__name:"VPDocAside",setup(t){const{theme:e}=M();return(n,o)=>(a(),l("div",Bi,[d(n.$slots,"aside-top",{},void 0,!0),d(n.$slots,"aside-outline-before",{},void 0,!0),f(Ni),d(n.$slots,"aside-outline-after",{},void 0,!0),Oi,d(n.$slots,"aside-ads-before",{},void 0,!0),i(e).carbonAds?(a(),$(Ai,{key:0,"carbon-ads":i(e).carbonAds},null,8,["carbon-ads"])):g("",!0),d(n.$slots,"aside-ads-after",{},void 0,!0),d(n.$slots,"aside-bottom",{},void 0,!0)]))}});const Hi=m(Ei,[["__scopeId","data-v-cb998dce"]]);function Di(){const{theme:t,page:e}=M();return w(()=>{const{text:n="Edit this page",pattern:o=""}=t.value.editLink||{};let s;return typeof o=="function"?s=o(e.value):s=o.replace(/:path/g,e.value.filePath),{url:s,text:n}})}function zi(){const{page:t,theme:e,frontmatter:n}=M();return w(()=>{var c,v,u,h;const o=ft(e.value.sidebar,t.value.relativePath),s=An(o),r=s.findIndex(b=>te(t.value.relativePath,b.link));return{prev:n.value.prev===!1?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((c=s[r-1])==null?void 0:c.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((v=s[r-1])==null?void 0:v.link)},next:n.value.next===!1?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((u=s[r+1])==null?void 0:u.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((h=s[r+1])==null?void 0:h.link)}}})}const Fi={},ji={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Gi=_("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Ri=_("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),Ui=[Gi,Ri];function Wi(t,e){return a(),l("svg",ji,Ui)}const Ki=m(Fi,[["render",Wi]]),qi={class:"VPLastUpdated"},Yi=["datetime"],Ji=y({__name:"VPDocFooterLastUpdated",setup(t){const{theme:e,page:n,lang:o}=M(),s=w(()=>new Date(n.value.lastUpdated)),r=w(()=>s.value.toISOString()),c=S("");return R(()=>{ee(()=>{c.value=s.value.toLocaleString(o.value)})}),(v,u)=>(a(),l("p",qi,[O(I(i(e).lastUpdatedText||"Last updated")+": ",1),_("time",{datetime:r.value},I(c.value),9,Yi)]))}});const Xi=m(Ji,[["__scopeId","data-v-0de45606"]]),Qi={key:0,class:"VPDocFooter"},Zi={key:0,class:"edit-info"},el={key:0,class:"edit-link"},tl={key:1,class:"last-updated"},nl={key:1,class:"prev-next"},ol={class:"pager"},sl=["href"],al=["innerHTML"],rl=["innerHTML"],il=["href"],ll=["innerHTML"],cl=["innerHTML"],ul=y({__name:"VPDocFooter",setup(t){const{theme:e,page:n,frontmatter:o}=M(),s=Di(),r=zi(),c=w(()=>e.value.editLink&&o.value.editLink!==!1),v=w(()=>n.value.lastUpdated&&o.value.lastUpdated!==!1),u=w(()=>c.value||v.value||r.value.prev||r.value.next);return(h,b)=>{var V,k,P,x,N,L,B;return u.value?(a(),l("footer",Qi,[d(h.$slots,"doc-footer-before",{},void 0,!0),c.value||v.value?(a(),l("div",Zi,[c.value?(a(),l("div",el,[f(q,{class:"edit-link-button",href:i(s).url,"no-icon":!0},{default:p(()=>[f(Ki,{class:"edit-link-icon","aria-label":"edit icon"}),O(" "+I(i(s).text),1)]),_:1},8,["href"])])):g("",!0),v.value?(a(),l("div",tl,[f(Xi)])):g("",!0)])):g("",!0),(V=i(r).prev)!=null&&V.link||(k=i(r).next)!=null&&k.link?(a(),l("div",nl,[_("div",ol,[(P=i(r).prev)!=null&&P.link?(a(),l("a",{key:0,class:"pager-link prev",href:i(ie)(i(r).prev.link)},[_("span",{class:"desc",innerHTML:((x=i(e).docFooter)==null?void 0:x.prev)||"Previous page"},null,8,al),_("span",{class:"title",innerHTML:i(r).prev.text},null,8,rl)],8,sl)):g("",!0)]),_("div",{class:A(["pager",{"has-prev":(N=i(r).prev)==null?void 0:N.link}])},[(L=i(r).next)!=null&&L.link?(a(),l("a",{key:0,class:"pager-link next",href:i(ie)(i(r).next.link)},[_("span",{class:"desc",innerHTML:((B=i(e).docFooter)==null?void 0:B.next)||"Next page"},null,8,ll),_("span",{class:"title",innerHTML:i(r).next.text},null,8,cl)],8,il)):g("",!0)],2)])):g("",!0)])):g("",!0)}}});const dl=m(ul,[["__scopeId","data-v-fc0d1b73"]]),_l={key:0,class:"VPDocOutlineDropdown"},vl={key:0,class:"items"},pl=y({__name:"VPDocOutlineDropdown",setup(t){const{frontmatter:e,theme:n}=M(),o=S(!1);se(()=>{o.value=!1});const s=le([]);return se(()=>{s.value=Fe(e.value.outline??n.value.outline)}),(r,c)=>s.value.length>0?(a(),l("div",_l,[_("button",{onClick:c[0]||(c[0]=v=>o.value=!o.value),class:A({open:o.value})},[O(I(i(ze)(i(n)))+" ",1),f(Ge,{class:"icon"})],2),o.value?(a(),l("div",vl,[f(je,{headers:s.value},null,8,["headers"])])):g("",!0)])):g("",!0)}});const fl=m(pl,[["__scopeId","data-v-2d98506c"]]),hl=t=>(F("data-v-c11df1f0"),t=t(),j(),t),ml={class:"container"},gl=hl(()=>_("div",{class:"aside-curtain"},null,-1)),yl={class:"aside-container"},bl={class:"aside-content"},$l={class:"content"},kl={class:"content-container"},Pl={class:"main"},wl=y({__name:"VPDoc",setup(t){const e=ce(),{hasSidebar:n,hasAside:o,leftAside:s}=G(),r=w(()=>e.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(c,v)=>{const u=X("Content");return a(),l("div",{class:A(["VPDoc",{"has-sidebar":i(n),"has-aside":i(o)}])},[d(c.$slots,"doc-top",{},void 0,!0),_("div",ml,[i(o)?(a(),l("div",{key:0,class:A(["aside",{"left-aside":i(s)}])},[gl,_("div",yl,[_("div",bl,[f(Hi,null,{"aside-top":p(()=>[d(c.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[d(c.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[d(c.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[d(c.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[d(c.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[d(c.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):g("",!0),_("div",$l,[_("div",kl,[d(c.$slots,"doc-before",{},void 0,!0),f(fl),_("main",Pl,[f(u,{class:A(["vp-doc",r.value])},null,8,["class"])]),f(dl,null,{"doc-footer-before":p(()=>[d(c.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),d(c.$slots,"doc-after",{},void 0,!0)])])]),d(c.$slots,"doc-bottom",{},void 0,!0)],2)}}});const Vl=m(wl,[["__scopeId","data-v-c11df1f0"]]),$e=t=>(F("data-v-e5bd6573"),t=t(),j(),t),Sl={class:"NotFound"},Ll=$e(()=>_("p",{class:"code"},"404",-1)),Ml=$e(()=>_("h1",{class:"title"},"PAGE NOT FOUND",-1)),Il=$e(()=>_("div",{class:"divider"},null,-1)),xl=$e(()=>_("blockquote",{class:"quote"}," But if you don't change your direction, and if you keep looking, you may end up where you are heading. ",-1)),Nl={class:"action"},Cl=["href"],Al=y({__name:"NotFound",setup(t){const{site:e}=M(),{localeLinks:n}=ue({removeCurrent:!1}),o=S("/");return R(()=>{var r;const s=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(o.value=((r=n.value.find(({link:c})=>c.startsWith(s)))==null?void 0:r.link)||n.value[0].link)}),(s,r)=>(a(),l("div",Sl,[Ll,Ml,Il,xl,_("div",Nl,[_("a",{class:"link",href:i(Me)(o.value),"aria-label":"go to home"}," Take me home ",8,Cl)])]))}});const Tl=m(Al,[["__scopeId","data-v-e5bd6573"]]),Bl=y({__name:"VPContent",setup(t){const{page:e,frontmatter:n}=M(),{hasSidebar:o}=G();return(s,r)=>(a(),l("div",{class:A(["VPContent",{"has-sidebar":i(o),"is-home":i(n).layout==="home"}]),id:"VPContent"},[i(e).isNotFound?d(s.$slots,"not-found",{key:0},()=>[f(Tl)],!0):i(n).layout==="page"?(a(),$(Dr,{key:1},{"page-top":p(()=>[d(s.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[d(s.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(n).layout==="home"?(a(),$(wi,{key:2},{"home-hero-before":p(()=>[d(s.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[d(s.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[d(s.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[d(s.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[d(s.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[d(s.$slots,"home-features-after",{},void 0,!0)]),_:3})):(a(),$(Vl,{key:3},{"doc-top":p(()=>[d(s.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[d(s.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":p(()=>[d(s.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[d(s.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[d(s.$slots,"doc-after",{},void 0,!0)]),"aside-top":p(()=>[d(s.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":p(()=>[d(s.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[d(s.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[d(s.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[d(s.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":p(()=>[d(s.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const Ol=m(Bl,[["__scopeId","data-v-91952ce3"]]),El={class:"container"},Hl=["innerHTML"],Dl=["innerHTML"],zl=y({__name:"VPFooter",setup(t){const{theme:e}=M(),{hasSidebar:n}=G();return(o,s)=>i(e).footer?(a(),l("footer",{key:0,class:A(["VPFooter",{"has-sidebar":i(n)}])},[_("div",El,[i(e).footer.message?(a(),l("p",{key:0,class:"message",innerHTML:i(e).footer.message},null,8,Hl)):g("",!0),i(e).footer.copyright?(a(),l("p",{key:1,class:"copyright",innerHTML:i(e).footer.copyright},null,8,Dl)):g("",!0)])],2)):g("",!0)}});const Fl=m(zl,[["__scopeId","data-v-07acdfa3"]]),jl={key:0,class:"Layout"},Gl=y({__name:"Layout",setup(t){const{isOpen:e,open:n,close:o}=G(),s=ce();K(()=>s.path,o),Tn(e,o),pe("close-sidebar",o),pe("is-sidebar-open",e);const{frontmatter:r}=M(),c=Wt(),v=w(()=>!!c["home-hero-image"]);return pe("hero-image-slot-exists",v),(u,h)=>{const b=X("Content");return i(r).layout!==!1?(a(),l("div",jl,[d(u.$slots,"layout-top",{},void 0,!0),f(En),f(zn,{class:"backdrop",show:i(e),onClick:i(o)},null,8,["show","onClick"]),f(qa,null,{"nav-bar-title-before":p(()=>[d(u.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[d(u.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[d(u.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[d(u.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":p(()=>[d(u.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[d(u.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),f(Pr,{open:i(e),onOpenMenu:i(n)},null,8,["open","onOpenMenu"]),f(Br,{open:i(e)},{"sidebar-nav-before":p(()=>[d(u.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":p(()=>[d(u.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),f(Ol,null,{"page-top":p(()=>[d(u.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[d(u.$slots,"page-bottom",{},void 0,!0)]),"not-found":p(()=>[d(u.$slots,"not-found",{},void 0,!0)]),"home-hero-before":p(()=>[d(u.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[d(u.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[d(u.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[d(u.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[d(u.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[d(u.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":p(()=>[d(u.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[d(u.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[d(u.$slots,"doc-after",{},void 0,!0)]),"doc-top":p(()=>[d(u.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[d(u.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":p(()=>[d(u.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[d(u.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[d(u.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[d(u.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[d(u.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[d(u.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),f(Fl),d(u.$slots,"layout-bottom",{},void 0,!0)])):(a(),$(b,{key:1}))}}});const Rl=m(Gl,[["__scopeId","data-v-bffce215"]]);const Xl={Layout:Rl,enhanceApp:({app:t})=>{t.component("Badge",qt)}};function Ql(t,e){const{localeIndex:n}=M();function o(s){var P,x;const r=s.split("."),c=t&&typeof t=="object",v=c&&((x=(P=t.locales)==null?void 0:P[n.value])==null?void 0:x.translations)||null,u=c&&t.translations||null;let h=v,b=u,V=e;const k=r.pop();for(const N of r){let L=null;const B=V==null?void 0:V[N];B&&(L=V=B);const z=b==null?void 0:b[N];z&&(L=b=z);const D=h==null?void 0:h[N];D&&(L=h=D),B||(V=L),z||(b=L),D||(h=L)}return(h==null?void 0:h[k])??(b==null?void 0:b[k])??(V==null?void 0:V[k])??""}return o}export{Jl as a,ql as b,Kl as c,Ql as d,re as e,Yl as f,gn as o,Xl as t,M as u,Wl as w}; diff --git a/assets/chunks/theme.98402b24.js b/assets/chunks/theme.98402b24.js new file mode 100644 index 00000000..e5f3fa9e --- /dev/null +++ b/assets/chunks/theme.98402b24.js @@ -0,0 +1 @@ +import{d as g,o as a,c as i,r as u,n as C,a as x,t as L,_ as m,b as $,w as v,T as ce,e as f,u as De,i as Ee,f as ue,g as P,h as I,j as K,k as c,l as r,p as H,m as z,q as j,s as W,v as le,x as q,y as te,z as de,A as we,B as Fe,C as R,F as T,D as A,E as _e,G as Y,H as h,I as U,J as Le,K as se,L as Z,M as ne,N as Oe,O as Ge,P as Se,Q as Ue,R as je,S as ye,U as Ke,V as qe,W as Me,X as Ne,Y as Re,Z as We,$ as Ye,a0 as Je}from"./framework.ed90c782.js";const Xe=g({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(s){return(e,t)=>(a(),i("span",{class:C(["VPBadge",e.type])},[u(e.$slots,"default",{},()=>[x(L(e.text),1)],!0)],2))}});const Ze=m(Xe,[["__scopeId","data-v-ea5b2908"]]),Qe={key:0,class:"VPBackdrop"},et=g({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(s){return(e,t)=>(a(),$(ce,{name:"fade"},{default:v(()=>[e.show?(a(),i("div",Qe)):f("",!0)]),_:1}))}});const tt=m(et,[["__scopeId","data-v-54a304ca"]]),V=De;function st(s,e){let t,n=!1;return()=>{t&&clearTimeout(t),n?t=setTimeout(s,e):(s(),(n=!0)&&setTimeout(()=>n=!1,e))}}function re(s){return/^\//.test(s)?s:`/${s}`}function J(s){if(Ee(s))return s;const{site:e}=V(),{pathname:t,search:n,hash:o}=new URL(s,"http://a.com"),l=t.endsWith("/")||t.endsWith(".html")?s:s.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,e.value.cleanUrls?"":".html")}${n}${o}`);return ue(l)}function X({removeCurrent:s=!0,correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:o,theme:l}=V(),d=P(()=>{var _,b;return{label:(_=t.value.locales[n.value])==null?void 0:_.label,link:((b=t.value.locales[n.value])==null?void 0:b.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:P(()=>Object.entries(t.value.locales).flatMap(([_,b])=>s&&d.value.label===b.label?[]:{text:b.label,link:nt(b.link||(_==="root"?"/":`/${_}/`),l.value.i18nRouting!==!1&&e,o.value.relativePath.slice(d.value.link.length-1),!t.value.cleanUrls)})),currentLang:d}}function nt(s,e,t,n){return e?s.replace(/\/$/,"")+re(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,n?".html":"")):s}const ot=s=>(H("data-v-b9c0c15a"),s=s(),z(),s),at={class:"NotFound"},lt={class:"code"},rt={class:"title"},it=ot(()=>c("div",{class:"divider"},null,-1)),ct={class:"quote"},ut={class:"action"},dt=["href","aria-label"],_t=g({__name:"NotFound",setup(s){const{site:e,theme:t}=V(),{localeLinks:n}=X({removeCurrent:!1}),o=I("/");return K(()=>{var d;const l=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(o.value=((d=n.value.find(({link:p})=>p.startsWith(l)))==null?void 0:d.link)||n.value[0].link)}),(l,d)=>{var p,_,b,w,S;return a(),i("div",at,[c("p",lt,L(((p=r(t).notFound)==null?void 0:p.code)??"404"),1),c("h1",rt,L(((_=r(t).notFound)==null?void 0:_.title)??"PAGE NOT FOUND"),1),it,c("blockquote",ct,L(((b=r(t).notFound)==null?void 0:b.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),c("div",ut,[c("a",{class:"link",href:r(ue)(o.value),"aria-label":((w=r(t).notFound)==null?void 0:w.linkLabel)??"go to home"},L(((S=r(t).notFound)==null?void 0:S.linkText)??"Take me home"),9,dt)])])}}});const vt=m(_t,[["__scopeId","data-v-b9c0c15a"]]);function Ie(s,e){if(Array.isArray(s))return Q(s);if(s==null)return[];e=re(e);const t=Object.keys(s).sort((o,l)=>l.split("/").length-o.split("/").length).find(o=>e.startsWith(re(o))),n=t?s[t]:[];return Array.isArray(n)?Q(n):Q(n.items,n.base)}function pt(s){const e=[];let t=0;for(const n in s){const o=s[n];if(o.items){t=e.push(o);continue}e[t]||e.push({items:[]}),e[t].items.push(o)}return e}function ht(s){const e=[];function t(n){for(const o of n)o.text&&o.link&&e.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&t(o.items)}return t(s),e}function ie(s,e){return Array.isArray(e)?e.some(t=>ie(s,t)):j(s,e.link)?!0:e.items?ie(s,e.items):!1}function Q(s,e){return[...s].map(t=>{const n={...t},o=n.base||e;return o&&n.link&&(n.link=o+n.link),n.items&&(n.items=Q(n.items,o)),n})}function F(){const{frontmatter:s,page:e,theme:t}=V(),n=le("(min-width: 960px)"),o=I(!1),l=P(()=>{const N=t.value.sidebar,y=e.value.relativePath;return N?Ie(N,y):[]}),d=I(l.value);q(l,(N,y)=>{JSON.stringify(N)!==JSON.stringify(y)&&(d.value=l.value)});const p=P(()=>s.value.sidebar!==!1&&d.value.length>0&&s.value.layout!=="home"),_=P(()=>b?s.value.aside==null?t.value.aside==="left":s.value.aside==="left":!1),b=P(()=>s.value.layout==="home"?!1:s.value.aside!=null?!!s.value.aside:t.value.aside!==!1),w=P(()=>p.value&&n.value),S=P(()=>p.value?pt(d.value):[]);function B(){o.value=!0}function k(){o.value=!1}function M(){o.value?k():B()}return{isOpen:o,sidebar:d,sidebarGroups:S,hasSidebar:p,hasAside:b,leftAside:_,isSidebarEnabled:w,open:B,close:k,toggle:M}}function ft(s,e){let t;te(()=>{t=s.value?document.activeElement:void 0}),K(()=>{window.addEventListener("keyup",n)}),de(()=>{window.removeEventListener("keyup",n)});function n(o){o.key==="Escape"&&s.value&&(e(),t==null||t.focus())}}const Te=I(W?location.hash:"");W&&window.addEventListener("hashchange",()=>{Te.value=location.hash});function mt(s){const{page:e}=V(),t=I(!1),n=P(()=>s.value.collapsed!=null),o=P(()=>!!s.value.link),l=I(!1),d=()=>{l.value=j(e.value.relativePath,s.value.link)};q([e,s,Te],d),K(d);const p=P(()=>l.value?!0:s.value.items?ie(e.value.relativePath,s.value.items):!1),_=P(()=>!!(s.value.items&&s.value.items.length));te(()=>{t.value=!!(n.value&&s.value.collapsed)}),we(()=>{(l.value||p.value)&&(t.value=!1)});function b(){n.value&&(t.value=!t.value)}return{collapsed:t,collapsible:n,isLink:o,isActiveLink:l,hasActiveLink:p,hasChildren:_,toggle:b}}function gt(){const{hasSidebar:s}=F(),e=le("(min-width: 960px)"),t=le("(min-width: 1280px)");return{isAsideEnabled:P(()=>!t.value&&!e.value?!1:s.value?t.value:e.value)}}const bt=71;function ve(s){return typeof s.outline=="object"&&!Array.isArray(s.outline)&&s.outline.label||s.outlineTitle||"On this page"}function pe(s){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{title:$t(t),link:"#"+t.id,level:n}});return kt(e,s)}function $t(s){let e="";for(const t of s.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function kt(s,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[n,o]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;s=s.filter(d=>d.level>=n&&d.level<=o);const l=[];e:for(let d=0;d=0;_--){const b=s[_];if(b.level{requestAnimationFrame(l),window.addEventListener("scroll",n)}),Fe(()=>{d(location.hash)}),de(()=>{window.removeEventListener("scroll",n)});function l(){if(!t.value)return;const p=[].slice.call(s.value.querySelectorAll(".outline-link")),_=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(k=>p.some(M=>M.hash===k.hash&&k.offsetParent!==null)),b=window.scrollY,w=window.innerHeight,S=document.body.offsetHeight,B=Math.abs(b+w-S)<1;if(_.length&&B){d(_[_.length-1].hash);return}for(let k=0;k<_.length;k++){const M=_[k],N=_[k+1],[y,D]=Pt(k,M,N);if(y){d(D);return}}}function d(p){o&&o.classList.remove("active"),p==null?o=null:o=s.value.querySelector(`a[href="${decodeURIComponent(p)}"]`);const _=o;_?(_.classList.add("active"),e.value.style.top=_.offsetTop+33+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function Pe(s){return s.parentElement.offsetTop-bt}function Pt(s,e,t){const n=window.scrollY;return s===0&&n===0?[!0,null]:n{const o=R("VPDocOutlineItem",!0);return a(),i("ul",{class:C(t.root?"root":"nested")},[(a(!0),i(T,null,A(t.headers,({children:l,link:d,title:p})=>(a(),i("li",null,[c("a",{class:"outline-link",href:d,onClick:e,title:p},L(p),9,Vt),l!=null&&l.length?(a(),$(o,{key:0,headers:l},null,8,["headers"])):f("",!0)]))),256))],2)}}});const he=m(wt,[["__scopeId","data-v-463da30f"]]),Lt=s=>(H("data-v-3a6c4994"),s=s(),z(),s),St={class:"content"},Mt={class:"outline-title",role:"heading","aria-level":"2"},Nt={"aria-labelledby":"doc-outline-aria-label"},It=Lt(()=>c("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),Tt=g({__name:"VPDocAsideOutline",setup(s){const{frontmatter:e,theme:t}=V(),n=_e([]);Y(()=>{n.value=pe(e.value.outline??t.value.outline)});const o=I(),l=I();return yt(o,l),(d,p)=>(a(),i("div",{class:C(["VPDocAsideOutline",{"has-outline":n.value.length>0}]),ref_key:"container",ref:o,role:"navigation"},[c("div",St,[c("div",{class:"outline-marker",ref_key:"marker",ref:l},null,512),c("div",Mt,L(r(ve)(r(t))),1),c("nav",Nt,[It,h(he,{headers:n.value,root:!0},null,8,["headers"])])])],2))}});const Ct=m(Tt,[["__scopeId","data-v-3a6c4994"]]),Bt={class:"VPDocAsideCarbonAds"},At=g({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(s){const e=()=>null;return(t,n)=>(a(),i("div",Bt,[h(r(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),xt=s=>(H("data-v-cb998dce"),s=s(),z(),s),Ht={class:"VPDocAside"},zt=xt(()=>c("div",{class:"spacer"},null,-1)),Dt=g({__name:"VPDocAside",setup(s){const{theme:e}=V();return(t,n)=>(a(),i("div",Ht,[u(t.$slots,"aside-top",{},void 0,!0),u(t.$slots,"aside-outline-before",{},void 0,!0),h(Ct),u(t.$slots,"aside-outline-after",{},void 0,!0),zt,u(t.$slots,"aside-ads-before",{},void 0,!0),r(e).carbonAds?(a(),$(At,{key:0,"carbon-ads":r(e).carbonAds},null,8,["carbon-ads"])):f("",!0),u(t.$slots,"aside-ads-after",{},void 0,!0),u(t.$slots,"aside-bottom",{},void 0,!0)]))}});const Et=m(Dt,[["__scopeId","data-v-cb998dce"]]);function Ft(){const{theme:s,page:e}=V();return P(()=>{const{text:t="Edit this page",pattern:n=""}=s.value.editLink||{};let o;return typeof n=="function"?o=n(e.value):o=n.replace(/:path/g,e.value.filePath),{url:o,text:t}})}function Ot(){const{page:s,theme:e,frontmatter:t}=V();return P(()=>{var _,b,w,S,B,k,M,N;const n=Ie(e.value.sidebar,s.value.relativePath),o=ht(n),l=o.findIndex(y=>j(s.value.relativePath,y.link)),d=((_=e.value.docFooter)==null?void 0:_.prev)===!1&&!t.value.prev||t.value.prev===!1,p=((b=e.value.docFooter)==null?void 0:b.next)===!1&&!t.value.next||t.value.next===!1;return{prev:d?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((w=o[l-1])==null?void 0:w.docFooterText)??((S=o[l-1])==null?void 0:S.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((B=o[l-1])==null?void 0:B.link)},next:p?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((k=o[l+1])==null?void 0:k.docFooterText)??((M=o[l+1])==null?void 0:M.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((N=o[l+1])==null?void 0:N.link)}}})}const Gt={},Ut={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},jt=c("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Kt=c("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),qt=[jt,Kt];function Rt(s,e){return a(),i("svg",Ut,qt)}const Wt=m(Gt,[["render",Rt]]),G=g({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(s){const e=s,t=P(()=>e.tag??(e.href?"a":"span")),n=P(()=>e.href&&Le.test(e.href));return(o,l)=>(a(),$(U(t.value),{class:C(["VPLink",{link:o.href,"vp-external-link-icon":n.value,"no-icon":o.noIcon}]),href:o.href?r(J)(o.href):void 0,target:o.target??(n.value?"_blank":void 0),rel:o.rel??(n.value?"noreferrer":void 0)},{default:v(()=>[u(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Yt={class:"VPLastUpdated"},Jt=["datetime"],Xt=g({__name:"VPDocFooterLastUpdated",setup(s){const{theme:e,page:t,frontmatter:n,lang:o}=V(),l=P(()=>new Date(n.value.lastUpdated??t.value.lastUpdated)),d=P(()=>l.value.toISOString()),p=I("");return K(()=>{te(()=>{var _,b,w;p.value=new Intl.DateTimeFormat((b=(_=e.value.lastUpdated)==null?void 0:_.formatOptions)!=null&&b.forceLocale?o.value:void 0,((w=e.value.lastUpdated)==null?void 0:w.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(l.value)})}),(_,b)=>{var w;return a(),i("p",Yt,[x(L(((w=r(e).lastUpdated)==null?void 0:w.text)||r(e).lastUpdatedText||"Last updated")+": ",1),c("time",{datetime:d.value},L(p.value),9,Jt)])}}});const Zt=m(Xt,[["__scopeId","data-v-19a7ae4e"]]),Qt={key:0,class:"VPDocFooter"},es={key:0,class:"edit-info"},ts={key:0,class:"edit-link"},ss={key:1,class:"last-updated"},ns={key:1,class:"prev-next"},os={class:"pager"},as=["href"],ls=["innerHTML"],rs=["innerHTML"],is={class:"pager"},cs=["href"],us=["innerHTML"],ds=["innerHTML"],_s=g({__name:"VPDocFooter",setup(s){const{theme:e,page:t,frontmatter:n}=V(),o=Ft(),l=Ot(),d=P(()=>e.value.editLink&&n.value.editLink!==!1),p=P(()=>t.value.lastUpdated&&n.value.lastUpdated!==!1),_=P(()=>d.value||p.value||l.value.prev||l.value.next);return(b,w)=>{var S,B,k,M,N,y;return _.value?(a(),i("footer",Qt,[u(b.$slots,"doc-footer-before",{},void 0,!0),d.value||p.value?(a(),i("div",es,[d.value?(a(),i("div",ts,[h(G,{class:"edit-link-button",href:r(o).url,"no-icon":!0},{default:v(()=>[h(Wt,{class:"edit-link-icon","aria-label":"edit icon"}),x(" "+L(r(o).text),1)]),_:1},8,["href"])])):f("",!0),p.value?(a(),i("div",ss,[h(Zt)])):f("",!0)])):f("",!0),(S=r(l).prev)!=null&&S.link||(B=r(l).next)!=null&&B.link?(a(),i("nav",ns,[c("div",os,[(k=r(l).prev)!=null&&k.link?(a(),i("a",{key:0,class:"pager-link prev",href:r(J)(r(l).prev.link)},[c("span",{class:"desc",innerHTML:((M=r(e).docFooter)==null?void 0:M.prev)||"Previous page"},null,8,ls),c("span",{class:"title",innerHTML:r(l).prev.text},null,8,rs)],8,as)):f("",!0)]),c("div",is,[(N=r(l).next)!=null&&N.link?(a(),i("a",{key:0,class:"pager-link next",href:r(J)(r(l).next.link)},[c("span",{class:"desc",innerHTML:((y=r(e).docFooter)==null?void 0:y.next)||"Next page"},null,8,us),c("span",{class:"title",innerHTML:r(l).next.text},null,8,ds)],8,cs)):f("",!0)])])):f("",!0)])):f("",!0)}}});const vs=m(_s,[["__scopeId","data-v-a2d931e4"]]),ps={},hs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},fs=c("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),ms=[fs];function gs(s,e){return a(),i("svg",hs,ms)}const fe=m(ps,[["render",gs]]),bs={key:0,class:"VPDocOutlineDropdown"},$s={key:0,class:"items"},ks=g({__name:"VPDocOutlineDropdown",setup(s){const{frontmatter:e,theme:t}=V(),n=I(!1);Y(()=>{n.value=!1});const o=_e([]);return Y(()=>{o.value=pe(e.value.outline??t.value.outline)}),(l,d)=>o.value.length>0?(a(),i("div",bs,[c("button",{onClick:d[0]||(d[0]=p=>n.value=!n.value),class:C({open:n.value})},[x(L(r(ve)(r(t)))+" ",1),h(fe,{class:"icon"})],2),n.value?(a(),i("div",$s,[h(he,{headers:o.value},null,8,["headers"])])):f("",!0)])):f("",!0)}});const ys=m(ks,[["__scopeId","data-v-95bb0785"]]),Ps=s=>(H("data-v-a3c25e27"),s=s(),z(),s),Vs={class:"container"},ws=Ps(()=>c("div",{class:"aside-curtain"},null,-1)),Ls={class:"aside-container"},Ss={class:"aside-content"},Ms={class:"content"},Ns={class:"content-container"},Is={class:"main"},Ts=g({__name:"VPDoc",setup(s){const{theme:e}=V(),t=se(),{hasSidebar:n,hasAside:o,leftAside:l}=F(),d=P(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(p,_)=>{const b=R("Content");return a(),i("div",{class:C(["VPDoc",{"has-sidebar":r(n),"has-aside":r(o)}])},[u(p.$slots,"doc-top",{},void 0,!0),c("div",Vs,[r(o)?(a(),i("div",{key:0,class:C(["aside",{"left-aside":r(l)}])},[ws,c("div",Ls,[c("div",Ss,[h(Et,null,{"aside-top":v(()=>[u(p.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(p.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(p.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(p.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(p.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(p.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),c("div",Ms,[c("div",Ns,[u(p.$slots,"doc-before",{},void 0,!0),h(ys),c("main",Is,[h(b,{class:C(["vp-doc",[d.value,r(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),h(vs,null,{"doc-footer-before":v(()=>[u(p.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),u(p.$slots,"doc-after",{},void 0,!0)])])]),u(p.$slots,"doc-bottom",{},void 0,!0)],2)}}});const Cs=m(Ts,[["__scopeId","data-v-a3c25e27"]]),Bs=g({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(s){const e=s,t=P(()=>e.href&&Le.test(e.href)),n=P(()=>e.tag||e.href?"a":"button");return(o,l)=>(a(),$(U(n.value),{class:C(["VPButton",[o.size,o.theme]]),href:o.href?r(J)(o.href):void 0,target:t.value?"_blank":void 0,rel:t.value?"noreferrer":void 0},{default:v(()=>[x(L(o.text),1)]),_:1},8,["class","href","target","rel"]))}});const As=m(Bs,[["__scopeId","data-v-1e76fe75"]]),xs=["src","alt"],Hs=g({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(s){return(e,t)=>{const n=R("VPImage",!0);return e.image?(a(),i(T,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),i("img",Z({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:r(ue)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,xs)):(a(),i(T,{key:1},[h(n,Z({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(n,Z({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}});const ee=m(Hs,[["__scopeId","data-v-ab19afbb"]]),zs=s=>(H("data-v-5a3e9999"),s=s(),z(),s),Ds={class:"container"},Es={class:"main"},Fs={key:0,class:"name"},Os=["innerHTML"],Gs=["innerHTML"],Us=["innerHTML"],js={key:0,class:"actions"},Ks={key:0,class:"image"},qs={class:"image-container"},Rs=zs(()=>c("div",{class:"image-bg"},null,-1)),Ws=g({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(s){const e=ne("hero-image-slot-exists");return(t,n)=>(a(),i("div",{class:C(["VPHero",{"has-image":t.image||r(e)}])},[c("div",Ds,[c("div",Es,[u(t.$slots,"home-hero-info",{},()=>[t.name?(a(),i("h1",Fs,[c("span",{innerHTML:t.name,class:"clip"},null,8,Os)])):f("",!0),t.text?(a(),i("p",{key:1,innerHTML:t.text,class:"text"},null,8,Gs)):f("",!0),t.tagline?(a(),i("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,Us)):f("",!0)],!0),t.actions?(a(),i("div",js,[(a(!0),i(T,null,A(t.actions,o=>(a(),i("div",{key:o.link,class:"action"},[h(As,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):f("",!0)]),t.image||r(e)?(a(),i("div",Ks,[c("div",qs,[Rs,u(t.$slots,"home-hero-image",{},()=>[t.image?(a(),$(ee,{key:0,class:"image-src",image:t.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}});const Ys=m(Ws,[["__scopeId","data-v-5a3e9999"]]),Js=g({__name:"VPHomeHero",setup(s){const{frontmatter:e}=V();return(t,n)=>r(e).hero?(a(),$(Ys,{key:0,class:"VPHomeHero",name:r(e).hero.name,text:r(e).hero.text,tagline:r(e).hero.tagline,image:r(e).hero.image,actions:r(e).hero.actions},{"home-hero-info":v(()=>[u(t.$slots,"home-hero-info")]),"home-hero-image":v(()=>[u(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),Xs={},Zs={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Qs=c("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),en=[Qs];function tn(s,e){return a(),i("svg",Zs,en)}const sn=m(Xs,[["render",tn]]),nn={class:"box"},on={key:0,class:"icon"},an=["innerHTML"],ln=["innerHTML"],rn=["innerHTML"],cn={key:4,class:"link-text"},un={class:"link-text-value"},dn=g({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(s){return(e,t)=>(a(),$(G,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:v(()=>[c("article",nn,[typeof e.icon=="object"&&e.icon.wrap?(a(),i("div",on,[h(ee,{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(),$(ee,{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(),i("div",{key:2,class:"icon",innerHTML:e.icon},null,8,an)):f("",!0),c("h2",{class:"title",innerHTML:e.title},null,8,ln),e.details?(a(),i("p",{key:3,class:"details",innerHTML:e.details},null,8,rn)):f("",!0),e.linkText?(a(),i("div",cn,[c("p",un,[x(L(e.linkText)+" ",1),h(sn,{class:"link-text-icon"})])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}});const _n=m(dn,[["__scopeId","data-v-ee984185"]]),vn={key:0,class:"VPFeatures"},pn={class:"container"},hn={class:"items"},fn=g({__name:"VPFeatures",props:{features:{}},setup(s){const e=s,t=P(()=>{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,o)=>n.features?(a(),i("div",vn,[c("div",pn,[c("div",hn,[(a(!0),i(T,null,A(n.features,l=>(a(),i("div",{key:l.title,class:C(["item",[t.value]])},[h(_n,{icon:l.icon,title:l.title,details:l.details,link:l.link,"link-text":l.linkText,rel:l.rel,target:l.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):f("",!0)}});const mn=m(fn,[["__scopeId","data-v-b1eea84a"]]),gn=g({__name:"VPHomeFeatures",setup(s){const{frontmatter:e}=V();return(t,n)=>r(e).features?(a(),$(mn,{key:0,class:"VPHomeFeatures",features:r(e).features},null,8,["features"])):f("",!0)}}),bn={class:"VPHome"},$n=g({__name:"VPHome",setup(s){return(e,t)=>{const n=R("Content");return a(),i("div",bn,[u(e.$slots,"home-hero-before",{},void 0,!0),h(Js,null,{"home-hero-info":v(()=>[u(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),u(e.$slots,"home-hero-after",{},void 0,!0),u(e.$slots,"home-features-before",{},void 0,!0),h(gn),u(e.$slots,"home-features-after",{},void 0,!0),h(n)])}}});const kn=m($n,[["__scopeId","data-v-20eabd3a"]]),yn={},Pn={class:"VPPage"};function Vn(s,e){const t=R("Content");return a(),i("div",Pn,[u(s.$slots,"page-top"),h(t),u(s.$slots,"page-bottom")])}const wn=m(yn,[["render",Vn]]),Ln=g({__name:"VPContent",setup(s){const{page:e,frontmatter:t}=V(),{hasSidebar:n}=F();return(o,l)=>(a(),i("div",{class:C(["VPContent",{"has-sidebar":r(n),"is-home":r(t).layout==="home"}]),id:"VPContent"},[r(e).isNotFound?u(o.$slots,"not-found",{key:0},()=>[h(vt)],!0):r(t).layout==="page"?(a(),$(wn,{key:1},{"page-top":v(()=>[u(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):r(t).layout==="home"?(a(),$(kn,{key:2},{"home-hero-before":v(()=>[u(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):r(t).layout&&r(t).layout!=="doc"?(a(),$(U(r(t).layout),{key:3})):(a(),$(Cs,{key:4},{"doc-top":v(()=>[u(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[u(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[u(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[u(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[u(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const Sn=m(Ln,[["__scopeId","data-v-3cf691b6"]]),Mn={class:"container"},Nn=["innerHTML"],In=["innerHTML"],Tn=g({__name:"VPFooter",setup(s){const{theme:e,frontmatter:t}=V(),{hasSidebar:n}=F();return(o,l)=>r(e).footer&&r(t).footer!==!1?(a(),i("footer",{key:0,class:C(["VPFooter",{"has-sidebar":r(n)}])},[c("div",Mn,[r(e).footer.message?(a(),i("p",{key:0,class:"message",innerHTML:r(e).footer.message},null,8,Nn)):f("",!0),r(e).footer.copyright?(a(),i("p",{key:1,class:"copyright",innerHTML:r(e).footer.copyright},null,8,In)):f("",!0)])],2)):f("",!0)}});const Cn=m(Tn,[["__scopeId","data-v-e4279f1c"]]),Bn={class:"header"},An={class:"outline"},xn=g({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(s){const e=s,{theme:t}=V(),n=I(!1),o=I(0),l=I();Y(()=>{n.value=!1});function d(){n.value=!n.value,o.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function p(b){b.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Ge(()=>{n.value=!1}))}function _(){n.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,w)=>(a(),i("div",{class:"VPLocalNavOutlineDropdown",style:Oe({"--vp-vh":o.value+"px"})},[b.headers.length>0?(a(),i("button",{key:0,onClick:d,class:C({open:n.value})},[x(L(r(ve)(r(t)))+" ",1),h(fe,{class:"icon"})],2)):(a(),i("button",{key:1,onClick:_},L(r(t).returnToTopLabel||"Return to top"),1)),h(ce,{name:"flyout"},{default:v(()=>[n.value?(a(),i("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:p},[c("div",Bn,[c("a",{class:"top-link",href:"#",onClick:_},L(r(t).returnToTopLabel||"Return to top"),1)]),c("div",An,[h(he,{headers:b.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}});const Hn=m(xn,[["__scopeId","data-v-24251f6f"]]),zn={},Dn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},En=c("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),Fn=c("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),On=c("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),Gn=c("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),Un=[En,Fn,On,Gn];function jn(s,e){return a(),i("svg",Dn,Un)}const Kn=m(zn,[["render",jn]]),qn=["aria-expanded"],Rn={class:"menu-text"},Wn=g({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(s){const{theme:e,frontmatter:t}=V(),{hasSidebar:n}=F(),{y:o}=Se(),l=_e([]),d=I(0);K(()=>{d.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Y(()=>{l.value=pe(t.value.outline??e.value.outline)});const p=P(()=>l.value.length===0&&!n.value),_=P(()=>({VPLocalNav:!0,fixed:p.value,"reached-top":o.value>=d.value}));return(b,w)=>r(t).layout!=="home"&&(!p.value||r(o)>=d.value)?(a(),i("div",{key:0,class:C(_.value)},[r(n)?(a(),i("button",{key:0,class:"menu","aria-expanded":b.open,"aria-controls":"VPSidebarNav",onClick:w[0]||(w[0]=S=>b.$emit("open-menu"))},[h(Kn,{class:"menu-icon"}),c("span",Rn,L(r(e).sidebarMenuLabel||"Menu"),1)],8,qn)):f("",!0),h(Hn,{headers:l.value,navHeight:d.value},null,8,["headers","navHeight"])],2)):f("",!0)}});const Yn=m(Wn,[["__scopeId","data-v-9e669cc1"]]);function Jn(){const s=I(!1);function e(){s.value=!0,window.addEventListener("resize",o)}function t(){s.value=!1,window.removeEventListener("resize",o)}function n(){s.value?t():e()}function o(){window.outerWidth>=768&&t()}const l=se();return q(()=>l.path,t),{isScreenOpen:s,openScreen:e,closeScreen:t,toggleScreen:n}}const Xn={},Zn={class:"VPSwitch",type:"button",role:"switch"},Qn={class:"check"},eo={key:0,class:"icon"};function to(s,e){return a(),i("button",Zn,[c("span",Qn,[s.$slots.default?(a(),i("span",eo,[u(s.$slots,"default",{},void 0,!0)])):f("",!0)])])}const so=m(Xn,[["render",to],["__scopeId","data-v-1c29e291"]]),no={},oo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ao=c("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),lo=[ao];function ro(s,e){return a(),i("svg",oo,lo)}const io=m(no,[["render",ro]]),co={},uo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},_o=Ue('',9),vo=[_o];function po(s,e){return a(),i("svg",uo,vo)}const ho=m(co,[["render",po]]),fo=g({__name:"VPSwitchAppearance",setup(s){const{isDark:e}=V(),t=ne("toggle-appearance",()=>{e.value=!e.value});return(n,o)=>(a(),$(so,{title:"toggle dark mode",class:"VPSwitchAppearance","aria-checked":r(e),onClick:r(t)},{default:v(()=>[h(ho,{class:"sun"}),h(io,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const me=m(fo,[["__scopeId","data-v-3329432d"]]),mo={key:0,class:"VPNavBarAppearance"},go=g({__name:"VPNavBarAppearance",setup(s){const{site:e}=V();return(t,n)=>r(e).appearance&&r(e).appearance!=="force-dark"?(a(),i("div",mo,[h(me)])):f("",!0)}});const bo=m(go,[["__scopeId","data-v-283b26e9"]]),ge=I();let Ce=!1,ae=0;function $o(s){const e=I(!1);if(W){!Ce&&ko(),ae++;const t=q(ge,n=>{var o,l,d;n===s.el.value||(o=s.el.value)!=null&&o.contains(n)?(e.value=!0,(l=s.onFocus)==null||l.call(s)):(e.value=!1,(d=s.onBlur)==null||d.call(s))});de(()=>{t(),ae--,ae||yo()})}return je(e)}function ko(){document.addEventListener("focusin",Be),Ce=!0,ge.value=document.activeElement}function yo(){document.removeEventListener("focusin",Be)}function Be(){ge.value=document.activeElement}const Po={},Vo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},wo=c("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),Lo=[wo];function So(s,e){return a(),i("svg",Vo,Lo)}const Ae=m(Po,[["render",So]]),Mo={},No={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Io=c("circle",{cx:"12",cy:"12",r:"2"},null,-1),To=c("circle",{cx:"19",cy:"12",r:"2"},null,-1),Co=c("circle",{cx:"5",cy:"12",r:"2"},null,-1),Bo=[Io,To,Co];function Ao(s,e){return a(),i("svg",No,Bo)}const xo=m(Mo,[["render",Ao]]),Ho={class:"VPMenuLink"},zo=g({__name:"VPMenuLink",props:{item:{}},setup(s){const{page:e}=V();return(t,n)=>(a(),i("div",Ho,[h(G,{class:C({active:r(j)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:v(()=>[x(L(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const oe=m(zo,[["__scopeId","data-v-f51f088d"]]),Do={class:"VPMenuGroup"},Eo={key:0,class:"title"},Fo=g({__name:"VPMenuGroup",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),i("div",Do,[e.text?(a(),i("p",Eo,L(e.text),1)):f("",!0),(a(!0),i(T,null,A(e.items,n=>(a(),i(T,null,["link"in n?(a(),$(oe,{key:0,item:n},null,8,["item"])):f("",!0)],64))),256))]))}});const Oo=m(Fo,[["__scopeId","data-v-a6b0397c"]]),Go={class:"VPMenu"},Uo={key:0,class:"items"},jo=g({__name:"VPMenu",props:{items:{}},setup(s){return(e,t)=>(a(),i("div",Go,[e.items?(a(),i("div",Uo,[(a(!0),i(T,null,A(e.items,n=>(a(),i(T,{key:n.text},["link"in n?(a(),$(oe,{key:0,item:n},null,8,["item"])):(a(),$(Oo,{key:1,text:n.text,items:n.items},null,8,["text","items"]))],64))),128))])):f("",!0),u(e.$slots,"default",{},void 0,!0)]))}});const Ko=m(jo,[["__scopeId","data-v-e42ed9b3"]]),qo=["aria-expanded","aria-label"],Ro={key:0,class:"text"},Wo=["innerHTML"],Yo={class:"menu"},Jo=g({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(s){const e=I(!1),t=I();$o({el:t,onBlur:n});function n(){e.value=!1}return(o,l)=>(a(),i("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:l[1]||(l[1]=d=>e.value=!0),onMouseleave:l[2]||(l[2]=d=>e.value=!1)},[c("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":o.label,onClick:l[0]||(l[0]=d=>e.value=!e.value)},[o.button||o.icon?(a(),i("span",Ro,[o.icon?(a(),$(U(o.icon),{key:0,class:"option-icon"})):f("",!0),o.button?(a(),i("span",{key:1,innerHTML:o.button},null,8,Wo)):f("",!0),h(Ae,{class:"text-icon"})])):(a(),$(xo,{key:1,class:"icon"}))],8,qo),c("div",Yo,[h(Ko,{items:o.items},{default:v(()=>[u(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const be=m(Jo,[["__scopeId","data-v-aa8de344"]]),Xo={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},Zo=["href","aria-label","innerHTML"],Qo=g({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(s){const e=s,t=P(()=>typeof e.icon=="object"?e.icon.svg:Xo[e.icon]);return(n,o)=>(a(),i("a",{class:"VPSocialLink no-icon",href:n.link,"aria-label":n.ariaLabel??(typeof n.icon=="string"?n.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,Zo))}});const ea=m(Qo,[["__scopeId","data-v-16cf740a"]]),ta={class:"VPSocialLinks"},sa=g({__name:"VPSocialLinks",props:{links:{}},setup(s){return(e,t)=>(a(),i("div",ta,[(a(!0),i(T,null,A(e.links,({link:n,icon:o,ariaLabel:l})=>(a(),$(ea,{key:n,icon:o,link:n,ariaLabel:l},null,8,["icon","link","ariaLabel"]))),128))]))}});const $e=m(sa,[["__scopeId","data-v-e71e869c"]]),na={key:0,class:"group translations"},oa={class:"trans-title"},aa={key:1,class:"group"},la={class:"item appearance"},ra={class:"label"},ia={class:"appearance-action"},ca={key:2,class:"group"},ua={class:"item social-links"},da=g({__name:"VPNavBarExtra",setup(s){const{site:e,theme:t}=V(),{localeLinks:n,currentLang:o}=X({correspondingLink:!0}),l=P(()=>n.value.length&&o.value.label||e.value.appearance||t.value.socialLinks);return(d,p)=>l.value?(a(),$(be,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[r(n).length&&r(o).label?(a(),i("div",na,[c("p",oa,L(r(o).label),1),(a(!0),i(T,null,A(r(n),_=>(a(),$(oe,{key:_.link,item:_},null,8,["item"]))),128))])):f("",!0),r(e).appearance?(a(),i("div",aa,[c("div",la,[c("p",ra,L(r(t).darkModeSwitchLabel||"Appearance"),1),c("div",ia,[h(me)])])])):f("",!0),r(t).socialLinks?(a(),i("div",ca,[c("div",ua,[h($e,{class:"social-links-list",links:r(t).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}});const _a=m(da,[["__scopeId","data-v-c8c2ae4b"]]),va=s=>(H("data-v-6bee1efd"),s=s(),z(),s),pa=["aria-expanded"],ha=va(()=>c("span",{class:"container"},[c("span",{class:"top"}),c("span",{class:"middle"}),c("span",{class:"bottom"})],-1)),fa=[ha],ma=g({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(s){return(e,t)=>(a(),i("button",{type:"button",class:C(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=n=>e.$emit("click"))},fa,10,pa))}});const ga=m(ma,[["__scopeId","data-v-6bee1efd"]]),ba=["innerHTML"],$a=g({__name:"VPNavBarMenuLink",props:{item:{}},setup(s){const{page:e}=V();return(t,n)=>(a(),$(G,{class:C({VPNavBarMenuLink:!0,active:r(j)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:v(()=>[c("span",{innerHTML:t.item.text},null,8,ba)]),_:1},8,["class","href","target","rel"]))}});const ka=m($a,[["__scopeId","data-v-cb318fec"]]),ya=g({__name:"VPNavBarMenuGroup",props:{item:{}},setup(s){const e=s,{page:t}=V(),n=l=>"link"in l?j(t.value.relativePath,l.link,!!e.item.activeMatch):l.items.some(n),o=P(()=>n(e.item));return(l,d)=>(a(),$(be,{class:C({VPNavBarMenuGroup:!0,active:r(j)(r(t).relativePath,l.item.activeMatch,!!l.item.activeMatch)||o.value}),button:l.item.text,items:l.item.items},null,8,["class","button","items"]))}}),Pa=s=>(H("data-v-f732b5d0"),s=s(),z(),s),Va={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},wa=Pa(()=>c("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),La=g({__name:"VPNavBarMenu",setup(s){const{theme:e}=V();return(t,n)=>r(e).nav?(a(),i("nav",Va,[wa,(a(!0),i(T,null,A(r(e).nav,o=>(a(),i(T,{key:o.text},["link"in o?(a(),$(ka,{key:0,item:o},null,8,["item"])):(a(),$(ya,{key:1,item:o},null,8,["item"]))],64))),128))])):f("",!0)}});const Sa=m(La,[["__scopeId","data-v-f732b5d0"]]);const Ma={type:"button",class:"DocSearch DocSearch-Button","aria-label":"Search"},Na={class:"DocSearch-Button-Container"},Ia=c("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[c("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),Ta={class:"DocSearch-Button-Placeholder"},Ca=c("span",{class:"DocSearch-Button-Keys"},[c("kbd",{class:"DocSearch-Button-Key"}),c("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Ve=g({__name:"VPNavBarSearchButton",props:{placeholder:{}},setup(s){return(e,t)=>(a(),i("button",Ma,[c("span",Na,[Ia,c("span",Ta,L(e.placeholder),1)]),Ca]))}});const Ba={class:"VPNavBarSearch"},Aa={id:"local-search"},xa={key:1,id:"docsearch"},Ha=g({__name:"VPNavBarSearch",setup(s){const e=Ke(()=>qe(()=>import("./VPLocalSearchBox.6e49b274.js"),["assets/chunks/VPLocalSearchBox.6e49b274.js","assets/chunks/framework.ed90c782.js"])),t=()=>null,{theme:n,localeIndex:o}=V(),l=I(!1),d=I(!1),p=P(()=>{var M,N,y,D,O,E,ke;const k=((M=n.value.search)==null?void 0:M.options)??n.value.algolia;return((O=(D=(y=(N=k==null?void 0:k.locales)==null?void 0:N[o.value])==null?void 0:y.translations)==null?void 0:D.button)==null?void 0:O.buttonText)||((ke=(E=k==null?void 0:k.translations)==null?void 0:E.button)==null?void 0:ke.buttonText)||"Search"});K(()=>{});function _(){l.value||(l.value=!0,setTimeout(b,16))}function b(){const k=new Event("keydown");k.key="k",k.metaKey=!0,window.dispatchEvent(k),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||b()},16)}function w(k){const M=k.target,N=M.tagName;return M.isContentEditable||N==="INPUT"||N==="SELECT"||N==="TEXTAREA"}const S=I(!1);ye("k",k=>{(k.ctrlKey||k.metaKey)&&(k.preventDefault(),S.value=!0)}),ye("/",k=>{w(k)||(k.preventDefault(),S.value=!0)});const B="local";return(k,M)=>{var N;return a(),i("div",Ba,[r(B)==="local"?(a(),i(T,{key:0},[S.value?(a(),$(r(e),{key:0,placeholder:p.value,onClose:M[0]||(M[0]=y=>S.value=!1)},null,8,["placeholder"])):f("",!0),c("div",Aa,[h(Ve,{placeholder:p.value,onClick:M[1]||(M[1]=y=>S.value=!0)},null,8,["placeholder"])])],64)):r(B)==="algolia"?(a(),i(T,{key:1},[l.value?(a(),$(r(t),{key:0,algolia:((N=r(n).search)==null?void 0:N.options)??r(n).algolia,onVnodeBeforeMount:M[2]||(M[2]=y=>d.value=!0)},null,8,["algolia"])):f("",!0),d.value?f("",!0):(a(),i("div",xa,[h(Ve,{placeholder:p.value,onClick:_},null,8,["placeholder"])]))],64)):f("",!0)])}}});const za=g({__name:"VPNavBarSocialLinks",setup(s){const{theme:e}=V();return(t,n)=>r(e).socialLinks?(a(),$($e,{key:0,class:"VPNavBarSocialLinks",links:r(e).socialLinks},null,8,["links"])):f("",!0)}});const Da=m(za,[["__scopeId","data-v-ef6192dc"]]),Ea=["href"],Fa=g({__name:"VPNavBarTitle",setup(s){const{site:e,theme:t}=V(),{hasSidebar:n}=F(),{currentLang:o}=X();return(l,d)=>(a(),i("div",{class:C(["VPNavBarTitle",{"has-sidebar":r(n)}])},[c("a",{class:"title",href:r(t).logoLink??r(J)(r(o).link)},[u(l.$slots,"nav-bar-title-before",{},void 0,!0),r(t).logo?(a(),$(ee,{key:0,class:"logo",image:r(t).logo},null,8,["image"])):f("",!0),r(t).siteTitle?(a(),i(T,{key:1},[x(L(r(t).siteTitle),1)],64)):r(t).siteTitle===void 0?(a(),i(T,{key:2},[x(L(r(e).title),1)],64)):f("",!0),u(l.$slots,"nav-bar-title-after",{},void 0,!0)],8,Ea)],2))}});const Oa=m(Fa,[["__scopeId","data-v-2973dbb4"]]),Ga={},Ua={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ja=c("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Ka=c("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),qa=[ja,Ka];function Ra(s,e){return a(),i("svg",Ua,qa)}const xe=m(Ga,[["render",Ra]]),Wa={class:"items"},Ya={class:"title"},Ja=g({__name:"VPNavBarTranslations",setup(s){const{theme:e}=V(),{localeLinks:t,currentLang:n}=X({correspondingLink:!0});return(o,l)=>r(t).length&&r(n).label?(a(),$(be,{key:0,class:"VPNavBarTranslations",icon:xe,label:r(e).langMenuLabel||"Change language"},{default:v(()=>[c("div",Wa,[c("p",Ya,L(r(n).label),1),(a(!0),i(T,null,A(r(t),d=>(a(),$(oe,{key:d.link,item:d},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}});const Xa=m(Ja,[["__scopeId","data-v-ff4524ae"]]),Za=s=>(H("data-v-f1abbc6e"),s=s(),z(),s),Qa={class:"container"},el={class:"title"},tl={class:"content"},sl=Za(()=>c("div",{class:"curtain"},null,-1)),nl={class:"content-body"},ol=g({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(s){const{y:e}=Se(),{hasSidebar:t}=F(),{frontmatter:n}=V(),o=I({});return we(()=>{o.value={"has-sidebar":t.value,top:n.value.layout==="home"&&e.value===0}}),(l,d)=>(a(),i("div",{class:C(["VPNavBar",o.value])},[c("div",Qa,[c("div",el,[h(Oa,null,{"nav-bar-title-before":v(()=>[u(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),c("div",tl,[sl,c("div",nl,[u(l.$slots,"nav-bar-content-before",{},void 0,!0),h(Ha,{class:"search"}),h(Sa,{class:"menu"}),h(Xa,{class:"translations"}),h(bo,{class:"appearance"}),h(Da,{class:"social-links"}),h(_a,{class:"extra"}),u(l.$slots,"nav-bar-content-after",{},void 0,!0),h(ga,{class:"hamburger",active:l.isScreenOpen,onClick:d[0]||(d[0]=p=>l.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const al=m(ol,[["__scopeId","data-v-f1abbc6e"]]),ll={key:0,class:"VPNavScreenAppearance"},rl={class:"text"},il=g({__name:"VPNavScreenAppearance",setup(s){const{site:e,theme:t}=V();return(n,o)=>r(e).appearance?(a(),i("div",ll,[c("p",rl,L(r(t).darkModeSwitchLabel||"Appearance"),1),h(me)])):f("",!0)}});const cl=m(il,[["__scopeId","data-v-0dc5cf49"]]),ul=g({__name:"VPNavScreenMenuLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),$(G,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e)},{default:v(()=>[x(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const dl=m(ul,[["__scopeId","data-v-fe523e3d"]]),_l={},vl={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},pl=c("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),hl=[pl];function fl(s,e){return a(),i("svg",vl,hl)}const ml=m(_l,[["render",fl]]),gl=g({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(s){const e=ne("close-screen");return(t,n)=>(a(),$(G,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e)},{default:v(()=>[x(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const He=m(gl,[["__scopeId","data-v-aea78dd1"]]),bl={class:"VPNavScreenMenuGroupSection"},$l={key:0,class:"title"},kl=g({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),i("div",bl,[e.text?(a(),i("p",$l,L(e.text),1)):f("",!0),(a(!0),i(T,null,A(e.items,n=>(a(),$(He,{key:n.text,item:n},null,8,["item"]))),128))]))}});const yl=m(kl,[["__scopeId","data-v-f60dbfa7"]]),Pl=["aria-controls","aria-expanded"],Vl={class:"button-text"},wl=["id"],Ll={key:1,class:"group"},Sl=g({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(s){const e=s,t=I(!1),n=P(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function o(){t.value=!t.value}return(l,d)=>(a(),i("div",{class:C(["VPNavScreenMenuGroup",{open:t.value}])},[c("button",{class:"button","aria-controls":n.value,"aria-expanded":t.value,onClick:o},[c("span",Vl,L(l.text),1),h(ml,{class:"button-icon"})],8,Pl),c("div",{id:n.value,class:"items"},[(a(!0),i(T,null,A(l.items,p=>(a(),i(T,{key:p.text},["link"in p?(a(),i("div",{key:p.text,class:"item"},[h(He,{item:p},null,8,["item"])])):(a(),i("div",Ll,[h(yl,{text:p.text,items:p.items},null,8,["text","items"])]))],64))),128))],8,wl)],2))}});const Ml=m(Sl,[["__scopeId","data-v-c2c554ed"]]),Nl={key:0,class:"VPNavScreenMenu"},Il=g({__name:"VPNavScreenMenu",setup(s){const{theme:e}=V();return(t,n)=>r(e).nav?(a(),i("nav",Nl,[(a(!0),i(T,null,A(r(e).nav,o=>(a(),i(T,{key:o.text},["link"in o?(a(),$(dl,{key:0,item:o},null,8,["item"])):(a(),$(Ml,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),Tl=g({__name:"VPNavScreenSocialLinks",setup(s){const{theme:e}=V();return(t,n)=>r(e).socialLinks?(a(),$($e,{key:0,class:"VPNavScreenSocialLinks",links:r(e).socialLinks},null,8,["links"])):f("",!0)}}),Cl={class:"list"},Bl=g({__name:"VPNavScreenTranslations",setup(s){const{localeLinks:e,currentLang:t}=X({correspondingLink:!0}),n=I(!1);function o(){n.value=!n.value}return(l,d)=>r(e).length&&r(t).label?(a(),i("div",{key:0,class:C(["VPNavScreenTranslations",{open:n.value}])},[c("button",{class:"title",onClick:o},[h(xe,{class:"icon lang"}),x(" "+L(r(t).label)+" ",1),h(Ae,{class:"icon chevron"})]),c("ul",Cl,[(a(!0),i(T,null,A(r(e),p=>(a(),i("li",{key:p.link,class:"item"},[h(G,{class:"link",href:p.link},{default:v(()=>[x(L(p.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}});const Al=m(Bl,[["__scopeId","data-v-41505286"]]),xl={class:"container"},Hl=g({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(s){const e=I(null),t=Me(W?document.body:null);return(n,o)=>(a(),$(ce,{name:"fade",onEnter:o[0]||(o[0]=l=>t.value=!0),onAfterLeave:o[1]||(o[1]=l=>t.value=!1)},{default:v(()=>[n.open?(a(),i("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[c("div",xl,[u(n.$slots,"nav-screen-content-before",{},void 0,!0),h(Il,{class:"menu"}),h(Al,{class:"translations"}),h(cl,{class:"appearance"}),h(Tl,{class:"social-links"}),u(n.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}});const zl=m(Hl,[["__scopeId","data-v-57cce842"]]),Dl={key:0,class:"VPNav"},El=g({__name:"VPNav",setup(s){const{isScreenOpen:e,closeScreen:t,toggleScreen:n}=Jn(),{frontmatter:o}=V(),l=P(()=>o.value.navbar!==!1);return Ne("close-screen",t),te(()=>{W&&document.documentElement.classList.toggle("hide-nav",!l.value)}),(d,p)=>l.value?(a(),i("header",Dl,[h(al,{"is-screen-open":r(e),onToggleScreen:r(n)},{"nav-bar-title-before":v(()=>[u(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(d.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),h(zl,{open:r(e)},{"nav-screen-content-before":v(()=>[u(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}});const Fl=m(El,[["__scopeId","data-v-7ad780c2"]]),Ol=s=>(H("data-v-bd01e0d5"),s=s(),z(),s),Gl=["role","tabindex"],Ul=Ol(()=>c("div",{class:"indicator"},null,-1)),jl=["onKeydown"],Kl={key:1,class:"items"},ql=g({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(s){const e=s,{collapsed:t,collapsible:n,isLink:o,isActiveLink:l,hasActiveLink:d,hasChildren:p,toggle:_}=mt(P(()=>e.item)),b=P(()=>p.value?"section":"div"),w=P(()=>o.value?"a":"div"),S=P(()=>p.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),B=P(()=>o.value?void 0:"button"),k=P(()=>[[`level-${e.depth}`],{collapsible:n.value},{collapsed:t.value},{"is-link":o.value},{"is-active":l.value},{"has-active":d.value}]);function M(y){"key"in y&&y.key!=="Enter"||!e.item.link&&_()}function N(){e.item.link&&_()}return(y,D)=>{const O=R("VPSidebarItem",!0);return a(),$(U(b.value),{class:C(["VPSidebarItem",k.value])},{default:v(()=>[y.item.text?(a(),i("div",Z({key:0,class:"item",role:B.value},We(y.item.items?{click:M,keydown:M}:{},!0),{tabindex:y.item.items&&0}),[Ul,y.item.link?(a(),$(G,{key:0,tag:w.value,class:"link",href:y.item.link,rel:y.item.rel,target:y.item.target},{default:v(()=>[(a(),$(U(S.value),{class:"text",innerHTML:y.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),$(U(S.value),{key:1,class:"text",innerHTML:y.item.text},null,8,["innerHTML"])),y.item.collapsed!=null?(a(),i("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:N,onKeydown:Re(N,["enter"]),tabindex:"0"},[h(fe,{class:"caret-icon"})],40,jl)):f("",!0)],16,Gl)):f("",!0),y.item.items&&y.item.items.length?(a(),i("div",Kl,[y.depth<5?(a(!0),i(T,{key:0},A(y.item.items,E=>(a(),$(O,{key:E.text,item:E,depth:y.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}});const Rl=m(ql,[["__scopeId","data-v-bd01e0d5"]]),ze=s=>(H("data-v-ee2efba5"),s=s(),z(),s),Wl=ze(()=>c("div",{class:"curtain"},null,-1)),Yl={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Jl=ze(()=>c("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Xl=g({__name:"VPSidebar",props:{open:{type:Boolean}},setup(s){const e=s,{sidebarGroups:t,hasSidebar:n}=F(),o=I(null),l=Me(W?document.body:null);return q([e,o],()=>{var d;e.open?(l.value=!0,(d=o.value)==null||d.focus()):l.value=!1},{immediate:!0,flush:"post"}),(d,p)=>r(n)?(a(),i("aside",{key:0,class:C(["VPSidebar",{open:d.open}]),ref_key:"navEl",ref:o,onClick:p[0]||(p[0]=Ye(()=>{},["stop"]))},[Wl,c("nav",Yl,[Jl,u(d.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),i(T,null,A(r(t),_=>(a(),i("div",{key:_.text,class:"group"},[h(Rl,{item:_,depth:0},null,8,["item"])]))),128)),u(d.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}});const Zl=m(Xl,[["__scopeId","data-v-ee2efba5"]]),Ql=g({__name:"VPSkipLink",setup(s){const e=se(),t=I();q(()=>e.path,()=>t.value.focus());function n({target:o}){const l=document.getElementById(decodeURIComponent(o.hash).slice(1));if(l){const d=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",d)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",d),l.focus(),window.scrollTo(0,0)}}return(o,l)=>(a(),i(T,null,[c("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),c("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:n}," Skip to content ")],64))}});const er=m(Ql,[["__scopeId","data-v-c8291ffa"]]),tr=g({__name:"Layout",setup(s){const{isOpen:e,open:t,close:n}=F(),o=se();q(()=>o.path,n),ft(e,n);const{frontmatter:l}=V(),d=Je(),p=P(()=>!!d["home-hero-image"]);return Ne("hero-image-slot-exists",p),(_,b)=>{const w=R("Content");return r(l).layout!==!1?(a(),i("div",{key:0,class:C(["Layout",r(l).pageClass])},[u(_.$slots,"layout-top",{},void 0,!0),h(er),h(tt,{class:"backdrop",show:r(e),onClick:r(n)},null,8,["show","onClick"]),h(Fl,null,{"nav-bar-title-before":v(()=>[u(_.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(_.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(_.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(_.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[u(_.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(_.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),h(Yn,{open:r(e),onOpenMenu:r(t)},null,8,["open","onOpenMenu"]),h(Zl,{open:r(e)},{"sidebar-nav-before":v(()=>[u(_.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[u(_.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),h(Sn,null,{"page-top":v(()=>[u(_.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(_.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[u(_.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[u(_.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(_.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(_.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(_.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(_.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(_.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[u(_.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(_.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(_.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[u(_.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(_.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[u(_.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(_.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(_.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(_.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(_.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(_.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),h(Cn),u(_.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),$(w,{key:1}))}}});const sr=m(tr,[["__scopeId","data-v-9d8abc1e"]]);const or={Layout:sr,enhanceApp:({app:s})=>{s.component("Badge",Ze)}};function ar(s,e){const{localeIndex:t}=V();function n(o){var k,M;const l=o.split("."),d=s&&typeof s=="object",p=d&&((M=(k=s.locales)==null?void 0:k[t.value])==null?void 0:M.translations)||null,_=d&&s.translations||null;let b=p,w=_,S=e;const B=l.pop();for(const N of l){let y=null;const D=S==null?void 0:S[N];D&&(y=S=D);const O=w==null?void 0:w[N];O&&(y=w=O);const E=b==null?void 0:b[N];E&&(y=b=E),D||(S=y),O||(w=y),E||(b=y)}return(b==null?void 0:b[B])??(w==null?void 0:w[B])??(S==null?void 0:S[B])??""}return n}export{ar as c,or as t,V as u}; diff --git a/assets/delta_faq.md.f7380f2d.js b/assets/delta_faq.md.f7380f2d.js new file mode 100644 index 00000000..b6e91640 --- /dev/null +++ b/assets/delta_faq.md.f7380f2d.js @@ -0,0 +1 @@ +import{_ as a,o as e,c as i,Q as r}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"delta/faq.md","filePath":"delta/faq.md","lastUpdated":1694898637000}'),s={name:"delta/faq.md"},o=r('

    常见问题

    如何安装 Magisk Delta?

    如何从当前的 Magisk 切换到 Magisk Delta,反之亦然?

    就像更新 Magisk 时一样!

    直接安装(推荐)

    1. 安装并打开 Magisk Delta,然后授予 root 访问权限。
    2. Magisk部分,点击“安装”,然后点击“直接安装”。如果看不到,请尝试关闭并打开应用程序。

    只需从当前的 Magisk 应用程序刷入 Magisk Delta

    1. 将扩展名 magisk.apk 重命名为 magisk.zip
    2. 打开 Magisk 应用程序,点击“模块”选项卡 -> “从存储安装”,然后选择 magisk.zip

    将 Magisk 直接安装到 /system(不推荐)

    请仅在具有 SELinux 宽容模式的 ROM 上使用此方法,或在 sepolicy 规则中使用许可 "u:r:su:s0 "上下文执行 SELinux,如 LineageOS 等用户调试 ROM。你应该备份你的 ROM,以防系统无法启动,也不要使用已损坏的第三方 Recovery。你的 ROM 必须能够挂载为读写,内核必须支持动态 SeLinux 规则补丁。使用此方法风险自负!

    由于某些原因,你不想用常规方法安装 Magisk(补丁启动映像),可以直接将 Magisk 安装到 /system

    1. 如果已安装 Magisk,则还原为默认启动映像
    2. 启动到 recovery,将 magisk.apk 重命名为 systemmagisk.zip 并刷入。
    3. 如果要更新 Magisk,请使用直接安装到系统分区,而不是直接安装

    如何将 Magisk 安装到 Android-x86 项目或 Android 模拟器中

    开始之前

    1. 只有 Magisk Delta 支持将 Magisk 安装到系统分区。
    2. 虽然模拟器有 ramdisk 映像,但不使用修补 ramdisk,因为 ramdisk 存储在单独的分区中,磁盘空间非常小,不足以存储 Magisk 二进制文件。
    3. 已采用最新的 Magisk Delta Canary 来支持 Bluestacks,但需要 app_process wrapper 来运行 Zygisk.
    4. 已测试的模拟器列表: NoxPlayer、LDPlayer、MEmu。
    5. 已测试的 Android x86 项目列表: BlissOS, PrimeOS
    6. Waydroid 支持 Canary 版本。

    将 Magisk 安装到 NoxPlayer、LDPlayer、MemuPlayer 等模拟器的步骤

    1. 在模拟器设置中启用 Root 访问
    2. 安装并打开 Magisk Delta
    3. 授予 Magisk Delta root 访问权限,点击 Magisk 卡片下的 "安装",使用“直接安装到系统分区”选项,而不是“直接安装”选项(如果没有看到此选项,请关闭并重新打开 Magisk Delta 应用程序),现在不要重启!
    4. ~~ 在模拟器设置中禁用 Root 访问。 ~~ 备份内置 su/system/bin/su/system/xbin/su)并删除它们(以防卸载 Magisk 后恢复内置 su),然后重启。由于 LDPlayer 等模拟器会在设置中禁用 ROOT 后删除所有su,因此切勿在模拟器设置中禁用 Root 访问。
    5. 享受 Magisk!

    将 Magisk 安装到 Bluestacks 的步骤

    1. 此处 下载 Bluestacks Tweaker
    2. 并单击“解锁”解锁 Bluestacks 实例,然后启动它,否则无法安装 Magisk。
    3. 实例成功启动后,点击“补丁”打开 root 访问,安装 Magisk Delta 并执行“直接安装到系统分区”操作
    4. 完成后,单击“UnPatch”,然后重新注册实例。
    5. 享受 Magisk!

    将 Magisk 安装到 Android-x86 项目的步骤

    • 你可以使用 initrd-magisk 或按照上述指南直接将 Magisk 安装到系统分区中。

    在 Waydroid 上安装 Magisk 的步骤

    启用 MagiskHide 后,为什么我的应用程序/游戏仍能检测到模拟器?

    MagiskHide 不是模拟器检测绕过程序

    如何在 Recovery 手动触发核心模式?

    在以下位置创建名为 .disable_magisk 的空文件:/cache/persist/metadata

    为什么不恢复 Magisk 模块的在线 repo?

    Magisk 的官方模块库已经死亡,不再维护。因此,将它们添加回去毫无意义。不过,Fox2Code 开发了 Magisk 模块管理器 应用程序,允许您在线下载 Magisk 模块。

    我应该安装 Shxxxxo 模块来隐藏 root 吗?

    • 不建议使用,你应该卸载它。如果不这样做,就不要向我抱怨死机了。MagiskHide 就足够了。
    • 如果你真的想使用 Shxxxxo,那就卸载 Magisk Delta,使用官方 Magisk ¯_(ツ)_/¯

    为什么启用 SuList 后某些模块会损坏?

    SuList 意味着 MagiskSU 和模块默认未加载,只有列表中的应用程序才会加载 Magisk,因此无法完全支持模块的功能,因为大多数模块必须在所有应用程序中加载,这相当于被检测到。有关 SuList 的更多信息,请阅读

    参考链接

    • FAQ(官方)
    ',36),l=[o];function t(d,k,h,n,g,c){return e(),i("div",null,l)}const M=a(s,[["render",t]]);export{m as __pageData,M as default}; diff --git a/assets/delta_faq.md.f7380f2d.lean.js b/assets/delta_faq.md.f7380f2d.lean.js new file mode 100644 index 00000000..2bd80da6 --- /dev/null +++ b/assets/delta_faq.md.f7380f2d.lean.js @@ -0,0 +1 @@ +import{_ as a,o as e,c as i,Q as r}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"delta/faq.md","filePath":"delta/faq.md","lastUpdated":1694898637000}'),s={name:"delta/faq.md"},o=r("",36),l=[o];function t(d,k,h,n,g,c){return e(),i("div",null,l)}const M=a(s,[["render",t]]);export{m as __pageData,M as default}; diff --git a/assets/delta_internal-guide.md.65b191bb.js b/assets/delta_internal-guide.md.65b191bb.js new file mode 100644 index 00000000..a5ad0af9 --- /dev/null +++ b/assets/delta_internal-guide.md.65b191bb.js @@ -0,0 +1,23 @@ +import{_ as s,o as a,c as o,Q as l}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"Magisk Delta 内部文档","description":"","frontmatter":{},"headers":[],"relativePath":"delta/internal-guide.md","filePath":"delta/internal-guide.md","lastUpdated":1694898637000}'),n={name:"delta/internal-guide.md"},e=l(`

    Magisk Delta 内部文档

    本文档介绍了适用于安卓设备的无系统 root 解决方案 Magisk Delta 的部分高级功能。Magisk Delta 允许你在不改变原始启动映像的情况下修改设备,并提供一个统一的界面来管理模块、root 访问权限等。

    早期挂载

    有些文件需要在启动过程中尽早挂载,即在执行“启动”进程之前。Magisk Delta 提供了一种在“预启动”阶段使用 early-mount.d 目录挂载文件的方法。

    • 要检查 Magisk Delta 是否支持 early-mount.d/v2,请使用此代码:
    bash
    EARLYMOUNTV2=false
    +if grep "$(magisk --path)/.magisk/early-mount.d" /proc/mounts | grep -q '^early-mount.d/v2'; then
    +    EARLYMOUNTV2=true
    +fi
    EARLYMOUNTV2=false
    +if grep "$(magisk --path)/.magisk/early-mount.d" /proc/mounts | grep -q '^early-mount.d/v2'; then
    +    EARLYMOUNTV2=true
    +fi
    • 要查找 early-mount.d 目录(Magisk v26+),请使用此代码:
    bash
    $(magisk --path)/.magisk/early-mount.d
    $(magisk --path)/.magisk/early-mount.d

    常规挂载

    • 由于在 Magisk Delta v26.0+ 中使用了新的 sepolicy 规则实施 early-mount.d/v2,一般的早期挂载分区将挂载到 $MAGISKTMP/.magisk/early-mount.d。早期挂载分区与预启动分区相同,可以是其中之一: datacachemetadatacustpersist等。Magisk 在修补引导映像时会对预启动分区进行硬编码。

    (*) 使用 persistmetadata 进行早期挂载时要小心,因为这些分区的大小非常有限。填满它们可能会导致设备无法启动。

    • 您可以将文件放到 early-mount.d 目录下的相应位置。例如,如果您想替换 /vendor/etc/vintf/manifest.xml,请将您的 manifest.xml 复制到 $MAGISKTMP/.magisk/early-mount.d/system/vendor/etc/vintf/manifest.xml。Magisk Delta 将在下次重启时挂载您的文件。其他不在 early-mount.d/system 中的文件将被忽略。

    模块挂载

    • 自 Magisk Delta v26.0+ 使用 early-mount.d/v2 以来,您也可以将早期挂载文件放在 /data/adb/modules/<module_id>/early-mount 中。

    TIP

    早期启动挂载只支持简单挂载,即可以替换文件,但不能添加新文件、文件夹或替换文件夹。

    init.rc 注入

    常规注入

    如果您想在不重新打包启动映像的情况下将自定义 *.rc 脚本注入设备,Magisk Delta 提供了一种无系统地实现这一目标的方法。您可以使用 initrc.d 目录来存储自定义脚本,Magisk Delta 会在每次启动时将它们注入到 init.rc 中。

    • 自定义 *.rc 脚本的位置是 $PRENITDIR/early-mount.d/initrc.d。Magisk Delta 会在每次启动时将此文件夹中的所有脚本注入到 init.rc 中。
    • 您可以使用 \${MAGISKTMP} 来引用 Magisk 的 tmpfs 目录。当 magiskinit 将 \${MAGISKTMP} 注入到 init.rc 时,您的 *.rc 脚本中出现的 \${MAGISKTMP} 模式将被替换为 Magisk 的 tmpfs 目录。
    • 启动时,Magisk 的镜像不可用,因此需要使用 \${MAGISKTMP}/.magisk/early-mount.d 模式来访问 early-mount.d 目录的副本。

    下面是一个自定义脚本的示例,名为 custom.rc,可以与 initrc.d 一起使用:

    bash
    # 使用 \${MAGISKTMP} 引用 Magisk 的 tmpfs 目录
    +
    +on early-init
    +    setprop sys.example.foo bar
    +    insmod \${MAGISKTMP}/.magisk/early-mount.d/libfoo.ko
    +    start myservice
    +
    +service myservice \${MAGISKTMP}/.magisk/early-mount.d/myscript.sh
    +    oneshot
    # 使用 \${MAGISKTMP} 引用 Magisk 的 tmpfs 目录
    +
    +on early-init
    +    setprop sys.example.foo bar
    +    insmod \${MAGISKTMP}/.magisk/early-mount.d/libfoo.ko
    +    start myservice
    +
    +service myservice \${MAGISKTMP}/.magisk/early-mount.d/myscript.sh
    +    oneshot

    模块注入

    自 Magisk Delta v26.0+ 使用 early-mount.d/v2 后,您也可以将 initrc.d 文件放到 /data/adb/modules/<module_id>/early-mount/initrc.d 中。

    删除文件和文件夹

    使用 Magisk 模块是修改系统分区的简便方法,无需对系统分区进行实际修改,而且修改非常容易。Magisk 模块可以替换或添加任何文件或文件夹到系统中。但仍不允许使用 Magisk 模块删除文件。

    在 Magisk 文档中:

    实际删除文件很复杂(有可能,但不值得这么做)。用一个假文件替换它就足够了

    要真正删除文件夹非常复杂(有可能,但不值得费力)。用一个空文件夹替换就足够了。将文件夹添加到模块模板中 "config.sh" 的替换列表中,它将用一个空文件夹替换该文件夹

    在某些情况下,仅将文件或文件夹替换为空文件或文件夹是不够的,还可能导致问题,因为某些修改需要文件消失才能生效。因此,Magisk Delta 为模块添加了删除支持:在模块目录的相应位置创建指向 /xxxxx 的损坏的符号链接

    以创建符号链接 /data/adb/modules/mymodule_id/system/vendor/etc/thermal-engine-normal.conf 为例,目标 /vendor/etc/thermal-engine-normal.conf 将被忽略并消失。

    bash
    ln -s "/xxxxx" /data/adb/modules/mymodule_id/system/vendor/etc/thermal-engine-normal.conf
    ln -s "/xxxxx" /data/adb/modules/mymodule_id/system/vendor/etc/thermal-engine-normal.conf

    参考链接

    `,32),p=[e];function t(c,r,i,d,y,E){return a(),o("div",null,p)}const h=s(n,[["render",t]]);export{m as __pageData,h as default}; diff --git a/assets/delta_internal-guide.md.65b191bb.lean.js b/assets/delta_internal-guide.md.65b191bb.lean.js new file mode 100644 index 00000000..c56cea6d --- /dev/null +++ b/assets/delta_internal-guide.md.65b191bb.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as o,Q as l}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"Magisk Delta 内部文档","description":"","frontmatter":{},"headers":[],"relativePath":"delta/internal-guide.md","filePath":"delta/internal-guide.md","lastUpdated":1694898637000}'),n={name:"delta/internal-guide.md"},e=l("",32),p=[e];function t(c,r,i,d,y,E){return a(),o("div",null,p)}const h=s(n,[["render",t]]);export{m as __pageData,h as default}; diff --git a/assets/details.md.8ac7ccaf.js b/assets/details.md.8ac7ccaf.js deleted file mode 100644 index 64dc01ec..00000000 --- a/assets/details.md.8ac7ccaf.js +++ /dev/null @@ -1,47 +0,0 @@ -import{_ as s,o as a,c as e,V as o}from"./chunks/framework.fc84ac3a.js";const k=JSON.parse('{"title":"内部细节","description":"","frontmatter":{},"headers":[],"relativePath":"details.md","filePath":"details.md","lastUpdated":1684159014000}'),n={name:"details.md"},l=o(`

    内部细节

    文档结构

    “Magisk tmpfs 目录”中的路径

    Magisk 将安装一个 tmpfs 目录来存储一些临时数据。对于带有 /sbin 文件夹的设备,将选择该文件夹,因为它还将充当将二进制文件注入 PATH 的覆盖层。从 Android 11 开始,/sbin 文件夹可能不存在,因此 Magisk 将在 /dev 下随机创建一个文件夹,并将其用作基本文件夹。

    shell
    # 为了获得Magisk正在使用的当前基本文件夹,使用命令 \`magisk--path\`。
    -# 二进制文件,如 magisk、magiskinit 和所有小程序的符号链接直接存储
    -# 在此路径中。这意味着当这是/sbin,这些二进制文件将直接在 PATH 中。
    -MAGISKTMP=$(magisk --path)
    -
    -# Magisk 内部材料
    -INTERNALDIR=$MAGISKTMP/.magisk
    -
    -# /data/adb/modules 将挂载到此处。
    -# 由于 nosuid 挂载标志,未使用原始文件夹。
    -$INTERNALDIR/modules
    -
    -# 当前 Magisk 安装配置
    -$INTERNALDIR/config
    -
    -# 分区映像
    -# 此路径中的每个目录都将装载其目录名的分区。
    -# 例如 system,system_ext,vendor,data ...
    -$INTERNALDIR/mirror
    -
    -# 根目录修补程序文件
    -# 在 system-as-root 的系统上,/不可写。
    -# 所有预初始化补丁文件都存储在这里绑定挂载。
    -$INTERNALDIR/rootdir

    /data 中的路径

    一些二进制文件和文件应存储在 /data 中的非易失性存储中。为了防止检测,所有东西都必须存储在 /data 中安全且不可检测的地方。选 /data/adb 文件夹是因为其具有以下优点:

    • 它是现代安卓系统上的一个现有文件夹,因此不能作为 Magisk 存在的标志。
    • 文件夹的权限默认为 700,所有者为 root,因此非 root 进程无法以任何可能的方式进入、读取和写入文件夹。
    • 文件夹 secontext 标记为 u:object_r:adb_data_file:s0,很少有进程有权与该 secontext 进行任何交互。
    • 该文件夹位于设备加密存储区中,因此一旦数据正确装载到 FBE(File-Based Encryption,基于文件的加密)设备中,即可访问该文件夹。
    shell
    SECURE_DIR=/data/adb
    -
    -# 存储常规 post-fs-data 脚本的文件夹
    -$SECURE_DIR/post-fs-data.d
    -
    -#存储常规 late_start 服务脚本的文件夹
    -$SECURE_DIR/service.d
    -
    -# Magisk 模块
    -$SECURE_DIR/modules
    -
    -# 等待升级的 Magisk 模块
    -# 模块文件在挂载时无法安全修改
    -# 通过 Magisk app 安装的模块将存储在此处并将在下次重新启动时
    -# 合并到 $SECURE_DIR/modules 中
    -$SECURE_DIR/modules_update
    -
    -# 数据库存储设置和 Root 权限
    -MAGISKDB=$SECURE_DIR/magisk.db
    -
    -# 所有与 magisk 相关的二进制文件,包括 busybox、脚本
    -# 和 magisk 二进制文件。用于支持模块安装、addon.d、 
    -# Magisk app 等。
    -DATABIN=$SECURE_DIR/magisk

    Magisk引导过程

    预初始化(Pre-Init)

    magiskinit 将替换 init 作为第一个运行的程序。

    • 挂载早期所需的分区。在已停产 system-as-root 设备上,我们将 root 切换到系统;在 2SI 设备上,我们修补原始的 init ,将第二阶段的 init 文件重定向到 magiskinit,并执行它为我们装载分区。
    • 将 magisk 服务注入 init.rc
    • 在使用 monolithic 策略的设备上,从 /sepolicy 加载 sepolicy ;否则我们使用 FIFO 劫持 selinuxfs 中的节点,将 LD_PRELOAD 设置为钩住 security_load_policy,并在 2SI 设备上协助劫持,然后启动守护程序,等待 init 尝试加载 sepolicy。
    • 修补 sepolicy 规则。如果我们使用“劫持”方法,将修补的 sepolicy 加载到内核中,取消阻止 init 并退出守护进程
    • 执行原始的 init 以继续启动过程

    解密后(post-fs-data)

    /data 被解密和装载时会在 post-fs-data 上触发。守护程序 magiskd 将被启动,执行 post-fs-data 脚本,并神奇地安装模块文件。

    后期启动(late_start)

    在稍后的引导过程中,将触发类 late_start ,并启动 Magisk “服务”模式。在此模式下,执行服务(service)脚本。

    重置属性(Resetprop)

    通常,系统属性(properties)被设计为仅由 init 更新,并且对非 root 进程是只读的。使用 root,您可以通过使用诸如 setprop 之类的命令向 property_service(由 init 托管)发送请求来更改属性,但仍然禁止更改只读属性(以ro.开头的属性,如ro.build.product)和删除属性。

    resetprop 是通过从 AOSP 中提取出与系统属性相关的源代码来实现的,并进行了修补,以允许直接修改属性区域或 prop_area,而无需通过 property_service 。由于我们绕过了 property_service ,因此需要注意一些:

    • 如果属性更改未通过 property_service ,则不会触发在 *.rc 脚本中注册的on property:foo=bar 操作。resetprop 的默认设置属性行为与 setprop 匹配,这将触发事件(通过首先删除属性,然后通过 property_service 设置它来实现)。如果您需要此特殊行为,则有一个标志 -n 可以禁用它。
    • 持久属性(以 persist. 开头的属性,如 persist.sys.usb.config )存储在 prop_area/data/property 中。默认情况下,删除属性不会将其从持久存储中删除,这意味着该属性将在下次重新启动后恢复;读取属性不会从持久存储中读取,因为这是 getprop 的行为。使用标志 -p ,删除属性将同时删除 prop_area/data/property 中的属性,读取属性将从 prop_area 和持久存储中读取。

    SELinux 政策

    Magisk 将修补现成的 sepolicy ,以确保 Root 和 Magisk 操作能够以安全可靠的方式完成。新域 magisk 是有效的,这就是 magiskd 和所有 root shell 将在其中运行的内容。magisk_file 是一种新的文件类型,设置为允许每个域(不受限制的文件上下文)访问。

    在 Android 8.0 之前,所有允许的 su 客户端域都可以直接连接到 magiskd 并与守护进程建立连接,以获得远程 root shell。Magisk 还必须放宽一些 ioctl 操作,以便 root shell 能够正常运行。

    在 Android 8.0 之后,为了减少 Android 沙盒中规则的放宽,部署了新的 SELinux 模型。 magisk 二进制文件标记为 magisk_exec 文件类型,并且执行 magisk 二进制文件(包括 su 命令)的 su 客户端域将通过使用 type_transition 规则传输到 magisk_client 。规则严格限制仅允许 magisk 域进程将文件归因于 magisk_exec 。不允许直接连接到 magiskd 的 sockets;访问守护进程的唯一方法是通过 magisk_client 进程。这些更改使我们能够保持沙盒完好无损,并将 Magisk 特定规则与其他策略分开。

    完整的规则可以在 magiskpolicy/rules.cpp 中找到。

    参考链接

    `,28),t=[l];function c(i,p,d,r,y,h){return a(),e("div",null,t)}const g=s(n,[["render",c]]);export{k as __pageData,g as default}; diff --git a/assets/details.md.8ac7ccaf.lean.js b/assets/details.md.8ac7ccaf.lean.js deleted file mode 100644 index 26333507..00000000 --- a/assets/details.md.8ac7ccaf.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as a,c as e,V as o}from"./chunks/framework.fc84ac3a.js";const k=JSON.parse('{"title":"内部细节","description":"","frontmatter":{},"headers":[],"relativePath":"details.md","filePath":"details.md","lastUpdated":1684159014000}'),n={name:"details.md"},l=o("",28),t=[l];function c(i,p,d,r,y,h){return a(),e("div",null,t)}const g=s(n,[["render",c]]);export{k as __pageData,g as default}; diff --git a/assets/details.md.a7ca6af8.js b/assets/details.md.a7ca6af8.js new file mode 100644 index 00000000..c29689fa --- /dev/null +++ b/assets/details.md.a7ca6af8.js @@ -0,0 +1,93 @@ +import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.ed90c782.js";const g=JSON.parse('{"title":"内部细节","description":"","frontmatter":{},"headers":[],"relativePath":"details.md","filePath":"details.md","lastUpdated":1694965574000}'),l={name:"details.md"},o=e(`

    内部细节

    文档结构

    “Magisk tmpfs 目录”中的路径

    Magisk 将安装一个 tmpfs 目录来存储一些临时数据。对于带有 /sbin 文件夹的设备,将选择该文件夹,因为它还将充当将二进制文件注入 PATH 的覆盖层。从 Android 11 开始,/sbin 文件夹可能不存在,因此 Magisk 将 /debug_ramdisk 其用作基本文件夹。

    bash
    # 为了获得Magisk正在使用的当前基本文件夹,使用命令 \`magisk--path\`。
    +# 二进制文件,如 magisk、magiskinit 和所有小程序的符号链接直接存储
    +# 在此路径中。这意味着当这是/sbin,这些二进制文件将直接在 PATH 中。
    +MAGISKTMP=$(magisk --path)
    +
    +# Magisk 内部材料
    +INTERNALDIR=$MAGISKTMP/.magisk
    +
    +# /data/adb/modules 将挂载到此处。
    +# 由于 nosuid 挂载标志,未使用原始文件夹。
    +$INTERNALDIR/modules
    +
    +# 当前 Magisk 安装配置
    +$INTERNALDIR/config
    +
    +# 分区映像
    +# 此路径中的每个目录都将装载其目录名的分区。
    +# 例如 system,system_ext,vendor,data ...
    +$INTERNALDIR/mirror
    +
    +# 根目录修补程序文件
    +# 在 system-as-root 的系统上,/不可写。
    +# 所有预初始化补丁文件都存储在这里绑定挂载。
    +$INTERNALDIR/rootdir
    # 为了获得Magisk正在使用的当前基本文件夹,使用命令 \`magisk--path\`。
    +# 二进制文件,如 magisk、magiskinit 和所有小程序的符号链接直接存储
    +# 在此路径中。这意味着当这是/sbin,这些二进制文件将直接在 PATH 中。
    +MAGISKTMP=$(magisk --path)
    +
    +# Magisk 内部材料
    +INTERNALDIR=$MAGISKTMP/.magisk
    +
    +# /data/adb/modules 将挂载到此处。
    +# 由于 nosuid 挂载标志,未使用原始文件夹。
    +$INTERNALDIR/modules
    +
    +# 当前 Magisk 安装配置
    +$INTERNALDIR/config
    +
    +# 分区映像
    +# 此路径中的每个目录都将装载其目录名的分区。
    +# 例如 system,system_ext,vendor,data ...
    +$INTERNALDIR/mirror
    +
    +# 根目录修补程序文件
    +# 在 system-as-root 的系统上,/不可写。
    +# 所有预初始化补丁文件都存储在这里绑定挂载。
    +$INTERNALDIR/rootdir

    /data 中的路径

    一些二进制文件和文件应存储在 /data 中的非易失性存储中。为了防止检测,所有东西都必须存储在 /data 中安全且不可检测的地方。选 /data/adb 文件夹是因为其具有以下优点:

    • 它是现代安卓系统上的一个现有文件夹,因此不能作为 Magisk 存在的标志。
    • 文件夹的权限默认为 700,所有者为 root,因此非 root 进程无法以任何可能的方式进入、读取和写入文件夹。
    • 文件夹 secontext 标记为 u:object_r:adb_data_file:s0,很少有进程有权与该 secontext 进行任何交互。
    • 该文件夹位于设备加密存储区中,因此一旦数据正确装载到 FBE(File-Based Encryption,基于文件的加密)设备中,即可访问该文件夹。
    bash
    SECURE_DIR=/data/adb
    +
    +# 存储常规 post-fs-data 脚本的文件夹
    +$SECURE_DIR/post-fs-data.d
    +
    +#存储常规 late_start 服务脚本的文件夹
    +$SECURE_DIR/service.d
    +
    +# Magisk 模块
    +$SECURE_DIR/modules
    +
    +# 等待升级的 Magisk 模块
    +# 模块文件在挂载时无法安全修改
    +# 通过 Magisk app 安装的模块将存储在此处并将在下次重新启动时
    +# 合并到 $SECURE_DIR/modules 中
    +$SECURE_DIR/modules_update
    +
    +# 数据库存储设置和 Root 权限
    +MAGISKDB=$SECURE_DIR/magisk.db
    +
    +# 所有与 magisk 相关的二进制文件,包括 busybox、脚本
    +# 和 magisk 二进制文件。用于支持模块安装、addon.d、 
    +# Magisk app 等。
    +DATABIN=$SECURE_DIR/magisk
    SECURE_DIR=/data/adb
    +
    +# 存储常规 post-fs-data 脚本的文件夹
    +$SECURE_DIR/post-fs-data.d
    +
    +#存储常规 late_start 服务脚本的文件夹
    +$SECURE_DIR/service.d
    +
    +# Magisk 模块
    +$SECURE_DIR/modules
    +
    +# 等待升级的 Magisk 模块
    +# 模块文件在挂载时无法安全修改
    +# 通过 Magisk app 安装的模块将存储在此处并将在下次重新启动时
    +# 合并到 $SECURE_DIR/modules 中
    +$SECURE_DIR/modules_update
    +
    +# 数据库存储设置和 Root 权限
    +MAGISKDB=$SECURE_DIR/magisk.db
    +
    +# 所有与 magisk 相关的二进制文件,包括 busybox、脚本
    +# 和 magisk 二进制文件。用于支持模块安装、addon.d、 
    +# Magisk app 等。
    +DATABIN=$SECURE_DIR/magisk

    Magisk 启动过程

    预初始化(Pre-Init)

    magiskinit 将替换 init 作为第一个运行的程序。

    • 挂载早期所需的分区。在已停产 system-as-root 设备上,我们将 root 切换到系统;在 2SI 设备上,我们修补原始的 init ,将第二阶段的 init 文件重定向到 magiskinit,并执行它为我们装载分区。
    • 将 magisk 服务注入 init.rc
    • 在使用 monolithic 策略的设备上,从 /sepolicy 加载 sepolicy ;否则我们使用 FIFO 劫持 selinuxfs 中的节点,将 LD_PRELOAD 设置为钩住 security_load_policy,并在 2SI 设备上协助劫持,然后启动守护程序,等待 init 尝试加载 sepolicy。
    • 修补 sepolicy 规则。如果我们使用“劫持”方法,将修补的 sepolicy 加载到内核中,取消阻止 init 并退出守护进程
    • 执行原始的 init 以继续启动过程

    解密后(post-fs-data)

    /data 被解密和装载时会在 post-fs-data 上触发。守护程序 magiskd 将被启动,执行 post-fs-data 脚本,并神奇地安装模块文件。

    后期启动(late_start)

    在稍后的引导过程中,将触发类 late_start ,并启动 Magisk “服务”模式。在此模式下,执行服务(service)脚本。

    重置属性(Resetprop)

    通常,系统属性(properties)被设计为仅由 init 更新,并且对非 root 进程是只读的。使用 root,您可以通过使用诸如 setprop 之类的命令向 property_service(由 init 托管)发送请求来更改属性,但仍然禁止更改只读属性(以ro.开头的属性,如ro.build.product)和删除属性。

    resetprop 是通过从 AOSP 中提取出与系统属性相关的源代码来实现的,并进行了修补,以允许直接修改属性区域或 prop_area,而无需通过 property_service 。由于我们绕过了 property_service ,因此需要注意一些:

    • 如果属性更改未通过 property_service ,则不会触发在 *.rc 脚本中注册的on property:foo=bar 操作。resetprop 的默认设置属性行为与 setprop 匹配,这将触发事件(通过首先删除属性,然后通过 property_service 设置它来实现)。如果您需要此特殊行为,则有一个标志 -n 可以禁用它。
    • 持久属性(以 persist. 开头的属性,如 persist.sys.usb.config )存储在 prop_area/data/property 中。默认情况下,删除属性不会将其从持久存储中删除,这意味着该属性将在下次重新启动后恢复;读取属性不会从持久存储中读取,因为这是 getprop 的行为。使用标志 -p ,删除属性将同时删除 prop_area/data/property 中的属性,读取属性将从 prop_area 和持久存储中读取。

    SELinux 政策

    Magisk 将修补现成的 sepolicy ,以确保 Root 和 Magisk 操作能够以安全可靠的方式完成。新域 magisk 是有效的,这就是 magiskd 和所有 root shell 将在其中运行的内容。magisk_file 是一种新的文件类型,设置为允许每个域(不受限制的文件上下文)访问。

    在 Android 8.0 之前,所有允许的 su 客户端域都可以直接连接到 magiskd 并与守护进程建立连接,以获得远程 root shell。Magisk 还必须放宽一些 ioctl 操作,以便 root shell 能够正常运行。

    在 Android 8.0 之后,为了减少 Android 沙盒中规则的放宽,部署了新的 SELinux 模型。 magisk 二进制文件标记为 magisk_exec 文件类型,并且执行 magisk 二进制文件(包括 su 命令)的 su 客户端域将通过使用 type_transition 规则传输到 magisk_client 。规则严格限制仅允许 magisk 域进程将文件归因于 magisk_exec 。不允许直接连接到 magiskd 的 sockets;访问守护进程的唯一方法是通过 magisk_client 进程。这些更改使我们能够保持沙盒完好无损,并将 Magisk 特定规则与其他策略分开。

    完整的规则可以在 magiskpolicy/rules.cpp 中找到。

    参考链接

    `,28),p=[o];function c(t,i,r,d,y,E){return a(),n("div",null,p)}const k=s(l,[["render",c]]);export{g as __pageData,k as default}; diff --git a/assets/details.md.a7ca6af8.lean.js b/assets/details.md.a7ca6af8.lean.js new file mode 100644 index 00000000..34973e89 --- /dev/null +++ b/assets/details.md.a7ca6af8.lean.js @@ -0,0 +1 @@ +import{_ as s,o as a,c as n,Q as e}from"./chunks/framework.ed90c782.js";const g=JSON.parse('{"title":"内部细节","description":"","frontmatter":{},"headers":[],"relativePath":"details.md","filePath":"details.md","lastUpdated":1694965574000}'),l={name:"details.md"},o=e("",28),p=[o];function c(t,i,r,d,y,E){return a(),n("div",null,p)}const k=s(l,[["render",c]]);export{g as __pageData,k as default}; diff --git a/assets/faq.md.0f89f64c.js b/assets/faq.md.0f89f64c.js deleted file mode 100644 index e64c52eb..00000000 --- a/assets/faq.md.0f89f64c.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as e,c as s,V as t}from"./chunks/framework.fc84ac3a.js";const u=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"faq.md","filePath":"faq.md","lastUpdated":1684159642000}'),o={name:"faq.md"},l=t('

    常见问题

    Q: 我安装了一个模块,然后启动时卡在了开机动画。求助

    如果在开发人员选项中启用了USB调试,请将手机连接到 PC。如果检测到了设备(通过 adb devices 检查),请进入 ADB shell 并运行命令 magisk --remove-modules。这将删除所有模块并自动重新启动设备。

    如果您没有启用 USB 调试,请重新启动到安全模式。大多数现代 Android 设备都支持在启动时按特殊键组合键以进入安全模式作为紧急选项。Magisk 将检测到安全模式被激活,所有模块将被禁用。然后重启回到正常模式(模块禁用状态持续),并通过 Magisk App 管理模块。

    提示

    如果您不知道什么是 ADB shell ,那么请在电脑上直接运行以下命令

    shell
    adb shell magisk --remove-modules

    如果您还不知道什么是 ADB ,那么请查看《Android 调试桥 (adb)》

    Q: 为什么 XXX应用会检测到 Root?

    Magisk 不再处理 Root 隐藏。有大量 Magisk/Zygisk 模块专门提供这些功能,请在网络上查找它们。😉(您可以在“酷安”或者“哔哩哔哩”中搜索)

    比较流行的模块是 Shamiko

    警告

    如果你使用的是「Magisk Delta」,则无法使用此模块!

    Q: 在我隐藏 Magisk App 后,应用图标显示异常

    当隐藏 Magisk App 时,它将安装一个“存根”APK,其中没有任何内容。这个存根应用程序的唯一功能是将完整的 Magisk app APK 下载到其内部存储并动态加载。由于APK实际上是 empty,因此它不包含 APP 的图标资源。

    当您打开隐藏的 Magisk App 时,它将为您提供在主屏幕中创建快捷方式的选项(其中包含正确的应用名称和图标),以方便您使用。您还可以手动要求应用在应用设置中创建图标。

    Q: 为什么这个文档很多错误或者不通顺的地方

    这个文档本质上还是机器翻译的,然而机器翻译的正确率有待提高。如果您发现了这些错误或者不通顺的地方,希望您可以向我们提交反馈

    参考链接

    ',16),r=[l];function i(n,p,h,d,c,m){return e(),s("div",null,r)}const g=a(o,[["render",i]]);export{u as __pageData,g as default}; diff --git a/assets/faq.md.0f89f64c.lean.js b/assets/faq.md.0f89f64c.lean.js deleted file mode 100644 index 0b827bf5..00000000 --- a/assets/faq.md.0f89f64c.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as e,c as s,V as t}from"./chunks/framework.fc84ac3a.js";const u=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"faq.md","filePath":"faq.md","lastUpdated":1684159642000}'),o={name:"faq.md"},l=t("",16),r=[l];function i(n,p,h,d,c,m){return e(),s("div",null,r)}const g=a(o,[["render",i]]);export{u as __pageData,g as default}; diff --git a/assets/faq.md.d3f195dc.js b/assets/faq.md.d3f195dc.js new file mode 100644 index 00000000..fa2d68fb --- /dev/null +++ b/assets/faq.md.d3f195dc.js @@ -0,0 +1 @@ +import{_ as a,o as e,c as s,Q as o}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"faq.md","filePath":"faq.md","lastUpdated":1685389078000}'),t={name:"faq.md"},l=o('

    常见问题

    Q: 我安装了一个模块,然后启动时卡在了开机动画。求助

    如果在开发人员选项中启用了USB调试,请将手机连接到 PC。如果检测到了设备(通过 adb devices 检查),请进入 ADB shell 并运行命令 magisk --remove-modules。这将删除所有模块并自动重新启动设备。

    如果您没有启用 USB 调试,请重新启动到安全模式。大多数现代 Android 设备都支持在启动时按特殊键组合键以进入安全模式作为紧急选项。Magisk 将检测到安全模式被激活,所有模块将被禁用。然后重启回到正常模式(模块禁用状态持续),并通过 Magisk App 管理模块。

    提示

    如果您不知道什么是 ADB shell ,那么请在电脑上直接运行以下命令

    shell
    adb shell magisk --remove-modules
    adb shell magisk --remove-modules

    如果您还不知道什么是 ADB ,那么请查看《Android 调试桥 (adb)》

    Q: 为什么 XXX应用会检测到 Root?

    Magisk 不再处理 Root 隐藏。有大量 Magisk/Zygisk 模块专门提供这些功能,请在网络上查找它们。😉(您可以在“酷安”或者“哔哩哔哩”中搜索)

    比较流行的模块是 Shamiko

    警告

    如果你使用的是「Magisk Delta」,则无法使用此模块!

    Q: 在我隐藏 Magisk App 后,应用图标显示异常

    当隐藏 Magisk App 时,它将安装一个“占位”APK,其中没有任何内容。这个占位应用程序的唯一功能是将完整的 Magisk app APK 下载到内部存储并动态加载。由于 APK 实际上是 empty,因此它不包含 APP 的图标资源。

    当您打开隐藏的 Magisk App 时,它将为您提供在主屏幕中创建快捷方式的选项(其中包含正确的应用名称和图标),以方便您使用。您还可以手动要求应用在应用设置中创建图标。

    Q: 为什么这个文档很多错误或者不通顺的地方

    这个文档本质上还是机器翻译的,然而机器翻译的正确率有待提高。如果您发现了这些错误或者不通顺的地方,希望您可以向我们提交反馈

    参考链接

    ',16),r=[l];function i(p,n,c,d,h,k){return e(),s("div",null,r)}const u=a(t,[["render",i]]);export{m as __pageData,u as default}; diff --git a/assets/faq.md.d3f195dc.lean.js b/assets/faq.md.d3f195dc.lean.js new file mode 100644 index 00000000..933deb65 --- /dev/null +++ b/assets/faq.md.d3f195dc.lean.js @@ -0,0 +1 @@ +import{_ as a,o as e,c as s,Q as o}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"faq.md","filePath":"faq.md","lastUpdated":1685389078000}'),t={name:"faq.md"},l=o("",16),r=[l];function i(p,n,c,d,h,k){return e(),s("div",null,r)}const u=a(t,[["render",i]]);export{m as __pageData,u as default}; diff --git a/assets/guides.md.19fb9662.js b/assets/guides.md.19fb9662.js deleted file mode 100644 index 6418316b..00000000 --- a/assets/guides.md.19fb9662.js +++ /dev/null @@ -1,134 +0,0 @@ -import{_ as e,H as p,o as t,c,C as a,a as s,J as l,V as o}from"./chunks/framework.fc84ac3a.js";const z=JSON.parse('{"title":"开发者指南","description":"","frontmatter":{},"headers":[],"relativePath":"guides.md","filePath":"guides.md","lastUpdated":1684157238000}'),r={name:"guides.md"},i=o(`

    开发者指南

    BusyBox

    Magisk 附带了一个完整的 BusyBox 二进制(包括完整的 SELinux 支持)。可执行文件位于 /data/adb/magisk/busybox 。Magisk 的 BusyBox 支持运行时可切换的“ASH独立外壳模式”。这种独立模式的意思是,当在 BusyBox 的 ash shell 中运行时,无论设置为 PATH ,每个命令都将直接使用 BusyBox 中的 applet。例如,像 lsrmchmod 这样的命令将不使用 PATH 中的内容(在 Android 的情况下,默认情况下将分别为 /system/bin/ls/system/bin/rm/system/bin/chmod ),而是直接调用内部 BusyBox 小程序。这确保脚本始终在可预测的环境中运行,并且无论在哪个 Android 版本上运行,都始终具有完整的命令集。要强制命令不使用BusyBox,必须使用完整路径调用可执行文件。

    在 Magisk 上下文中运行的每个 shell 脚本都将在启用独立模式(Standalone Mode)的 BusyBox 的 ash shell 中执行。对于与第三方开发人员相关的内容,这包括所有启动脚本和模块安装脚本。

    对于想在 Magisk 之外使用“独立模式”功能的开发者,有两种方法可以启用它:

    1. 将环境变量 ASH_STANDALONE 设置为 1
      示例:ASH_STANDALONE=1 /data/adb/magisk/busybox sh <script>
    2. 使用命令行选项切换:
      /data/adb/magisk/busybox sh -o standalone <script>

    为了确保所有后续执行的 sh shell 也以独立模式运行,选项1是首选方法(这是 Magisk 和 Magisk app 内部使用的方法),因为环境变量向下继承到子进程。

    Magisk 模块

    Magisk 模块是放置在 /data/adb/modules 中的文件夹,结构如下:

    txt
    /data/adb/modules
    -├── .
    -├── .
    -|
    -├── $MODID                  <--- 文件夹以模块的 ID 命名
    -│   │
    -│   │      *** 模块 ID ***
    -│   │
    -│   ├── module.prop         <--- 此文件存储模块的元数据(metadata)
    -│   │
    -│   │      *** 主要内容 ***
    -│   │
    -│   ├── system              <--- 如果 skip_mount 不存在,将挂载此文件夹
    -│   │   ├── ...
    -│   │   ├── ...
    -│   │   └── ...
    -│   │
    -│   ├── zygisk              <--- 此文件夹包含模块的 Zygisk native 库
    -│   │   ├── arm64-v8a.so
    -│   │   ├── armeabi-v7a.so
    -│   │   ├── x86.so
    -│   │   ├── x86_64.so
    -│   │   └── unloaded        <--- 如果存在,则 native 库不兼容
    -│   │
    -│   │      *** 状态标志 ***
    -│   │
    -│   ├── skip_mount          <--- 如果存在,Magisk 将不会挂载您的 system 文件夹
    -│   ├── disable             <--- 如果存在,模块将被禁用
    -│   ├── remove              <--- 如果存在,模块将在下次重新启动时删除
    -│   │
    -│   │      *** 可选文件 ***
    -│   │
    -│   ├── post-fs-data.sh     <--- 此脚本将在 post-fs-data 中执行
    -│   ├── service.sh          <--- 此脚本将在 late_start 服务中执行
    -|   ├── uninstall.sh        <--- 当 Magisk 删除您的模块时,将执行此脚本
    -│   ├── system.prop         <--- resetprop 将此文件中的属性作为系统属性加载
    -│   ├── sepolicy.rule       <--- 其他自定义 sepolicy 规则
    -│   │
    -│   │      *** 自动生成,请勿手动创建或修改 ***
    -│   │
    -│   ├── vendor              <--- $MODID/system/vendor 的符号链接
    -│   ├── product             <--- $MODID/system/product 的符号链接
    -│   ├── system_ext          <--- $MODID/system/system_ext 的符号链接
    -│   │
    -│   │      *** 允许任何其他文件/文件夹 ***
    -│   │
    -│   ├── ...
    -│   └── ...
    -|
    -├── 其他模块
    -│   ├── .
    -│   └── .
    -├── .
    -├── .

    module.prop

    这是 module.prop 必须遵守的格式

    (以下代码块虽然标注为 js,但实际上是 prop,此操作仅为提供代码高亮)

    js
    id=<字符串> <string>
    -name=<字符串> <string>
    -version=<字符串> <string>
    -versionCode=<整数> <int>
    -author=<字符串> <string>
    -description=<字符串> <string>
    -updateJson=<链接> <url> (可选)
    `,14),C=a("code",null,"id",-1),d=a("code",null,"^[a-zA-Z][a-zA-Z0-9._-]+$",-1),y=a("code",null,".",-1),A=a("code",null,"_",-1),D=a("code",null,"-",-1),u=a("br",null,null,-1),F=a("code",null,"a_module",-1),m=a("code",null,"a.module",-1),g=a("code",null,"module-101",-1),h=a("code",null,"a module",-1),b=a("code",null,"1_module",-1),_=a("code",null,"-a-module",-1),k=a("br",null,null,-1),B=a("strong",null,"唯一标识符",-1),E=o("
  • versionCode 必须是整数。这用于对比版本,以便检查更新。
  • updateJson 应该指向一个 URL,该 URL 下载 JSON 以提供信息,以便 Magisk app 可以更新模块。
  • 上面没有提到的其他字符串可以是任何单行字符串。
  • 确保使用 UNIX (LF) 换行类型,而不是 Windows (CR+LF)Macintosh (CR)
  • ",4),v=o(`

    更新的JSON的格式:

    json
    {
    -    "version": string,
    -    "versionCode": int,
    -    "zipUrl": url,
    -    "changelog": url
    -}

    Shell 脚本 (*.sh)

    请阅读 启动脚本 部分,了解 post-fs-data.shservice.sh 之间的区别。对于大多数模块开发人员来说,如果您只需要运行引导脚本,service.sh 应该足够好了。

    在模块的所有脚本中,请使用 MODDIR=\${0%/*} 获取模块的基本目录路径;不要在脚本中硬编码模块路径。
    如果启用了Zygisk,则环境变量 ZYGISK_ENABLED 将设置为 1

    system 文件夹

    要替换/注入的所有文件都应放在此文件夹中。此文件夹将以递归方式合并到真正的 /system 中,也就是说:真实 /system 中的现有文件将被模块 system 中的文件替换,模块 system 中的新文件将被添加到真实 /system 中。

    如果您将名为 .replace 的文件放在任何文件夹中,而不是合并其内容,则该文件夹将直接替换实际系统中的文件夹。这对于交换整个文件夹非常方便。

    如果要替换 /vendor/product/system_ext 中的文件,请分别将它们放在 system/vendorsystem/productsystem/system_ext 下。Magisk 将透明地处理这些分区是否位于单独的分区中。

    zygisk

    Zygisk 是 Magisk 的一项功能,它允许高级模块开发人员在每个 Android 应用程序的进程中直接运行代码,然后再进行专业化和运行。有关 Zygisk API 和构建 Zygisk 模块的更多详细信息,请查看 Zygisk 模块示例 项目。

    system.prop

    此文件遵循与 build.prop 相同的格式。每行由 [key]=[value]组成。

    sepolicy.rule

    如果您的模块需要一些额外的 sepolicy 补丁,请将这些规则添加到此文件中。此文件中的每一行都将被视为策略语句。有关如何格式化策略语句的更多详细信息,请查看 magiskpolicy 的文档。

    Magisk 模块安装程序

    Magisk 模块安装程序是打包在 zip 文件中的 Magisk 模块,可以在 Magisk 应用程序或第三方recovery(如 TWRP)中刷入。最简单的 Magisk 模块安装程序只是一个打包为 zip 文件的 Magisk 模块,此外还有以下文件:

    • update-binary:下载最新的 module_installer.sh 并将该脚本重命名或复制为 update-binary
    • updater-script:这个文件应该只包含字符串 “#MAGISK

    模块安装程序脚本将会设置环境,将模块文件从 zip 文件提取到正确的位置,然后完成安装过程,这对于大多数简单的 Magisk 模块来说应该足够好了。

    txt
    模块module.zip
    -
    -├── META-INF
    -│   └── com
    -│       └── google
    -│           └── android
    -│               ├── update-binary      <--- 您下载 module_installer.sh
    -│               └── updater-script     <--- 应只包含字符串“#MAGISK”
    -
    -├── customize.sh                       <--- (可选,稍后将详细介绍)
    -│                                           此脚本将来源于 update-binary
    -├── ...
    -├── ...  /* 模块的其余文件 */
    -

    自定义

    如果需要自定义模块安装过程,可以选择在安装程序中创建名为 customize.sh 的脚本。在提取所有文件并设置默认权限和 secontext 后,该脚本将由 update-binary 脚本提供(未执行!)。如果您的模块需要基于设备 ABI 进行其他设置,或者您需要为某些模块文件设置特殊权限/secontext,这将非常有用。

    如果要完全控制和自定义安装过程,请在 customize.sh 中声明 SKIPUNZIP=1 以跳过所有默认安装步骤。这样,您的 customize.sh 将负责自行安装所有内容。

    customize.sh 脚本在 Magisk 的 BusyBox ash shell 中运行,并启用了“独立模式”。以下变量和函数可用:

    变量

    • MAGISK_VER (string): 当前安装的 Magisk 的版本字符串(例如 v20.0
    • MAGISK_VER_CODE (int): 当前安装的Magisk的版本代码(例如 20000
    • BOOTMODE (bool): 如果模块在 Magisk app 中安装,则为 true
    • MODPATH (path): 模块文件应安装的路径
    • TMPDIR (path): 可以临时存储文件的地方
    • ZIPFILE (path): your module's installation zip 模块的压缩文件
    • ARCH (string): 设备的 CPU 架构。值为 armarm64x86x64
    • IS64BIT (bool): 如果 $ARCHarm64x64 ,则为 true
    • API (int): 设备的 API 级别(安卓版本)(例如,Android 6.0 的 23

    提示

    您可以在 这里 找到所有 Android 版本对应的 API 级别

    函数

    shell
    ui_print <msg>
    -    打印 <msg> 到控制台
    -    请避免使用“echo”,因为它不会显示在第三方 recovery 的控制台中
    -
    -abort <msg>
    -    打印错误消息 <msg> 到控制台并终止安装
    -    请避免使用“exit”,因为它会跳过终止清理步骤
    -
    -set_perm <target> <owner> <group> <permission> [context]
    -    如果未指定 [context],则默认值为“u:object_r:system_file:s0”
    -    此函数是以下命令的简写:
    -       chown owner.group target
    -       chmod permission target
    -       chcon context target
    -
    -set_perm_recursive <directory> <owner> <group> <dirpermission> <filepermission> [context]
    -    如果未指定 [context],则默认值为“u:object_r:system_file:s0”
    -    此函数是以下psuedo代码的简写:
    -      set_perm <directory> owner group dirpermission context
    -      对于 <directory> 内的文件:
    -        set_perm file owner group filepermission context
    -      对于 <directory> 内的文件夹:
    -        set_perm_recursive dir owner group dirpermission context

    为方便起见,您还可以在变量名称 REPLACE 中声明要替换的文件夹列表。模块安装程序脚本会将 .replace 文件创建到 REPLACE 中列出的文件夹中。例如:

    sh
    REPLACE="
    -/system/app/YouTube
    -/system/app/Bloatware
    -"

    上面的列表将对应创建以下文件:$MODPATH/system/app/YouTube/.replace$MODPATH/system/app/Bloatware/.replace

    注意

    • 使用 Magisk 应用程序下载模块时,update-binary强制替换为最新的 module_installer.sh不要尝试在 update-binary 中添加任何自定义逻辑
    • 由于历史原因,请勿在模块 zip 中添加名为 install.sh 的文件
    • 不要在 customize.sh 末尾调用 exit 。模块安装程序脚本必须在退出之前执行一些清理。

    启动脚本

    在Magisk中,您可以以两种不同的模式运行启动脚本:post-fs-datalate_start service 模式。

    • post-fs-data 模式
      • 此阶段会阻塞。启动过程在执行完成,或过 10 秒前暂停。
      • 脚本在装入任何模块之前运行。这允许模块开发人员在安装模块之前动态调整其模块。
      • 这个阶段发生在 Zygote 启动之前,这几乎意味着是 Android 的一切
      • 警告:使用 setprop 将导致启动过程死锁!请改用 resetprop -n <prop_name> <prop_value>
      • 仅在必要时在此模式下运行脚本
    • late_start service 模式
      • 此阶段为非阻塞。脚本与引导过程的其余部分并行运行。
      • 建议大多数脚本在此阶段运行

    在 Magisk 中,还有 2 种脚本:通用脚本模块脚本

    • 通用脚本
      • 放置在 /data/adb/post-fs-data.d/data/adb/service.d
      • 仅当脚本设置为可执行文件时才执行(chmod +x script.sh
      • post-fs-data.d 中的脚本以 post-fs-data 模式运行,service.d 的脚本以 late_start service 模式运行。
      • 模块不应在安装过程中添加常规脚本
    • 模块脚本
      • 放置在模块自己的文件夹中
      • 仅在启用模块时执行
      • post-fs-data.sh 以 post-fs-data 模式运行,而 service.sh 以 late_start service 模式运行。

    所有启动脚本都将在 Magisk 的 BusyBox ash shell 中运行,并启用“独立模式”。

    根目录覆盖系统

    由于 / 在 system-as-root 设备上是只读的,因此 Magisk 提供了一个覆盖系统,使开发者能够替换根目录中的文件或添加新的 *.rc 脚本。此功能主要为第三方内核开发者设计。

    覆盖文件应放在 boot 映像 ramdisk 的 overlay.d 文件夹中,并遵循以下规则:

    1. 对于 overlay.d 中的每个 *.rc 文件( init.rc 除外),init.rc 之后,如果在根目录中不存在,将读取并连接,否则将替换现有文件
    2. 现有文件可以替换为位于相同相对路径的文件
    3. 与不存在的文件对应的文件将被忽略

    要添加您在自定义 *.rc 脚本中引用的其他文件,请将它们添加到 overlay.d/sbin 中。上面的 3 条规则不适用于此文件夹中的任何内容;相反,它们将直接复制到Magisk 的内部 tmpfs 目录(以前是 /sbin )。

    从 Android 11 开始,/sbin 文件夹可能不再存在,在这种情况下,Magisk 会在每次启动时随机生成一个不同的 tmpfs 文件夹。当 magiskinit 将其注入 init.rc 时,*.rc 脚本中的 \${MAGISKTMP} 都将替换为 Magisk tmpfs 文件夹。在 Android 11 之前的设备上,\${MAGISKTMP} 将简单地替换为 /sbin 。因此在引用这些附加文件时,*.rc 脚本中永远不要硬编码 “/sbin

    下面是如何使用自定义 *.rc 脚本设置 overlay.d 的示例:

    txt
    ramdisk
    -
    -├── overlay.d
    -│   ├── sbin
    -│   │   ├── libfoo.ko      <--- 这两个文件将被复制到 Magisk 的
    -│   │   └── myscript.sh    <--- 的 tmpfs 目录中
    -│   ├── custom.rc          <--- 此文件将被注入到 init.rc 中
    -│   ├── res
    -│   │   └── random.png     <--- 此文件将替换 /res/random.png
    -│   └── new_file           <--- 此文件将被忽略,因为 /new_file 不存在
    -├── res
    -│   └── random.png         <--- 此文件将被 /overlay.d/res/random.png
    -|                               替换
    -├── ...
    -├── ...  /* 其余的 initramfs 文件 */
    -

    这是 custom.rc 的示例:

    sh
    # 使用 \${MAGISKTMP} 引用 Magisk 的 tmpfs 目录
    -
    -on early-init
    -    setprop sys.example.foo bar
    -    insmod \${MAGISKTMP}/libfoo.ko
    -    start myservice
    -
    -service myservice \${MAGISKTMP}/myscript.sh
    -    oneshot
    原版示例
    sh
    # Use \${MAGISKTMP} to refer to Magisk's tmpfs directory
    -
    -on early-init
    -    setprop sys.example.foo bar
    -    insmod \${MAGISKTMP}/libfoo.ko
    -    start myservice
    -
    -service myservice \${MAGISKTMP}/myscript.sh
    -    oneshot

    参考链接

    `,53);function M(x,f,P,q,T,I){const n=p("Badge");return t(),c("div",null,[i,a("ul",null,[a("li",null,[C,s(" 必须匹配此正则表达式:"),d,s("(也就是开头必须为字母,后面为字母、数字、点 "),y,s(" 、下划线 "),A,s(" 和减号 "),D,s(")"),u,s(" 示例: "),F,s(),l(n,{type:"tip",text:"✓"}),s("、"),m,s(),l(n,{type:"tip",text:"✓"}),s("、"),g,s(),l(n,{type:"tip",text:"✓"}),s("、"),h,s(),l(n,{type:"danger",text:"✗"}),s("、"),b,s(),l(n,{type:"danger",text:"✗"}),s("、"),_,s(),l(n,{type:"danger",text:"✗"}),k,s(" 这是模块的"),B,s("。模块发布后,您不应更改它。")]),E]),v])}const $=e(r,[["render",M]]);export{z as __pageData,$ as default}; diff --git a/assets/guides.md.19fb9662.lean.js b/assets/guides.md.19fb9662.lean.js deleted file mode 100644 index 76f86a4f..00000000 --- a/assets/guides.md.19fb9662.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,H as p,o as t,c,C as a,a as s,J as l,V as o}from"./chunks/framework.fc84ac3a.js";const z=JSON.parse('{"title":"开发者指南","description":"","frontmatter":{},"headers":[],"relativePath":"guides.md","filePath":"guides.md","lastUpdated":1684157238000}'),r={name:"guides.md"},i=o("",14),C=a("code",null,"id",-1),d=a("code",null,"^[a-zA-Z][a-zA-Z0-9._-]+$",-1),y=a("code",null,".",-1),A=a("code",null,"_",-1),D=a("code",null,"-",-1),u=a("br",null,null,-1),F=a("code",null,"a_module",-1),m=a("code",null,"a.module",-1),g=a("code",null,"module-101",-1),h=a("code",null,"a module",-1),b=a("code",null,"1_module",-1),_=a("code",null,"-a-module",-1),k=a("br",null,null,-1),B=a("strong",null,"唯一标识符",-1),E=o("",4),v=o("",53);function M(x,f,P,q,T,I){const n=p("Badge");return t(),c("div",null,[i,a("ul",null,[a("li",null,[C,s(" 必须匹配此正则表达式:"),d,s("(也就是开头必须为字母,后面为字母、数字、点 "),y,s(" 、下划线 "),A,s(" 和减号 "),D,s(")"),u,s(" 示例: "),F,s(),l(n,{type:"tip",text:"✓"}),s("、"),m,s(),l(n,{type:"tip",text:"✓"}),s("、"),g,s(),l(n,{type:"tip",text:"✓"}),s("、"),h,s(),l(n,{type:"danger",text:"✗"}),s("、"),b,s(),l(n,{type:"danger",text:"✗"}),s("、"),_,s(),l(n,{type:"danger",text:"✗"}),k,s(" 这是模块的"),B,s("。模块发布后,您不应更改它。")]),E]),v])}const $=e(r,[["render",M]]);export{z as __pageData,$ as default}; diff --git a/assets/guides.md.513bdfd5.js b/assets/guides.md.513bdfd5.js new file mode 100644 index 00000000..cf0f8a58 --- /dev/null +++ b/assets/guides.md.513bdfd5.js @@ -0,0 +1,267 @@ +import{_ as p,C as o,o as t,c,k as n,a as s,H as l,Q as e}from"./chunks/framework.ed90c782.js";const $=JSON.parse('{"title":"开发者指南","description":"","frontmatter":{},"headers":[],"relativePath":"guides.md","filePath":"guides.md","lastUpdated":1694965574000}'),r={name:"guides.md"},i=e(`

    开发者指南

    BusyBox

    Magisk 附带了一个完整的 BusyBox 二进制(包括完整的 SELinux 支持)。可执行文件位于 /data/adb/magisk/busybox 。Magisk 的 BusyBox 支持运行时可切换的“ASH独立外壳模式”。这种独立模式的意思是,当在 BusyBox 的 ash shell 中运行时,无论 PATH 设置为什么,每个命令都将直接使用 BusyBox 中的 applet。例如,像 lsrmchmod 这样的命令将不使用 PATH 中的内容(在 Android 上,这些命令默认情况下分别为 /system/bin/ls/system/bin/rm/system/bin/chmod ),而是直接调用内部 BusyBox 小程序。这确保脚本始终在可预测的环境中运行,并且无论在哪个 Android 版本上运行,都始终具有完整的命令集。要强制命令不使用BusyBox,必须使用完整路径调用可执行文件。

    在 Magisk 环境下运行的每一个 shell 脚本都将在启用独立模式(Standalone Mode)的 BusyBox 的 ash shell 中执行。对于与第三方开发人员相关的内容,这包括所有启动脚本和模块安装脚本。

    对于想在 Magisk 之外使用“独立模式”功能的开发者,有两种方法可以启用它:

    1. 将环境变量 ASH_STANDALONE 设置为 1
      示例:ASH_STANDALONE=1 /data/adb/magisk/busybox sh <script>
    2. 使用命令行选项切换:
      /data/adb/magisk/busybox sh -o standalone <script>

    为了确保所有后续执行的 sh shell 也以独立模式运行,选项1是首选方法(这是 Magisk 和 Magisk app 内部使用的方法),因为环境变量继承到子进程。

    Magisk 模块

    Magisk 模块是放置在 /data/adb/modules 中的文件夹,结构如下:

    txt
    /data/adb/modules
    +├── .
    +├── .
    +|
    +├── $MODID                  <--- 文件夹以模块的 ID 命名
    +│   │
    +│   │      *** 模块 ID ***
    +│   │
    +│   ├── module.prop         <--- 此文件存储模块的元数据(metadata)
    +│   │
    +│   │      *** 主要内容 ***
    +│   │
    +│   ├── system              <--- 如果 skip_mount 不存在,将挂载此文件夹
    +│   │   ├── ...
    +│   │   ├── ...
    +│   │   └── ...
    +│   │
    +│   ├── zygisk              <--- 此文件夹包含模块的 Zygisk native 库
    +│   │   ├── arm64-v8a.so
    +│   │   ├── armeabi-v7a.so
    +│   │   ├── x86.so
    +│   │   ├── x86_64.so
    +│   │   └── unloaded        <--- 如果存在,则 native 库不兼容
    +│   │
    +│   │      *** 状态标志 ***
    +│   │
    +│   ├── skip_mount          <--- 如果存在,Magisk 将不会挂载您的 system 文件夹
    +│   ├── disable             <--- 如果存在,模块将被禁用
    +│   ├── remove              <--- 如果存在,模块将在下次重新启动时删除
    +│   │
    +│   │      *** 可选文件 ***
    +│   │
    +│   ├── post-fs-data.sh     <--- 此脚本将在 post-fs-data 中执行
    +│   ├── service.sh          <--- 此脚本将在 late_start 服务中执行
    +|   ├── uninstall.sh        <--- 当 Magisk 删除您的模块时,将执行此脚本
    +│   ├── system.prop         <--- resetprop 将此文件中的属性作为系统属性加载
    +│   ├── sepolicy.rule       <--- 其他自定义 sepolicy 规则
    +│   │
    +│   │      *** 自动生成,请勿手动创建或修改 ***
    +│   │
    +│   ├── vendor              <--- $MODID/system/vendor 的符号链接
    +│   ├── product             <--- $MODID/system/product 的符号链接
    +│   ├── system_ext          <--- $MODID/system/system_ext 的符号链接
    +│   │
    +│   │      *** 允许任何其他的文件/文件夹 ***
    +│   │
    +│   ├── ...
    +│   └── ...
    +|
    +├── 其他模块
    +│   ├── .
    +│   └── .
    +├── .
    +├── .
    /data/adb/modules
    +├── .
    +├── .
    +|
    +├── $MODID                  <--- 文件夹以模块的 ID 命名
    +│   │
    +│   │      *** 模块 ID ***
    +│   │
    +│   ├── module.prop         <--- 此文件存储模块的元数据(metadata)
    +│   │
    +│   │      *** 主要内容 ***
    +│   │
    +│   ├── system              <--- 如果 skip_mount 不存在,将挂载此文件夹
    +│   │   ├── ...
    +│   │   ├── ...
    +│   │   └── ...
    +│   │
    +│   ├── zygisk              <--- 此文件夹包含模块的 Zygisk native 库
    +│   │   ├── arm64-v8a.so
    +│   │   ├── armeabi-v7a.so
    +│   │   ├── x86.so
    +│   │   ├── x86_64.so
    +│   │   └── unloaded        <--- 如果存在,则 native 库不兼容
    +│   │
    +│   │      *** 状态标志 ***
    +│   │
    +│   ├── skip_mount          <--- 如果存在,Magisk 将不会挂载您的 system 文件夹
    +│   ├── disable             <--- 如果存在,模块将被禁用
    +│   ├── remove              <--- 如果存在,模块将在下次重新启动时删除
    +│   │
    +│   │      *** 可选文件 ***
    +│   │
    +│   ├── post-fs-data.sh     <--- 此脚本将在 post-fs-data 中执行
    +│   ├── service.sh          <--- 此脚本将在 late_start 服务中执行
    +|   ├── uninstall.sh        <--- 当 Magisk 删除您的模块时,将执行此脚本
    +│   ├── system.prop         <--- resetprop 将此文件中的属性作为系统属性加载
    +│   ├── sepolicy.rule       <--- 其他自定义 sepolicy 规则
    +│   │
    +│   │      *** 自动生成,请勿手动创建或修改 ***
    +│   │
    +│   ├── vendor              <--- $MODID/system/vendor 的符号链接
    +│   ├── product             <--- $MODID/system/product 的符号链接
    +│   ├── system_ext          <--- $MODID/system/system_ext 的符号链接
    +│   │
    +│   │      *** 允许任何其他的文件/文件夹 ***
    +│   │
    +│   ├── ...
    +│   └── ...
    +|
    +├── 其他模块
    +│   ├── .
    +│   └── .
    +├── .
    +├── .

    module.prop

    这是 module.prop 必须遵守的格式

    properties
    id=<字符串> <string>
    +name=<字符串> <string>
    +version=<字符串> <string>
    +versionCode=<整数> <int>
    +author=<字符串> <string>
    +description=<字符串> <string>
    +updateJson=<链接> <url> (可选)
    id=<字符串> <string>
    +name=<字符串> <string>
    +version=<字符串> <string>
    +versionCode=<整数> <int>
    +author=<字符串> <string>
    +description=<字符串> <string>
    +updateJson=<链接> <url> (可选)
    `,13),y=n("code",null,"id",-1),d=n("code",null,"^[a-zA-Z][a-zA-Z0-9._-]+$",-1),E=n("code",null,".",-1),u=n("code",null,"_",-1),g=n("code",null,"-",-1),F=n("br",null,null,-1),m=n("code",null,"a_module",-1),h=n("code",null,"a.module",-1),b=n("code",null,"module-101",-1),k=n("code",null,"a module",-1),_=n("code",null,"1_module",-1),v=n("code",null,"-a-module",-1),C=n("br",null,null,-1),B=n("strong",null,"唯一标识符",-1),A=e("
  • versionCode 必须是整数。这用于对比版本,以便检查更新。
  • updateJson 应该指向一个 URL,该 URL 下载提供信息的 JSON,以便 Magisk app 可以更新模块。
  • 上面没有提到的其他字符串可以是任何单行字符串。
  • 确保使用 UNIX (LF) 换行类型,而不是 Windows (CR+LF)Macintosh (CR)
  • ",4),f=e(`

    更新的 JSON 的格式:

    json
    {
    +    "version": string,
    +    "versionCode": int,
    +    "zipUrl": url,
    +    "changelog": url
    +}
    {
    +    "version": string,
    +    "versionCode": int,
    +    "zipUrl": url,
    +    "changelog": url
    +}

    Shell 脚本 (*.sh)

    请阅读 启动脚本 部分,了解 post-fs-data.shservice.sh 之间的区别。对于大多数模块开发人员来说,如果您只需要运行引导脚本,service.sh 应该足够好了。

    在模块的所有脚本中,请使用 MODDIR=\${0%/*} 获取模块的基本目录路径;不要在脚本中硬编码模块路径。
    如果启用了Zygisk,则环境变量 ZYGISK_ENABLED 将设置为 1

    system 文件夹

    要替换/注入的所有文件都应放在此文件夹中。此文件夹将以递归方式合并到真正的 /system 中,也就是说:真实 /system 中的现有文件将被模块 system 中的文件替换,模块 system 中的新文件将被添加到真实 /system 中。

    如果您将名为 .replace 的文件放在任何文件夹中,而不是合并其内容,则该文件夹将直接替换实际系统中的文件夹。这对于交换整个文件夹非常方便。

    如果要替换 /vendor/product/system_ext 中的文件,请分别将它们放在 system/vendorsystem/productsystem/system_ext 下。Magisk 将透明地处理这些分区是否位于单独的分区中。

    zygisk

    Zygisk 是 Magisk 的一项功能,它允许高级模块开发人员在每个 Android 应用程序的进程中直接运行代码,然后再进行专业化和运行。有关 Zygisk API 和构建 Zygisk 模块的更多详细信息,请查看 Zygisk 模块示例 项目。

    system.prop

    此文件遵循与 build.prop 相同的格式。每行由 [key]=[value]组成。

    sepolicy.rule

    如果您的模块需要一些额外的 sepolicy 补丁,请将这些规则添加到此文件中。此文件中的每一行都将被视为策略语句。有关如何格式化策略语句的更多详细信息,请查看 magiskpolicy 的文档。

    Magisk 模块安装程序

    Magisk 模块安装程序是打包在 zip 文件中的 Magisk 模块,可以在 Magisk 应用程序或第三方recovery(如 TWRP)中刷入。最简单的 Magisk 模块安装程序只是一个打包为 zip 文件的 Magisk 模块,此外还有以下文件:

    • update-binary:下载最新的 module_installer.sh 并将该脚本重命名或复制为 update-binary
    • updater-script:这个文件应该只包含字符串 “#MAGISK

    模块安装程序脚本将会设置环境,将模块文件从 zip 文件提取到正确的位置,然后完成安装过程,这对于大多数简单的 Magisk 模块来说应该足够好了。

    txt
    模块module.zip
    +
    +├── META-INF
    +│   └── com
    +│       └── google
    +│           └── android
    +│               ├── update-binary      <--- 您下载 module_installer.sh
    +│               └── updater-script     <--- 应只包含字符串“#MAGISK”
    +
    +├── customize.sh                       <--- (可选,稍后将详细介绍)
    +│                                           此脚本将来源于 update-binary
    +├── ...
    +├── ...  /* 模块的其余文件 */
    +
    模块module.zip
    +
    +├── META-INF
    +│   └── com
    +│       └── google
    +│           └── android
    +│               ├── update-binary      <--- 您下载 module_installer.sh
    +│               └── updater-script     <--- 应只包含字符串“#MAGISK”
    +
    +├── customize.sh                       <--- (可选,稍后将详细介绍)
    +│                                           此脚本将来源于 update-binary
    +├── ...
    +├── ...  /* 模块的其余文件 */
    +

    自定义

    如果需要自定义模块安装过程,可以选择在安装程序中创建名为 customize.sh 的脚本。在提取所有文件并设置默认权限和 secontext 后,该脚本将由 update-binary 脚本提供(未执行!)。如果您的模块需要基于设备 ABI 进行其他设置,或者您需要为某些模块文件设置特殊权限/secontext,这将非常有用。

    如果要完全控制和自定义安装过程,请在 customize.sh 中声明 SKIPUNZIP=1 以跳过所有默认安装步骤。这样,您的 customize.sh 将负责自行安装所有内容。

    customize.sh 脚本在 Magisk 的 BusyBox ash shell 中运行,并启用了“独立模式”。以下变量和函数可用:

    变量

    • MAGISK_VER (string): 当前安装的 Magisk 的版本字符串(例如 v20.0
    • MAGISK_VER_CODE (int): 当前安装的Magisk的版本代码(例如 20000
    • BOOTMODE (bool): 如果模块在 Magisk app 中安装,则为 true
    • MODPATH (path): 模块文件应安装的路径
    • TMPDIR (path): 可以临时存储文件的地方
    • ZIPFILE (path): your module's installation zip 模块的压缩文件
    • ARCH (string): 设备的 CPU 架构。值为 armarm64x86x64
    • IS64BIT (bool): 如果 $ARCHarm64x64 ,则为 true
    • API (int): 设备的 API 级别(安卓版本)(例如,Android 6.0 的 23

    提示

    您可以在 这里 找到所有 Android 版本对应的 API 级别

    函数

    bash
    ui_print <msg>
    +    打印 <msg> 到控制台
    +    请避免使用“echo”,因为它不会显示在第三方 recovery 的控制台中
    +
    +abort <msg>
    +    打印错误消息 <msg> 到控制台并终止安装
    +    请避免使用“exit”,因为它会跳过终止清理步骤
    +
    +set_perm <target> <owner> <group> <permission> [context]
    +    如果未指定 [context],则默认值为“u:object_r:system_file:s0”
    +    此函数是以下命令的简写:
    +       chown owner.group target
    +       chmod permission target
    +       chcon context target
    +
    +set_perm_recursive <directory> <owner> <group> <dirpermission> <filepermission> [context]
    +    如果未指定 [context],则默认值为“u:object_r:system_file:s0”
    +    此函数是以下psuedo代码的简写:
    +      set_perm <directory> owner group dirpermission context
    +      对于 <directory> 内的文件:
    +        set_perm file owner group filepermission context
    +      对于 <directory> 内的文件夹:
    +        set_perm_recursive dir owner group dirpermission context
    ui_print <msg>
    +    打印 <msg> 到控制台
    +    请避免使用“echo”,因为它不会显示在第三方 recovery 的控制台中
    +
    +abort <msg>
    +    打印错误消息 <msg> 到控制台并终止安装
    +    请避免使用“exit”,因为它会跳过终止清理步骤
    +
    +set_perm <target> <owner> <group> <permission> [context]
    +    如果未指定 [context],则默认值为“u:object_r:system_file:s0”
    +    此函数是以下命令的简写:
    +       chown owner.group target
    +       chmod permission target
    +       chcon context target
    +
    +set_perm_recursive <directory> <owner> <group> <dirpermission> <filepermission> [context]
    +    如果未指定 [context],则默认值为“u:object_r:system_file:s0”
    +    此函数是以下psuedo代码的简写:
    +      set_perm <directory> owner group dirpermission context
    +      对于 <directory> 内的文件:
    +        set_perm file owner group filepermission context
    +      对于 <directory> 内的文件夹:
    +        set_perm_recursive dir owner group dirpermission context

    为方便起见,您还可以在变量名称 REPLACE 中声明要替换的文件夹列表。模块安装程序脚本会将 .replace 文件创建到 REPLACE 中列出的文件夹中。例如:

    sh
    REPLACE="
    +/system/app/YouTube
    +/system/app/Bloatware
    +"
    REPLACE="
    +/system/app/YouTube
    +/system/app/Bloatware
    +"

    上面的列表将对应创建以下文件:$MODPATH/system/app/YouTube/.replace$MODPATH/system/app/Bloatware/.replace

    注意

    • 使用 Magisk 应用程序下载模块时,update-binary强制替换为最新的 module_installer.sh不要尝试在 update-binary 中添加任何自定义逻辑
    • 由于历史原因,请勿在模块 zip 中添加名为 install.sh 的文件
    • 不要在 customize.sh 末尾调用 exit 。模块安装程序脚本必须在退出之前执行一些清理。

    启动脚本

    在Magisk中,您可以以两种不同的模式运行启动脚本:post-fs-datalate_start service 模式。

    • post-fs-data 模式
      • 此阶段会阻塞。启动过程在执行完成,或过 10 秒前暂停。
      • 脚本在装入任何模块之前运行。这允许模块开发人员在安装模块之前动态调整其模块。
      • 这个阶段发生在 Zygote 启动之前,这几乎意味着是 Android 的一切
      • 警告:使用 setprop 将导致启动过程死锁!请改用 resetprop -n <prop_name> <prop_value>
      • 仅在必要时在此模式下运行脚本
    • late_start service 模式
      • 此阶段为非阻塞。脚本与引导过程的其余部分并行运行。
      • 建议大多数脚本在此阶段运行

    在 Magisk 中,还有 2 种脚本:通用脚本模块脚本

    • 通用脚本
      • 放置在 /data/adb/post-fs-data.d/data/adb/service.d
      • 仅当脚本设置为可执行文件时才执行(chmod +x script.sh
      • post-fs-data.d 中的脚本以 post-fs-data 模式运行,service.d 的脚本以 late_start service 模式运行。
      • 模块不应在安装过程中添加常规脚本
    • 模块脚本
      • 放置在模块自己的文件夹中
      • 仅在启用模块时执行
      • post-fs-data.sh 以 post-fs-data 模式运行,而 service.sh 以 late_start service 模式运行。

    所有启动脚本都将在 Magisk 的 BusyBox ash shell 中运行,并启用“独立模式”。

    根目录覆盖系统

    由于 / 在 system-as-root 设备上是只读的,因此 Magisk 提供了一个覆盖系统,使开发者能够替换根目录中的文件或添加新的 *.rc 脚本。此功能主要为第三方内核开发者设计。

    覆盖文件应放在 boot 映像 ramdisk 的 overlay.d 文件夹中,并遵循以下规则:

    1. 对于 overlay.d 中的每个 *.rc 文件( init.rc 除外),init.rc 之后,如果在根目录中不存在,将读取并连接,否则将替换现有文件
    2. 现有文件可以替换为位于相同相对路径的文件
    3. 与不存在的文件对应的文件将被忽略

    要添加您在自定义 *.rc 脚本中引用的其他文件,请将它们添加到 overlay.d/sbin 中。上面的 3 条规则不适用于此文件夹中的任何内容;相反,它们将直接复制到Magisk 的内部 tmpfs 目录(以前是 /sbin )。

    从 Android 11 开始,/sbin 文件夹可能不再存在,在这种情况下,Magisk 会在每次启动时随机生成一个不同的 tmpfs 文件夹。当 magiskinit 将其注入 init.rc 时,*.rc 脚本中的 \${MAGISKTMP} 都将替换为 Magisk tmpfs 文件夹。在 Android 11 之前的设备上,\${MAGISKTMP} 将简单地替换为 /sbin 。因此在引用这些附加文件时,*.rc 脚本中永远不要硬编码 “/sbin

    下面是如何使用自定义 *.rc 脚本设置 overlay.d 的示例:

    txt
    ramdisk
    +
    +├── overlay.d
    +│   ├── sbin
    +│   │   ├── libfoo.ko      <--- 这两个文件将被复制到 Magisk 的
    +│   │   └── myscript.sh    <--- 的 tmpfs 目录中
    +│   ├── custom.rc          <--- 此文件将被注入到 init.rc 中
    +│   ├── res
    +│   │   └── random.png     <--- 此文件将替换 /res/random.png
    +│   └── new_file           <--- 此文件将被忽略,因为 /new_file 不存在
    +├── res
    +│   └── random.png         <--- 此文件将被 /overlay.d/res/random.png
    +|                               替换
    +├── ...
    +├── ...  /* 其余的 initramfs 文件 */
    +
    ramdisk
    +
    +├── overlay.d
    +│   ├── sbin
    +│   │   ├── libfoo.ko      <--- 这两个文件将被复制到 Magisk 的
    +│   │   └── myscript.sh    <--- 的 tmpfs 目录中
    +│   ├── custom.rc          <--- 此文件将被注入到 init.rc 中
    +│   ├── res
    +│   │   └── random.png     <--- 此文件将替换 /res/random.png
    +│   └── new_file           <--- 此文件将被忽略,因为 /new_file 不存在
    +├── res
    +│   └── random.png         <--- 此文件将被 /overlay.d/res/random.png
    +|                               替换
    +├── ...
    +├── ...  /* 其余的 initramfs 文件 */
    +

    这是 custom.rc 的示例:

    sh
    # 使用 \${MAGISKTMP} 引用 Magisk 的 tmpfs 目录
    +
    +on early-init
    +    setprop sys.example.foo bar
    +    insmod \${MAGISKTMP}/libfoo.ko
    +    start myservice
    +
    +service myservice \${MAGISKTMP}/myscript.sh
    +    oneshot
    # 使用 \${MAGISKTMP} 引用 Magisk 的 tmpfs 目录
    +
    +on early-init
    +    setprop sys.example.foo bar
    +    insmod \${MAGISKTMP}/libfoo.ko
    +    start myservice
    +
    +service myservice \${MAGISKTMP}/myscript.sh
    +    oneshot
    sh
    # Use \${MAGISKTMP} to refer to Magisk's tmpfs directory
    +
    +on early-init
    +    setprop sys.example.foo bar
    +    insmod \${MAGISKTMP}/libfoo.ko
    +    start myservice
    +
    +service myservice \${MAGISKTMP}/myscript.sh
    +    oneshot
    # Use \${MAGISKTMP} to refer to Magisk's tmpfs directory
    +
    +on early-init
    +    setprop sys.example.foo bar
    +    insmod \${MAGISKTMP}/libfoo.ko
    +    start myservice
    +
    +service myservice \${MAGISKTMP}/myscript.sh
    +    oneshot

    参考链接

    `,52);function M(x,D,P,q,I,T){const a=o("Badge");return t(),c("div",null,[i,n("ul",null,[n("li",null,[y,s(" 必须匹配此正则表达式:"),d,s("(译者注:也就是由字母、数字、点 "),E,s(" 、下划线 "),u,s(" 和减号 "),g,s(" 组成,且开头必须为字母)"),F,s(" 示例: "),m,s(),l(a,{text:"✓"}),s(" ,"),h,s(),l(a,{text:"✓"}),s(" ,"),b,s(),l(a,{text:"✓"}),s(" ,"),k,s(),l(a,{type:"danger",text:"✗"}),s(" ,"),_,s(),l(a,{type:"danger",text:"✗"}),s(" ,"),v,s(),l(a,{type:"danger",text:"✗"}),C,s(" 这是模块的"),B,s("。模块发布后,您不应更改它。")]),A]),f])}const w=p(r,[["render",M]]);export{$ as __pageData,w as default}; diff --git a/assets/guides.md.513bdfd5.lean.js b/assets/guides.md.513bdfd5.lean.js new file mode 100644 index 00000000..bb0ef38d --- /dev/null +++ b/assets/guides.md.513bdfd5.lean.js @@ -0,0 +1 @@ +import{_ as p,C as o,o as t,c,k as n,a as s,H as l,Q as e}from"./chunks/framework.ed90c782.js";const $=JSON.parse('{"title":"开发者指南","description":"","frontmatter":{},"headers":[],"relativePath":"guides.md","filePath":"guides.md","lastUpdated":1694965574000}'),r={name:"guides.md"},i=e("",13),y=n("code",null,"id",-1),d=n("code",null,"^[a-zA-Z][a-zA-Z0-9._-]+$",-1),E=n("code",null,".",-1),u=n("code",null,"_",-1),g=n("code",null,"-",-1),F=n("br",null,null,-1),m=n("code",null,"a_module",-1),h=n("code",null,"a.module",-1),b=n("code",null,"module-101",-1),k=n("code",null,"a module",-1),_=n("code",null,"1_module",-1),v=n("code",null,"-a-module",-1),C=n("br",null,null,-1),B=n("strong",null,"唯一标识符",-1),A=e("",4),f=e("",52);function M(x,D,P,q,I,T){const a=o("Badge");return t(),c("div",null,[i,n("ul",null,[n("li",null,[y,s(" 必须匹配此正则表达式:"),d,s("(译者注:也就是由字母、数字、点 "),E,s(" 、下划线 "),u,s(" 和减号 "),g,s(" 组成,且开头必须为字母)"),F,s(" 示例: "),m,s(),l(a,{text:"✓"}),s(" ,"),h,s(),l(a,{text:"✓"}),s(" ,"),b,s(),l(a,{text:"✓"}),s(" ,"),k,s(),l(a,{type:"danger",text:"✗"}),s(" ,"),_,s(),l(a,{type:"danger",text:"✗"}),s(" ,"),v,s(),l(a,{type:"danger",text:"✗"}),C,s(" 这是模块的"),B,s("。模块发布后,您不应更改它。")]),A]),f])}const w=p(r,[["render",M]]);export{$ as __pageData,w as default}; diff --git a/assets/index.md.43313836.js b/assets/index.md.43313836.js deleted file mode 100644 index 9fa35e3c..00000000 --- a/assets/index.md.43313836.js +++ /dev/null @@ -1,20 +0,0 @@ -import{u as i,H as o,o as r,c as p,C as a,a as s,J as t,t as c,b as h,V as n}from"./chunks/framework.fc84ac3a.js";const g="/MagiskChineseDocument/images/logo.png",d={id:"magisk-中文文档",tabindex:"-1"},u=a("a",{class:"header-anchor",href:"#magisk-中文文档","aria-label":'Permalink to "Magisk 中文文档 "'},"​",-1),_=a("p",null,[a("img",{src:g,alt:"logo"}),s(" 本文档翻译了 "),a("a",{href:"https://topjohnwu.github.io/Magisk/",target:"_blank",rel:"noreferrer"},"Magisk 官方文档"),s(" 并补充了很多内容。")],-1),A=n('

    以下部分面向开发者:

    ',3),m={id:"magisk-许可-license",tabindex:"-1"},C=a("a",{class:"header-anchor",href:"#magisk-许可-license","aria-label":'Permalink to "Magisk 许可(License)"'},"​",-1),f=n(`

    WARNING

    中文汉化版许可仅供参考,请以英文原版为准

    txt
    Magisk,包括所有 git 子模块都是自由软件:
    -您可以根据自由软件基金会发布的 GNU 通用公共许可证的条款(许可证的第3版,
    -或(根据您的选择)任何更高版本重新分发和/或修改它。
    -
    -分发此程序是希望它有用,但没有任何保证;甚至没有适销性或特定用途适用性
    -的隐含保证。有关详细信息,请参阅GNU通用公共许可证。
    -
    -你应该已经收到了GNU通用公共许可证的副本以及这个程序。如果没有,请参见
    -<http://www.gnu.org/licenses/>.
    英文原版
    txt
    Magisk, including all git submodules are free software:
    -you can redistribute it and/or modify it under the terms of the
    -GNU General Public License as published by the Free Software Foundation,
    -either version 3 of the License, or (at your option) any later version.
    -
    -This program is distributed in the hope that it will be useful,
    -but WITHOUT ANY WARRANTY; without even the implied warranty of
    -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    -GNU General Public License for more details.
    -
    -You should have received a copy of the GNU General Public License
    -along with this program.  If not, see <http://www.gnu.org/licenses/>.

    相关链接

    友情链接

    `,7),T=JSON.parse('{"title":"Magisk 中文文档","titleTemplate":"Magisk 中文文档","description":"","frontmatter":{"aside":false,"title":"Magisk 中文文档","titleTemplate":"Magisk 中文文档"},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1684159014000}'),k={name:"index.md"},x=Object.assign(k,{setup(y){const{theme:l}=i();return(b,D)=>{const e=o("Badge");return r(),p("div",null,[a("h1",d,[s("Magisk 中文文档 "),t(e,{type:"tip",text:"由 Jesse205 翻译"}),s(),t(e,{type:"warning",text:"非官方"}),s(),u]),_,a("p",null,"原始文档版本:"+c(h(l).originDocumentDate),1),A,a("h2",m,[s("Magisk 许可(License)"),t(e,{type:"tip",text:"使用 百度翻译 汉化"}),s(),C]),f])}}});export{T as __pageData,x as default}; diff --git a/assets/index.md.43313836.lean.js b/assets/index.md.43313836.lean.js deleted file mode 100644 index 11cf7836..00000000 --- a/assets/index.md.43313836.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{u as i,H as o,o as r,c as p,C as a,a as s,J as t,t as c,b as h,V as n}from"./chunks/framework.fc84ac3a.js";const g="/MagiskChineseDocument/images/logo.png",d={id:"magisk-中文文档",tabindex:"-1"},u=a("a",{class:"header-anchor",href:"#magisk-中文文档","aria-label":'Permalink to "Magisk 中文文档 "'},"​",-1),_=a("p",null,[a("img",{src:g,alt:"logo"}),s(" 本文档翻译了 "),a("a",{href:"https://topjohnwu.github.io/Magisk/",target:"_blank",rel:"noreferrer"},"Magisk 官方文档"),s(" 并补充了很多内容。")],-1),A=n("",3),m={id:"magisk-许可-license",tabindex:"-1"},C=a("a",{class:"header-anchor",href:"#magisk-许可-license","aria-label":'Permalink to "Magisk 许可(License)"'},"​",-1),f=n("",7),T=JSON.parse('{"title":"Magisk 中文文档","titleTemplate":"Magisk 中文文档","description":"","frontmatter":{"aside":false,"title":"Magisk 中文文档","titleTemplate":"Magisk 中文文档"},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1684159014000}'),k={name:"index.md"},x=Object.assign(k,{setup(y){const{theme:l}=i();return(b,D)=>{const e=o("Badge");return r(),p("div",null,[a("h1",d,[s("Magisk 中文文档 "),t(e,{type:"tip",text:"由 Jesse205 翻译"}),s(),t(e,{type:"warning",text:"非官方"}),s(),u]),_,a("p",null,"原始文档版本:"+c(h(l).originDocumentDate),1),A,a("h2",m,[s("Magisk 许可(License)"),t(e,{type:"tip",text:"使用 百度翻译 汉化"}),s(),C]),f])}}});export{T as __pageData,x as default}; diff --git a/assets/index.md.df26462f.js b/assets/index.md.df26462f.js new file mode 100644 index 00000000..08131d05 --- /dev/null +++ b/assets/index.md.df26462f.js @@ -0,0 +1,39 @@ +import{u as t,C as i,o,c as p,k as e,a as s,H as n,Q as l}from"./chunks/framework.ed90c782.js";const r="/MagiskChineseDocument/images/logo.png",c={id:"magisk-中文文档",tabindex:"-1"},h=e("a",{class:"header-anchor",href:"#magisk-中文文档","aria-label":'Permalink to "Magisk 中文文档 "'},"​",-1),d=l('

    logo

    本文档翻译了 Magisk 官方文档Magisk Delta 文档 并补充了很多内容。

    以下部分面向开发者:

    Magisk Delta:

    Magisk 许可(License)

    WARNING

    中文汉化版许可仅供参考,请以英文原版为准!

    ',9),g={class:"vp-code-group vp-adaptive-theme"},u={class:"tabs"},_=e("input",{type:"radio",name:"group-Bh-p5",id:"tab-pNpAghx",checked:"checked"},null,-1),f={for:"tab-pNpAghx"},b=e("input",{type:"radio",name:"group-Bh-p5",id:"tab-OPYoDl7"},null,-1),y=e("label",{for:"tab-OPYoDl7"},"英文原版",-1),k=l(`
    txt
    Magisk,包括所有 git 子模块都是自由软件:
    +您可以根据自由软件基金会发布的 GNU 通用公共许可证的条款(许可证的第3版,
    +或(根据您的选择)任何更高版本重新分发和/或修改它。
    +
    +分发此程序是希望它有用,但没有任何保证;甚至没有适销性或特定用途适用性
    +的隐含保证。有关详细信息,请参阅 GNU 通用公共许可证。
    +
    +你应该已经收到了GNU通用公共许可证的副本以及这个程序。如果没有,请参见
    +<http://www.gnu.org/licenses/>。
    Magisk,包括所有 git 子模块都是自由软件:
    +您可以根据自由软件基金会发布的 GNU 通用公共许可证的条款(许可证的第3版,
    +或(根据您的选择)任何更高版本重新分发和/或修改它。
    +
    +分发此程序是希望它有用,但没有任何保证;甚至没有适销性或特定用途适用性
    +的隐含保证。有关详细信息,请参阅 GNU 通用公共许可证。
    +
    +你应该已经收到了GNU通用公共许可证的副本以及这个程序。如果没有,请参见
    +<http://www.gnu.org/licenses/>。
    txt
    Magisk, including all git submodules are free software:
    +you can redistribute it and/or modify it under the terms of the
    +GNU General Public License as published by the Free Software Foundation,
    +either version 3 of the License, or (at your option) any later version.
    +
    +This program is distributed in the hope that it will be useful,
    +but WITHOUT ANY WARRANTY; without even the implied warranty of
    +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    +GNU General Public License for more details.
    +
    +You should have received a copy of the GNU General Public License
    +along with this program.  If not, see <http://www.gnu.org/licenses/>.
    Magisk, including all git submodules are free software:
    +you can redistribute it and/or modify it under the terms of the
    +GNU General Public License as published by the Free Software Foundation,
    +either version 3 of the License, or (at your option) any later version.
    +
    +This program is distributed in the hope that it will be useful,
    +but WITHOUT ANY WARRANTY; without even the implied warranty of
    +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    +GNU General Public License for more details.
    +
    +You should have received a copy of the GNU General Public License
    +along with this program.  If not, see <http://www.gnu.org/licenses/>.
    `,1),m=l('

    相关链接

    友情链接

    ',4),M=JSON.parse('{"title":"Magisk 中文文档","titleTemplate":false,"description":"","frontmatter":{"aside":false,"titleTemplate":false},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1694965516000}'),T={name:"index.md"},P=Object.assign(T,{setup(v){return t(),(N,w)=>{const a=i("Badge");return o(),p("div",null,[e("h1",c,[s("Magisk 中文文档 "),n(a,{text:"由 Jesse205 翻译"}),s(),n(a,{type:"warning",text:"非官方"}),s(),h]),d,e("div",g,[e("div",u,[_,e("label",f,[s("中文汉化 "),n(a,{text:"百度翻译"})]),b,y]),k]),m])}}});export{M as __pageData,P as default}; diff --git a/assets/index.md.df26462f.lean.js b/assets/index.md.df26462f.lean.js new file mode 100644 index 00000000..d4f4a4ab --- /dev/null +++ b/assets/index.md.df26462f.lean.js @@ -0,0 +1 @@ +import{u as t,C as i,o,c as p,k as e,a as s,H as n,Q as l}from"./chunks/framework.ed90c782.js";const r="/MagiskChineseDocument/images/logo.png",c={id:"magisk-中文文档",tabindex:"-1"},h=e("a",{class:"header-anchor",href:"#magisk-中文文档","aria-label":'Permalink to "Magisk 中文文档 "'},"​",-1),d=l("",9),g={class:"vp-code-group vp-adaptive-theme"},u={class:"tabs"},_=e("input",{type:"radio",name:"group-Bh-p5",id:"tab-pNpAghx",checked:"checked"},null,-1),f={for:"tab-pNpAghx"},b=e("input",{type:"radio",name:"group-Bh-p5",id:"tab-OPYoDl7"},null,-1),y=e("label",{for:"tab-OPYoDl7"},"英文原版",-1),k=l("",1),m=l("",4),M=JSON.parse('{"title":"Magisk 中文文档","titleTemplate":false,"description":"","frontmatter":{"aside":false,"titleTemplate":false},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1694965516000}'),T={name:"index.md"},P=Object.assign(T,{setup(v){return t(),(N,w)=>{const a=i("Badge");return o(),p("div",null,[e("h1",c,[s("Magisk 中文文档 "),n(a,{text:"由 Jesse205 翻译"}),s(),n(a,{type:"warning",text:"非官方"}),s(),h]),d,e("div",g,[e("div",u,[_,e("label",f,[s("中文汉化 "),n(a,{text:"百度翻译"})]),b,y]),k]),m])}}});export{M as __pageData,P as default}; diff --git a/assets/install.md.4596894c.js b/assets/install.md.4596894c.js new file mode 100644 index 00000000..a73e972c --- /dev/null +++ b/assets/install.md.4596894c.js @@ -0,0 +1,7 @@ +import{_ as l,C as t,o as r,c as n,k as s,H as c,a as o,Q as a}from"./chunks/framework.ed90c782.js";const p="/MagiskChineseDocument/assets/device_info.234952cd.png",B=JSON.parse('{"title":"安装","description":"","frontmatter":{},"headers":[],"relativePath":"install.md","filePath":"install.md","lastUpdated":1694967546000}'),i={name:"install.md"},d=a('

    安装

    如果您已经安装了 Magisk ,强烈建议直接通过 Magisk 应用程序的「直接安装」方法进行升级。以下教程仅针对初始安装。

    入门

    在你开始之前:

    • 本教程假设您了解如何使用 adbfastboot
    • 如果您还计划安装第三方内核(kernel),请在安装 Magisk 之后安装它
    • 必须解锁设备的引导加载程序(bootloader)

    下载并安装最新的 Magisk 应用程序 (只需下载「Magisk-版本.apk」即可) 在主屏幕中,您应该看到:

    Ramdisk 的结果确定您的设备在 boot 分区中是否有 ramdisk。如果您的设备没有启动 ramdisk,请在继续之前阅读 Recovery 中的 Magisk 部分。

    信息

    不幸的是,有一些例外情况,因为某些设备的引导加载程序会接受 ramdisk,即使它不应该接受。 在这种情况下,您必须按照说明进行操作,就好像您的设备的 boot 分区包含 ramdisk 一样。 没有什么办法检测到这一点,因此唯一可以确定的方法就是实际尝试。 幸运的是,据我们所知,只有部分小米设备具有此属性,所以大多数人可以忽略这条信息。

    如果您使用的是华为设备,请查看相应部分
    如果您使用的是三星设备,请查看相应部分

    如果您的设备有启动 ramdisk,请获取 boot.img 或者 init_boot.img(如果存在。在出厂时搭载 Android 13 的设备通常是这样的)的副本。

    如果您的设备没有启动 ramdisk,请获取 recovery.img 的副本。

    您可以从官方固件包或第三方 ROM 刷机包中提取所需文件。

    接下来,我们需要知道您的设备是否有单独的 vbmeta 分区。

    • 如果您的官方固件包包含 vbmeta.img ,那么您的设备有一个单独的 vbmeta 分区
    • 您还可以通过将设备连接到 PC 并运行以下命令进行检查:
    shell
    adb shell ls -l /dev/block/by-name
    +# 如果您遇到如 No such file or directory 的报错,那么请尝试把命令更换为
    +adb shell ls -l /dev/block/bootdevice/by-name
    +# 如果还是报错(比如华为设备),那么请联网搜索您的设备相对应的方法
    adb shell ls -l /dev/block/by-name
    +# 如果您遇到如 No such file or directory 的报错,那么请尝试把命令更换为
    +adb shell ls -l /dev/block/bootdevice/by-name
    +# 如果还是报错(比如华为设备),那么请联网搜索您的设备相对应的方法
    • 如果找到 vbmetavbmeta_avbmeta_b ,那么您的设备有一个单独的 vbmeta 分区
    • 否则,您的设备没有单独的 vbmeta 分区

    快速回顾一下,此时,您应该已经知道并准备好了:

    1. 设备是否有启动 ramdisk
    2. 设备是否有单独的 vbmeta 分区
    3. 基于 (1) 的 boot.imginit_boot.imgrecovery.img

    让我们继续修补映像.

    修补映像

    `,22),g=a('
  • 将 boot 、init_boot 或 recovery 映像( *.img 文件)复制到设备
  • 按下 Magisk 主屏幕中的 「安装」 按钮
  • 如果要修补 recovery 映像,请选中 「Recovery 模式」 选项
  • 如果您的设备没有单独的 vbmeta 分区,请选中 「修补 boot 映像中的 vbmeta」 选项
  • 在方式中选择 「选择并修补一个文件」 ,然后选择 boot 、init_boot 或 recovery 映像
  • 开始安装,并使用 ADB 将修补的映像复制到您的电脑:
    shell
    adb pull /sdcard/Download/magisk_patched_[随机字符].img PC上magisk_patched.img的路径
    adb pull /sdcard/Download/magisk_patched_[随机字符].img PC上magisk_patched.img的路径

    提示,你可以将文件从资源管理器直接拖到终端中来获得文件绝对路径。 不要使用 MTP,因为它可能会损坏大文件。

  • 将修补好的 boot 、init_boot 或 recovery 映像刷入到您的设备。
    对于大多数设备,可以重启到 fastboot 模式,并使用以下命令刷入:
    shell
    fastboot flash boot[_x] PC上magisk_patched_[随机字符].img的路径
    fastboot flash boot[_x] PC上magisk_patched_[随机字符].img的路径
    shell
    fastboot flash init_boot[_x] PC上magisk_patched_[随机字符].img的路径
    fastboot flash init_boot[_x] PC上magisk_patched_[随机字符].img的路径
    shell
    fastboot flash recovery PC上magisk_patched_[随机字符].img的路径
    fastboot flash recovery PC上magisk_patched_[随机字符].img的路径
    [_x] 应该取决于您的设备,应为 _a_b 或者不写
  • ',7),h=s("code",null,"vbmeta",-1),b=s("code",null,"vbmeta",-1),y=a('
    shell
    fastboot flash vbmeta --disable-verity --disable-verification vbmeta.img
    fastboot flash vbmeta --disable-verity --disable-verification vbmeta.img

    WARNING

    此操作可能清除您的数据。

    ',2),m=s("li",null,"重启并启动 Magisk 应用程序(如果您清除数据,您将看到一个用于占位的 Magisk 应用程序),您将看到一个询问修复环境的对话框,点击它并等待重启。",-1),k=s("li",null,"瞧!",-1),u=a('

    卸载

    卸载 Magisk 的最简单方法是直接通过 Magisk 应用程序。如果您坚持使用第三方 Recovery,请将 Magisk APK 文件 重命名为 uninstall.zip 后像其他普通的刷机包一样刷入。

    Recovery 中的 Magisk

    如果您的设备在 boot 映像中没有 ramdisk ,Magisk 别无选择,只能劫持 Recovery 分区。对于这些设备,每次启用 Magisk 时都必须重新启动至 Recovery

    当 Magisk 劫持 recovery 时,有一个特殊的机制允许您实际进入到 Recovery 模式。每个设备都有自己的启动到 Recovery 模式的按键组合,(例如几乎所有的小米设备均为「电源」+「音量增大」以及 Galaxy S10 的「电源」+「Bixby」+「音量增大」)。百度搜索(或者 Bing 搜索、Google 搜索)可以很容易地获得这些信息。一旦你按下组合键,设备就会显示启动屏幕(可能还会振动),释放所有按键即可启动 Magisk。如果您决定引导到实际的 Recovery 模式,请长按音量增大,直到看到 Recovery 屏幕

    总之,在 recovery 中安装 Magisk 后 (从关机开始)

    • (正常开机) → (无 Magisk 的系统)
    • (按键组合) → (启动屏幕) → (释放所有按钮) → (带有 Magisk 的系统)
    • (按键组合) → (启动屏幕) → (长按音量增大) → (Recovery 模式)

    (注意:在这种情况下,您不能使用 第三方 Recovery 来安装或升级 Magisk!!)

    三星设备

    在继续之前,请确认:

    • 安装 Magisk 将熔断您的 Knox 保修位,此操作无论如何都是不可逆的。
    • 首次安装 Magisk 需要完整的数据擦除(这不包括在解锁 bootloader 时的数据擦除)。请备份您的数据。

    刷机工具

    要求

    要验证三星设备是否可以安装 Magisk,首先必须检查 OEM 锁和 KnoxGuard (RMM) 状态,为此请使用组合键在下载模式下启动设备。

    OEM 锁的值可能如下:

    • ON (L):完全锁定。
    • ON (U):启动加载程序已锁定,OEM 解锁已启用。
    • OFF (U):完全解锁。

    要解锁引导加载器,请按照以下说明操作。如果下载模式下未显示 OEM 锁的值,则可能由于市场限制(美国/加拿大设备),您的设备无法解锁。

    KnoxGuard 的值可能如下:

    • ActiveLocked:您的设备已被电信运营商或保险公司远程锁定。
    • Prenormal:您的设备被暂时锁定,达到 168 小时正常运行时间后会触发解锁。
    • CheckingCompletedBroken:您的设备已解锁。

    启用 KnoxGuard 后,无论您的启动加载器处于何种锁定状态,都将无法安装/运行 Magisk。

    解锁 Bootloader

    1. 允许在解锁 bootloader,在 开发者选项 → OEM 解锁
    2. 重启至下载模式:关闭设备电源并按下设备的下载模式组合键
    3. 长按音量上键解锁启动加载器。这将清除你的数据并自动重启
    4. 完成初始设置。跳过所有步骤,因为数据将在后面的步骤中再次清除。请在设置过程中将设备连接到互联网。
    5. 启用开发者选项,确认 OEM 解锁选项是否存在,并显示为灰色。 这意味着 KnoxGuard 尚未锁定您的设备。
    6. 您的 bootloader 现在在下载模式下可接受的非官方映像。

    操作指南

    • 为您的设备下载最新固件包,您可以使用以下工具之一直接从三星服务器下载:
    • 解压缩固件并将 AP 归档文件复制到设备。它通常命名为 AP_[device_model_sw_ver].tar.md5
    • 按下 Magisk 主屏幕中的 「安装」 按钮。
    • 如果您的设备没有启动 ramdisk,勾选 「Recovery模式」 选项。
    • 在方式中选择 「选择并修补一个文件」 ,然后选择 AP 归档文件。
    • 开始安装,并使用 ADB 将修补的归档文件复制到您的电脑:
      shell
      adb pull /sdcard/Download/magisk_patched_[random_strings].tar
      adb pull /sdcard/Download/magisk_patched_[random_strings].tar

      WARNING

      不要使用 MTP,因为它可能会损坏大型文件。

      译者注:如果有条件,可以验证一下哈希值。

    • 重新启动到下载模式。在您的 PC 上打开 Odin,将 magisk_patched.tar 作为 AP,连同原始固件中的 BLCPCSC不是 HOME_CSC,因为我们要清除数据)一起刷入。
    • 一旦 Odin 完成刷机,您的设备应该会自动重启。如果被要求恢复出厂设置,请同意。
    • 如果您的设备没有启动 ramdisk,请立即重新启动到 recovery 以启用 Magisk(原因在 Recovery 中的 Magisk 中说明)。
    • 安装您已经下载的 Magisk 应用程序 并启动该应用程序。 它应该显示一个对话框,要求进行额外的设置。
    • 让应用程序完成它的工作并自动重启设备。瞧!

    系统更新

    一旦你的三星设备获得了 root 权限,你就不能再通过 OTA 进行 Android 系统更新了。要进行系统更新,您必须手动下载新的固件归档文件并完成上一节中编写的相同 AP 修补过程。这里唯一的区别在于Odin刷入步骤:不要使用 CSC 归档文件,而是使用 HOME_CSC 归档文件,因为我们正在执行升级,而不是初始安装

    注意事项

    • 永远、永远不要尝试将 bootrecoveryvbmeta 分区恢复到原样! 您这样做会破坏您的设备,并且从中恢复的唯一方法是清除数据并进行完整的 Odin 恢复
    • 要使用新的固件升级您的设备,切勿出于上述原因直接使用原厂 AP 归档文件。 始终在 Magisk 应用程序中修补 AP 并改用它。

    华为

    DANGER

    这部分现已从官方文档中移除。您正在浏览的是 2021.03.22 时并修改补充后的版本。

    Magisk 不再正式支持较新的华为设备,因为其设备上的 bootloader 不可通过官方途径解锁,更重要的是他们不遵循标准的 Android 分区方案。以下只是一些一般性指导。

    使用了麒麟处理器的华为设备与大多数常见设备的分区方式不同。Magisk 通常安装在设备的 boot 分区,但是华为设备没有这个分区。根据您的设备运行的 EMUI 版本,说明会略有不同。

    WARNING

    建议不要使用最新版本的 Magisk 应用!推荐使用 Magisk v23.0Magisk v20.4 搭配 Magisk Manager v7.5.1

    获得官方映像

    华为不发布官方出厂映像以及 OTA 归档文件,但大多数固件压缩包可以从华为固件下载站下载。 要从压缩包中的「UPDATE.APP」中提取映像,您必须使用 Huawei Update Extractor(仅限 Windows!)

    EMUI 5 及以下

    遵循入门的教程,唯一的不同在于请勿使用最新版本的 Magisk 应用!

    注意:华为设备进入 fastboot 模式需要将手机使用数据线连接电脑,而进入 Recovery 模式则不能将手机连接到电脑!所以如果您在 fastboot 模式中刷入 Recovery 映像后请将手机与电脑断开连接后再按下「电源」+「音量增大」来进入 Recovery,否则您将进入的是「eRecovery」。

    EMUI 8

    对于运行 EMUI 8 的设备,您的设备有一个名为 ramdisk 的分区,这是将要安装 Magisk 的地方。

    • 如果您打算使用第三方 Recovery,只需按照第三方 Recovery 的说明进行操作即可。
    • 如果您不打算使用第三方 Recovery,则必须从您的固件中提取 RAMDISK.img 。 按照上面的修补映像说明进行操作,但使用 RAMDISK.img 文件而不是 boot 映像!
    • 要将修补后的映像刷入您的设备,请使用 fastboot 命令:
      shell
      fastboot flash ramdisk /path/to/magisk_patched.img
      fastboot flash ramdisk /path/to/magisk_patched.img
      请注意,您正在刷入 ramdisk,而不是 boot

    EMUI 9 或更高版本

    对于 EMUI 9+ 设备,ramdisk 分区不再存在。 作为解决方法,Magisk 将安装到 recovery_ramdisk 分区。 在按照以下说明操作之前,请先阅读 Recovery 中的 Magisk

    译者注:正如在 荣耀 View 10 上测试的那样,华为的内核似乎无法在早期启动时捕获按键事件,因此长按音量增大不会在我的设备上不会启动到 Recovery。 您的体验可能会有所不同。

    • 如果您打算使用第三方 Recovery,只需按照第三方 Recovery 的说明进行操作即可。
      警告:Magisk 将覆盖第三方 Recovery。
    • 如果您不打算使用第三方 Recovery,则必须从固件中提取 RECOVERY_RAMDIS.img (这不是拼写错误),而不是 recovery.img(部分设备依旧需要修补 recovery.img )。 按照上面的引导映像修补说明进行操作,但使用 RECOVERY_RAMDIS.img 文件而不是 boot 映像!
    • 要将修补后的映像刷入您的设备,请使用 fastboot 命令:
      shell
      fastboot flash recovery_ramdisk /path/to/magisk_patched.img
      fastboot flash recovery_ramdisk /path/to/magisk_patched.img
      请注意,您正在刷入 recovery_ramdisk,而不是 boot

    第三方 Recovery

    WARNING

    这种安装方法已被弃用,并且可以用很小的工作量来维护。

    仅当您的设备启动 ramdisk 时,才能使用第三方 Recovery 进行安装。不建议在新的设备上通过第三方 Recovery 安装 Magisk。如果您遇到任何问题,请使用正确的修补映像方法。

    • 下载 Magisk 安装包
    • .apk 文件扩展名重命名为 .zip ,例如:Magisk-v26.1.apkMagisk-v26.1.zip 。如果重命名文件扩展名时遇到问题(比如在 Windows 文件资源管理器中默认不显示文件扩展名),请使用 Android 上的文件管理器或第三方 Recovery 中的文件管理功能重命名文件。
    • 像其他普通的刷机包一样刷 zip。
    • 重新启动并检查是否已安装 Magisk 应用程序。如果未自动安装,请手动安装 APK。
    • 启动 Magisk 应用程序,它将显示一个让您重新安装的对话框。请直接在 APP 内重新安装并重新启动(MTK 设备将在重启后自动给 boot 分区上锁,请使用 fastboot 或者第三方 recovery 修补映像)。

    WARNING

    模块的 sepolicy.rule 文可能存储在 cache 分区中。请不要擦除 CACHE 分区。

    TIP

    您也可以提供 adb sideload 刷入 Magisk,这对于不能正常解密 data 分区且无外置存储设备(SD 卡,U 盘等)的设备特别友好,并且在这种情况下无需将 .apk 文件扩展名重命名为 .zip

    参考链接

    ',54);function v(E,_,f,F,C,M){const e=t("Badge");return r(),n("div",null,[d,s("ul",null,[g,s("li",null,[c(e,{text:"可选"}),o(" 如果您的设备有单独的 "),h,o(" 分区,则可以使用以下命令修补 "),b,o(" 分区"),y]),m,k]),u])}const R=l(i,[["render",v]]);export{B as __pageData,R as default}; diff --git a/assets/install.md.4596894c.lean.js b/assets/install.md.4596894c.lean.js new file mode 100644 index 00000000..cfef631f --- /dev/null +++ b/assets/install.md.4596894c.lean.js @@ -0,0 +1 @@ +import{_ as l,C as t,o as r,c as n,k as s,H as c,a as o,Q as a}from"./chunks/framework.ed90c782.js";const p="/MagiskChineseDocument/assets/device_info.234952cd.png",B=JSON.parse('{"title":"安装","description":"","frontmatter":{},"headers":[],"relativePath":"install.md","filePath":"install.md","lastUpdated":1694967546000}'),i={name:"install.md"},d=a("",22),g=a("",7),h=s("code",null,"vbmeta",-1),b=s("code",null,"vbmeta",-1),y=a("",2),m=s("li",null,"重启并启动 Magisk 应用程序(如果您清除数据,您将看到一个用于占位的 Magisk 应用程序),您将看到一个询问修复环境的对话框,点击它并等待重启。",-1),k=s("li",null,"瞧!",-1),u=a("",54);function v(E,_,f,F,C,M){const e=t("Badge");return r(),n("div",null,[d,s("ul",null,[g,s("li",null,[c(e,{text:"可选"}),o(" 如果您的设备有单独的 "),h,o(" 分区,则可以使用以下命令修补 "),b,o(" 分区"),y]),m,k]),u])}const R=l(i,[["render",v]]);export{B as __pageData,R as default}; diff --git a/assets/install.md.d1d3e2f1.js b/assets/install.md.d1d3e2f1.js deleted file mode 100644 index 13a0c446..00000000 --- a/assets/install.md.d1d3e2f1.js +++ /dev/null @@ -1,7 +0,0 @@ -import{_ as t,H as l,o as r,c as n,C as o,J as i,a as e,V as a}from"./chunks/framework.fc84ac3a.js";const c="/MagiskChineseDocument/assets/device_info.234952cd.png",_=JSON.parse('{"title":"安装","description":"","frontmatter":{},"headers":[],"relativePath":"install.md","filePath":"install.md","lastUpdated":1684159642000}'),p={name:"install.md"},d=a('

    安装

    如果您已经安装了 Magisk ,强烈建议直接通过 Magisk 应用程序的「直接安装」方法进行升级。以下教程仅针对初始安装。

    • 如果您在使用运行着 EMUI 8 或更高版本的华为设备,请查看相应部分
    • 如果您使用的是搭载 Android 9.0 或更高版本的三星设备(2019 年新设备),请查看相应部分

    入门

    在你开始之前:

    • 本教程假设您了解如何使用 adbfastboot
    • 如果您还计划安装第三方内核(kernel),请在安装 Magisk 之后安装它
    • 必须解锁设备的引导加载程序(bootloader)

    下载并安装最新的 Magisk 应用程序 (只需下载「Magisk-版本.apk」即可) 在主屏幕中,您应该看到:

    Ramdisk 的结果确定您的设备在 boot 分区中是否有 ramdisk。如果您的设备没有启动 ramdisk,请在继续之前阅读 Recovery 中的 Magisk 部分。

    信息

    不幸的是,有一些例外情况,因为某些设备的引导加载程序会接受 ramdisk,即使它不应该接受。 在这种情况下,您必须按照说明进行操作,就好像您的设备的 boot 分区包含 ramdisk 一样。 没有什么办法检测到这一点,因此唯一可以确定的方法就是实际尝试。 幸运的是,据我们所知,只有部分小米设备具有此属性,所以大多数人可以忽略这条信息。

    如果您的设备有启动 ramdisk,请获取 boot.img 或者 init_boot.img(如果存在。在出厂时搭载 Android 13 的设备通常是这样的,比如红米 K60Pro)的副本。

    如果您的设备没有启动 ramdisk,请获取 recovery.img 的副本。

    您可以从官方固件包或第三方 ROM 刷机包中提取所需文件。

    接下来,我们需要知道您的设备是否有单独的 vbmeta 分区。

    • 如果您的官方固件包包含 vbmeta.img ,那么您的设备有一个单独的 vbmeta 分区
    • 您还可以通过将设备连接到 PC 并运行以下命令进行检查:
    shell
    adb shell ls -l /dev/block/by-name
    -# 如果您遇到如 No such file or directory 的报错,那么请尝试把命令更换为
    -adb shell ls -l /dev/block/bootdevice/by-name
    -# 如果还是报错(比如华为设备),那么请联网搜索您的设备相对应的方法
    • 如果找到 vbmetavbmeta_avbmeta_b ,那么您的设备有一个单独的 vbmeta 分区
    • 否则,您的设备没有单独的 vbmeta 分区

    快速回顾一下,此时,您应该已经知道并准备好了:

    1. 设备是否有启动 ramdisk
    2. 设备是否有单独的 vbmeta 分区
    3. 基于 (1) 的 boot.imginit_boot.imgrecovery.img

    让我们继续修补映像.

    修补映像

    • 将 boot 、init_boot 或 recovery 映像( *.img 文件)复制到设备
    • 按下 Magisk 主屏幕中的 「安装」 按钮
    • 如果要修补 recovery 映像,请选中 「Recovery 模式」 选项
    • 如果您的设备没有单独的 vbmeta 分区,请选中 「修补 boot 映像中的 vbmeta」 选项
    • 在方式中选择 「选择并修补一个文件」 ,然后选择 boot 、init_boot 或 recovery 映像
    • 开始安装,并使用 ADB 将修补的映像复制到您的电脑:
    shell
    adb pull /sdcard/Download/magisk_patched_[随机字符].img PC上magisk_patched.img的路径

    提示,你可以将文件从资源管理器直接拖到终端中来获得文件绝对路径。

    不要使用 MTP,因为它可能会损坏大文件。

    • 将修补好的 boot 、init_boot 或 recovery 映像刷入到您的设备。
      对于大多数设备,可以重启到 fastboot 模式,并使用以下命令刷入:
    shell
    fastboot flash boot[_x] PC上magisk_patched_[随机字符].img的路径 # 或
    -fastboot flash init_boot[_x] PC上magisk_patched_[随机字符].img的路径
    -# 如果刚刚修补的是 recovery 映像则改用:
    -fastboot flash recovery PC上magisk_patched_[随机字符].img的路径

    [_x] 应该取决于您的设备,应为 _a_b 或者不写

    `,29),g=o("code",null,"vbmeta",-1),h=o("code",null,"vbmeta",-1),m=a('
    shell
    fastboot flash vbmeta --disable-verity --disable-verification vbmeta.img

    WARNING

    此操作可能清除您的数据

    • 重启并启动 Magisk 应用程序(如果您清除数据,您将看到一个用于占位的 Magisk 应用程序),您将看到一个询问修复环境的对话框,点击它并等待重启
    • 瞧!

    卸载

    卸载 Magisk 的最简单方法是直接通过 Magisk 应用程序。如果您坚持使用第三方 Recovery,请将 Magisk APK 文件 重命名为 uninstall.zip 后像其他普通的刷机包一样刷入。

    Recovery 中的 Magisk

    如果您的设备在 boot 映像中没有 ramdisk ,Magisk 别无选择,只能劫持 Recovery 分区。对于这些设备,每次启用 Magisk 时都必须重新启动至 Recovery

    当 Magisk 劫持 recovery 时,有一个特殊的机制允许您实际进入到 Recovery 模式。每个设备都有自己的启动到 Recovery 模式的按键组合,(例如几乎所有的小米设备均为「电源」+「音量增大」以及 Galaxy S10 的「电源」+「Bixby」+「音量增大」)。百度搜索(或者 Bing 搜索、Google 搜索)可以很容易地获得这些信息。一旦你按下组合键,设备就会显示启动屏幕(可能还会振动),释放所有按键即可启动 Magisk。如果您决定引导到实际的 Recovery 模式,请长按音量增大,直到看到 Recovery 屏幕

    总之,在 recovery 中安装 Magisk 后 (从关机开始)

    • (正常开机) → (无 Magisk 的系统)
    • (按键组合) → (启动屏幕) → (释放所有按钮) → (带有 Magisk 的系统)
    • (按键组合) → (启动屏幕) → (长按音量增大) → (Recovery 模式)

    (注意:在这种情况下,您不能使用 第三方 Recovery 来安装或升级 Magisk!!)

    三星 (System-as-root)

    警告

    如果您的三星设备未安装 Android 9.0 或更高版本,则说明以下内容不适用于您的设备。

    安装 Magisk 之前

    • 安装 Magisk 将熔断 KNOX
    • 首次安装 Magisk 需要完整的数据擦除(这不包括在解锁 bootloader 时的数据擦除)。请在继续之前备份您的数据。
    • 下载支持您设备的 Odin (仅限 Windows 上运行) 或者 Heimdall (仅 Linux)。

    解锁 Bootloader

    在较新三星设备上解锁 bootloader 有一些注意事项。新引入的 VaultKeeper 服务会使 bootloader 在某些情况下拒绝任何非官方分区。

    • 允许在解锁 bootloader,在 开发者选项 → OEM 解锁
    • 重启到下载模式:将设备关机,然后按下设备的下载模式键组合
    • 长按音量上限可解锁引导加载程序这将擦除数据并自动重新启动
    • 完成初始设置。跳过所有步骤,因为数据将在后面的步骤中再次擦除。在设置过程中将设备连接到互联网
    • 启用开发者选项,确认「OEM解锁」选项存在且呈灰色。 这意味着 VaultKeeper 服务释放了引导加载程序。
    • 您的 bootloader 现在在下载模式允许非官方映像

    操作指南

    • 使用 samfirm.jsFrija,或 Samloader 直接从三星服务器下载设备的最新 zip 固件 。

    • 解压缩固件并将 AP 归档文件复制到设备。它通常命名为 AP_[device_model_sw_ver].tar.md5

    • 按下 Magisk 主屏幕中的 「安装」 按钮

    • 如果您的设备没有启动 ramdisk,勾选 「Recovery模式」 选项

    • 在方式中选择 「选择并修补一个文件」 ,然后选择 AP 归档文件

    • 开始安装,并使用 ADB 将修补的归档文件复制到您的电脑:

      shell
      adb pull /sdcard/Download/magisk_patched_[random_strings].tar

      注意:不要使用MTP,因为它可能会损坏大型文件。

    • 重新启动到下载模式。在您的 PC 上打开 Odin,将 magisk_patched.tar 作为 AP,连同原始固件中的 BLCPCSC不是 HOME_CSC,因为我们要清除数据)一起刷入。

    • 一旦 Odin 完成刷机,您的设备应该会自动重启。 如果被要求恢复出厂设置,请同意。

    • 如果您的设备没有启动 ramdisk,请立即重新启动到 recovery 以启用 Magisk(原因在 Recovery 中的 Magisk 中说明)。

    • 安装您已经下载的 Magisk 应用程序 并启动该应用程序。 它应该显示一个对话框,要求进行额外的设置。

    • 让应用程序完成它的工作并自动重启设备。

    系统更新

    一旦你的三星设备获得了 root 权限,你就不能再通过 OTA 进行 Android 系统更新了。要进行系统更新,您必须手动下载新的固件归档文件并完成上一节中编写的相同 AP 修补过程。这里唯一的区别在于Odin刷入步骤:不要使用 CSC 归档文件,而是使用 HOME_CSC 归档文件,因为我们正在执行升级,而不是初始安装

    注意事项

    • 永远、永远不要尝试将 bootrecoveryvbmeta 分区恢复到原样! 您这样做会破坏您的设备,并且从中恢复的唯一方法是清除数据并进行完整的 Odin 恢复
    • 要使用新的固件升级您的设备,切勿出于上述原因直接使用原厂 AP 归档文件。 始终在 Magisk 应用程序中修补 AP 并改用它。
    • 永远不要只刷入 AP ,否则 Odin 可能会缩小 /data 文件系统的大小。升级时请刷入 AP + BL + CP + HOME_CSC

    华为

    DANGER

    这部分现已从官方文档中移除。您正在浏览的是 2021.03.22 并补充后的版本。

    Magisk 不再正式支持较新的华为设备,因为其设备上的 bootloader 不可通过官方途径解锁,更重要的是他们不遵循标准的 Android 分区方案。以下只是一些一般性指导。

    使用了麒麟处理器的华为设备与大多数常见设备的分区方式不同。Magisk 通常安装在设备的 boot 分区,但是华为设备没有这个分区。根据您的设备运行的 EMUI 版本,说明会略有不同。

    DANGER

    请勿使用最新版本的 Magisk 应用!我推荐使用 Magisk v23.0 或使用 Magisk v20.4 (下载「Magisk-v20.4.zip」)搭配 Magisk Manager v7.5.1 (下载「MagiskManager-v7.5.1.apk」)

    Magisk 兼容性列表
    名称型号EMUI 版本Android 版本详情
    华为畅享7SLA-AL00EMUI 5.1.2Android 7.0使用 Magisk v25.2 时会触发引导循环并直接重启至 eRecovery
    荣耀畅玩4CCHM-TL00HEMUI 4.0Android 6.0使用新版 Magisk 会导致无法授权
    荣耀畅玩6XBLN-AL10EMUI 8.0Android 8.0没有这个问题

    获得官方映像

    华为不发布官方出厂映像以及 OTA 归档文件,但大多数固件压缩包可以从华为固件下载站下载。 要从压缩包中的「UPDATE.APP」中提取映像,您必须使用 Huawei Update Extractor(仅限 Windows!)

    EMUI 5 及以下

    遵循入门的教程,唯一的不同在于请勿使用最新版本的 Magisk 应用!

    注意:华为设备进入 fastboot 模式需要将手机使用数据线连接电脑,而进入 Recovery 模式则不能将手机连接到电脑!所以如果您在 fastboot 模式中刷入 Recovery 映像后请将手机与电脑断开连接后再按下「电源」+「音量增大」来进入 Recovery,否则您将进入的是「eRecovery」。

    EMUI 8

    对于运行 EMUI 8 的设备,您的设备有一个名为 ramdisk 的分区,这是将要安装 Magisk 的地方。

    • 如果您打算使用第三方 Recovery,只需按照第三方 Recovery 的说明进行操作即可。

    • 如果您不打算使用第三方 Recovery,则必须从您的固件中提取 RAMDISK.img 。 按照上面的修补映像说明进行操作,但使用 RAMDISK.img 文件而不是 boot 映像!

    • 要将修补后的映像刷入您的设备,请使用 fastboot 命令:

      shell
      fastboot flash ramdisk /path/to/magisk_patched.img

    请注意,您正在刷入 ramdisk,而不是 boot

    EMUI 9 或更高版本

    对于 EMUI 9+ 设备,ramdisk 分区不再存在。 作为解决方法,Magisk 将安装到 recovery_ramdisk 分区。 在按照以下说明操作之前,请先阅读 Recovery 中的 Magisk

    注意:正如在 荣耀 View 10 上测试的那样,华为的内核似乎无法在早期启动时捕获按键事件,因此长按音量增大不会在我的设备上不会启动到 Recovery。 您的体验可能会有所不同。

    • 如果您打算使用第三方 Recovery,只需按照第三方 Recovery 的说明进行操作即可。
      警告:Magisk 将覆盖第三方 Recovery。

    • 如果您不打算使用第三方 Recovery,则必须从固件中提取 RECOVERY_RAMDIS.img (这不是拼写错误),而不是 recovery.img(部分设备依旧需要修补 recovery.img )。 按照上面的引导映像修补说明进行操作,但使用 RECOVERY_RAMDIS.img 文件而不是 boot 映像!

    • 要将修补后的映像刷入您的设备,请使用 fastboot 命令:

      shell
      fastboot flash recovery_ramdisk /path/to/magisk_patched.img

    请注意,您正在刷入 recovery_ramdisk,而不是 boot

    第三方 Recovery

    警告

    这种安装方法已被弃用,并且可以用很小的工作量来维护。

    仅当您的设备启动 ramdisk 时,才能使用第三方 Recovery 进行安装。不建议在新的设备上通过第三方 Recovery 安装 Magisk。如果您遇到任何问题,请使用正确的修补映像方法。

    • 下载 Magisk 安装包
    • .apk 文件扩展名重命名为 .zip ,例如:Magisk-v25.2.apkMagisk-v25.2.zip 。如果重命名文件扩展名时遇到问题(比如在 Windows 文件资源管理器中默认不显示文件扩展名),请使用 Android 上的文件管理器或第三方 Recovery 中的文件管理功能重命名文件。
    • 像其他普通的刷机包一样刷入归档文件。
    • 重新启动并检查是否已安装 Magisk 应用程序。如果未自动安装,请手动安装 APK。
    • 启动 Magisk 应用程序,它将显示一个让您重新安装的对话框。请直接在 APP 内重新安装并重新启动(MTK 设备将在重启后自动给 boot 分区上锁,请使用 fastboot 或者第三方 recovery 修补映像)。

    警告

    模块的 sepolicy.rule 文可能存储在 cache 分区中。请不要擦除 CACHE 分区。

    TIP

    您也可以提供 adb sideload 刷入 Magisk,这对于不能正常解密 data 分区且无外置存储设备(SD 卡,U 盘等)的设备特别友好,并且在这种情况下无需将 .apk 文件扩展名重命名为 .zip

    参考链接

    ',51);function b(y,k,u,C,v,A){const s=l("Badge");return r(),n("div",null,[d,o("ul",null,[o("li",null,[i(s,{type:"tip",text:"可选"}),e(" 如果您的设备有单独的 "),g,e(" 分区,则可以使用以下命令修补 "),h,e(" 分区")])]),m])}const M=t(p,[["render",b]]);export{_ as __pageData,M as default}; diff --git a/assets/install.md.d1d3e2f1.lean.js b/assets/install.md.d1d3e2f1.lean.js deleted file mode 100644 index 9bde3c19..00000000 --- a/assets/install.md.d1d3e2f1.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,H as l,o as r,c as n,C as o,J as i,a as e,V as a}from"./chunks/framework.fc84ac3a.js";const c="/MagiskChineseDocument/assets/device_info.234952cd.png",_=JSON.parse('{"title":"安装","description":"","frontmatter":{},"headers":[],"relativePath":"install.md","filePath":"install.md","lastUpdated":1684159642000}'),p={name:"install.md"},d=a("",29),g=o("code",null,"vbmeta",-1),h=o("code",null,"vbmeta",-1),m=a("",51);function b(y,k,u,C,v,A){const s=l("Badge");return r(),n("div",null,[d,o("ul",null,[o("li",null,[i(s,{type:"tip",text:"可选"}),e(" 如果您的设备有单独的 "),g,e(" 分区,则可以使用以下命令修补 "),h,e(" 分区")])]),m])}const M=t(p,[["render",b]]);export{_ as __pageData,M as default}; diff --git a/assets/ota.md.93c63cee.js b/assets/ota.md.65ab8a7c.js similarity index 97% rename from assets/ota.md.93c63cee.js rename to assets/ota.md.65ab8a7c.js index 0d0e1c55..93bf1b67 100644 --- a/assets/ota.md.93c63cee.js +++ b/assets/ota.md.65ab8a7c.js @@ -1 +1 @@ -import{_ as a,o as e,c as i,V as t}from"./chunks/framework.fc84ac3a.js";const o="/MagiskChineseDocument/images/disable_auto_ota.png",s="/MagiskChineseDocument/images/restore_img.png",r="/MagiskChineseDocument/images/ota_done.png",l="/MagiskChineseDocument/images/install_inactive_slot.png",n="/MagiskChineseDocument/images/manager_reboot.png",T=JSON.parse('{"title":"OTA 升级指南","description":"","frontmatter":{},"headers":[],"relativePath":"ota.md","filePath":"ota.md","lastUpdated":1681768747000}'),g={name:"ota.md"},c=t('

    OTA 升级指南

    Magisk 不修改大多数只读分区,这意味着应用官方 OTA 要简单得多。以下是几种不同类型的设备的教程,以应用 OTA 并在安装后保留 Magisk(如果可能)。这只是一个通用指南,因为每个设备的程序可能有所不同。

    注意:为了应用 OTA,您必须确保自己没有以任何方式修改只读分区(如 /system/vendor )。即使将分区重新挂载到 rw 也会篡改块验证

    必要条件

    • 请在开发人员选项中禁用自动系统更新,这样在未经您确认的情况下,它不会安装 OTA。

    • 当OTA可用时,首先转到(Magisk app → 卸载 → 恢复映像),不要重新启动,否则将卸载 Magisk。 这将使 Magisk 修改的分区从安装时的生成备份恢复到官方,以便通过 OTA 前的块验证。在执行以下步骤之前,需要执行此步骤

    带 A/B 分区的设备

    可以将 OTA 安装到非活动插槽,并让 Magisk app 将 Magisk 安装到更新的分区上。开箱即用的 OTA 安装工作无缝,安装后可以保存 Magisk。

    • 恢复官方映像后,按正常方式应用 OTA(设置 → 系统 → 系统更新)。
    • 等待安装完成(OTA 的 步骤1:“安装更新” 和 步骤2:“优化您的设备”),不要按“重新启动”按钮! 相反,请转到(Magisk app → 安装 → 安装到非活动插槽)将 Magisk 安装到更新的插槽。

    • 安装完成后,按下 Magisk app 中的重新启动按钮。在 hood 下,Magisk app 强制您的设备切换到更新的插槽,绕过任何可能的 OTA 后验证。

    “非 A/B” 设备

    不幸的是,在这些设备上应用 OTA 并没有真正好的方法。以下教程不会保留 Magisk;升级后,您必须手动重新 root 设备,这将需要通过电脑。这些只是“最佳实践”。

    • 如果您安装了第三方 recovery,则可以从以前的备份、在线转储或 OEM 提供的出厂映像中恢复。 如果您决定在不接触 recovery 分区的情况下开始安装 Magisk,您可以有几种选择,无论是哪种方式,您都可以最终使用 Magisk root 的设备,但 recovery 仍然保持不变:
      • 如果支持,请使用 fastboot boot <recovery_img> 启动第三方 Recovery 并安装 Magisk。
      • 如果您有官方映像转储的副本,请使用 Magisk app 的“修补映像”功能安装 Magisk
    • 恢复到官方映像和其他映像后,下载 OTA。可选地,一旦下载了 OTA 的更新 zip,就可以找到提取 zip 的方法(因为它通常涉及 root 用户)
    • 应用 OTA 并重启设备。这将使用您设备的官方映像 OTA 安装机制来升级您的系统。
    • 一旦完成,您将得到一个升级的、100% 官方的、未 root 的设备。你必须手动将 Magisk 刷回。如果您想经常接收官方 OTA,请考虑使用 步骤1 中所述的方法,在不接触恢复分区的情况下刷入 Magisk。

    参考链接

    ',19),p=[c];function d(h,_,m,u,k,A){return e(),i("div",null,p)}const O=a(g,[["render",d]]);export{T as __pageData,O as default}; +import{_ as a,o as e,c as i,Q as t}from"./chunks/framework.ed90c782.js";const o="/MagiskChineseDocument/images/disable_auto_ota.png",s="/MagiskChineseDocument/images/restore_img.png",r="/MagiskChineseDocument/images/ota_done.png",l="/MagiskChineseDocument/images/install_inactive_slot.png",n="/MagiskChineseDocument/images/manager_reboot.png",T=JSON.parse('{"title":"OTA 升级指南","description":"","frontmatter":{},"headers":[],"relativePath":"ota.md","filePath":"ota.md","lastUpdated":1681768747000}'),g={name:"ota.md"},c=t('

    OTA 升级指南

    Magisk 不修改大多数只读分区,这意味着应用官方 OTA 要简单得多。以下是几种不同类型的设备的教程,以应用 OTA 并在安装后保留 Magisk(如果可能)。这只是一个通用指南,因为每个设备的程序可能有所不同。

    注意:为了应用 OTA,您必须确保自己没有以任何方式修改只读分区(如 /system/vendor )。即使将分区重新挂载到 rw 也会篡改块验证

    必要条件

    • 请在开发人员选项中禁用自动系统更新,这样在未经您确认的情况下,它不会安装 OTA。

    • 当OTA可用时,首先转到(Magisk app → 卸载 → 恢复映像),不要重新启动,否则将卸载 Magisk。 这将使 Magisk 修改的分区从安装时的生成备份恢复到官方,以便通过 OTA 前的块验证。在执行以下步骤之前,需要执行此步骤

    带 A/B 分区的设备

    可以将 OTA 安装到非活动插槽,并让 Magisk app 将 Magisk 安装到更新的分区上。开箱即用的 OTA 安装工作无缝,安装后可以保存 Magisk。

    • 恢复官方映像后,按正常方式应用 OTA(设置 → 系统 → 系统更新)。
    • 等待安装完成(OTA 的 步骤1:“安装更新” 和 步骤2:“优化您的设备”),不要按“重新启动”按钮! 相反,请转到(Magisk app → 安装 → 安装到非活动插槽)将 Magisk 安装到更新的插槽。

    • 安装完成后,按下 Magisk app 中的重新启动按钮。在 hood 下,Magisk app 强制您的设备切换到更新的插槽,绕过任何可能的 OTA 后验证。

    “非 A/B” 设备

    不幸的是,在这些设备上应用 OTA 并没有真正好的方法。以下教程不会保留 Magisk;升级后,您必须手动重新 root 设备,这将需要通过电脑。这些只是“最佳实践”。

    • 如果您安装了第三方 recovery,则可以从以前的备份、在线转储或 OEM 提供的出厂映像中恢复。 如果您决定在不接触 recovery 分区的情况下开始安装 Magisk,您可以有几种选择,无论是哪种方式,您都可以最终使用 Magisk root 的设备,但 recovery 仍然保持不变:
      • 如果支持,请使用 fastboot boot <recovery_img> 启动第三方 Recovery 并安装 Magisk。
      • 如果您有官方映像转储的副本,请使用 Magisk app 的“修补映像”功能安装 Magisk
    • 恢复到官方映像和其他映像后,下载 OTA。可选地,一旦下载了 OTA 的更新 zip,就可以找到提取 zip 的方法(因为它通常涉及 root 用户)
    • 应用 OTA 并重启设备。这将使用您设备的官方映像 OTA 安装机制来升级您的系统。
    • 一旦完成,您将得到一个升级的、100% 官方的、未 root 的设备。你必须手动将 Magisk 刷回。如果您想经常接收官方 OTA,请考虑使用 步骤1 中所述的方法,在不接触恢复分区的情况下刷入 Magisk。

    参考链接

    ',19),p=[c];function d(h,_,m,u,k,A){return e(),i("div",null,p)}const O=a(g,[["render",d]]);export{T as __pageData,O as default}; diff --git a/assets/ota.md.93c63cee.lean.js b/assets/ota.md.65ab8a7c.lean.js similarity index 80% rename from assets/ota.md.93c63cee.lean.js rename to assets/ota.md.65ab8a7c.lean.js index fb81c6fc..b7b95a9e 100644 --- a/assets/ota.md.93c63cee.lean.js +++ b/assets/ota.md.65ab8a7c.lean.js @@ -1 +1 @@ -import{_ as a,o as e,c as i,V as t}from"./chunks/framework.fc84ac3a.js";const o="/MagiskChineseDocument/images/disable_auto_ota.png",s="/MagiskChineseDocument/images/restore_img.png",r="/MagiskChineseDocument/images/ota_done.png",l="/MagiskChineseDocument/images/install_inactive_slot.png",n="/MagiskChineseDocument/images/manager_reboot.png",T=JSON.parse('{"title":"OTA 升级指南","description":"","frontmatter":{},"headers":[],"relativePath":"ota.md","filePath":"ota.md","lastUpdated":1681768747000}'),g={name:"ota.md"},c=t("",19),p=[c];function d(h,_,m,u,k,A){return e(),i("div",null,p)}const O=a(g,[["render",d]]);export{T as __pageData,O as default}; +import{_ as a,o as e,c as i,Q as t}from"./chunks/framework.ed90c782.js";const o="/MagiskChineseDocument/images/disable_auto_ota.png",s="/MagiskChineseDocument/images/restore_img.png",r="/MagiskChineseDocument/images/ota_done.png",l="/MagiskChineseDocument/images/install_inactive_slot.png",n="/MagiskChineseDocument/images/manager_reboot.png",T=JSON.parse('{"title":"OTA 升级指南","description":"","frontmatter":{},"headers":[],"relativePath":"ota.md","filePath":"ota.md","lastUpdated":1681768747000}'),g={name:"ota.md"},c=t("",19),p=[c];function d(h,_,m,u,k,A){return e(),i("div",null,p)}const O=a(g,[["render",d]]);export{T as __pageData,O as default}; diff --git a/assets/releases_18000.md.6eb41e04.js b/assets/releases_18000.md.6eb41e04.js new file mode 100644 index 00000000..d4bab3ac --- /dev/null +++ b/assets/releases_18000.md.6eb41e04.js @@ -0,0 +1 @@ +import{_ as e,o,c as a,Q as t}from"./chunks/framework.ed90c782.js";const u=JSON.parse('{"title":"2018.12.7 Magisk v18.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/18000.md","filePath":"releases/18000.md","lastUpdated":1694958663000}'),s={name:"releases/18000.md"},i=t('

    2018.12.7 Magisk v18.0

    Here comes a stable release, this time with quite a few major updates!

    MagiskHide Improvements

    Starting from v18, the process monitor matches component names instead of process names. Android allow app services to name their process arbitrarily, and many apps starting to use dedicated services to detect root; it used to require adding all of these service process names to the list to hide Magisk effectively. Component names have the format: <package name>/<java class name>, which means we can always know which application spawned a given process.

    TL;DR, ALL processes spawned from the applications on the hide list will be targeted.

    Recently I discovered a very widespread Linux kernel bug affecting tons of Android devices (full write-up: Medium Article). This bug exposes the supposedly protected procfs, which is abused in some apps to detect Magisk with information leaked from other processes. Magisk will patch this bug on all Android 7.0+ devices. Yes, a fully effective MagiskHide requires the enhanced Android Sandbox in modern Android versions.

    Path Changes

    The name of the folder /sbin/.core is confusing and will no longer be used; it is replaced with /sbin/.magisk. Another major change is the location to store general boot scripts. As these boot scripts should still run even if magisk.img is not mounted, they are moved out of magisk.img, from <img>/.core/<stage>.d to /data/adb/<stage>.d (stage is either post-fs-data or service). Say goodbye to stupid paths like /sbin/.core/img/.core/post-fs-data.d!

    Quick recap:

    • New magisk.img mountpoint: /sbin/.magisk/img
    • New internal busybox PATH: /sbin/.magisk/busybox
    • The folder <img>/.core is no longer used in any places. magisk.img is solely used for storing modules, no other functionality depends on it.
    • Symlinks are created so all old paths will still work. None of the existing apps/scripts depending on these internal paths should break, but please migrate to the new paths ASAP.

    Dropping Legacy Support

    The NEXT Magisk Manager upgrade (not this one) will only support v18+, please upgrade ASAP. Magisk Manager is always designed to be fully functional across a wide range of Magisk versions. However, to enforce full obfuscation, I will have to drop legacy support eventually.

    This is also a good opportunity to push the whole community forward, all module developers should forget about backward compatibility (e.g. stop supporting the old Magisk paths, please don't torture yourself...). I expect very few structural changes in the near future, so again, please upgrade ASAP 😃

    Modern C++ Code Base

    Although this has nothing to do with the end user, tons of effort was done to migrate Magisk to a more modern C++ code base instead of the previous good plain old C. This makes the code easier to maintain and allows me to utilized many C++ language features.

    完整更新日志: 这里

    ',16),r=[i];function n(d,l,c,p,h,g){return o(),a("div",null,r)}const f=e(s,[["render",n]]);export{u as __pageData,f as default}; diff --git a/assets/releases_18000.md.6eb41e04.lean.js b/assets/releases_18000.md.6eb41e04.lean.js new file mode 100644 index 00000000..3bd59a92 --- /dev/null +++ b/assets/releases_18000.md.6eb41e04.lean.js @@ -0,0 +1 @@ +import{_ as e,o,c as a,Q as t}from"./chunks/framework.ed90c782.js";const u=JSON.parse('{"title":"2018.12.7 Magisk v18.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/18000.md","filePath":"releases/18000.md","lastUpdated":1694958663000}'),s={name:"releases/18000.md"},i=t("",16),r=[i];function n(d,l,c,p,h,g){return o(),a("div",null,r)}const f=e(s,[["render",n]]);export{u as __pageData,f as default}; diff --git a/assets/releases_18000.md.7c18a94a.js b/assets/releases_18000.md.7c18a94a.js deleted file mode 100644 index 5bee3e1a..00000000 --- a/assets/releases_18000.md.7c18a94a.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as o,V as t}from"./chunks/framework.fc84ac3a.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/18000.md","filePath":"releases/18000.md","lastUpdated":1674222670000}'),s={name:"releases/18000.md"},i=t('

    2018.12.7 Magisk v18.0

    Here comes a stable release, this time with quite a few major updates!

    MagiskHide Improvements

    Starting from v18, the process monitor matches component names instead of process names. Android allow app services to name their process arbitrarily, and many apps starting to use dedicated services to detect root; it used to require adding all of these service process names to the list to hide Magisk effectively. Component names have the format: <package name>/<java class name>, which means we can always know which application spawned a given process.

    TL;DR, ALL processes spawned from the applications on the hide list will be targeted.

    Recently I discovered a very widespread Linux kernel bug affecting tons of Android devices (full write-up: Medium Article). This bug exposes the supposedly protected procfs, which is abused in some apps to detect Magisk with information leaked from other processes. Magisk will patch this bug on all Android 7.0+ devices. Yes, a fully effective MagiskHide requires the enhanced Android Sandbox in modern Android versions.

    Path Changes

    The name of the folder /sbin/.core is confusing and will no longer be used; it is replaced with /sbin/.magisk. Another major change is the location to store general boot scripts. As these boot scripts should still run even if magisk.img is not mounted, they are moved out of magisk.img, from <img>/.core/<stage>.d to /data/adb/<stage>.d (stage is either post-fs-data or service). Say goodbye to stupid paths like /sbin/.core/img/.core/post-fs-data.d!

    Quick recap:

    • New magisk.img mountpoint: /sbin/.magisk/img
    • New internal busybox PATH: /sbin/.magisk/busybox
    • The folder <img>/.core is no longer used in any places. magisk.img is solely used for storing modules, no other functionality depends on it.
    • Symlinks are created so all old paths will still work. None of the existing apps/scripts depending on these internal paths should break, but please migrate to the new paths ASAP.

    Dropping Legacy Support

    The NEXT Magisk Manager upgrade (not this one) will only support v18+, please upgrade ASAP. Magisk Manager is always designed to be fully functional across a wide range of Magisk versions. However, to enforce full obfuscation, I will have to drop legacy support eventually.

    This is also a good opportunity to push the whole community forward, all module developers should forget about backward compatibility (e.g. stop supporting the old Magisk paths, please don't torture yourself...). I expect very few structural changes in the near future, so again, please upgrade ASAP 😃

    Modern C++ Code Base

    Although this has nothing to do with the end user, tons of effort was done to migrate Magisk to a more modern C++ code base instead of the previous good plain old C. This makes the code easier to maintain and allows me to utilized many C++ language features.

    Full Changelog: here

    ',16),r=[i];function n(d,l,c,h,p,g){return a(),o("div",null,r)}const f=e(s,[["render",n]]);export{u as __pageData,f as default}; diff --git a/assets/releases_18000.md.7c18a94a.lean.js b/assets/releases_18000.md.7c18a94a.lean.js deleted file mode 100644 index cdbf8c53..00000000 --- a/assets/releases_18000.md.7c18a94a.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as o,V as t}from"./chunks/framework.fc84ac3a.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/18000.md","filePath":"releases/18000.md","lastUpdated":1674222670000}'),s={name:"releases/18000.md"},i=t("",16),r=[i];function n(d,l,c,h,p,g){return a(),o("div",null,r)}const f=e(s,[["render",n]]);export{u as __pageData,f as default}; diff --git a/assets/releases_18100.md.512c5ac9.js b/assets/releases_18100.md.4d7c3cf0.js similarity index 62% rename from assets/releases_18100.md.512c5ac9.js rename to assets/releases_18100.md.4d7c3cf0.js index 02987686..0f7eb82b 100644 --- a/assets/releases_18100.md.512c5ac9.js +++ b/assets/releases_18100.md.4d7c3cf0.js @@ -1 +1 @@ -import{_ as a,o as e,c as o,V as t}from"./chunks/framework.fc84ac3a.js";const m=JSON.parse('{"title":"2019.2.4 Magisk v18.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/18100.md","filePath":"releases/18100.md","lastUpdated":1674222670000}'),r={name:"releases/18100.md"},i=t('

    2019.2.4 Magisk v18.1

    What is a better way to celebrate Chinese New Year than a new Magisk update!

    EMUI 9 Support

    Welcome on board "again", Huawei! Even though Huawei had officially blocked bootloader unlocks, people still love to buy them (duh), and there are paid services that unlock Huawei bootloaders. So hey, get Magisk installed on that bad boy! One caveat is that since Huawei have changed the partitions, special workarounds has to be done. Details and instructions are in the newly created instruction page

    Support Down to Android 4.2

    Because why not, it was quite a lot of fun LOL. All devices running KitKat and higher will have all features enabled. MagiskHide and resetprop aren't possible on Jellybean, and Magic Mount (modules) is temporarily disabled; basically it only works as a root solution for now. Android 4.1 isn't 100% usable yet, so installation is also temporarily blocked. Eventually, all Jellybean devices will have full Magic Mount and MagiskSU support.

    Major Magisk Manager Update

    Aside from the obvious major UI overhaul, tons of little user experience and performance improvements are also added. The app is finally less crappy now 😃

    Final Words

    I'm aware that there are apps updated to detect Magisk, however no MagiskHide improvements efforts are done in this release; v18.1 is aimed to be as stable as possible. Stay tuned for future public betas, or if you are more adventurous, jump on the Canary Channel bandwagon for more aggressive hiding techniques 😃

    Full Changelog: here

    ',11),s=[i];function n(l,d,h,u,p,c){return e(),o("div",null,s)}const b=a(r,[["render",n]]);export{m as __pageData,b as default}; +import{_ as a,o as e,c as t,Q as o}from"./chunks/framework.ed90c782.js";const g=JSON.parse('{"title":"2019.2.4 Magisk v18.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/18100.md","filePath":"releases/18100.md","lastUpdated":1694958663000}'),r={name:"releases/18100.md"},s=o('

    2019.2.4 Magisk v18.1

    What is a better way to celebrate Chinese New Year than a new Magisk update!

    EMUI 9 Support

    Welcome on board "again", Huawei! Even though Huawei had officially blocked bootloader unlocks, people still love to buy them (duh), and there are paid services that unlock Huawei bootloaders. So hey, get Magisk installed on that bad boy! One caveat is that since Huawei have changed the partitions, special workarounds has to be done. Details and instructions are in the newly created instruction page

    Support Down to Android 4.2

    Because why not, it was quite a lot of fun LOL. All devices running KitKat and higher will have all features enabled. MagiskHide and resetprop aren't possible on Jellybean, and Magic Mount (modules) is temporarily disabled; basically it only works as a root solution for now. Android 4.1 isn't 100% usable yet, so installation is also temporarily blocked. Eventually, all Jellybean devices will have full Magic Mount and MagiskSU support.

    Major Magisk Manager Update

    Aside from the obvious major UI overhaul, tons of little user experience and performance improvements are also added. The app is finally less crappy now 😃

    Final Words

    I'm aware that there are apps updated to detect Magisk, however no MagiskHide improvements efforts are done in this release; v18.1 is aimed to be as stable as possible. Stay tuned for future public betas, or if you are more adventurous, jump on the Canary Channel bandwagon for more aggressive hiding techniques 😃

    完整更新日志: 这里

    ',11),i=[s];function n(l,d,h,p,u,c){return e(),t("div",null,i)}const b=a(r,[["render",n]]);export{g as __pageData,b as default}; diff --git a/assets/releases_18100.md.4d7c3cf0.lean.js b/assets/releases_18100.md.4d7c3cf0.lean.js new file mode 100644 index 00000000..ee6a812e --- /dev/null +++ b/assets/releases_18100.md.4d7c3cf0.lean.js @@ -0,0 +1 @@ +import{_ as a,o as e,c as t,Q as o}from"./chunks/framework.ed90c782.js";const g=JSON.parse('{"title":"2019.2.4 Magisk v18.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/18100.md","filePath":"releases/18100.md","lastUpdated":1694958663000}'),r={name:"releases/18100.md"},s=o("",11),i=[s];function n(l,d,h,p,u,c){return e(),t("div",null,i)}const b=a(r,[["render",n]]);export{g as __pageData,b as default}; diff --git a/assets/releases_18100.md.512c5ac9.lean.js b/assets/releases_18100.md.512c5ac9.lean.js deleted file mode 100644 index 0d5b9bb5..00000000 --- a/assets/releases_18100.md.512c5ac9.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as e,c as o,V as t}from"./chunks/framework.fc84ac3a.js";const m=JSON.parse('{"title":"2019.2.4 Magisk v18.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/18100.md","filePath":"releases/18100.md","lastUpdated":1674222670000}'),r={name:"releases/18100.md"},i=t("",11),s=[i];function n(l,d,h,u,p,c){return e(),o("div",null,s)}const b=a(r,[["render",n]]);export{m as __pageData,b as default}; diff --git a/assets/releases_19000.md.13328490.lean.js b/assets/releases_19000.md.13328490.lean.js deleted file mode 100644 index 1ec636a1..00000000 --- a/assets/releases_19000.md.13328490.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as o}from"./chunks/framework.fc84ac3a.js";const p=JSON.parse('{"title":"2019.3.28 Magisk v19.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19000.md","filePath":"releases/19000.md","lastUpdated":1674222670000}'),s={name:"releases/19000.md"},i=o("",18),r=[i];function n(l,d,h,u,c,m){return a(),t("div",null,r)}const f=e(s,[["render",n]]);export{p as __pageData,f as default}; diff --git a/assets/releases_19000.md.13328490.js b/assets/releases_19000.md.ed972ef1.js similarity index 88% rename from assets/releases_19000.md.13328490.js rename to assets/releases_19000.md.ed972ef1.js index fa3d137f..f991ef54 100644 --- a/assets/releases_19000.md.13328490.js +++ b/assets/releases_19000.md.ed972ef1.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,V as o}from"./chunks/framework.fc84ac3a.js";const p=JSON.parse('{"title":"2019.3.28 Magisk v19.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19000.md","filePath":"releases/19000.md","lastUpdated":1674222670000}'),s={name:"releases/19000.md"},i=o('

    2019.3.28 Magisk v19.0

    I would say this is one of my most ambitious release of all time! Due to the extremely massive changes, this release will be a public beta. Calling it v18.2 doesn't do it justice, so v19.0 we go.

    Magisk Module installer

    Magisk module developers: pay extra attention! A completely new Magisk Module Installer replaces the old Magisk module template. This new format decouples ALL installation logic from modules, and encourages developers to use the provided API for installation. This new format is ENFORCED, meaning all existing modules should upgrade ASAP, and new modules are REQUIRED to follow the rules.

    Carefully read through the updated docs!

    Warning: All existing modules that does not use the new module format will be automatically removed on May 1st, 2019. Module devs: upgrade your existing modules ASAP!

    Imageless Magisk

    Since the existence of Magisk, all modules are stored within an EXT4 image which will be loop mounted at boot. This approach has a few problems: resizing the image is a huge headache (no live resizing, resize2fs on some devices refuse to work properly), and also MANY devices using F2FS ships a broken driver with the kernel, causing EXT4 loop devices unable to be mounted at all. All these problems come to an end now: modules are now directly stored in /data! Backwards compatibility is provided, for modules that uses the official module template, installation should work just fine.

    Warning: Although module migration was tested, there are still chances that your modules will get lost in the process. Be prepared to reinstall your existing modules in that case.

    Native 64 Bit is Back

    At one point in history, Magisk uses native 64 binaries. However due to binary size considerations, all binaries was switched to 32 bit. Starting from v19, all static binaries are still 32 bit only, but the most important part: the main magisk binary now runs in native 64 bit on supported devices.

    Zygote Ptrace Based MagiskHide

    MagiskHide used to use logcat to monitor activity manager events for new process creation. That method is extremely unreliable: even with constant improvements since introduction, it is still not working 100% of the time. Here comes a fundamentally new approach: ptrace the zygote process and step through all fork events. In layman's term, this new method is able to target a process before it even starts to run! The code for it is extremely tricky, but it was tested for quite a while in the canary channel, so I'm confident enough to release this to the public 😃

    Android Q

    Full support for Android Q Beta 1 is also introduced in this release. However, you cannot use it on the Pixel 3 (XL) due to the fact that Google decided to use logical partitions on the 3rd gen Pixels starting with Q. A solution is still WIP, please stay tuned!

    Final Words

    What you can expect in upcoming releases: Samsung S10 support, and full logical partition support. Also, I AM aware of Google Pay issues, but these are not my main focus now since there are still tons of other issues for me to focus on. Several discussion threads on XDA provide seemingly working solutions, please do some research on your own.

    Full Changelog: here

    ',18),r=[i];function n(l,d,h,u,c,m){return a(),t("div",null,r)}const f=e(s,[["render",n]]);export{p as __pageData,f as default}; +import{_ as e,o as a,c as t,Q as o}from"./chunks/framework.ed90c782.js";const p=JSON.parse('{"title":"2019.3.28 Magisk v19.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19000.md","filePath":"releases/19000.md","lastUpdated":1694958663000}'),s={name:"releases/19000.md"},i=o('

    2019.3.28 Magisk v19.0

    I would say this is one of my most ambitious release of all time! Due to the extremely massive changes, this release will be a public beta. Calling it v18.2 doesn't do it justice, so v19.0 we go.

    Magisk Module installer

    Magisk module developers: pay extra attention! A completely new Magisk Module Installer replaces the old Magisk module template. This new format decouples ALL installation logic from modules, and encourages developers to use the provided API for installation. This new format is ENFORCED, meaning all existing modules should upgrade ASAP, and new modules are REQUIRED to follow the rules.

    Carefully read through the updated docs!

    Warning: All existing modules that does not use the new module format will be automatically removed on May 1st, 2019. Module devs: upgrade your existing modules ASAP!

    Imageless Magisk

    Since the existence of Magisk, all modules are stored within an EXT4 image which will be loop mounted at boot. This approach has a few problems: resizing the image is a huge headache (no live resizing, resize2fs on some devices refuse to work properly), and also MANY devices using F2FS ships a broken driver with the kernel, causing EXT4 loop devices unable to be mounted at all. All these problems come to an end now: modules are now directly stored in /data! Backwards compatibility is provided, for modules that uses the official module template, installation should work just fine.

    Warning: Although module migration was tested, there are still chances that your modules will get lost in the process. Be prepared to reinstall your existing modules in that case.

    Native 64 Bit is Back

    At one point in history, Magisk uses native 64 binaries. However due to binary size considerations, all binaries was switched to 32 bit. Starting from v19, all static binaries are still 32 bit only, but the most important part: the main magisk binary now runs in native 64 bit on supported devices.

    Zygote Ptrace Based MagiskHide

    MagiskHide used to use logcat to monitor activity manager events for new process creation. That method is extremely unreliable: even with constant improvements since introduction, it is still not working 100% of the time. Here comes a fundamentally new approach: ptrace the zygote process and step through all fork events. In layman's term, this new method is able to target a process before it even starts to run! The code for it is extremely tricky, but it was tested for quite a while in the canary channel, so I'm confident enough to release this to the public 😃

    Android Q

    Full support for Android Q Beta 1 is also introduced in this release. However, you cannot use it on the Pixel 3 (XL) due to the fact that Google decided to use logical partitions on the 3rd gen Pixels starting with Q. A solution is still WIP, please stay tuned!

    Final Words

    What you can expect in upcoming releases: Samsung S10 support, and full logical partition support. Also, I AM aware of Google Pay issues, but these are not my main focus now since there are still tons of other issues for me to focus on. Several discussion threads on XDA provide seemingly working solutions, please do some research on your own.

    完整更新日志: 这里

    ',18),r=[i];function n(l,d,h,u,c,m){return a(),t("div",null,r)}const f=e(s,[["render",n]]);export{p as __pageData,f as default}; diff --git a/assets/releases_19000.md.ed972ef1.lean.js b/assets/releases_19000.md.ed972ef1.lean.js new file mode 100644 index 00000000..d0b73104 --- /dev/null +++ b/assets/releases_19000.md.ed972ef1.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as o}from"./chunks/framework.ed90c782.js";const p=JSON.parse('{"title":"2019.3.28 Magisk v19.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19000.md","filePath":"releases/19000.md","lastUpdated":1694958663000}'),s={name:"releases/19000.md"},i=o("",18),r=[i];function n(l,d,h,u,c,m){return a(),t("div",null,r)}const f=e(s,[["render",n]]);export{p as __pageData,f as default}; diff --git a/assets/releases_19100.md.e4827b55.js b/assets/releases_19100.md.10d48686.js similarity index 50% rename from assets/releases_19100.md.e4827b55.js rename to assets/releases_19100.md.10d48686.js index 135b5632..ed472ec3 100644 --- a/assets/releases_19100.md.e4827b55.js +++ b/assets/releases_19100.md.10d48686.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,V as s}from"./chunks/framework.fc84ac3a.js";const m=JSON.parse('{"title":"2019.5.1 Magisk v19.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19100.md","filePath":"releases/19100.md","lastUpdated":1674222670000}'),l={name:"releases/19100.md"},o=s('

    2019.5.1 Magisk v19.1

    Finally, a lovely stable release!

    For those that were using v18.1, here are some quick highlights of v19.0

    • Imageless Magisk: Although module migration was tested, there are still chances that your modules will get lost in the process. Be prepared to reinstall your existing modules in that case.
    • Native 64-bit support
    • Zygote Ptrace Based MagiskHide

    Other than adding support for Samsung system-as-root devices, this release is mostly bug fixes from v19.0. Enjoy 😃

    Full Changelog: here

    ',6),r=[o];function i(h,n,c,d,g,_){return a(),t("div",null,r)}const p=e(l,[["render",i]]);export{m as __pageData,p as default}; +import{_ as e,o as s,c as t,Q as a}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"2019.5.1 Magisk v19.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19100.md","filePath":"releases/19100.md","lastUpdated":1694958663000}'),i={name:"releases/19100.md"},o=a('

    2019.5.1 Magisk v19.1

    Finally, a lovely stable release!

    For those that were using v18.1, here are some quick highlights of v19.0

    • Imageless Magisk: Although module migration was tested, there are still chances that your modules will get lost in the process. Be prepared to reinstall your existing modules in that case.
    • Native 64-bit support
    • Zygote Ptrace Based MagiskHide

    Other than adding support for Samsung system-as-root devices, this release is mostly bug fixes from v19.0. Enjoy 😃

    完整更新日志: 这里

    ',6),r=[o];function l(n,h,c,_,d,p){return s(),t("div",null,r)}const u=e(i,[["render",l]]);export{m as __pageData,u as default}; diff --git a/assets/releases_19100.md.10d48686.lean.js b/assets/releases_19100.md.10d48686.lean.js new file mode 100644 index 00000000..74c86d79 --- /dev/null +++ b/assets/releases_19100.md.10d48686.lean.js @@ -0,0 +1 @@ +import{_ as e,o as s,c as t,Q as a}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"2019.5.1 Magisk v19.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19100.md","filePath":"releases/19100.md","lastUpdated":1694958663000}'),i={name:"releases/19100.md"},o=a("",6),r=[o];function l(n,h,c,_,d,p){return s(),t("div",null,r)}const u=e(i,[["render",l]]);export{m as __pageData,u as default}; diff --git a/assets/releases_19100.md.e4827b55.lean.js b/assets/releases_19100.md.e4827b55.lean.js deleted file mode 100644 index 58f50bb1..00000000 --- a/assets/releases_19100.md.e4827b55.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as s}from"./chunks/framework.fc84ac3a.js";const m=JSON.parse('{"title":"2019.5.1 Magisk v19.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19100.md","filePath":"releases/19100.md","lastUpdated":1674222670000}'),l={name:"releases/19100.md"},o=s("",6),r=[o];function i(h,n,c,d,g,_){return a(),t("div",null,r)}const p=e(l,[["render",i]]);export{m as __pageData,p as default}; diff --git a/assets/releases_19200.md.7a067985.js b/assets/releases_19200.md.79dfaefa.js similarity index 76% rename from assets/releases_19200.md.7a067985.js rename to assets/releases_19200.md.79dfaefa.js index c604ba4f..3e6174e4 100644 --- a/assets/releases_19200.md.7a067985.js +++ b/assets/releases_19200.md.79dfaefa.js @@ -1 +1 @@ -import{_ as a,o as t,c as s,C as e,a as o}from"./chunks/framework.fc84ac3a.js";const O=JSON.parse('{"title":"TODO","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19200.md","filePath":"releases/19200.md","lastUpdated":1672379788000}'),r={name:"releases/19200.md"},c=e("h1",{id:"todo",tabindex:"-1"},[o("TODO "),e("a",{class:"header-anchor",href:"#todo","aria-label":'Permalink to "TODO"'},"​")],-1),d=[c];function n(l,i,_,p,h,m){return t(),s("div",null,d)}const u=a(r,[["render",n]]);export{O as __pageData,u as default}; +import{_ as a,o as t,c as s,k as e,a as o}from"./chunks/framework.ed90c782.js";const O=JSON.parse('{"title":"TODO","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19200.md","filePath":"releases/19200.md","lastUpdated":1672379788000}'),r={name:"releases/19200.md"},c=e("h1",{id:"todo",tabindex:"-1"},[o("TODO "),e("a",{class:"header-anchor",href:"#todo","aria-label":'Permalink to "TODO"'},"​")],-1),d=[c];function n(l,i,_,p,h,m){return t(),s("div",null,d)}const u=a(r,[["render",n]]);export{O as __pageData,u as default}; diff --git a/assets/releases_19200.md.7a067985.lean.js b/assets/releases_19200.md.79dfaefa.lean.js similarity index 76% rename from assets/releases_19200.md.7a067985.lean.js rename to assets/releases_19200.md.79dfaefa.lean.js index c604ba4f..3e6174e4 100644 --- a/assets/releases_19200.md.7a067985.lean.js +++ b/assets/releases_19200.md.79dfaefa.lean.js @@ -1 +1 @@ -import{_ as a,o as t,c as s,C as e,a as o}from"./chunks/framework.fc84ac3a.js";const O=JSON.parse('{"title":"TODO","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19200.md","filePath":"releases/19200.md","lastUpdated":1672379788000}'),r={name:"releases/19200.md"},c=e("h1",{id:"todo",tabindex:"-1"},[o("TODO "),e("a",{class:"header-anchor",href:"#todo","aria-label":'Permalink to "TODO"'},"​")],-1),d=[c];function n(l,i,_,p,h,m){return t(),s("div",null,d)}const u=a(r,[["render",n]]);export{O as __pageData,u as default}; +import{_ as a,o as t,c as s,k as e,a as o}from"./chunks/framework.ed90c782.js";const O=JSON.parse('{"title":"TODO","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19200.md","filePath":"releases/19200.md","lastUpdated":1672379788000}'),r={name:"releases/19200.md"},c=e("h1",{id:"todo",tabindex:"-1"},[o("TODO "),e("a",{class:"header-anchor",href:"#todo","aria-label":'Permalink to "TODO"'},"​")],-1),d=[c];function n(l,i,_,p,h,m){return t(),s("div",null,d)}const u=a(r,[["render",n]]);export{O as __pageData,u as default}; diff --git a/assets/releases_19300.md.63682635.js b/assets/releases_19300.md.a7abaab5.js similarity index 76% rename from assets/releases_19300.md.63682635.js rename to assets/releases_19300.md.a7abaab5.js index 42cbb14d..9af102a2 100644 --- a/assets/releases_19300.md.63682635.js +++ b/assets/releases_19300.md.a7abaab5.js @@ -1 +1 @@ -import{_ as a,o as t,c as s,C as e,a as o}from"./chunks/framework.fc84ac3a.js";const O=JSON.parse('{"title":"TODO","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19300.md","filePath":"releases/19300.md","lastUpdated":1672379788000}'),r={name:"releases/19300.md"},c=e("h1",{id:"todo",tabindex:"-1"},[o("TODO "),e("a",{class:"header-anchor",href:"#todo","aria-label":'Permalink to "TODO"'},"​")],-1),d=[c];function n(l,i,_,p,h,m){return t(),s("div",null,d)}const u=a(r,[["render",n]]);export{O as __pageData,u as default}; +import{_ as a,o as t,c as s,k as e,a as o}from"./chunks/framework.ed90c782.js";const O=JSON.parse('{"title":"TODO","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19300.md","filePath":"releases/19300.md","lastUpdated":1672379788000}'),r={name:"releases/19300.md"},c=e("h1",{id:"todo",tabindex:"-1"},[o("TODO "),e("a",{class:"header-anchor",href:"#todo","aria-label":'Permalink to "TODO"'},"​")],-1),d=[c];function n(l,i,_,p,h,m){return t(),s("div",null,d)}const u=a(r,[["render",n]]);export{O as __pageData,u as default}; diff --git a/assets/releases_19300.md.63682635.lean.js b/assets/releases_19300.md.a7abaab5.lean.js similarity index 76% rename from assets/releases_19300.md.63682635.lean.js rename to assets/releases_19300.md.a7abaab5.lean.js index 42cbb14d..9af102a2 100644 --- a/assets/releases_19300.md.63682635.lean.js +++ b/assets/releases_19300.md.a7abaab5.lean.js @@ -1 +1 @@ -import{_ as a,o as t,c as s,C as e,a as o}from"./chunks/framework.fc84ac3a.js";const O=JSON.parse('{"title":"TODO","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19300.md","filePath":"releases/19300.md","lastUpdated":1672379788000}'),r={name:"releases/19300.md"},c=e("h1",{id:"todo",tabindex:"-1"},[o("TODO "),e("a",{class:"header-anchor",href:"#todo","aria-label":'Permalink to "TODO"'},"​")],-1),d=[c];function n(l,i,_,p,h,m){return t(),s("div",null,d)}const u=a(r,[["render",n]]);export{O as __pageData,u as default}; +import{_ as a,o as t,c as s,k as e,a as o}from"./chunks/framework.ed90c782.js";const O=JSON.parse('{"title":"TODO","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19300.md","filePath":"releases/19300.md","lastUpdated":1672379788000}'),r={name:"releases/19300.md"},c=e("h1",{id:"todo",tabindex:"-1"},[o("TODO "),e("a",{class:"header-anchor",href:"#todo","aria-label":'Permalink to "TODO"'},"​")],-1),d=[c];function n(l,i,_,p,h,m){return t(),s("div",null,d)}const u=a(r,[["render",n]]);export{O as __pageData,u as default}; diff --git a/assets/releases_19400.md.cd99945f.js b/assets/releases_19400.md.40a338af.js similarity index 77% rename from assets/releases_19400.md.cd99945f.js rename to assets/releases_19400.md.40a338af.js index 53213e84..b7082e99 100644 --- a/assets/releases_19400.md.cd99945f.js +++ b/assets/releases_19400.md.40a338af.js @@ -1 +1 @@ -import{_ as e,o as t,c as o,V as a}from"./chunks/framework.fc84ac3a.js";const g=JSON.parse('{"title":"2019.9.19 Magisk v19.4","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19400.md","filePath":"releases/19400.md","lastUpdated":1674222670000}'),s={name:"releases/19400.md"},i=a('

    2019.9.19 Magisk v19.4

    This version is heavily tested and tons of bugs were squashed before release. However due to the massive changes, it is decided to release a public beta for people/root app developers to adjust/update before things hit public stable.

    New System-as-root Implementation

    Magisk has supported system-as-root devices for a long time since the first Pixel came out. The goal is always to revert things back to the good old initramfs based root dir. However, this not only creates tons of issues on many devices, not easily hide-able with MagiskHide, but most importantly not even possible on Android 10. Starting with v19.4, Magisk will follow how Google has designed system-as-root: mounting system actually to / (root).

    This implies several MASSIVE consequences for system-as-root devices:

    • /system is no longer a valid mount point. For existing root apps that remounts /system to rw, you will have to remount / instead of /system
    • The root directory (/) is no longer rootfs, but actually system. Remounting / to rw and modify files means you are writing to the actual system partition, NOT volatile storage as it used to be in rootfs. This is not recommended as user is not necessary aware that you are tampering an actual partition, sometimes dangerous if dm-verity/AVB-verity is enforced, or sometimes outright impossible since many devices now ship with read-only system partitions (e.g. EROFS, EXT4 dedup)
    • Several custom kernel rely on Magisk's root directory overlay system (overlay) for modifying /. This is no longer compatible with the new implementation. A new overlay system (overlay.d) will replace the existing one as an alternative (details in documentations). To provide backwards compatibility, Magisk will switch to "Compat Mode" when /overlay is detected, which simply reverts to the old system-as-root setup. Compat Mode will not work on Android 10 and will cause bootloop. Although things will still work as it used to, please upgrade to overlay.d ASAP.

    Android 10 Support

    Other than A-only devices running Android 10, Android 10 is fully supported with MagiskHide fully functioning. Android 10's biggest challenge is the new "2-Stage-Init" system-as-root implementation, which is the sole reason why A-only is not support yet. Stay tuned for further updates as that is the next thing on the list.

    (For those interested in "2-Stage-Init" and other details of system-as-root, check this Twitter thread I tweeted)

    Product Partition Support

    Magisk Module developers can now finally properly modify files in /product! This partition is now an essential part in Android 10, and many files are moved from system to product. Please check documentations for more details.

    A-Only System-as-root

    A huge number of new devices have A-only system-as-root setups (Android 9.0). These unfortunate devices will have to install Magisk into the recovery partition. Please check the fully updated Installation Guide for more details.

    Full Changelog: here

    ',14),r=[i];function n(l,d,h,c,u,p){return t(),o("div",null,r)}const y=e(s,[["render",n]]);export{g as __pageData,y as default}; +import{_ as e,o as t,c as o,Q as s}from"./chunks/framework.ed90c782.js";const y=JSON.parse('{"title":"2019.9.19 Magisk v19.4","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19400.md","filePath":"releases/19400.md","lastUpdated":1694958663000}'),a={name:"releases/19400.md"},i=s('

    2019.9.19 Magisk v19.4

    This version is heavily tested and tons of bugs were squashed before release. However due to the massive changes, it is decided to release a public beta for people/root app developers to adjust/update before things hit public stable.

    New System-as-root Implementation

    Magisk has supported system-as-root devices for a long time since the first Pixel came out. The goal is always to revert things back to the good old initramfs based root dir. However, this not only creates tons of issues on many devices, not easily hide-able with MagiskHide, but most importantly not even possible on Android 10. Starting with v19.4, Magisk will follow how Google has designed system-as-root: mounting system actually to / (root).

    This implies several MASSIVE consequences for system-as-root devices:

    • /system is no longer a valid mount point. For existing root apps that remounts /system to rw, you will have to remount / instead of /system
    • The root directory (/) is no longer rootfs, but actually system. Remounting / to rw and modify files means you are writing to the actual system partition, NOT volatile storage as it used to be in rootfs. This is not recommended as user is not necessary aware that you are tampering an actual partition, sometimes dangerous if dm-verity/AVB-verity is enforced, or sometimes outright impossible since many devices now ship with read-only system partitions (e.g. EROFS, EXT4 dedup)
    • Several custom kernel rely on Magisk's root directory overlay system (overlay) for modifying /. This is no longer compatible with the new implementation. A new overlay system (overlay.d) will replace the existing one as an alternative (details in documentations). To provide backwards compatibility, Magisk will switch to "Compat Mode" when /overlay is detected, which simply reverts to the old system-as-root setup. Compat Mode will not work on Android 10 and will cause bootloop. Although things will still work as it used to, please upgrade to overlay.d ASAP.

    Android 10 Support

    Other than A-only devices running Android 10, Android 10 is fully supported with MagiskHide fully functioning. Android 10's biggest challenge is the new "2-Stage-Init" system-as-root implementation, which is the sole reason why A-only is not support yet. Stay tuned for further updates as that is the next thing on the list.

    (For those interested in "2-Stage-Init" and other details of system-as-root, check this Twitter thread I tweeted)

    Product Partition Support

    Magisk Module developers can now finally properly modify files in /product! This partition is now an essential part in Android 10, and many files are moved from system to product. Please check documentations for more details.

    A-Only System-as-root

    A huge number of new devices have A-only system-as-root setups (Android 9.0). These unfortunate devices will have to install Magisk into the recovery partition. Please check the fully updated Installation Guide for more details.

    完整更新日志: 这里

    ',14),r=[i];function n(l,d,c,h,p,u){return t(),o("div",null,r)}const g=e(a,[["render",n]]);export{y as __pageData,g as default}; diff --git a/assets/releases_19400.md.40a338af.lean.js b/assets/releases_19400.md.40a338af.lean.js new file mode 100644 index 00000000..ca4d39f2 --- /dev/null +++ b/assets/releases_19400.md.40a338af.lean.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as o,Q as s}from"./chunks/framework.ed90c782.js";const y=JSON.parse('{"title":"2019.9.19 Magisk v19.4","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19400.md","filePath":"releases/19400.md","lastUpdated":1694958663000}'),a={name:"releases/19400.md"},i=s("",14),r=[i];function n(l,d,c,h,p,u){return t(),o("div",null,r)}const g=e(a,[["render",n]]);export{y as __pageData,g as default}; diff --git a/assets/releases_19400.md.cd99945f.lean.js b/assets/releases_19400.md.cd99945f.lean.js deleted file mode 100644 index 94f39b6c..00000000 --- a/assets/releases_19400.md.cd99945f.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as t,c as o,V as a}from"./chunks/framework.fc84ac3a.js";const g=JSON.parse('{"title":"2019.9.19 Magisk v19.4","description":"","frontmatter":{},"headers":[],"relativePath":"releases/19400.md","filePath":"releases/19400.md","lastUpdated":1674222670000}'),s={name:"releases/19400.md"},i=a("",14),r=[i];function n(l,d,h,c,u,p){return t(),o("div",null,r)}const y=e(s,[["render",n]]);export{g as __pageData,y as default}; diff --git a/assets/releases_20000.md.74fa467b.js b/assets/releases_20000.md.6a645446.js similarity index 78% rename from assets/releases_20000.md.74fa467b.js rename to assets/releases_20000.md.6a645446.js index 5432c57e..2e9c8976 100644 --- a/assets/releases_20000.md.74fa467b.js +++ b/assets/releases_20000.md.6a645446.js @@ -1 +1 @@ -import{_ as e,o,c as t,V as a}from"./chunks/framework.fc84ac3a.js";const g=JSON.parse('{"title":"2019.10.11 Magisk v20.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20000.md","filePath":"releases/20000.md","lastUpdated":1674222670000}'),s={name:"releases/20000.md"},i=a('

    2019.10.11 Magisk v20.0

    The following release notes are mostly the same as v19.4. Compared to v19.4 beta, the most notable change is adding tons of support for more devices on Android 10, along with several bug fixes.

    New System-as-root Implementation

    Magisk has supported system-as-root devices for a long time since the first Pixel came out. The goal is always to revert things back to the good old initramfs based root dir. However, this not only creates tons of issues on many devices, not easily hide-able with MagiskHide, but most importantly not even possible on Android 10. Magisk will now start to follow how Google has designed system-as-root: mounting system actually to / (root).

    This implies several MASSIVE consequences for system-as-root devices:

    • /system is no longer a valid mount point. For existing root apps that remounts /system to rw, you will have to remount / instead of /system
    • The root directory (/) is no longer rootfs, but actually system. Remounting / to rw and modify files means you are writing to the actual system partition, NOT volatile storage as it used to be in rootfs. This is not recommended as user is not necessary aware that you are tampering an actual partition, sometimes dangerous if dm-verity/AVB-verity is enforced, or sometimes outright impossible since many devices now ship with read-only system partitions (e.g. EROFS, EXT4 dedup)
    • Several custom kernel rely on Magisk's root directory overlay system (overlay) for modifying /. This is no longer compatible with the new implementation. A new overlay system (overlay.d) will replace the existing one as an alternative (details in documentations). To provide backwards compatibility, Magisk will switch to "Compat Mode" when /overlay is detected, which simply reverts to the old system-as-root setup. Compat Mode will not work on Android 10 and will cause bootloop. Although things will still work as it used to, please upgrade to overlay.d ASAP.

    Android 10 Support

    Android 10 is now fully supported with MagiskHide working as expected. Android 10's biggest challenge is the new "2-Stage-Init" system-as-root implementation, which requires modding early mount fstab in a specific way, and in many devices' cases involves patching DTBs in the boot image.

    (For those interested in "2-Stage-Init" and other details of system-as-root, check this Twitter thread I tweeted)

    Product Partition Support

    Magisk Module developers can now finally properly modify files in /product! This partition is now an essential part in Android 10, and many files are moved from system to product. Please check documentations for more details.

    A-Only System-as-root

    A huge number of new devices have A-only system-as-root setups (Android 9.0). These unfortunate devices will have to install Magisk into the recovery partition. Please check the fully updated Installation Guide for more details.

    Full Changelog: here

    ',14),r=[i];function n(l,d,c,h,m,p){return o(),t("div",null,r)}const y=e(s,[["render",n]]);export{g as __pageData,y as default}; +import{_ as e,o,c as t,Q as a}from"./chunks/framework.ed90c782.js";const g=JSON.parse('{"title":"2019.10.11 Magisk v20.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20000.md","filePath":"releases/20000.md","lastUpdated":1694958663000}'),s={name:"releases/20000.md"},i=a('

    2019.10.11 Magisk v20.0

    The following release notes are mostly the same as v19.4. Compared to v19.4 beta, the most notable change is adding tons of support for more devices on Android 10, along with several bug fixes.

    New System-as-root Implementation

    Magisk has supported system-as-root devices for a long time since the first Pixel came out. The goal is always to revert things back to the good old initramfs based root dir. However, this not only creates tons of issues on many devices, not easily hide-able with MagiskHide, but most importantly not even possible on Android 10. Magisk will now start to follow how Google has designed system-as-root: mounting system actually to / (root).

    This implies several MASSIVE consequences for system-as-root devices:

    • /system is no longer a valid mount point. For existing root apps that remounts /system to rw, you will have to remount / instead of /system
    • The root directory (/) is no longer rootfs, but actually system. Remounting / to rw and modify files means you are writing to the actual system partition, NOT volatile storage as it used to be in rootfs. This is not recommended as user is not necessary aware that you are tampering an actual partition, sometimes dangerous if dm-verity/AVB-verity is enforced, or sometimes outright impossible since many devices now ship with read-only system partitions (e.g. EROFS, EXT4 dedup)
    • Several custom kernel rely on Magisk's root directory overlay system (overlay) for modifying /. This is no longer compatible with the new implementation. A new overlay system (overlay.d) will replace the existing one as an alternative (details in documentations). To provide backwards compatibility, Magisk will switch to "Compat Mode" when /overlay is detected, which simply reverts to the old system-as-root setup. Compat Mode will not work on Android 10 and will cause bootloop. Although things will still work as it used to, please upgrade to overlay.d ASAP.

    Android 10 Support

    Android 10 is now fully supported with MagiskHide working as expected. Android 10's biggest challenge is the new "2-Stage-Init" system-as-root implementation, which requires modding early mount fstab in a specific way, and in many devices' cases involves patching DTBs in the boot image.

    (For those interested in "2-Stage-Init" and other details of system-as-root, check this Twitter thread I tweeted)

    Product Partition Support

    Magisk Module developers can now finally properly modify files in /product! This partition is now an essential part in Android 10, and many files are moved from system to product. Please check documentations for more details.

    A-Only System-as-root

    A huge number of new devices have A-only system-as-root setups (Android 9.0). These unfortunate devices will have to install Magisk into the recovery partition. Please check the fully updated Installation Guide for more details.

    完整更新日志: 这里

    ',14),r=[i];function n(d,l,c,h,m,p){return o(),t("div",null,r)}const y=e(s,[["render",n]]);export{g as __pageData,y as default}; diff --git a/assets/releases_20000.md.6a645446.lean.js b/assets/releases_20000.md.6a645446.lean.js new file mode 100644 index 00000000..dc5f3533 --- /dev/null +++ b/assets/releases_20000.md.6a645446.lean.js @@ -0,0 +1 @@ +import{_ as e,o,c as t,Q as a}from"./chunks/framework.ed90c782.js";const g=JSON.parse('{"title":"2019.10.11 Magisk v20.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20000.md","filePath":"releases/20000.md","lastUpdated":1694958663000}'),s={name:"releases/20000.md"},i=a("",14),r=[i];function n(d,l,c,h,m,p){return o(),t("div",null,r)}const y=e(s,[["render",n]]);export{g as __pageData,y as default}; diff --git a/assets/releases_20000.md.74fa467b.lean.js b/assets/releases_20000.md.74fa467b.lean.js deleted file mode 100644 index 3b01e91d..00000000 --- a/assets/releases_20000.md.74fa467b.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o,c as t,V as a}from"./chunks/framework.fc84ac3a.js";const g=JSON.parse('{"title":"2019.10.11 Magisk v20.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20000.md","filePath":"releases/20000.md","lastUpdated":1674222670000}'),s={name:"releases/20000.md"},i=a("",14),r=[i];function n(l,d,c,h,m,p){return o(),t("div",null,r)}const y=e(s,[["render",n]]);export{g as __pageData,y as default}; diff --git a/assets/releases_20100.md.4cc41a26.js b/assets/releases_20100.md.4151533a.js similarity index 68% rename from assets/releases_20100.md.4cc41a26.js rename to assets/releases_20100.md.4151533a.js index 5fd78915..7b30f281 100644 --- a/assets/releases_20100.md.4cc41a26.js +++ b/assets/releases_20100.md.4151533a.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,V as i}from"./chunks/framework.fc84ac3a.js";const m=JSON.parse('{"title":"2019.11.2 Magisk v20.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20100.md","filePath":"releases/20100.md","lastUpdated":1674222670000}'),n={name:"releases/20100.md"},s=i('

    2019.11.2 Magisk v20.1

    Lots of bug fixes from v20.0, and some cool new features!

    Updated Magisk Manager Hiding

    Starting with Magisk v20.1 paired with Magisk Manager v7.4.0, a new hiding mode is introduced for Android 9.0+. On supported devices, Magisk Manager will download and customize a heavily obfuscated stub APK and use it as a replacement. The stub app will then download the full app into its private internal data, then dynamically load and run the actual full Magisk Manager.

    Note, not all Android 9.0+ devices will be able to use this feature. To use an obfuscated stub as Magisk Manager, the Magisk daemon will have to rely on a special way to communicate with the app, and some OEMs (most likely Chinese manufacturers) block certain broadcasts, breaking the communication channel.

    Magisk Manager will verify compatibility before it uses stubs to hide itself on Android 9.0+. The verification relies on Magisk v20.1+, which means you have to fully upgrade and reboot in order to opt in this feature. If you are already running a hidden Magisk Manager, restore and upgrade Magisk Manager, upgrade Magisk and reboot, then re-hide the app.

    For those incompatible with the hiding-with-stub feature, there are also a few updates that everyone, regardless whether using stubs or not, can enjoy:

    • You can now customize the app name of the repackaged Magisk Manager
    • Magisk Manager will generate new keys to sign the repackaged APK to prevent signature detection

    Full Changelog: here

    ',9),o=[s];function r(l,d,h,g,c,u){return a(),t("div",null,o)}const f=e(n,[["render",r]]);export{m as __pageData,f as default}; +import{_ as e,o as a,c as t,Q as i}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"2019.11.2 Magisk v20.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20100.md","filePath":"releases/20100.md","lastUpdated":1694958663000}'),n={name:"releases/20100.md"},s=i('

    2019.11.2 Magisk v20.1

    Lots of bug fixes from v20.0, and some cool new features!

    Updated Magisk Manager Hiding

    Starting with Magisk v20.1 paired with Magisk Manager v7.4.0, a new hiding mode is introduced for Android 9.0+. On supported devices, Magisk Manager will download and customize a heavily obfuscated stub APK and use it as a replacement. The stub app will then download the full app into its private internal data, then dynamically load and run the actual full Magisk Manager.

    Note, not all Android 9.0+ devices will be able to use this feature. To use an obfuscated stub as Magisk Manager, the Magisk daemon will have to rely on a special way to communicate with the app, and some OEMs (most likely Chinese manufacturers) block certain broadcasts, breaking the communication channel.

    Magisk Manager will verify compatibility before it uses stubs to hide itself on Android 9.0+. The verification relies on Magisk v20.1+, which means you have to fully upgrade and reboot in order to opt in this feature. If you are already running a hidden Magisk Manager, restore and upgrade Magisk Manager, upgrade Magisk and reboot, then re-hide the app.

    For those incompatible with the hiding-with-stub feature, there are also a few updates that everyone, regardless whether using stubs or not, can enjoy:

    • You can now customize the app name of the repackaged Magisk Manager
    • Magisk Manager will generate new keys to sign the repackaged APK to prevent signature detection

    完整更新日志: 这里

    ',9),o=[s];function r(d,l,g,h,c,p){return a(),t("div",null,o)}const k=e(n,[["render",r]]);export{m as __pageData,k as default}; diff --git a/assets/releases_20100.md.4151533a.lean.js b/assets/releases_20100.md.4151533a.lean.js new file mode 100644 index 00000000..3a949be8 --- /dev/null +++ b/assets/releases_20100.md.4151533a.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as i}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"2019.11.2 Magisk v20.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20100.md","filePath":"releases/20100.md","lastUpdated":1694958663000}'),n={name:"releases/20100.md"},s=i("",9),o=[s];function r(d,l,g,h,c,p){return a(),t("div",null,o)}const k=e(n,[["render",r]]);export{m as __pageData,k as default}; diff --git a/assets/releases_20100.md.4cc41a26.lean.js b/assets/releases_20100.md.4cc41a26.lean.js deleted file mode 100644 index 579c1a85..00000000 --- a/assets/releases_20100.md.4cc41a26.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as i}from"./chunks/framework.fc84ac3a.js";const m=JSON.parse('{"title":"2019.11.2 Magisk v20.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20100.md","filePath":"releases/20100.md","lastUpdated":1674222670000}'),n={name:"releases/20100.md"},s=i("",9),o=[s];function r(l,d,h,g,c,u){return a(),t("div",null,o)}const f=e(n,[["render",r]]);export{m as __pageData,f as default}; diff --git a/assets/releases_20200.md.f6d2625d.js b/assets/releases_20200.md.5d9b9708.js similarity index 68% rename from assets/releases_20200.md.f6d2625d.js rename to assets/releases_20200.md.5d9b9708.js index adfae50a..c5b0f484 100644 --- a/assets/releases_20200.md.f6d2625d.js +++ b/assets/releases_20200.md.5d9b9708.js @@ -1 +1 @@ -import{_ as e,o as a,c as t,V as o}from"./chunks/framework.fc84ac3a.js";const g=JSON.parse('{"title":"2020.1.2 Magisk v20.2","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20200.md","filePath":"releases/20200.md","lastUpdated":1674222670000}'),s={name:"releases/20200.md"},l=o('

    2020.1.2 Magisk v20.2

    Happy New Year! Let's start 2020 with a new Magisk release 😃

    Pre-Init sepolicy Patches for Modules

    Magisk v20.2 add support for modules to include its own custom sepolicy patches. Developers used to use boot scripts along with the magiskpolicy tool to do live sepolicy patches; however, this method leads to numerous issues as Android is no longer designed to allow live sepolicy patches, and on some devices (e.g. Huawei) this method is outright inapplicable.

    To address this issue, Magisk allow module devs to create a new file called sepolicy.rule in their modules. The module installer script and Magisk daemon will make sure this file is stored in somewhere accessible pre-init to allow magiskinit to do its job every time your device boots up.

    New Module Installer Format

    The old template is actually pretty convoluted: developers are expected to implement specific callback functions in their install.sh, and the zip file structure does not directly represent how modules are actually stored on your device. The new module installer format makes creating new modules very easy, but still give experienced developers tons of freedom to do anything they want in the installation process.

    For details regarding sepolicy.rule and the new module installer format, please read the updated Developer Guides. Note that the old "Module Installer Template" is obsolete; creating a Magisk module no longer requires a "template" as it is now a straightforward process.

    Full Changelog: here

    ',9),i=[l];function r(d,n,c,h,u,p){return a(),t("div",null,i)}const f=e(s,[["render",r]]);export{g as __pageData,f as default}; +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.ed90c782.js";const g=JSON.parse('{"title":"2020.1.2 Magisk v20.2","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20200.md","filePath":"releases/20200.md","lastUpdated":1694958663000}'),s={name:"releases/20200.md"},i=a('

    2020.1.2 Magisk v20.2

    Happy New Year! Let's start 2020 with a new Magisk release 😃

    Pre-Init sepolicy Patches for Modules

    Magisk v20.2 add support for modules to include its own custom sepolicy patches. Developers used to use boot scripts along with the magiskpolicy tool to do live sepolicy patches; however, this method leads to numerous issues as Android is no longer designed to allow live sepolicy patches, and on some devices (e.g. Huawei) this method is outright inapplicable.

    To address this issue, Magisk allow module devs to create a new file called sepolicy.rule in their modules. The module installer script and Magisk daemon will make sure this file is stored in somewhere accessible pre-init to allow magiskinit to do its job every time your device boots up.

    New Module Installer Format

    The old template is actually pretty convoluted: developers are expected to implement specific callback functions in their install.sh, and the zip file structure does not directly represent how modules are actually stored on your device. The new module installer format makes creating new modules very easy, but still give experienced developers tons of freedom to do anything they want in the installation process.

    For details regarding sepolicy.rule and the new module installer format, please read the updated Developer Guides. Note that the old "Module Installer Template" is obsolete; creating a Magisk module no longer requires a "template" as it is now a straightforward process.

    完整更新日志: 这里

    ',9),l=[i];function r(d,n,c,p,h,u){return t(),o("div",null,l)}const f=e(s,[["render",r]]);export{g as __pageData,f as default}; diff --git a/assets/releases_20200.md.5d9b9708.lean.js b/assets/releases_20200.md.5d9b9708.lean.js new file mode 100644 index 00000000..f7a0dfca --- /dev/null +++ b/assets/releases_20200.md.5d9b9708.lean.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as o,Q as a}from"./chunks/framework.ed90c782.js";const g=JSON.parse('{"title":"2020.1.2 Magisk v20.2","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20200.md","filePath":"releases/20200.md","lastUpdated":1694958663000}'),s={name:"releases/20200.md"},i=a("",9),l=[i];function r(d,n,c,p,h,u){return t(),o("div",null,l)}const f=e(s,[["render",r]]);export{g as __pageData,f as default}; diff --git a/assets/releases_20200.md.f6d2625d.lean.js b/assets/releases_20200.md.f6d2625d.lean.js deleted file mode 100644 index 635ebe2f..00000000 --- a/assets/releases_20200.md.f6d2625d.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as o}from"./chunks/framework.fc84ac3a.js";const g=JSON.parse('{"title":"2020.1.2 Magisk v20.2","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20200.md","filePath":"releases/20200.md","lastUpdated":1674222670000}'),s={name:"releases/20200.md"},l=o("",9),i=[l];function r(d,n,c,h,u,p){return a(),t("div",null,i)}const f=e(s,[["render",r]]);export{g as __pageData,f as default}; diff --git a/assets/releases_20300.md.285288fe.js b/assets/releases_20300.md.285288fe.js deleted file mode 100644 index 288bfdde..00000000 --- a/assets/releases_20300.md.285288fe.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as e,c as s,V as t}from"./chunks/framework.fc84ac3a.js";const k=JSON.parse('{"title":"2020.1.10 Magisk v20.3","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20300.md","filePath":"releases/20300.md","lastUpdated":1674222670000}'),i={name:"releases/20300.md"},l=t('

    2020.1.10 Magisk v20.3

    Magisk

    • Fix magiskboot crashing when dealing with lz4_legacy format

    Magisk Manager

    • Fix MagiskHide app component toggles

    Full Changelog: here

    ',6),o=[l];function r(n,h,c,g,d,_){return e(),s("div",null,o)}const u=a(i,[["render",r]]);export{k as __pageData,u as default}; diff --git a/assets/releases_20300.md.285288fe.lean.js b/assets/releases_20300.md.285288fe.lean.js deleted file mode 100644 index 1a3f7cb1..00000000 --- a/assets/releases_20300.md.285288fe.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as e,c as s,V as t}from"./chunks/framework.fc84ac3a.js";const k=JSON.parse('{"title":"2020.1.10 Magisk v20.3","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20300.md","filePath":"releases/20300.md","lastUpdated":1674222670000}'),i={name:"releases/20300.md"},l=t("",6),o=[l];function r(n,h,c,g,d,_){return e(),s("div",null,o)}const u=a(i,[["render",r]]);export{k as __pageData,u as default}; diff --git a/assets/releases_20300.md.b29964a4.js b/assets/releases_20300.md.b29964a4.js new file mode 100644 index 00000000..d42ed7f4 --- /dev/null +++ b/assets/releases_20300.md.b29964a4.js @@ -0,0 +1 @@ +import{_ as a,o as e,c as s,Q as t}from"./chunks/framework.ed90c782.js";const k=JSON.parse('{"title":"2020.1.10 Magisk v20.3","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20300.md","filePath":"releases/20300.md","lastUpdated":1694958663000}'),i={name:"releases/20300.md"},o=t('

    2020.1.10 Magisk v20.3

    Magisk

    • Fix magiskboot crashing when dealing with lz4_legacy format

    Magisk Manager

    • Fix MagiskHide app component toggles

    完整更新日志: 这里

    ',6),r=[o];function n(l,c,_,d,g,h){return e(),s("div",null,r)}const p=a(i,[["render",n]]);export{k as __pageData,p as default}; diff --git a/assets/releases_20300.md.b29964a4.lean.js b/assets/releases_20300.md.b29964a4.lean.js new file mode 100644 index 00000000..c1f042d7 --- /dev/null +++ b/assets/releases_20300.md.b29964a4.lean.js @@ -0,0 +1 @@ +import{_ as a,o as e,c as s,Q as t}from"./chunks/framework.ed90c782.js";const k=JSON.parse('{"title":"2020.1.10 Magisk v20.3","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20300.md","filePath":"releases/20300.md","lastUpdated":1694958663000}'),i={name:"releases/20300.md"},o=t("",6),r=[o];function n(l,c,_,d,g,h){return e(),s("div",null,r)}const p=a(i,[["render",n]]);export{k as __pageData,p as default}; diff --git a/assets/releases_20400.md.b4d99bf2.js b/assets/releases_20400.md.b4d99bf2.js deleted file mode 100644 index 48092007..00000000 --- a/assets/releases_20400.md.b4d99bf2.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as o}from"./chunks/framework.fc84ac3a.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20400.md","filePath":"releases/20400.md","lastUpdated":1672379788000}'),s={name:"releases/20400.md"},i=o('

    2020.3.23 Magisk v20.4

    Miscellaneous

    This release is mainly focused on stability and bug squashing. Please be aware that MagiskHide is no longer enabled by default. Since Google has enabled hardware-based key attestation in SafetyNet (FAQ), there is no effective way to pass full CTS SafetyNet anymore (although Google seems to have temporarily reverted the change).

    I decided that the fully redesigned Magisk Manager isn't fully ready for prime time yet, so this time around no Magisk Manager update is released. The WIP manager will continue to be improved and is available for testing on the canary channel.

    BusyBox Standalone Mode

    Starting with Magisk v20.4, all Magisk related scripts, including boot scripts and module installation scripts, will run on BusyBox's shell (ash) in standalone mode. In BusyBox ash standalone mode, every single command will be forced to use the one that is in Magisk's BusyBox (if available). For instance, no matter how you change the environment variable PATH, the rm command will always use the one in BusyBox, not the one in system, external BusyBox, vendor, or included in custom recovery.

    The reason behind this change is that all scripts will be guaranteed to have 100% consistent results no matter how the environment is setup. The internal BusyBox is significantly beefed up with patches from @osm0sis, and also with SELinux features enabled. It shall offer a very complete, reliable, and consistent scripting environment. If in any case you require to use a command outside of BusyBox, please call it with the full path (e.g. /system/bin/nslookup)

    Magisk Changelog

    • [MagiskInit] Fix potential bootloop in A-only 2SI devices
    • [MagiskInit] Properly support Tegra partition naming
    • [General] Load libsqlite.so dynamically, which removes the need to use wrapper scripts on Android 10+
    • [General] Detect API level with a fallback method on some devices
    • [General] Workaround possible bug in x86 kernel readlinkat system call
    • [BusyBox] Enable SELinux features. Add chcon/runcon etc., and '-Z' option to many applets
    • [BusyBox] Introduce standalone mode. More details in release notes
    • [MagiskHide] Disable MagiskHide by default
    • [MagiskHide] Add more potential detectable system properties
    • [MagiskHide] Add workaround for Xiaomi devices bootloop when MagiskHide is enabled on cross region ROMs
    • [MagiskBoot] Support patching special Motorolla DTB format
    • [MagiskPolicy] Support 'genfscon' sepolicy rules
    • [Scripts] Support NAND based boot images (character nodes in /dev/block)
    • [Scripts] Better addon.d (both v1 and v2) support
    • [Scripts] Support Lineage Recovery for Android 10+
    ',9),n=[i];function l(r,d,c,h,u,p){return a(),t("div",null,n)}const b=e(s,[["render",l]]);export{m as __pageData,b as default}; diff --git a/assets/releases_20400.md.b4d99bf2.lean.js b/assets/releases_20400.md.b4d99bf2.lean.js deleted file mode 100644 index 80c830c9..00000000 --- a/assets/releases_20400.md.b4d99bf2.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as o}from"./chunks/framework.fc84ac3a.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20400.md","filePath":"releases/20400.md","lastUpdated":1672379788000}'),s={name:"releases/20400.md"},i=o("",9),n=[i];function l(r,d,c,h,u,p){return a(),t("div",null,n)}const b=e(s,[["render",l]]);export{m as __pageData,b as default}; diff --git a/assets/releases_20400.md.f3caa241.js b/assets/releases_20400.md.f3caa241.js new file mode 100644 index 00000000..1d63d69e --- /dev/null +++ b/assets/releases_20400.md.f3caa241.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as o}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"2020.3.23 Magisk v20.4","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20400.md","filePath":"releases/20400.md","lastUpdated":1694958663000}'),s={name:"releases/20400.md"},i=o('

    2020.3.23 Magisk v20.4

    Miscellaneous

    This release is mainly focused on stability and bug squashing. Please be aware that MagiskHide is no longer enabled by default. Since Google has enabled hardware-based key attestation in SafetyNet (FAQ), there is no effective way to pass full CTS SafetyNet anymore (although Google seems to have temporarily reverted the change).

    I decided that the fully redesigned Magisk Manager isn't fully ready for prime time yet, so this time around no Magisk Manager update is released. The WIP manager will continue to be improved and is available for testing on the canary channel.

    BusyBox Standalone Mode

    Starting with Magisk v20.4, all Magisk related scripts, including boot scripts and module installation scripts, will run on BusyBox's shell (ash) in standalone mode. In BusyBox ash standalone mode, every single command will be forced to use the one that is in Magisk's BusyBox (if available). For instance, no matter how you change the environment variable PATH, the rm command will always use the one in BusyBox, not the one in system, external BusyBox, vendor, or included in custom recovery.

    The reason behind this change is that all scripts will be guaranteed to have 100% consistent results no matter how the environment is setup. The internal BusyBox is significantly beefed up with patches from @osm0sis, and also with SELinux features enabled. It shall offer a very complete, reliable, and consistent scripting environment. If in any case you require to use a command outside of BusyBox, please call it with the full path (e.g. /system/bin/nslookup)

    Magisk Changelog

    • [MagiskInit] Fix potential bootloop in A-only 2SI devices
    • [MagiskInit] Properly support Tegra partition naming
    • [General] Load libsqlite.so dynamically, which removes the need to use wrapper scripts on Android 10+
    • [General] Detect API level with a fallback method on some devices
    • [General] Workaround possible bug in x86 kernel readlinkat system call
    • [BusyBox] Enable SELinux features. Add chcon/runcon etc., and '-Z' option to many applets
    • [BusyBox] Introduce standalone mode. More details in release notes
    • [MagiskHide] Disable MagiskHide by default
    • [MagiskHide] Add more potential detectable system properties
    • [MagiskHide] Add workaround for Xiaomi devices bootloop when MagiskHide is enabled on cross region ROMs
    • [MagiskBoot] Support patching special Motorolla DTB format
    • [MagiskPolicy] Support 'genfscon' sepolicy rules
    • [Scripts] Support NAND based boot images (character nodes in /dev/block)
    • [Scripts] Better addon.d (both v1 and v2) support
    • [Scripts] Support Lineage Recovery for Android 10+
    ',9),n=[i];function l(r,d,c,h,u,p){return a(),t("div",null,n)}const b=e(s,[["render",l]]);export{m as __pageData,b as default}; diff --git a/assets/releases_20400.md.f3caa241.lean.js b/assets/releases_20400.md.f3caa241.lean.js new file mode 100644 index 00000000..9e90c8e7 --- /dev/null +++ b/assets/releases_20400.md.f3caa241.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as o}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"2020.3.23 Magisk v20.4","description":"","frontmatter":{},"headers":[],"relativePath":"releases/20400.md","filePath":"releases/20400.md","lastUpdated":1694958663000}'),s={name:"releases/20400.md"},i=o("",9),n=[i];function l(r,d,c,h,u,p){return a(),t("div",null,n)}const b=e(s,[["render",l]]);export{m as __pageData,b as default}; diff --git a/assets/releases_21000.md.792fbc82.js b/assets/releases_21000.md.792fbc82.js deleted file mode 100644 index 419ee5cd..00000000 --- a/assets/releases_21000.md.792fbc82.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as o}from"./chunks/framework.fc84ac3a.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/21000.md","filePath":"releases/21000.md","lastUpdated":1674222670000}'),s={name:"releases/21000.md"},r=o('

    2020.10.3 Magisk v21.0

    Long time no see! v21.0 is the largest release in Magisk's history. It comes with full Android 11 support (tons of stuff had to be rewritten from scratch!), and a completely redesigned Magisk Manager. These are the reasons why this particular public release took me over half a year to wrap up.

    To the end user, not much has changed other than the fact that Magisk Manager has completely changed its appearance. However developers should pay attention to some changes due to adjustments for Android 11. Full changelogs are too massive to fit, so here I'll point out the main changes and links to updated documentations.

    Highlights

    • Android 11 support 🎉
    • Completely redesigned Magisk Manager
    • Safe Mode detection: if you installed a module that bootloops your device, reboot into Safe Mode and all modules will be disabled. More instructions on how to deal with broken modules is linked here.

    The following are for advanced users/developer:

    • On Android 8.0+, Magisk now uses a new SELinux setup that keeps Android sandbox less compromised. This provides better security to rooted users, and also separates Magisk rules from original rules. Details here.
    • On Android 11, /sbin may no longer exist. For developers, this means the Magisk's internal tmpfs directory is no longer always /sbin, and instead randomly created every boot. To get the tmpfs path, use the command magisk --path (more details here). For custom kernel developers that uses overlay.d, updated docs are here.
    • magiskpolicy gained more features and some minor syntax changes, details here.

    Full Changelog: here

    ',8),i=[r];function l(n,h,d,c,g,u){return a(),t("div",null,i)}const f=e(s,[["render",l]]);export{m as __pageData,f as default}; diff --git a/assets/releases_21000.md.792fbc82.lean.js b/assets/releases_21000.md.792fbc82.lean.js deleted file mode 100644 index fbb56f36..00000000 --- a/assets/releases_21000.md.792fbc82.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as o}from"./chunks/framework.fc84ac3a.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/21000.md","filePath":"releases/21000.md","lastUpdated":1674222670000}'),s={name:"releases/21000.md"},r=o("",8),i=[r];function l(n,h,d,c,g,u){return a(),t("div",null,i)}const f=e(s,[["render",l]]);export{m as __pageData,f as default}; diff --git a/assets/releases_21000.md.94426129.js b/assets/releases_21000.md.94426129.js new file mode 100644 index 00000000..9a59edc0 --- /dev/null +++ b/assets/releases_21000.md.94426129.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"2020.10.3 Magisk v21.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/21000.md","filePath":"releases/21000.md","lastUpdated":1694958663000}'),s={name:"releases/21000.md"},r=o('

    2020.10.3 Magisk v21.0

    Long time no see! v21.0 is the largest release in Magisk's history. It comes with full Android 11 support (tons of stuff had to be rewritten from scratch!), and a completely redesigned Magisk Manager. These are the reasons why this particular public release took me over half a year to wrap up.

    To the end user, not much has changed other than the fact that Magisk Manager has completely changed its appearance. However developers should pay attention to some changes due to adjustments for Android 11. Full changelogs are too massive to fit, so here I'll point out the main changes and links to updated documentations.

    Highlights

    • Android 11 support 🎉
    • Completely redesigned Magisk Manager
    • Safe Mode detection: if you installed a module that bootloops your device, reboot into Safe Mode and all modules will be disabled. More instructions on how to deal with broken modules is linked here.

    The following are for advanced users/developer:

    • On Android 8.0+, Magisk now uses a new SELinux setup that keeps Android sandbox less compromised. This provides better security to rooted users, and also separates Magisk rules from original rules. Details here.
    • On Android 11, /sbin may no longer exist. For developers, this means the Magisk's internal tmpfs directory is no longer always /sbin, and instead randomly created every boot. To get the tmpfs path, use the command magisk --path (more details here). For custom kernel developers that uses overlay.d, updated docs are here.
    • magiskpolicy gained more features and some minor syntax changes, details here.

    完整更新日志: 这里

    ',8),i=[r];function l(n,d,h,c,g,p){return t(),a("div",null,i)}const f=e(s,[["render",l]]);export{m as __pageData,f as default}; diff --git a/assets/releases_21000.md.94426129.lean.js b/assets/releases_21000.md.94426129.lean.js new file mode 100644 index 00000000..8cf06f2c --- /dev/null +++ b/assets/releases_21000.md.94426129.lean.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as a,Q as o}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"2020.10.3 Magisk v21.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/21000.md","filePath":"releases/21000.md","lastUpdated":1694958663000}'),s={name:"releases/21000.md"},r=o("",8),i=[r];function l(n,d,h,c,g,p){return t(),a("div",null,i)}const f=e(s,[["render",l]]);export{m as __pageData,f as default}; diff --git a/assets/releases_21100.md.945acb51.js b/assets/releases_21100.md.945acb51.js deleted file mode 100644 index 2af28dd6..00000000 --- a/assets/releases_21100.md.945acb51.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as s}from"./chunks/framework.fc84ac3a.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/21100.md","filePath":"releases/21100.md","lastUpdated":1674222670000}'),r={name:"releases/21100.md"},o=s('

    2020.11.13 Magisk v21.1

    v21.1 is a maintenance update from v21.0, mostly addressing bugs, refining some details, and adding new boot image format support (for Pixel 5 and 4a 5G). Checkout the full v21.0 release notes if coming from older releases.

    Full Changelog: here

    ',3),n=[o];function l(i,h,c,d,_,g){return a(),t("div",null,n)}const u=e(r,[["render",l]]);export{f as __pageData,u as default}; diff --git a/assets/releases_21100.md.945acb51.lean.js b/assets/releases_21100.md.945acb51.lean.js deleted file mode 100644 index a2440e49..00000000 --- a/assets/releases_21100.md.945acb51.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as s}from"./chunks/framework.fc84ac3a.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/21100.md","filePath":"releases/21100.md","lastUpdated":1674222670000}'),r={name:"releases/21100.md"},o=s("",3),n=[o];function l(i,h,c,d,_,g){return a(),t("div",null,n)}const u=e(r,[["render",l]]);export{f as __pageData,u as default}; diff --git a/assets/releases_21100.md.ac6f3d1f.js b/assets/releases_21100.md.ac6f3d1f.js new file mode 100644 index 00000000..65fa2c0c --- /dev/null +++ b/assets/releases_21100.md.ac6f3d1f.js @@ -0,0 +1 @@ +import{_ as s,o as t,c as o,k as e,a}from"./chunks/framework.ed90c782.js";const k=JSON.parse('{"title":"2020.11.13 Magisk v21.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/21100.md","filePath":"releases/21100.md","lastUpdated":1694958663000}'),r={name:"releases/21100.md"},n=e("h1",{id:"_2020-11-13-magisk-v21-1",tabindex:"-1"},[a("2020.11.13 Magisk v21.1 "),e("a",{class:"header-anchor",href:"#_2020-11-13-magisk-v21-1","aria-label":'Permalink to "2020.11.13 Magisk v21.1"'},"​")],-1),i=e("p",null,[a("v21.1 is a maintenance update from v21.0, mostly addressing bugs, refining some details, and adding new boot image format support (for Pixel 5 and 4a 5G). Checkout the full "),e("a",{href:"https://topjohnwu.github.io/Magisk/releases/21000.html",target:"_blank",rel:"noreferrer"},"v21.0 release notes"),a(" if coming from older releases.")],-1),l=e("p",null,[e("strong",null,[a("完整更新日志: "),e("a",{href:"/MagiskChineseDocument/changes.html"},"这里")])],-1),d=[n,i,l];function c(h,m,_,f,p,g){return t(),o("div",null,d)}const v=s(r,[["render",c]]);export{k as __pageData,v as default}; diff --git a/assets/releases_21100.md.ac6f3d1f.lean.js b/assets/releases_21100.md.ac6f3d1f.lean.js new file mode 100644 index 00000000..65fa2c0c --- /dev/null +++ b/assets/releases_21100.md.ac6f3d1f.lean.js @@ -0,0 +1 @@ +import{_ as s,o as t,c as o,k as e,a}from"./chunks/framework.ed90c782.js";const k=JSON.parse('{"title":"2020.11.13 Magisk v21.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/21100.md","filePath":"releases/21100.md","lastUpdated":1694958663000}'),r={name:"releases/21100.md"},n=e("h1",{id:"_2020-11-13-magisk-v21-1",tabindex:"-1"},[a("2020.11.13 Magisk v21.1 "),e("a",{class:"header-anchor",href:"#_2020-11-13-magisk-v21-1","aria-label":'Permalink to "2020.11.13 Magisk v21.1"'},"​")],-1),i=e("p",null,[a("v21.1 is a maintenance update from v21.0, mostly addressing bugs, refining some details, and adding new boot image format support (for Pixel 5 and 4a 5G). Checkout the full "),e("a",{href:"https://topjohnwu.github.io/Magisk/releases/21000.html",target:"_blank",rel:"noreferrer"},"v21.0 release notes"),a(" if coming from older releases.")],-1),l=e("p",null,[e("strong",null,[a("完整更新日志: "),e("a",{href:"/MagiskChineseDocument/changes.html"},"这里")])],-1),d=[n,i,l];function c(h,m,_,f,p,g){return t(),o("div",null,d)}const v=s(r,[["render",c]]);export{k as __pageData,v as default}; diff --git a/assets/releases_21200.md.c9fd3f8c.js b/assets/releases_21200.md.c9fd3f8c.js deleted file mode 100644 index f6f14115..00000000 --- a/assets/releases_21200.md.c9fd3f8c.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as l}from"./chunks/framework.fc84ac3a.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/21200.md","filePath":"releases/21200.md","lastUpdated":1674222670000}'),o={name:"releases/21200.md"},i=l('

    2020.12.28 Magisk v21.2

    v21.2 is a maintenance update, mostly addressing bugs, and expanding device compatibility. Checkout the full v21.0 release notes if coming from older releases.

    v21.2

    • [MagiskInit] Detect 2SI after mounting system_root on legacy SAR devices
    • [General] Make sure post-fs-data scripts cannot block more than 35 seconds
    • [General] Fix the magisk --install-module command
    • [General] Trim Windows newline when reading files
    • [General] Directly log to file to prevent logcat weirdness
    • [MagiskBoot] Fix header dump/load for header v3 images

    Full Changelog: here

    ',5),s=[i];function r(n,c,d,h,m,g){return a(),t("div",null,s)}const f=e(o,[["render",r]]);export{u as __pageData,f as default}; diff --git a/assets/releases_21200.md.c9fd3f8c.lean.js b/assets/releases_21200.md.c9fd3f8c.lean.js deleted file mode 100644 index ee4b1b34..00000000 --- a/assets/releases_21200.md.c9fd3f8c.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as l}from"./chunks/framework.fc84ac3a.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/21200.md","filePath":"releases/21200.md","lastUpdated":1674222670000}'),o={name:"releases/21200.md"},i=l("",5),s=[i];function r(n,c,d,h,m,g){return a(),t("div",null,s)}const f=e(o,[["render",r]]);export{u as __pageData,f as default}; diff --git a/assets/releases_21200.md.f65699a3.js b/assets/releases_21200.md.f65699a3.js new file mode 100644 index 00000000..e83a811c --- /dev/null +++ b/assets/releases_21200.md.f65699a3.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as s}from"./chunks/framework.ed90c782.js";const p=JSON.parse('{"title":"2020.12.28 Magisk v21.2","description":"","frontmatter":{},"headers":[],"relativePath":"releases/21200.md","filePath":"releases/21200.md","lastUpdated":1694958663000}'),i={name:"releases/21200.md"},o=s('

    2020.12.28 Magisk v21.2

    v21.2 is a maintenance update, mostly addressing bugs, and expanding device compatibility. Checkout the full v21.0 release notes if coming from older releases.

    v21.2

    • [MagiskInit] Detect 2SI after mounting system_root on legacy SAR devices
    • [General] Make sure post-fs-data scripts cannot block more than 35 seconds
    • [General] Fix the magisk --install-module command
    • [General] Trim Windows newline when reading files
    • [General] Directly log to file to prevent logcat weirdness
    • [MagiskBoot] Fix header dump/load for header v3 images

    完整更新日志: 这里

    ',5),r=[o];function l(n,c,d,h,_,m){return a(),t("div",null,r)}const u=e(i,[["render",l]]);export{p as __pageData,u as default}; diff --git a/assets/releases_21200.md.f65699a3.lean.js b/assets/releases_21200.md.f65699a3.lean.js new file mode 100644 index 00000000..bfc09d17 --- /dev/null +++ b/assets/releases_21200.md.f65699a3.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as s}from"./chunks/framework.ed90c782.js";const p=JSON.parse('{"title":"2020.12.28 Magisk v21.2","description":"","frontmatter":{},"headers":[],"relativePath":"releases/21200.md","filePath":"releases/21200.md","lastUpdated":1694958663000}'),i={name:"releases/21200.md"},o=s("",5),r=[o];function l(n,c,d,h,_,m){return a(),t("div",null,r)}const u=e(i,[["render",l]]);export{p as __pageData,u as default}; diff --git a/assets/releases_21400.md.b582e920.js b/assets/releases_21400.md.b582e920.js deleted file mode 100644 index f87d428f..00000000 --- a/assets/releases_21400.md.b582e920.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as o,V as s}from"./chunks/framework.fc84ac3a.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/21400.md","filePath":"releases/21400.md","lastUpdated":1674222670000}'),r={name:"releases/21400.md"},t=s('

    2021.1.17 Magisk v21.4

    Update: v21.4 adds more regression hot fixes.

    Happy 2021! v21.3 adds a workaround for devices with buggy F2FS Linux kernel drivers. This F2FS bug may cause bootloops on many devices. Checkout the full v21.0 release notes if coming from older releases.

    v21.4

    • [MagiskSU] Fix su -c behavior that broke many root apps
    • [General] Properly handle read/write over sockets (the broken pipe issue)

    v21.3

    • [MagiskInit] Avoid mounting f2fs userdata as it may result in kernel crashes. This shall fix a lot of bootloops
    • [MagiskBoot] Fix a minor header checksum bug for DHTB header and ASUS blob image formats
    • [MagiskHide] Allowing hiding isolated processes if the mount namespace is separated

    Full Changelog: here

    ',8),i=[t];function l(n,h,d,c,u,g){return a(),o("div",null,i)}const _=e(r,[["render",l]]);export{p as __pageData,_ as default}; diff --git a/assets/releases_21400.md.b582e920.lean.js b/assets/releases_21400.md.b582e920.lean.js deleted file mode 100644 index e21a0ba2..00000000 --- a/assets/releases_21400.md.b582e920.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as o,V as s}from"./chunks/framework.fc84ac3a.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/21400.md","filePath":"releases/21400.md","lastUpdated":1674222670000}'),r={name:"releases/21400.md"},t=s("",8),i=[t];function l(n,h,d,c,u,g){return a(),o("div",null,i)}const _=e(r,[["render",l]]);export{p as __pageData,_ as default}; diff --git a/assets/releases_21400.md.bf9f03aa.js b/assets/releases_21400.md.bf9f03aa.js new file mode 100644 index 00000000..9ef5c352 --- /dev/null +++ b/assets/releases_21400.md.bf9f03aa.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as o,Q as s}from"./chunks/framework.ed90c782.js";const _=JSON.parse('{"title":"2021.1.17 Magisk v21.4","description":"","frontmatter":{},"headers":[],"relativePath":"releases/21400.md","filePath":"releases/21400.md","lastUpdated":1694958663000}'),t={name:"releases/21400.md"},r=s('

    2021.1.17 Magisk v21.4

    Update: v21.4 adds more regression hot fixes.

    Happy 2021! v21.3 adds a workaround for devices with buggy F2FS Linux kernel drivers. This F2FS bug may cause bootloops on many devices. Checkout the full v21.0 release notes if coming from older releases.

    v21.4

    • [MagiskSU] Fix su -c behavior that broke many root apps
    • [General] Properly handle read/write over sockets (the broken pipe issue)

    v21.3

    • [MagiskInit] Avoid mounting f2fs userdata as it may result in kernel crashes. This shall fix a lot of bootloops
    • [MagiskBoot] Fix a minor header checksum bug for DHTB header and ASUS blob image formats
    • [MagiskHide] Allowing hiding isolated processes if the mount namespace is separated

    完整更新日志: 这里

    ',8),i=[r];function l(n,d,c,h,p,u){return a(),o("div",null,i)}const g=e(t,[["render",l]]);export{_ as __pageData,g as default}; diff --git a/assets/releases_21400.md.bf9f03aa.lean.js b/assets/releases_21400.md.bf9f03aa.lean.js new file mode 100644 index 00000000..c07753da --- /dev/null +++ b/assets/releases_21400.md.bf9f03aa.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as o,Q as s}from"./chunks/framework.ed90c782.js";const _=JSON.parse('{"title":"2021.1.17 Magisk v21.4","description":"","frontmatter":{},"headers":[],"relativePath":"releases/21400.md","filePath":"releases/21400.md","lastUpdated":1694958663000}'),t={name:"releases/21400.md"},r=s("",8),i=[r];function l(n,d,c,h,p,u){return a(),o("div",null,i)}const g=e(t,[["render",l]]);export{_ as __pageData,g as default}; diff --git a/assets/releases_22000.md.8c658003.js b/assets/releases_22000.md.8c658003.js deleted file mode 100644 index 0e4b8f09..00000000 --- a/assets/releases_22000.md.8c658003.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as i,V as t}from"./chunks/framework.fc84ac3a.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/22000.md","filePath":"releases/22000.md","lastUpdated":1674222670000}'),s={name:"releases/22000.md"},o=t('

    2021.2.23 Magisk v22.0

    RESTORE THE EXISTING MAGISK MANAGER BACK TO NORMAL BEFORE UPGRADING IF HIDDEN!

    Another major Magisk release! This time our focus is not the core Magisk implementation, but rather on improving the whole Magisk user experience.

    Magisk Manager is dead.
    Long live the Magisk app!

    Ever since the first Magisk release, Magisk (the core components) and Magisk Manager (the companion app) are released separately and isn't necessarily always in sync. This leads to some confusion and a lot of complexity when downloading/installing Magisk through the app. Starting from v22.0, the Magisk app (renamed from Magisk Manager) includes everything it needs within the APK itself, making installation a 100% offline process.

    Custom recovery lovers, no worries! The Magisk app APK itself is a custom recovery flashable zip, just like MAGIC™🌈. Check out the updated installation guide for more info.

    App Hiding

    Another major breakthrough in this release is that devices lower than Android 9.0 can now also use the advanced app hiding technique to hide the Magisk app. Due to this incompatible change, RESTORE THE EXISTING MAGISK MANAGER BACK TO NORMAL BEFORE UPGRADING IF HIDDEN!

    Bug Fixes

    • [MagiskHide] Fix a bug when stopping MagiskHide does not take effect
    • [MagiskBoot] Fix bug when unpacking lz4_lg compressed boot images
    • [MagiskInit] Support Galaxy S21 series
    • [MagiskSU] Fix incorrect APEX paths that caused libsqlite.so fail to load

    Full Changelog: here

    ',11),n=[o];function r(l,h,g,d,c,p){return a(),i("div",null,n)}const k=e(s,[["render",r]]);export{u as __pageData,k as default}; diff --git a/assets/releases_22000.md.8c658003.lean.js b/assets/releases_22000.md.8c658003.lean.js deleted file mode 100644 index 96f22dad..00000000 --- a/assets/releases_22000.md.8c658003.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as i,V as t}from"./chunks/framework.fc84ac3a.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/22000.md","filePath":"releases/22000.md","lastUpdated":1674222670000}'),s={name:"releases/22000.md"},o=t("",11),n=[o];function r(l,h,g,d,c,p){return a(),i("div",null,n)}const k=e(s,[["render",r]]);export{u as __pageData,k as default}; diff --git a/assets/releases_22000.md.a664d51e.js b/assets/releases_22000.md.a664d51e.js new file mode 100644 index 00000000..36203cb7 --- /dev/null +++ b/assets/releases_22000.md.a664d51e.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as i,Q as t}from"./chunks/framework.ed90c782.js";const k=JSON.parse('{"title":"2021.2.23 Magisk v22.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/22000.md","filePath":"releases/22000.md","lastUpdated":1694958663000}'),s={name:"releases/22000.md"},o=t('

    2021.2.23 Magisk v22.0

    RESTORE THE EXISTING MAGISK MANAGER BACK TO NORMAL BEFORE UPGRADING IF HIDDEN!

    Another major Magisk release! This time our focus is not the core Magisk implementation, but rather on improving the whole Magisk user experience.

    Magisk Manager is dead.
    Long live the Magisk app!

    Ever since the first Magisk release, Magisk (the core components) and Magisk Manager (the companion app) are released separately and isn't necessarily always in sync. This leads to some confusion and a lot of complexity when downloading/installing Magisk through the app. Starting from v22.0, the Magisk app (renamed from Magisk Manager) includes everything it needs within the APK itself, making installation a 100% offline process.

    Custom recovery lovers, no worries! The Magisk app APK itself is a custom recovery flashable zip, just like MAGIC™🌈. Check out the updated installation guide for more info.

    App Hiding

    Another major breakthrough in this release is that devices lower than Android 9.0 can now also use the advanced app hiding technique to hide the Magisk app. Due to this incompatible change, RESTORE THE EXISTING MAGISK MANAGER BACK TO NORMAL BEFORE UPGRADING IF HIDDEN!

    Bug Fixes

    • [MagiskHide] Fix a bug when stopping MagiskHide does not take effect
    • [MagiskBoot] Fix bug when unpacking lz4_lg compressed boot images
    • [MagiskInit] Support Galaxy S21 series
    • [MagiskSU] Fix incorrect APEX paths that caused libsqlite.so fail to load

    完整更新日志: 这里

    ',11),n=[o];function r(l,h,g,d,p,c){return a(),i("div",null,n)}const u=e(s,[["render",r]]);export{k as __pageData,u as default}; diff --git a/assets/releases_22000.md.a664d51e.lean.js b/assets/releases_22000.md.a664d51e.lean.js new file mode 100644 index 00000000..62e85ffd --- /dev/null +++ b/assets/releases_22000.md.a664d51e.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as i,Q as t}from"./chunks/framework.ed90c782.js";const k=JSON.parse('{"title":"2021.2.23 Magisk v22.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/22000.md","filePath":"releases/22000.md","lastUpdated":1694958663000}'),s={name:"releases/22000.md"},o=t("",11),n=[o];function r(l,h,g,d,p,c){return a(),i("div",null,n)}const u=e(s,[["render",r]]);export{k as __pageData,u as default}; diff --git a/assets/releases_22100.md.551a2e63.js b/assets/releases_22100.md.551a2e63.js deleted file mode 100644 index 0671895a..00000000 --- a/assets/releases_22100.md.551a2e63.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as i,V as s}from"./chunks/framework.fc84ac3a.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/22100.md","filePath":"releases/22100.md","lastUpdated":1674222670000}'),r={name:"releases/22100.md"},t=s('

    2021.4.9 Magisk v22.1

    This release is focused on fixing regressions and bugs. Check the v22.0 release notes if coming from older releases.

    Note: Magisk v22 is the last major version to support Jellybean and Kitkat. Magisk v23 will only support Android 5.0 and higher.

    Bug Fixes

    • [App] Prevent multiple installation sessions running in parallel
    • [App] Prevent OutOfMemory crashes when checking boot signature on PXA boot images
    • [General] Proper cgroup migration implementation
    • [General] Rewrite log writer from scratch, should resolve any crashes and deadlocks
    • [General] Many scripts updates fixing regressions
    • [MagiskHide] Prevent possible deadlock when signal arrives
    • [MagiskHide] Partial match process names if necessary
    • [MagiskBoot] Preserve and patch AVB 2.0 structures/headers in boot images
    • [MagiskBoot] Properly strip out data encryption flags
    • [MagiskBoot] Prevent possible integer overflow
    • [MagiskInit] Fix sepolicy.rule mounting strategy
    • [resetprop] Always delete existing ro. props before updating. This will fix bootloops that could be caused by modifying device fingerprint properties.

    Full Changelog: here

    ',6),o=[t];function l(n,c,h,g,d,p){return a(),i("div",null,o)}const f=e(r,[["render",l]]);export{m as __pageData,f as default}; diff --git a/assets/releases_22100.md.551a2e63.lean.js b/assets/releases_22100.md.551a2e63.lean.js deleted file mode 100644 index fec85b98..00000000 --- a/assets/releases_22100.md.551a2e63.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as i,V as s}from"./chunks/framework.fc84ac3a.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/22100.md","filePath":"releases/22100.md","lastUpdated":1674222670000}'),r={name:"releases/22100.md"},t=s("",6),o=[t];function l(n,c,h,g,d,p){return a(),i("div",null,o)}const f=e(r,[["render",l]]);export{m as __pageData,f as default}; diff --git a/assets/releases_22100.md.fafc6195.js b/assets/releases_22100.md.fafc6195.js new file mode 100644 index 00000000..5b462859 --- /dev/null +++ b/assets/releases_22100.md.fafc6195.js @@ -0,0 +1 @@ +import{_ as e,o as i,c as s,Q as a}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"2021.4.9 Magisk v22.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/22100.md","filePath":"releases/22100.md","lastUpdated":1694958663000}'),r={name:"releases/22100.md"},t=a('

    2021.4.9 Magisk v22.1

    This release is focused on fixing regressions and bugs. Check the v22.0 release notes if coming from older releases.

    Note: Magisk v22 is the last major version to support Jellybean and Kitkat. Magisk v23 will only support Android 5.0 and higher.

    Bug Fixes

    • [App] Prevent multiple installation sessions running in parallel
    • [App] Prevent OutOfMemory crashes when checking boot signature on PXA boot images
    • [General] Proper cgroup migration implementation
    • [General] Rewrite log writer from scratch, should resolve any crashes and deadlocks
    • [General] Many scripts updates fixing regressions
    • [MagiskHide] Prevent possible deadlock when signal arrives
    • [MagiskHide] Partial match process names if necessary
    • [MagiskBoot] Preserve and patch AVB 2.0 structures/headers in boot images
    • [MagiskBoot] Properly strip out data encryption flags
    • [MagiskBoot] Prevent possible integer overflow
    • [MagiskInit] Fix sepolicy.rule mounting strategy
    • [resetprop] Always delete existing ro. props before updating. This will fix bootloops that could be caused by modifying device fingerprint properties.

    完整更新日志: 这里

    ',6),o=[t];function l(n,c,p,d,g,h){return i(),s("div",null,o)}const _=e(r,[["render",l]]);export{m as __pageData,_ as default}; diff --git a/assets/releases_22100.md.fafc6195.lean.js b/assets/releases_22100.md.fafc6195.lean.js new file mode 100644 index 00000000..29a92dc1 --- /dev/null +++ b/assets/releases_22100.md.fafc6195.lean.js @@ -0,0 +1 @@ +import{_ as e,o as i,c as s,Q as a}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"2021.4.9 Magisk v22.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/22100.md","filePath":"releases/22100.md","lastUpdated":1694958663000}'),r={name:"releases/22100.md"},t=a("",6),o=[t];function l(n,c,p,d,g,h){return i(),s("div",null,o)}const _=e(r,[["render",l]]);export{m as __pageData,_ as default}; diff --git a/assets/releases_23000.md.7d4a1d83.js b/assets/releases_23000.md.7d4a1d83.js new file mode 100644 index 00000000..701ddc5e --- /dev/null +++ b/assets/releases_23000.md.7d4a1d83.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as i,Q as s}from"./chunks/framework.ed90c782.js";const _=JSON.parse('{"title":"2021.5.12 Magisk v23.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/23000.md","filePath":"releases/23000.md","lastUpdated":1694958663000}'),t={name:"releases/23000.md"},l=s('

    2021.5.12 Magisk v23.0

    This release is focused on fixing regressions and bugs.

    Note: Magisk v22 is the last major version to support Jellybean and Kitkat. Magisk v23 only supports Android 5.0 and higher.

    Bug Fixes

    • [App] Update snet extension. This fixes SafetyNet API errors.
    • [App] Fix a bug in the stub app that causes APK installation to fail
    • [App] Hide annoying errors in logs when hidden as stub
    • [App] Fix issues when patching ODIN tar files when the app is hidden
    • [General] Remove all pre Android 5.0 support
    • [General] Update BusyBox to use proper libc
    • [General] Fix C++ undefined behaviors
    • [General] Several sepolicy.rule copy/installation fixes
    • [MagiskPolicy] Remove unnecessary sepolicy rules
    • [MagiskHide] Update package and process name validation logic
    • [MagiskHide] Some changes that prevents zygote deadlock

    完整更新日志: 这里

    ',6),o=[l];function n(r,p,d,c,h,u){return a(),i("div",null,o)}const f=e(t,[["render",n]]);export{_ as __pageData,f as default}; diff --git a/assets/releases_23000.md.7d4a1d83.lean.js b/assets/releases_23000.md.7d4a1d83.lean.js new file mode 100644 index 00000000..7e1a3a21 --- /dev/null +++ b/assets/releases_23000.md.7d4a1d83.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as i,Q as s}from"./chunks/framework.ed90c782.js";const _=JSON.parse('{"title":"2021.5.12 Magisk v23.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/23000.md","filePath":"releases/23000.md","lastUpdated":1694958663000}'),t={name:"releases/23000.md"},l=s("",6),o=[l];function n(r,p,d,c,h,u){return a(),i("div",null,o)}const f=e(t,[["render",n]]);export{_ as __pageData,f as default}; diff --git a/assets/releases_23000.md.bacddf11.js b/assets/releases_23000.md.bacddf11.js deleted file mode 100644 index 1e7a524e..00000000 --- a/assets/releases_23000.md.bacddf11.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as i,V as s}from"./chunks/framework.fc84ac3a.js";const _=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/23000.md","filePath":"releases/23000.md","lastUpdated":1674222670000}'),l={name:"releases/23000.md"},t=s('

    2021.5.12 Magisk v23.0

    This release is focused on fixing regressions and bugs.

    Note: Magisk v22 is the last major version to support Jellybean and Kitkat. Magisk v23 only supports Android 5.0 and higher.

    Bug Fixes

    • [App] Update snet extension. This fixes SafetyNet API errors.
    • [App] Fix a bug in the stub app that causes APK installation to fail
    • [App] Hide annoying errors in logs when hidden as stub
    • [App] Fix issues when patching ODIN tar files when the app is hidden
    • [General] Remove all pre Android 5.0 support
    • [General] Update BusyBox to use proper libc
    • [General] Fix C++ undefined behaviors
    • [General] Several sepolicy.rule copy/installation fixes
    • [MagiskPolicy] Remove unnecessary sepolicy rules
    • [MagiskHide] Update package and process name validation logic
    • [MagiskHide] Some changes that prevents zygote deadlock

    Full Changelog: here

    ',6),o=[t];function n(r,d,h,p,c,u){return a(),i("div",null,o)}const f=e(l,[["render",n]]);export{_ as __pageData,f as default}; diff --git a/assets/releases_23000.md.bacddf11.lean.js b/assets/releases_23000.md.bacddf11.lean.js deleted file mode 100644 index 25428c24..00000000 --- a/assets/releases_23000.md.bacddf11.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as i,V as s}from"./chunks/framework.fc84ac3a.js";const _=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/23000.md","filePath":"releases/23000.md","lastUpdated":1674222670000}'),l={name:"releases/23000.md"},t=s("",6),o=[t];function n(r,d,h,p,c,u){return a(),i("div",null,o)}const f=e(l,[["render",n]]);export{_ as __pageData,f as default}; diff --git a/assets/releases_24000.md.1958b910.js b/assets/releases_24000.md.1958b910.js deleted file mode 100644 index 993c9287..00000000 --- a/assets/releases_24000.md.1958b910.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as i}from"./chunks/framework.fc84ac3a.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/24000.md","filePath":"releases/24000.md","lastUpdated":1674222670000}'),o={name:"releases/24000.md"},n=i('

    2022.1.26 Magisk v24.0

    It has been a while since the last public release, long time no see! A personal update for those unaware: I am now working at Google on the Android Platform Security team. Without further ado, let's jump right into it!

    MagiskHide Removal

    I have lost interest in fighting this battle for quite a while; plus, the existing MagiskHide implementation is flawed in so many ways. Decoupling Magisk from root hiding is, in my opinion, beneficial to the community. Ever since my announcement on Twitter months ago, highly effective "root hiding" modules (much MUCH better than MagiskHide) has been flourishing, which again shows that people are way more capable than I am on this subject. So why not give those determined their time to shine, and let me focus on improving Magisk instead of drowning in the everlasting cat-and-mouse game 😉.

    Sunsetting Magisk-Modules-Repo

    Due to lack of time and maintenance, the centralized Magisk-Modules-Repo was frozen, and the functionality to download modules from the repo is removed in v24.0. As a supplement, module developers can now specify an updateJson URL in their modules. The Magisk app will use that to check, download, and install module updates.

    Introducing Zygisk

    Zygisk is Magisk in Zygote, the next big thing for Magisk! When this feature is enabled, a part of Magisk will run in the Zygote daemon process, allowing module developers to run code directly in every Android apps' processes. If you've heard of Riru, then Zygisk is inspired by that project and is functionally similar, though the implementation is quite different internally. I cannot wait to see what module developers can achieve using Zygisk!

    Documentation

    For developers, details about updateJson and building Zygisk modules can all be found in the updated documentation.

    Full Changelog: here

    ',11),s=[n];function r(l,h,d,u,g,c){return a(),t("div",null,s)}const f=e(o,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/releases_24000.md.1958b910.lean.js b/assets/releases_24000.md.1958b910.lean.js deleted file mode 100644 index dc0982ac..00000000 --- a/assets/releases_24000.md.1958b910.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as i}from"./chunks/framework.fc84ac3a.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/24000.md","filePath":"releases/24000.md","lastUpdated":1674222670000}'),o={name:"releases/24000.md"},n=i("",11),s=[n];function r(l,h,d,u,g,c){return a(),t("div",null,s)}const f=e(o,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/releases_24000.md.a2288654.js b/assets/releases_24000.md.a2288654.js new file mode 100644 index 00000000..d279621b --- /dev/null +++ b/assets/releases_24000.md.a2288654.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as i}from"./chunks/framework.ed90c782.js";const p=JSON.parse('{"title":"2022.1.26 Magisk v24.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/24000.md","filePath":"releases/24000.md","lastUpdated":1694958663000}'),o={name:"releases/24000.md"},n=i('

    2022.1.26 Magisk v24.0

    It has been a while since the last public release, long time no see! A personal update for those unaware: I am now working at Google on the Android Platform Security team. Without further ado, let's jump right into it!

    MagiskHide Removal

    I have lost interest in fighting this battle for quite a while; plus, the existing MagiskHide implementation is flawed in so many ways. Decoupling Magisk from root hiding is, in my opinion, beneficial to the community. Ever since my announcement on Twitter months ago, highly effective "root hiding" modules (much MUCH better than MagiskHide) has been flourishing, which again shows that people are way more capable than I am on this subject. So why not give those determined their time to shine, and let me focus on improving Magisk instead of drowning in the everlasting cat-and-mouse game 😉.

    Sunsetting Magisk-Modules-Repo

    Due to lack of time and maintenance, the centralized Magisk-Modules-Repo was frozen, and the functionality to download modules from the repo is removed in v24.0. As a supplement, module developers can now specify an updateJson URL in their modules. The Magisk app will use that to check, download, and install module updates.

    Introducing Zygisk

    Zygisk is Magisk in Zygote, the next big thing for Magisk! When this feature is enabled, a part of Magisk will run in the Zygote daemon process, allowing module developers to run code directly in every Android apps' processes. If you've heard of Riru, then Zygisk is inspired by that project and is functionally similar, though the implementation is quite different internally. I cannot wait to see what module developers can achieve using Zygisk!

    Documentation

    For developers, details about updateJson and building Zygisk modules can all be found in the updated documentation.

    完整更新日志: 这里

    ',11),s=[n];function r(l,d,h,u,g,c){return a(),t("div",null,s)}const k=e(o,[["render",r]]);export{p as __pageData,k as default}; diff --git a/assets/releases_24000.md.a2288654.lean.js b/assets/releases_24000.md.a2288654.lean.js new file mode 100644 index 00000000..1a54e798 --- /dev/null +++ b/assets/releases_24000.md.a2288654.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as i}from"./chunks/framework.ed90c782.js";const p=JSON.parse('{"title":"2022.1.26 Magisk v24.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/24000.md","filePath":"releases/24000.md","lastUpdated":1694958663000}'),o={name:"releases/24000.md"},n=i("",11),s=[n];function r(l,d,h,u,g,c){return a(),t("div",null,s)}const k=e(o,[["render",r]]);export{p as __pageData,k as default}; diff --git a/assets/releases_24100.md.15429fef.js b/assets/releases_24100.md.15429fef.js new file mode 100644 index 00000000..537939ce --- /dev/null +++ b/assets/releases_24100.md.15429fef.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as o}from"./chunks/framework.ed90c782.js";const p=JSON.parse('{"title":"2022.1.28 Magisk v24.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/24100.md","filePath":"releases/24100.md","lastUpdated":1694958663000}'),i={name:"releases/24100.md"},n=o('

    2022.1.28 Magisk v24.1

    For those coming from v24.0, v24.1 only has some minor app improvements. The following are copied from v24.0 release notes.

    It has been a while since the last public release, long time no see! A personal update for those unaware: I am now working at Google on the Android Platform Security team. Without further ado, let's jump right into it!

    MagiskHide Removal

    I have lost interest in fighting this battle for quite a while; plus, the existing MagiskHide implementation is flawed in so many ways. Decoupling Magisk from root hiding is, in my opinion, beneficial to the community. Ever since my announcement on Twitter months ago, highly effective "root hiding" modules (much MUCH better than MagiskHide) has been flourishing, which again shows that people are way more capable than I am on this subject. So why not give those determined their time to shine, and let me focus on improving Magisk instead of drowning in the everlasting cat-and-mouse game 😉.

    Sunsetting Magisk-Modules-Repo

    Due to lack of time and maintenance, the centralized Magisk-Modules-Repo was frozen, and the functionality to download modules from the repo is removed in v24.0. As a supplement, module developers can now specify an updateJson URL in their modules. The Magisk app will use that to check, download, and install module updates.

    Introducing Zygisk

    Zygisk is Magisk in Zygote, the next big thing for Magisk! When this feature is enabled, a part of Magisk will run in the Zygote daemon process, allowing module developers to run code directly in every Android apps' processes. If you've heard of Riru, then Zygisk is inspired by that project and is functionally similar, though the implementation is quite different internally. I cannot wait to see what module developers can achieve using Zygisk!

    Documentation

    For developers, details about updateJson and building Zygisk modules can all be found in the updated documentation.

    完整更新日志: 这里

    ',12),s=[n];function r(l,d,h,u,m,c){return a(),t("div",null,s)}const k=e(i,[["render",r]]);export{p as __pageData,k as default}; diff --git a/assets/releases_24100.md.15429fef.lean.js b/assets/releases_24100.md.15429fef.lean.js new file mode 100644 index 00000000..b1487fe4 --- /dev/null +++ b/assets/releases_24100.md.15429fef.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as o}from"./chunks/framework.ed90c782.js";const p=JSON.parse('{"title":"2022.1.28 Magisk v24.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/24100.md","filePath":"releases/24100.md","lastUpdated":1694958663000}'),i={name:"releases/24100.md"},n=o("",12),s=[n];function r(l,d,h,u,m,c){return a(),t("div",null,s)}const k=e(i,[["render",r]]);export{p as __pageData,k as default}; diff --git a/assets/releases_24100.md.6b9a3320.js b/assets/releases_24100.md.6b9a3320.js deleted file mode 100644 index f95968cb..00000000 --- a/assets/releases_24100.md.6b9a3320.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as o}from"./chunks/framework.fc84ac3a.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/24100.md","filePath":"releases/24100.md","lastUpdated":1674222670000}'),i={name:"releases/24100.md"},n=o('

    2022.1.28 Magisk v24.1

    For those coming from v24.0, v24.1 only has some minor app improvements. The following are copied from v24.0 release notes.

    It has been a while since the last public release, long time no see! A personal update for those unaware: I am now working at Google on the Android Platform Security team. Without further ado, let's jump right into it!

    MagiskHide Removal

    I have lost interest in fighting this battle for quite a while; plus, the existing MagiskHide implementation is flawed in so many ways. Decoupling Magisk from root hiding is, in my opinion, beneficial to the community. Ever since my announcement on Twitter months ago, highly effective "root hiding" modules (much MUCH better than MagiskHide) has been flourishing, which again shows that people are way more capable than I am on this subject. So why not give those determined their time to shine, and let me focus on improving Magisk instead of drowning in the everlasting cat-and-mouse game 😉.

    Sunsetting Magisk-Modules-Repo

    Due to lack of time and maintenance, the centralized Magisk-Modules-Repo was frozen, and the functionality to download modules from the repo is removed in v24.0. As a supplement, module developers can now specify an updateJson URL in their modules. The Magisk app will use that to check, download, and install module updates.

    Introducing Zygisk

    Zygisk is Magisk in Zygote, the next big thing for Magisk! When this feature is enabled, a part of Magisk will run in the Zygote daemon process, allowing module developers to run code directly in every Android apps' processes. If you've heard of Riru, then Zygisk is inspired by that project and is functionally similar, though the implementation is quite different internally. I cannot wait to see what module developers can achieve using Zygisk!

    Documentation

    For developers, details about updateJson and building Zygisk modules can all be found in the updated documentation.

    Full Changelog: here

    ',12),s=[n];function r(l,h,d,u,c,g){return a(),t("div",null,s)}const f=e(i,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/releases_24100.md.6b9a3320.lean.js b/assets/releases_24100.md.6b9a3320.lean.js deleted file mode 100644 index cd757196..00000000 --- a/assets/releases_24100.md.6b9a3320.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as o}from"./chunks/framework.fc84ac3a.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/24100.md","filePath":"releases/24100.md","lastUpdated":1674222670000}'),i={name:"releases/24100.md"},n=o("",12),s=[n];function r(l,h,d,u,c,g){return a(),t("div",null,s)}const f=e(i,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/releases_24200.md.6091c70d.js b/assets/releases_24200.md.6091c70d.js deleted file mode 100644 index 3156d87b..00000000 --- a/assets/releases_24200.md.6091c70d.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as i,c as a,V as l}from"./chunks/framework.fc84ac3a.js";const h=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/24200.md","filePath":"releases/24200.md","lastUpdated":1674222670000}'),s={name:"releases/24200.md"},o=l('

    2022.3.1 Magisk v24.2

    Maintenance release fixing various issues.

    • [MagiskSU] Fix buffer overflow
    • [MagiskSU] Fix owner managed multiuser superuser settings
    • [MagiskSU] Fix command logging when using su -c <cmd>
    • [MagiskSU] Prevent su request indefinite blocking
    • [MagiskBoot] Support lz4_legacy archive with multiple magic
    • [MagiskBoot] Fix lz4_lg compression
    • [DenyList] Allow targeting processes running as system UID
    • [Zygisk] Workaround Samsung's "early zygote"
    • [Zygisk] Improved Zygisk loading mechanism
    • [Zygisk] Fix application UID tracking
    • [Zygisk] Fix improper umask being set in zygote
    • [App] Fix BusyBox execution test
    • [App] Improve stub loading mechanism
    • [App] Major app upgrade flow improvements
    • [General] Improve commandline error handling and messaging

    Full Changelog: here

    ',4),t=[o];function n(r,g,c,d,m,u){return i(),a("div",null,t)}const _=e(s,[["render",n]]);export{h as __pageData,_ as default}; diff --git a/assets/releases_24200.md.6091c70d.lean.js b/assets/releases_24200.md.6091c70d.lean.js deleted file mode 100644 index f93810b6..00000000 --- a/assets/releases_24200.md.6091c70d.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as i,c as a,V as l}from"./chunks/framework.fc84ac3a.js";const h=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/24200.md","filePath":"releases/24200.md","lastUpdated":1674222670000}'),s={name:"releases/24200.md"},o=l("",4),t=[o];function n(r,g,c,d,m,u){return i(),a("div",null,t)}const _=e(s,[["render",n]]);export{h as __pageData,_ as default}; diff --git a/assets/releases_24200.md.eab9d9d7.js b/assets/releases_24200.md.eab9d9d7.js new file mode 100644 index 00000000..0668511e --- /dev/null +++ b/assets/releases_24200.md.eab9d9d7.js @@ -0,0 +1 @@ +import{_ as e,o as i,c as s,Q as a}from"./chunks/framework.ed90c782.js";const _=JSON.parse('{"title":"2022.3.1 Magisk v24.2","description":"","frontmatter":{},"headers":[],"relativePath":"releases/24200.md","filePath":"releases/24200.md","lastUpdated":1694958663000}'),o={name:"releases/24200.md"},l=a('

    2022.3.1 Magisk v24.2

    Maintenance release fixing various issues.

    • [MagiskSU] Fix buffer overflow
    • [MagiskSU] Fix owner managed multiuser superuser settings
    • [MagiskSU] Fix command logging when using su -c <cmd>
    • [MagiskSU] Prevent su request indefinite blocking
    • [MagiskBoot] Support lz4_legacy archive with multiple magic
    • [MagiskBoot] Fix lz4_lg compression
    • [DenyList] Allow targeting processes running as system UID
    • [Zygisk] Workaround Samsung's "early zygote"
    • [Zygisk] Improved Zygisk loading mechanism
    • [Zygisk] Fix application UID tracking
    • [Zygisk] Fix improper umask being set in zygote
    • [App] Fix BusyBox execution test
    • [App] Improve stub loading mechanism
    • [App] Major app upgrade flow improvements
    • [General] Improve commandline error handling and messaging

    完整更新日志: 这里

    ',4),t=[l];function n(r,c,g,p,d,m){return i(),s("div",null,t)}const k=e(o,[["render",n]]);export{_ as __pageData,k as default}; diff --git a/assets/releases_24200.md.eab9d9d7.lean.js b/assets/releases_24200.md.eab9d9d7.lean.js new file mode 100644 index 00000000..50bec02e --- /dev/null +++ b/assets/releases_24200.md.eab9d9d7.lean.js @@ -0,0 +1 @@ +import{_ as e,o as i,c as s,Q as a}from"./chunks/framework.ed90c782.js";const _=JSON.parse('{"title":"2022.3.1 Magisk v24.2","description":"","frontmatter":{},"headers":[],"relativePath":"releases/24200.md","filePath":"releases/24200.md","lastUpdated":1694958663000}'),o={name:"releases/24200.md"},l=a("",4),t=[l];function n(r,c,g,p,d,m){return i(),s("div",null,t)}const k=e(o,[["render",n]]);export{_ as __pageData,k as default}; diff --git a/assets/releases_24300.md.3ff8f899.js b/assets/releases_24300.md.3ff8f899.js deleted file mode 100644 index 70c5a7f7..00000000 --- a/assets/releases_24300.md.3ff8f899.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as o,V as t}from"./chunks/framework.fc84ac3a.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/24300.md","filePath":"releases/24300.md","lastUpdated":1674222670000}'),l={name:"releases/24300.md"},s=t('

    2022.3.10 Magisk v24.3

    For those coming from v24.1, check the full changelog for changes introduced in v24.2.

    • [General] Stop using getrandom syscall
    • [Zygisk] Update API to v3, adding new fields to AppSpecializeArgs
    • [App] Improve app repackaging installation workflow

    Full Changelog: here

    ',4),r=[s];function i(n,c,h,d,_,g){return a(),o("div",null,r)}const u=e(l,[["render",i]]);export{m as __pageData,u as default}; diff --git a/assets/releases_24300.md.3ff8f899.lean.js b/assets/releases_24300.md.3ff8f899.lean.js deleted file mode 100644 index c7eb963b..00000000 --- a/assets/releases_24300.md.3ff8f899.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as o,V as t}from"./chunks/framework.fc84ac3a.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/24300.md","filePath":"releases/24300.md","lastUpdated":1674222670000}'),l={name:"releases/24300.md"},s=t("",4),r=[s];function i(n,c,h,d,_,g){return a(),o("div",null,r)}const u=e(l,[["render",i]]);export{m as __pageData,u as default}; diff --git a/assets/releases_24300.md.8db6782c.js b/assets/releases_24300.md.8db6782c.js new file mode 100644 index 00000000..efe1bdd6 --- /dev/null +++ b/assets/releases_24300.md.8db6782c.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as s}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"2022.3.10 Magisk v24.3","description":"","frontmatter":{},"headers":[],"relativePath":"releases/24300.md","filePath":"releases/24300.md","lastUpdated":1694958663000}'),o={name:"releases/24300.md"},i=s('

    2022.3.10 Magisk v24.3

    For those coming from v24.1, check the full changelog for changes introduced in v24.2.

    • [General] Stop using getrandom syscall
    • [Zygisk] Update API to v3, adding new fields to AppSpecializeArgs
    • [App] Improve app repackaging installation workflow

    完整更新日志: 这里

    ',4),r=[i];function n(l,c,_,d,p,g){return a(),t("div",null,r)}const f=e(o,[["render",n]]);export{m as __pageData,f as default}; diff --git a/assets/releases_24300.md.8db6782c.lean.js b/assets/releases_24300.md.8db6782c.lean.js new file mode 100644 index 00000000..dfeff370 --- /dev/null +++ b/assets/releases_24300.md.8db6782c.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as t,Q as s}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"2022.3.10 Magisk v24.3","description":"","frontmatter":{},"headers":[],"relativePath":"releases/24300.md","filePath":"releases/24300.md","lastUpdated":1694958663000}'),o={name:"releases/24300.md"},i=s("",4),r=[i];function n(l,c,_,d,p,g){return a(),t("div",null,r)}const f=e(o,[["render",n]]);export{m as __pageData,f as default}; diff --git a/assets/releases_25000.md.6c7ad114.js b/assets/releases_25000.md.6c7ad114.js deleted file mode 100644 index 4cbaf016..00000000 --- a/assets/releases_25000.md.6c7ad114.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as i}from"./chunks/framework.fc84ac3a.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/25000.md","filePath":"releases/25000.md","lastUpdated":1674222670000}'),o={name:"releases/25000.md"},s=i('

    2022.6.7 Magisk v25.0

    Another major release! A lot of the changes aren't visible at the surface, but v25 is actually a really substantial upgrade!

    MagiskInit Rewrite

    A significant portion of magiskinit (the critical software that runs before your device boots up) is completely rewritten from scratch. Ever since Android introduced Project Treble in Android 8.0, Magisk has been constantly fighting against the increasingly complex partitioning and early mount setups of all kinds of devices, sometimes with weird OEM specific implementations. It got to a point that magiskinit had become so complicated that few people (including myself!) were aware of every detail, and maintaining this piece of software like this was clearly not sustainable. After many months of planning (yes, this whole re-architecture has been in my head for a long time) and some help from external contributors, a whole new sepolicy injection mechanism is introduced into Magisk, solving the "SELinux Problem" once and for all.

    Since this is a full paradigm shift on how Magisk hot-patch the device at boot, several behaviors that many developers implicitly relied on might not exist. For example, Magisk no longer patches fstabs in most scenarios, which means AVB will remain intact; some custom kernels rely on AVB being stripped out for them by Magisk.

    MagiskSU Security Enhancements

    The superuser functionality of Magisk has not seen much changes ever since its introduction. v25 focuses on making root permission management more accurate and secure:

    • Add a whole new package tracking system to ensure malicious UID reuse attack cannot be performed
    • Properly support and implement the UX in the Magisk app for packages using sharedUserId
    • Enforce root manager APK signature verification to combat the rampant unofficial Magisk app "mods"

    Many might not realize, but using a trusted, unmodified Magisk app is really important. Magisk's root daemon treats the Magisk app differently and gives it blanket root access without any restrictions. A modded Magisk app can potentially backdoor your device.

    And in case some of you are about to put on your tin foil hats, this is not designed to "vendor lock-in"; the goal is to make sure your root management app comes from the same developer of the underlying root implementation. Magisk's build system allows custom distributors to use its own signing keys, and in addition, I am also providing official debug builds which skips any signature verification for development.

    Full Changelog: here

    ',11),n=[s];function r(l,c,h,d,m,u){return a(),t("div",null,n)}const f=e(o,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/releases_25000.md.6c7ad114.lean.js b/assets/releases_25000.md.6c7ad114.lean.js deleted file mode 100644 index 771525f5..00000000 --- a/assets/releases_25000.md.6c7ad114.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as i}from"./chunks/framework.fc84ac3a.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/25000.md","filePath":"releases/25000.md","lastUpdated":1674222670000}'),o={name:"releases/25000.md"},s=i("",11),n=[s];function r(l,c,h,d,m,u){return a(),t("div",null,n)}const f=e(o,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/releases_25000.md.a96540ec.js b/assets/releases_25000.md.a96540ec.js new file mode 100644 index 00000000..d337a288 --- /dev/null +++ b/assets/releases_25000.md.a96540ec.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.ed90c782.js";const g=JSON.parse('{"title":"2022.6.7 Magisk v25.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/25000.md","filePath":"releases/25000.md","lastUpdated":1694958663000}'),o={name:"releases/25000.md"},s=i('

    2022.6.7 Magisk v25.0

    Another major release! A lot of the changes aren't visible at the surface, but v25 is actually a really substantial upgrade!

    MagiskInit Rewrite

    A significant portion of magiskinit (the critical software that runs before your device boots up) is completely rewritten from scratch. Ever since Android introduced Project Treble in Android 8.0, Magisk has been constantly fighting against the increasingly complex partitioning and early mount setups of all kinds of devices, sometimes with weird OEM specific implementations. It got to a point that magiskinit had become so complicated that few people (including myself!) were aware of every detail, and maintaining this piece of software like this was clearly not sustainable. After many months of planning (yes, this whole re-architecture has been in my head for a long time) and some help from external contributors, a whole new sepolicy injection mechanism is introduced into Magisk, solving the "SELinux Problem" once and for all.

    Since this is a full paradigm shift on how Magisk hot-patch the device at boot, several behaviors that many developers implicitly relied on might not exist. For example, Magisk no longer patches fstabs in most scenarios, which means AVB will remain intact; some custom kernels rely on AVB being stripped out for them by Magisk.

    MagiskSU Security Enhancements

    The superuser functionality of Magisk has not seen much changes ever since its introduction. v25 focuses on making root permission management more accurate and secure:

    • Add a whole new package tracking system to ensure malicious UID reuse attack cannot be performed
    • Properly support and implement the UX in the Magisk app for packages using sharedUserId
    • Enforce root manager APK signature verification to combat the rampant unofficial Magisk app "mods"

    Many might not realize, but using a trusted, unmodified Magisk app is really important. Magisk's root daemon treats the Magisk app differently and gives it blanket root access without any restrictions. A modded Magisk app can potentially backdoor your device.

    And in case some of you are about to put on your tin foil hats, this is not designed to "vendor lock-in"; the goal is to make sure your root management app comes from the same developer of the underlying root implementation. Magisk's build system allows custom distributors to use its own signing keys, and in addition, I am also providing official debug builds which skips any signature verification for development.

    完整更新日志: 这里

    ',11),n=[s];function r(l,c,d,m,h,p){return t(),a("div",null,n)}const f=e(o,[["render",r]]);export{g as __pageData,f as default}; diff --git a/assets/releases_25000.md.a96540ec.lean.js b/assets/releases_25000.md.a96540ec.lean.js new file mode 100644 index 00000000..8788f05a --- /dev/null +++ b/assets/releases_25000.md.a96540ec.lean.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.ed90c782.js";const g=JSON.parse('{"title":"2022.6.7 Magisk v25.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/25000.md","filePath":"releases/25000.md","lastUpdated":1694958663000}'),o={name:"releases/25000.md"},s=i("",11),n=[s];function r(l,c,d,m,h,p){return t(),a("div",null,n)}const f=e(o,[["render",r]]);export{g as __pageData,f as default}; diff --git a/assets/releases_25100.md.16546601.js b/assets/releases_25100.md.16546601.js new file mode 100644 index 00000000..6a826c58 --- /dev/null +++ b/assets/releases_25100.md.16546601.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.ed90c782.js";const g=JSON.parse('{"title":"2022.6.19 Magisk v25.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/25100.md","filePath":"releases/25100.md","lastUpdated":1694958663000}'),o={name:"releases/25100.md"},s=i('

    2022.6.19 Magisk v25.1

    v25.1 fixes some minor bugs over v25.0. The following are the same as v25.0 release notes.

    Another major release! A lot of the changes aren't visible at the surface, but v25 is actually a really substantial upgrade!

    MagiskInit Rewrite

    A significant portion of magiskinit (the critical software that runs before your device boots up) is completely rewritten from scratch. Ever since Android introduced Project Treble in Android 8.0, Magisk has been constantly fighting against the increasingly complex partitioning and early mount setups of all kinds of devices, sometimes with weird OEM specific implementations. It got to a point that magiskinit had become so complicated that few people (including myself!) were aware of every detail, and maintaining this piece of software like this was clearly not sustainable. After many months of planning (yes, this whole re-architecture has been in my head for a long time) and some help from external contributors, a whole new sepolicy injection mechanism is introduced into Magisk, solving the "SELinux Problem" once and for all.

    Since this is a full paradigm shift on how Magisk hot-patch the device at boot, several behaviors that many developers implicitly relied on might not exist. For example, Magisk no longer patches fstabs in most scenarios, which means AVB will remain intact; some custom kernels rely on AVB being stripped out for them by Magisk.

    MagiskSU Security Enhancements

    The superuser functionality of Magisk has not seen much changes ever since its introduction. v25 focuses on making root permission management more accurate and secure:

    • Add a whole new package tracking system to ensure malicious UID reuse attack cannot be performed
    • Properly support and implement the UX in the Magisk app for packages using sharedUserId
    • Enforce root manager APK signature verification to combat the rampant unofficial Magisk app "mods"

    Many might not realize, but using a trusted, unmodified Magisk app is really important. Magisk's root daemon treats the Magisk app differently and gives it blanket root access without any restrictions. A modded Magisk app can potentially backdoor your device.

    And in case some of you are about to put on your tin foil hats, this is not designed to "vendor lock-in"; the goal is to make sure your root management app comes from the same developer of the underlying root implementation. Magisk's build system allows custom distributors to use its own signing keys, and in addition, I am also providing official debug builds which skips any signature verification for development.

    完整更新日志: 这里

    ',12),n=[s];function r(l,c,m,d,h,p){return t(),a("div",null,n)}const f=e(o,[["render",r]]);export{g as __pageData,f as default}; diff --git a/assets/releases_25100.md.16546601.lean.js b/assets/releases_25100.md.16546601.lean.js new file mode 100644 index 00000000..10056602 --- /dev/null +++ b/assets/releases_25100.md.16546601.lean.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as a,Q as i}from"./chunks/framework.ed90c782.js";const g=JSON.parse('{"title":"2022.6.19 Magisk v25.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/25100.md","filePath":"releases/25100.md","lastUpdated":1694958663000}'),o={name:"releases/25100.md"},s=i("",12),n=[s];function r(l,c,m,d,h,p){return t(),a("div",null,n)}const f=e(o,[["render",r]]);export{g as __pageData,f as default}; diff --git a/assets/releases_25100.md.7021edff.js b/assets/releases_25100.md.7021edff.js deleted file mode 100644 index 2bb7a73d..00000000 --- a/assets/releases_25100.md.7021edff.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as i}from"./chunks/framework.fc84ac3a.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/25100.md","filePath":"releases/25100.md","lastUpdated":1674222670000}'),o={name:"releases/25100.md"},s=i('

    2022.6.19 Magisk v25.1

    v25.1 fixes some minor bugs over v25.0. The following are the same as v25.0 release notes.

    Another major release! A lot of the changes aren't visible at the surface, but v25 is actually a really substantial upgrade!

    MagiskInit Rewrite

    A significant portion of magiskinit (the critical software that runs before your device boots up) is completely rewritten from scratch. Ever since Android introduced Project Treble in Android 8.0, Magisk has been constantly fighting against the increasingly complex partitioning and early mount setups of all kinds of devices, sometimes with weird OEM specific implementations. It got to a point that magiskinit had become so complicated that few people (including myself!) were aware of every detail, and maintaining this piece of software like this was clearly not sustainable. After many months of planning (yes, this whole re-architecture has been in my head for a long time) and some help from external contributors, a whole new sepolicy injection mechanism is introduced into Magisk, solving the "SELinux Problem" once and for all.

    Since this is a full paradigm shift on how Magisk hot-patch the device at boot, several behaviors that many developers implicitly relied on might not exist. For example, Magisk no longer patches fstabs in most scenarios, which means AVB will remain intact; some custom kernels rely on AVB being stripped out for them by Magisk.

    MagiskSU Security Enhancements

    The superuser functionality of Magisk has not seen much changes ever since its introduction. v25 focuses on making root permission management more accurate and secure:

    • Add a whole new package tracking system to ensure malicious UID reuse attack cannot be performed
    • Properly support and implement the UX in the Magisk app for packages using sharedUserId
    • Enforce root manager APK signature verification to combat the rampant unofficial Magisk app "mods"

    Many might not realize, but using a trusted, unmodified Magisk app is really important. Magisk's root daemon treats the Magisk app differently and gives it blanket root access without any restrictions. A modded Magisk app can potentially backdoor your device.

    And in case some of you are about to put on your tin foil hats, this is not designed to "vendor lock-in"; the goal is to make sure your root management app comes from the same developer of the underlying root implementation. Magisk's build system allows custom distributors to use its own signing keys, and in addition, I am also providing official debug builds which skips any signature verification for development.

    Full Changelog: here

    ',12),n=[s];function r(l,c,h,d,m,u){return a(),t("div",null,n)}const f=e(o,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/releases_25100.md.7021edff.lean.js b/assets/releases_25100.md.7021edff.lean.js deleted file mode 100644 index ca0ed9e4..00000000 --- a/assets/releases_25100.md.7021edff.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as i}from"./chunks/framework.fc84ac3a.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/25100.md","filePath":"releases/25100.md","lastUpdated":1674222670000}'),o={name:"releases/25100.md"},s=i("",12),n=[s];function r(l,c,h,d,m,u){return a(),t("div",null,n)}const f=e(o,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/releases_25200.md.1983de15.js b/assets/releases_25200.md.1983de15.js deleted file mode 100644 index 70c218af..00000000 --- a/assets/releases_25200.md.1983de15.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as i}from"./chunks/framework.fc84ac3a.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/25200.md","filePath":"releases/25200.md","lastUpdated":1674222670000}'),s={name:"releases/25200.md"},l=i('

    2022.7.20 Magisk v25.2

    Maintenance release fixing various issues.

    • [MagiskInit] Fix a potential issue when stub cpio is used
    • [MagiskInit] Fix reboot to recovery when stub cpio is used
    • [MagiskInit] Fix sepolicy.rules symlink for rootfs devices
    • [General] Better data encryption detection
    • [General] Move the whole logging infrastructure into Rust

    Full Changelog: here

    ',4),o=[l];function r(n,c,h,_,d,u){return a(),t("div",null,o)}const f=e(s,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/releases_25200.md.1983de15.lean.js b/assets/releases_25200.md.1983de15.lean.js deleted file mode 100644 index 7de968be..00000000 --- a/assets/releases_25200.md.1983de15.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o as a,c as t,V as i}from"./chunks/framework.fc84ac3a.js";const p=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/25200.md","filePath":"releases/25200.md","lastUpdated":1674222670000}'),s={name:"releases/25200.md"},l=i("",4),o=[l];function r(n,c,h,_,d,u){return a(),t("div",null,o)}const f=e(s,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/releases_25200.md.94a4189a.js b/assets/releases_25200.md.94a4189a.js new file mode 100644 index 00000000..ceeee400 --- /dev/null +++ b/assets/releases_25200.md.94a4189a.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as s,Q as i}from"./chunks/framework.ed90c782.js";const g=JSON.parse('{"title":"2022.7.20 Magisk v25.2","description":"","frontmatter":{},"headers":[],"relativePath":"releases/25200.md","filePath":"releases/25200.md","lastUpdated":1694958663000}'),a={name:"releases/25200.md"},o=i('

    2022.7.20 Magisk v25.2

    Maintenance release fixing various issues.

    • [MagiskInit] Fix a potential issue when stub cpio is used
    • [MagiskInit] Fix reboot to recovery when stub cpio is used
    • [MagiskInit] Fix sepolicy.rules symlink for rootfs devices
    • [General] Better data encryption detection
    • [General] Move the whole logging infrastructure into Rust

    完整更新日志: 这里

    ',4),n=[o];function r(l,c,_,d,p,u){return t(),s("div",null,n)}const m=e(a,[["render",r]]);export{g as __pageData,m as default}; diff --git a/assets/releases_25200.md.94a4189a.lean.js b/assets/releases_25200.md.94a4189a.lean.js new file mode 100644 index 00000000..8e0412fe --- /dev/null +++ b/assets/releases_25200.md.94a4189a.lean.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as s,Q as i}from"./chunks/framework.ed90c782.js";const g=JSON.parse('{"title":"2022.7.20 Magisk v25.2","description":"","frontmatter":{},"headers":[],"relativePath":"releases/25200.md","filePath":"releases/25200.md","lastUpdated":1694958663000}'),a={name:"releases/25200.md"},o=i("",4),n=[o];function r(l,c,_,d,p,u){return t(),s("div",null,n)}const m=e(a,[["render",r]]);export{g as __pageData,m as default}; diff --git a/assets/releases_26000.md.8ba36e0d.js b/assets/releases_26000.md.8ba36e0d.js new file mode 100644 index 00000000..9c70ad9f --- /dev/null +++ b/assets/releases_26000.md.8ba36e0d.js @@ -0,0 +1 @@ +import{_ as a,o as e,c as o,Q as i}from"./chunks/framework.ed90c782.js";const _=JSON.parse('{"title":"2023.4.5 Magisk v26.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/26000.md","filePath":"releases/26000.md","lastUpdated":1694964698000}'),r={name:"releases/26000.md"},s=i('

    2023.4.5 Magisk v26.0

    嘿!好久不见!

    将最低 Android 版本提升到6.0

    Magisk 对 Android Lollipop 的支持在不知不觉中已经中断了一段时间。此外,Magisk 的活跃开发者都没有运行 Android Lollipop 的实际硬件。我们依赖使用官方安卓模拟器对旧平台进行回归测试,但谷歌从未提供过支持 SELinux 的棒棒糖模拟器镜像,这让我们别无选择,只能放弃对棒棒糖的支持,因为在没有充分测试的情况下,我们不放心支持安卓棒棒糖。

    新的 Magic Mount 实现

    魔力挂载(Magic Mount)是一项能让模块修改分区的功能,现已进行了重大改写。现有实现无法很好地与使用 overlayfs 向系统注入覆盖层的 OEM 配合使用。新的实现方式从根本上改变了文件系统镜像的创建方式,为我们提供了未修改文件系统的更精确克隆。

    新的 sepolicy.rule 实现

    Magisk 允许模块通过包含 sepolicy.rule 文件来提供自定义 SELinux 补丁。由于 SELinux 补丁的复杂性,该功能的兼容性一直很不稳定;许多设备都不支持。在此版本中,我们设计了全新的启动前分区检测机制,以支持更多设备。由于复杂的原因,该检测机制无法在第三方 Recovery 环境中执行。

    这意味着使用第三方 Recovery 功能安装 Magisk v26+ 将是不完整的;需要在启动后通过 Magisk 应用程序重新安装。

    Zygisk 更新

    **新版 Zygisk API v4 现已上线!**它具有新功能和完善的 PLT 函数钩子 API。Zygisk 的实现也经历了一些重大的重构,包括新的代码加载/卸载机制和新的 PLT 函数钩子实现。

    前往 Zygisk 模块示例 仓库查看新的 API 和文档!

    完整更新日志: 这里

    ',13),t=[s];function n(l,c,d,p,h,g){return e(),o("div",null,t)}const k=a(r,[["render",n]]);export{_ as __pageData,k as default}; diff --git a/assets/releases_26000.md.8ba36e0d.lean.js b/assets/releases_26000.md.8ba36e0d.lean.js new file mode 100644 index 00000000..363fec6e --- /dev/null +++ b/assets/releases_26000.md.8ba36e0d.lean.js @@ -0,0 +1 @@ +import{_ as a,o as e,c as o,Q as i}from"./chunks/framework.ed90c782.js";const _=JSON.parse('{"title":"2023.4.5 Magisk v26.0","description":"","frontmatter":{},"headers":[],"relativePath":"releases/26000.md","filePath":"releases/26000.md","lastUpdated":1694964698000}'),r={name:"releases/26000.md"},s=i("",13),t=[s];function n(l,c,d,p,h,g){return e(),o("div",null,t)}const k=a(r,[["render",n]]);export{_ as __pageData,k as default}; diff --git a/assets/releases_26000.md.dc2422e5.js b/assets/releases_26000.md.dc2422e5.js deleted file mode 100644 index 6d2a8d4f..00000000 --- a/assets/releases_26000.md.dc2422e5.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o,c as t,V as a}from"./chunks/framework.fc84ac3a.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/26000.md","filePath":"releases/26000.md","lastUpdated":1681768747000}'),i={name:"releases/26000.md"},n=a('

    2023.4.5 Magisk v26.0

    Hey! Long time no see!

    Bumping Minimum Android Version to 6.0

    Magisk's support for Android Lollipop has been pretty broken for a while without it being noticed. Also, none of the active developers of Magisk have actual hardware to run Android Lollipop. We rely on using the official Android emulator for regression testing on older platforms, however Google never shipped a Lollipop emulator image with SELinux support, leaving us with no option but to drop Lollipop support since we don't feel comfortable supporting Android Lollipop without adequate testing.

    New Magic Mount Implementation

    Magic Mount, the feature that make modules modify partitions, has gone through a major rewrite. The existing implementation doesn't work well with OEMs injecting overlays into their system using overlayfs. The new implementation fundamentally changes how filesystem mirrors are created, giving us a more accurate clone of the unmodified filesystem.

    New sepolicy.rule Implementation

    Magisk allows modules to provide custom SELinux patches by including the file sepolicy.rule. Due to the complicated nature of SELinux patching, the compatibility of this functionality has been pretty spotty; many devices are not supported. In this release, a brand new pre-init partition detection mechanism has been designed to support even more devices. Due to complicated reasons, this detection mechanism cannot be performed in a custom recovery environment.

    This means that any installation of Magisk v26+ using custom recovery will be incomplete; a subsequent re-installation through the Magisk app after booting up is required.

    Zygisk Updates

    The new Zygisk API v4 is now live! It comes with new features and a refined PLT function hook API. The implementaton of Zygisk has also gone through some major refactoring, including new code loading/unloading mechanisms and a new PLT function hook implementation.

    Head over to the Zygisk Module Sample repository to check out the new API and documentation!

    Full Changelog: here

    ',13),r=[n];function s(l,h,m,p,d,u){return o(),t("div",null,r)}const f=e(i,[["render",s]]);export{g as __pageData,f as default}; diff --git a/assets/releases_26000.md.dc2422e5.lean.js b/assets/releases_26000.md.dc2422e5.lean.js deleted file mode 100644 index 6f3af254..00000000 --- a/assets/releases_26000.md.dc2422e5.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o,c as t,V as a}from"./chunks/framework.fc84ac3a.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/26000.md","filePath":"releases/26000.md","lastUpdated":1681768747000}'),i={name:"releases/26000.md"},n=a("",13),r=[n];function s(l,h,m,p,d,u){return o(),t("div",null,r)}const f=e(i,[["render",s]]);export{g as __pageData,f as default}; diff --git a/assets/releases_26100.md.3336cb75.js b/assets/releases_26100.md.3336cb75.js new file mode 100644 index 00000000..b21c7826 --- /dev/null +++ b/assets/releases_26100.md.3336cb75.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as i,Q as o}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"2023.4.11 Magisk v26.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/26100.md","filePath":"releases/26100.md","lastUpdated":1694964698000}'),r={name:"releases/26100.md"},s=o('

    2023.4.11 Magisk v26.1

    与 v26.0 相比的更改

    • [应用程序] 修复了撤销根权限时崩溃的问题
    • [MagiskInit] 在选择预初始化分区时,始终更喜欢 ext4 分区而不是 f2fs
    • [常规] 从镜像恢复模块文件的上下文/所有者/组。这是 v26.0 中引入的回归
    英文原版
    • [App] Fix crashing when revoking root permissions
    • [MagiskInit] Always prefer ext4 partitions over f2fs when selecting the pre-init partition
    • [General] Restore module files' context/owner/group from mirror. This is a regression introduced in v26.0

    (以下内容与 v26.0 发布说明相同)

    将最低 Android 版本提升到6.0

    Magisk 对 Android Lollipop 的支持在不知不觉中已经中断了一段时间。此外,Magisk 的活跃开发者都没有运行 Android Lollipop 的实际硬件。我们依赖使用官方安卓模拟器对旧平台进行回归测试,但谷歌从未提供过支持 SELinux 的棒棒糖模拟器镜像,这让我们别无选择,只能放弃对棒棒糖的支持,因为在没有充分测试的情况下,我们不放心支持安卓棒棒糖。

    新的 Magic Mount 实现

    魔力挂载(Magic Mount)是一项能让模块修改分区的功能,现已进行了重大改写。现有实现无法很好地与使用 overlayfs 向系统注入覆盖层的 OEM 配合使用。新的实现方式从根本上改变了文件系统镜像的创建方式,为我们提供了未修改文件系统的更精确克隆。

    新的 sepolicy.rule 实现

    Magisk 允许模块通过包含 sepolicy.rule 文件来提供自定义 SELinux 补丁。由于 SELinux 补丁的复杂性,该功能的兼容性一直很不稳定;许多设备都不支持。在此版本中,我们设计了全新的启动前分区检测机制,以支持更多设备。由于复杂的原因,该检测机制无法在第三方 Recovery 环境中执行。

    这意味着使用第三方 Recovery 功能安装 Magisk v26+ 将是不完整的;需要在启动后通过 Magisk 应用程序重新安装。

    Zygisk 更新

    **新版 Zygisk API v4 现已上线!**它具有新功能和完善的 PLT 函数钩子 API。Zygisk 的实现也经历了一些重大的重构,包括新的代码加载/卸载机制和新的 PLT 函数钩子实现。

    前往 Zygisk 模块示例 仓库查看新的 API 和文档!

    完整更新日志: 这里

    ',16),t=[s];function l(n,c,d,h,p,u){return a(),i("div",null,t)}const k=e(r,[["render",l]]);export{m as __pageData,k as default}; diff --git a/assets/releases_26100.md.3336cb75.lean.js b/assets/releases_26100.md.3336cb75.lean.js new file mode 100644 index 00000000..6f51a716 --- /dev/null +++ b/assets/releases_26100.md.3336cb75.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as i,Q as o}from"./chunks/framework.ed90c782.js";const m=JSON.parse('{"title":"2023.4.11 Magisk v26.1","description":"","frontmatter":{},"headers":[],"relativePath":"releases/26100.md","filePath":"releases/26100.md","lastUpdated":1694964698000}'),r={name:"releases/26100.md"},s=o("",16),t=[s];function l(n,c,d,h,p,u){return a(),i("div",null,t)}const k=e(r,[["render",l]]);export{m as __pageData,k as default}; diff --git a/assets/releases_26100.md.6724a4c6.js b/assets/releases_26100.md.6724a4c6.js deleted file mode 100644 index ab6a8142..00000000 --- a/assets/releases_26100.md.6724a4c6.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o,c as t,V as i}from"./chunks/framework.fc84ac3a.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/26100.md","filePath":"releases/26100.md","lastUpdated":1681768747000}'),a={name:"releases/26100.md"},n=i('

    2023.4.11 Magisk v26.1

    Changes from v26.0

    • [App] Fix crashing when revoking root permissions
    • [MagiskInit] Always prefer ext4 partitions over f2fs when selecting the pre-init partition
    • [General] Restore module files' context/owner/group from mirror. This is a regression introduced in v26.0

    (The following is the same as v26.0 release notes)

    Hey! Long time no see!

    Bumping Minimum Android Version to 6.0

    Magisk's support for Android Lollipop has been pretty broken for a while without it being noticed. Also, none of the active developers of Magisk have actual hardware to run Android Lollipop. We rely on using the official Android emulator for regression testing on older platforms, however Google never shipped a Lollipop emulator image with SELinux support, leaving us with no option but to drop Lollipop support since we don't feel comfortable supporting Android Lollipop without adequate testing.

    New Magic Mount Implementation

    Magic Mount, the feature that make modules modify partitions, has gone through a major rewrite. The existing implementation doesn't work well with OEMs injecting overlays into their system using overlayfs. The new implementation fundamentally changes how filesystem mirrors are created, giving us a more accurate clone of the unmodified filesystem.

    New sepolicy.rule Implementation

    Magisk allows modules to provide custom SELinux patches by including the file sepolicy.rule. Due to the complicated nature of SELinux patching, the compatibility of this functionality has been pretty spotty; many devices are not supported. In this release, a brand new pre-init partition detection mechanism has been designed to support even more devices. Due to complicated reasons, this detection mechanism cannot be performed in a custom recovery environment.

    This means that any installation of Magisk v26+ using custom recovery will be incomplete; a subsequent re-installation through the Magisk app after booting up is required.

    Zygisk Updates

    The new Zygisk API v4 is now live! It comes with new features and a refined PLT function hook API. The implementaton of Zygisk has also gone through some major refactoring, including new code loading/unloading mechanisms and a new PLT function hook implementation.

    Head over to the Zygisk Module Sample repository to check out the new API and documentation!

    Full Changelog: here

    ',16),r=[n];function s(l,h,m,p,d,c){return o(),t("div",null,r)}const f=e(a,[["render",s]]);export{g as __pageData,f as default}; diff --git a/assets/releases_26100.md.6724a4c6.lean.js b/assets/releases_26100.md.6724a4c6.lean.js deleted file mode 100644 index 7ab39f04..00000000 --- a/assets/releases_26100.md.6724a4c6.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,o,c as t,V as i}from"./chunks/framework.fc84ac3a.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"releases/26100.md","filePath":"releases/26100.md","lastUpdated":1681768747000}'),a={name:"releases/26100.md"},n=i("",16),r=[n];function s(l,h,m,p,d,c){return o(),t("div",null,r)}const f=e(a,[["render",s]]);export{g as __pageData,f as default}; diff --git a/assets/releases_26200.md.20898ea4.js b/assets/releases_26200.md.20898ea4.js new file mode 100644 index 00000000..e47e4f67 --- /dev/null +++ b/assets/releases_26200.md.20898ea4.js @@ -0,0 +1 @@ +import{_ as i,o as e,c as o,Q as t}from"./chunks/framework.ed90c782.js";const u=JSON.parse('{"title":"2023.8.27 Magisk v26.2","description":"","frontmatter":{},"headers":[],"relativePath":"releases/26200.md","filePath":"releases/26200.md","lastUpdated":1694958136000}'),l={name:"releases/26200.md"},a=t('

    2023.8.27 Magisk v26.2

    • [MagiskBoot] 支持从payload.bin中提取启动映像
    • [MagiskBoot] 支持包含字符文件的 cpio 文件
    • [MagiskBoot] 支持列出 cpio 内容
    • [MagiskBoot] 直接处理 AVB 1.0 签名和验证,无需通过 Java 实现
    • [守护进程] 使守护程序套接字成为 MAGISKTMP 中的固定路径
    • [resetprop] 支持打印属性上下文
    • [resetprop] 仅支持从存储中打印持久属性
    • [resetprop] 正确支持设置持久属性绕过 property_service
    • [MagiskSU] 支持 -g-G 选项
    • [MagiskSU] 支持使用 -t 将挂载命名空间切换到 PID
    • [MagiskPolicy] 修复修补扩展权限
    • [MagiskPolicy] 支持更多语法以获得扩展权限
    • [MagiskPolicy] 支持打印加载的 sepolicy 规则
    • [应用程序] 支持从 ROM 压缩包修补启动映像
    • [应用程序] 使用 init_boot.img 修补三星固件时正确保留 boot.img
    英文原版
    • [MagiskBoot] Support extracting boot image from payload.bin
    • [MagiskBoot] Support cpio files containing character files
    • [MagiskBoot] Support listing cpio content
    • [MagiskBoot] Directly handle AVB 1.0 signing and verification without going through Java implementation
    • [Daemon] Make daemon socket a fixed path in MAGISKTMP
    • [resetprop] Support printing property context
    • [resetprop] Support only printing persistent properties from storage
    • [resetprop] Properly support setting persistent properties bypassing property_service
    • [MagiskSU] Support -g and -G options
    • [MagiskSU] Support switching mount namespace to PID with -t
    • [MagiskPolicy] Fix patching extended permissions
    • [MagiskPolicy] Support more syntax for extended permissions
    • [MagiskPolicy] Support printing out the loaded sepolicy rules
    • [App] Support patching boot image from ROM zips
    • [App] Properly preserve boot.img when patching Samsung firmware with init_boot.img

    完整更新日志: 这里

    ',4),s=[a];function r(p,c,n,d,g,m){return e(),o("div",null,s)}const k=i(l,[["render",r]]);export{u as __pageData,k as default}; diff --git a/assets/releases_26200.md.20898ea4.lean.js b/assets/releases_26200.md.20898ea4.lean.js new file mode 100644 index 00000000..a50962ec --- /dev/null +++ b/assets/releases_26200.md.20898ea4.lean.js @@ -0,0 +1 @@ +import{_ as i,o as e,c as o,Q as t}from"./chunks/framework.ed90c782.js";const u=JSON.parse('{"title":"2023.8.27 Magisk v26.2","description":"","frontmatter":{},"headers":[],"relativePath":"releases/26200.md","filePath":"releases/26200.md","lastUpdated":1694958136000}'),l={name:"releases/26200.md"},a=t("",4),s=[a];function r(p,c,n,d,g,m){return e(),o("div",null,s)}const k=i(l,[["render",r]]);export{u as __pageData,k as default}; diff --git a/assets/releases_26300.md.7a9b8346.js b/assets/releases_26300.md.7a9b8346.js new file mode 100644 index 00000000..52efea50 --- /dev/null +++ b/assets/releases_26300.md.7a9b8346.js @@ -0,0 +1 @@ +import{_ as i,o as e,c as o,Q as t}from"./chunks/framework.ed90c782.js";const h=JSON.parse('{"title":"2023.9.4 Magisk v26.3","description":"","frontmatter":{},"headers":[],"relativePath":"releases/26300.md","filePath":"releases/26300.md","lastUpdated":1694959570000}'),l={name:"releases/26300.md"},a=t('

    2023.9.4 Magisk v26.3

    v26.3

    • [常规] 修复设备信息检测脚本
    • [常规] 将 BusyBox 更新到 1.36.1
    • [常规] 更新工具链,生成损坏的 arm32 可执行文件
    • [应用] 修复根服务无法绑定一加设备的问题
    英文原版
    • [General] Fix device information detection script
    • [General] Update BusyBox to 1.36.1
    • [General] Update toolchain that produces broken arm32 executables
    • [App] Fix root service unable to bind on OnePlus devices

    v26.2

    • [MagiskBoot] 支持从payload.bin中提取启动映像
    • [MagiskBoot] 支持包含字符文件的 cpio 文件
    • [MagiskBoot] 支持列出 cpio 内容
    • [MagiskBoot] 直接处理 AVB 1.0 签名和验证,无需通过 Java 实现
    • [守护进程] 使守护程序套接字成为 MAGISKTMP 中的固定路径
    • [resetprop] 支持打印属性上下文
    • [resetprop] 仅支持从存储中打印持久属性
    • [resetprop] 正确支持设置持久属性绕过 property_service
    • [MagiskSU] 支持 -g-G 选项
    • [MagiskSU] 支持使用 -t 将挂载命名空间切换到 PID
    • [MagiskPolicy] 修复修补扩展权限
    • [MagiskPolicy] 支持更多语法以获得扩展权限
    • [MagiskPolicy] 支持打印加载的 sepolicy 规则
    • [应用程序] 支持从 ROM 压缩包修补启动映像
    • [应用程序] 使用 init_boot.img 修补三星固件时正确保留 boot.img
    英文原版
    • [MagiskBoot] Support extracting boot image from payload.bin
    • [MagiskBoot] Support cpio files containing character files
    • [MagiskBoot] Support listing cpio content
    • [MagiskBoot] Directly handle AVB 1.0 signing and verification without going through Java implementation
    • [Daemon] Make daemon socket a fixed path in MAGISKTMP
    • [resetprop] Support printing property context
    • [resetprop] Support only printing persistent properties from storage
    • [resetprop] Properly support setting persistent properties bypassing property_service
    • [MagiskSU] Support -g and -G options
    • [MagiskSU] Support switching mount namespace to PID with -t
    • [MagiskPolicy] Fix patching extended permissions
    • [MagiskPolicy] Support more syntax for extended permissions
    • [MagiskPolicy] Support printing out the loaded sepolicy rules
    • [App] Support patching boot image from ROM zips
    • [App] Properly preserve boot.img when patching Samsung firmware with init_boot.img

    完整更新日志: 这里

    ',8),s=[a];function r(p,c,n,d,g,m){return e(),o("div",null,s)}const k=i(l,[["render",r]]);export{h as __pageData,k as default}; diff --git a/assets/releases_26300.md.7a9b8346.lean.js b/assets/releases_26300.md.7a9b8346.lean.js new file mode 100644 index 00000000..f7c8ab1d --- /dev/null +++ b/assets/releases_26300.md.7a9b8346.lean.js @@ -0,0 +1 @@ +import{_ as i,o as e,c as o,Q as t}from"./chunks/framework.ed90c782.js";const h=JSON.parse('{"title":"2023.9.4 Magisk v26.3","description":"","frontmatter":{},"headers":[],"relativePath":"releases/26300.md","filePath":"releases/26300.md","lastUpdated":1694959570000}'),l={name:"releases/26300.md"},a=t("",8),s=[a];function r(p,c,n,d,g,m){return e(),o("div",null,s)}const k=i(l,[["render",r]]);export{h as __pageData,k as default}; diff --git a/assets/releases_index.md.2825e5f5.js b/assets/releases_index.md.2825e5f5.js new file mode 100644 index 00000000..94261dc6 --- /dev/null +++ b/assets/releases_index.md.2825e5f5.js @@ -0,0 +1 @@ +import{_ as a,o as l,c as e,Q as i}from"./chunks/framework.ed90c782.js";const d=JSON.parse('{"title":"发布日志","description":"","frontmatter":{},"headers":[],"relativePath":"releases/index.md","filePath":"releases/index.md","lastUpdated":1694959570000}'),h={name:"releases/index.md"},t=i('

    发布日志


    其他日志

    参考链接

    ',8),r=[t];function s(m,f,n,o,v,c){return l(),e("div",null,r)}const u=a(h,[["render",s]]);export{d as __pageData,u as default}; diff --git a/assets/releases_index.md.b47a879f.lean.js b/assets/releases_index.md.2825e5f5.lean.js similarity index 54% rename from assets/releases_index.md.b47a879f.lean.js rename to assets/releases_index.md.2825e5f5.lean.js index ecb94335..a897956a 100644 --- a/assets/releases_index.md.b47a879f.lean.js +++ b/assets/releases_index.md.2825e5f5.lean.js @@ -1 +1 @@ -import{_ as a,o as l,c as e,V as i}from"./chunks/framework.fc84ac3a.js";const d=JSON.parse('{"title":"发布日志","description":"","frontmatter":{},"headers":[],"relativePath":"releases/index.md","filePath":"releases/index.md","lastUpdated":1681768747000}'),h={name:"releases/index.md"},t=i("",8),r=[t];function s(m,f,n,o,v,c){return l(),e("div",null,r)}const u=a(h,[["render",s]]);export{d as __pageData,u as default}; +import{_ as a,o as l,c as e,Q as i}from"./chunks/framework.ed90c782.js";const d=JSON.parse('{"title":"发布日志","description":"","frontmatter":{},"headers":[],"relativePath":"releases/index.md","filePath":"releases/index.md","lastUpdated":1694959570000}'),h={name:"releases/index.md"},t=i("",8),r=[t];function s(m,f,n,o,v,c){return l(),e("div",null,r)}const u=a(h,[["render",s]]);export{d as __pageData,u as default}; diff --git a/assets/releases_index.md.b47a879f.js b/assets/releases_index.md.b47a879f.js deleted file mode 100644 index 8fbcac75..00000000 --- a/assets/releases_index.md.b47a879f.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as a,o as l,c as e,V as i}from"./chunks/framework.fc84ac3a.js";const d=JSON.parse('{"title":"发布日志","description":"","frontmatter":{},"headers":[],"relativePath":"releases/index.md","filePath":"releases/index.md","lastUpdated":1681768747000}'),h={name:"releases/index.md"},t=i('

    发布日志


    其他日志

    参考链接

    ',8),r=[t];function s(m,f,n,o,v,c){return l(),e("div",null,r)}const u=a(h,[["render",s]]);export{d as __pageData,u as default}; diff --git a/assets/style.645eff1b.css b/assets/style.645eff1b.css deleted file mode 100644 index 12c46b55..00000000 --- a/assets/style.645eff1b.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/MagiskChineseDocument/assets/inter-roman-cyrillic.5f2c6c8c.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/MagiskChineseDocument/assets/inter-roman-cyrillic-ext.e75737ce.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 var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/MagiskChineseDocument/assets/inter-roman-greek.d5a6d92a.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/MagiskChineseDocument/assets/inter-roman-greek-ext.ab0619bc.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/MagiskChineseDocument/assets/inter-roman-latin.2ed14f66.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,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 var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/MagiskChineseDocument/assets/inter-roman-latin-ext.0030eebd.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/MagiskChineseDocument/assets/inter-roman-vietnamese.14ce25a6.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/MagiskChineseDocument/assets/inter-italic-cyrillic.ea42a392.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/MagiskChineseDocument/assets/inter-italic-cyrillic-ext.33bd5a8e.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 var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/MagiskChineseDocument/assets/inter-italic-greek.8f4463c4.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/MagiskChineseDocument/assets/inter-italic-greek-ext.4fbe9427.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/MagiskChineseDocument/assets/inter-italic-latin.bd3b6f56.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,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 var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/MagiskChineseDocument/assets/inter-italic-latin-ext.bd8920cc.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/MagiskChineseDocument/assets/inter-italic-vietnamese.6ce511fb.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Chinese Quotes;src:local("PingFang SC Regular"),local("PingFang SC"),local("SimHei"),local("Source Han Sans SC");unicode-range:U+2018,U+2019,U+201C,U+201D}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-gray: #8e8e93;--vp-c-text-light-1: rgba(60, 60, 67);--vp-c-text-light-2: rgba(60, 60, 67, .75);--vp-c-text-light-3: rgba(60, 60, 67, .33);--vp-c-text-dark-1: rgba(255, 255, 245, .86);--vp-c-text-dark-2: rgba(235, 235, 245, .6);--vp-c-text-dark-3: rgba(235, 235, 245, .38);--vp-c-green: #10b981;--vp-c-green-light: #34d399;--vp-c-green-lighter: #6ee7b7;--vp-c-green-dark: #059669;--vp-c-green-darker: #047857;--vp-c-green-dimm-1: rgba(16, 185, 129, .05);--vp-c-green-dimm-2: rgba(16, 185, 129, .2);--vp-c-green-dimm-3: rgba(16, 185, 129, .5);--vp-c-yellow: #d97706;--vp-c-yellow-light: #f59e0b;--vp-c-yellow-lighter: #fbbf24;--vp-c-yellow-dark: #b45309;--vp-c-yellow-darker: #92400e;--vp-c-yellow-dimm-1: rgba(234, 179, 8, .05);--vp-c-yellow-dimm-2: rgba(234, 179, 8, .2);--vp-c-yellow-dimm-3: rgba(234, 179, 8, .5);--vp-c-red: #f43f5e;--vp-c-red-light: #fb7185;--vp-c-red-lighter: #fda4af;--vp-c-red-dark: #e11d48;--vp-c-red-darker: #be123c;--vp-c-red-dimm-1: rgba(244, 63, 94, .05);--vp-c-red-dimm-2: rgba(244, 63, 94, .2);--vp-c-red-dimm-3: rgba(244, 63, 94, .5);--vp-c-sponsor: #db2777}:root{--vp-c-bg: #ffffff;--vp-c-bg-elv: #ffffff;--vp-c-bg-elv-up: #ffffff;--vp-c-bg-elv-down: #f6f6f7;--vp-c-bg-elv-mute: #f6f6f7;--vp-c-bg-soft: #f6f6f7;--vp-c-bg-soft-up: #f9f9fa;--vp-c-bg-soft-down: #e3e3e5;--vp-c-bg-soft-mute: #e3e3e5;--vp-c-bg-alt: #f6f6f7;--vp-c-border: rgba(60, 60, 67, .29);--vp-c-divider: rgba(60, 60, 67, .12);--vp-c-gutter: rgba(60, 60, 67, .12);--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white);--vp-c-text-1: var(--vp-c-text-light-1);--vp-c-text-2: var(--vp-c-text-light-2);--vp-c-text-3: var(--vp-c-text-light-3);--vp-c-text-inverse-1: var(--vp-c-text-dark-1);--vp-c-text-inverse-2: var(--vp-c-text-dark-2);--vp-c-text-inverse-3: var(--vp-c-text-dark-3);--vp-c-text-code: #476582;--vp-c-brand: var(--vp-c-green);--vp-c-brand-light: var(--vp-c-green-light);--vp-c-brand-lighter: var(--vp-c-green-lighter);--vp-c-brand-dark: var(--vp-c-green-dark);--vp-c-brand-darker: var(--vp-c-green-darker);--vp-c-mute: #f6f6f7;--vp-c-mute-light: #f9f9fc;--vp-c-mute-lighter: #ffffff;--vp-c-mute-dark: #e3e3e5;--vp-c-mute-darker: #d7d7d9}.dark{--vp-c-bg: #1e1e20;--vp-c-bg-elv: #252529;--vp-c-bg-elv-up: #313136;--vp-c-bg-elv-down: #1e1e20;--vp-c-bg-elv-mute: #313136;--vp-c-bg-soft: #252529;--vp-c-bg-soft-up: #313136;--vp-c-bg-soft-down: #1e1e20;--vp-c-bg-soft-mute: #313136;--vp-c-bg-alt: #161618;--vp-c-border: rgba(82, 82, 89, .68);--vp-c-divider: rgba(82, 82, 89, .32);--vp-c-gutter: #000000;--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black);--vp-c-text-1: var(--vp-c-text-dark-1);--vp-c-text-2: var(--vp-c-text-dark-2);--vp-c-text-3: var(--vp-c-text-dark-3);--vp-c-text-inverse-1: var(--vp-c-text-light-1);--vp-c-text-inverse-2: var(--vp-c-text-light-2);--vp-c-text-inverse-3: var(--vp-c-text-light-3);--vp-c-text-code: #c9def1;--vp-c-mute: #313136;--vp-c-mute-light: #3a3a3c;--vp-c-mute-lighter: #505053;--vp-c-mute-dark: #2c2c30;--vp-c-mute-darker: #252529}:root{--vp-font-family-base: "Chinese Quotes", "Inter var", "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}: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-local-nav: 10;--vp-z-index-nav: 20;--vp-z-index-layout-top: 30;--vp-z-index-backdrop: 40;--vp-z-index-sidebar: 50;--vp-z-index-footer: 60}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E")}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-c-code-dimm: var(--vp-c-text-dark-3);--vp-code-block-color: var(--vp-c-text-dark-1);--vp-code-block-bg: #292b30;--vp-code-block-bg-light: #1e1e20;--vp-code-block-divider-color: #000000;--vp-code-line-highlight-color: rgba(0, 0, 0, .5);--vp-code-line-number-color: var(--vp-c-code-dimm);--vp-code-line-diff-add-color: var(--vp-c-green-dimm-2);--vp-code-line-diff-add-symbol-color: var(--vp-c-green);--vp-code-line-diff-remove-color: var(--vp-c-red-dimm-2);--vp-code-line-diff-remove-symbol-color: var(--vp-c-red);--vp-code-line-warning-color: var(--vp-c-yellow-dimm-2);--vp-code-line-error-color: var(--vp-c-red-dimm-2);--vp-code-copy-code-border-color: transparent;--vp-code-copy-code-bg: var(--vp-code-block-bg-light);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-code-block-bg-light);--vp-code-copy-code-active-text: var(--vp-c-text-dark-2);--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-dark-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-dark-1);--vp-code-tab-active-text-color: var(--vp-c-text-dark-1);--vp-code-tab-active-bar-color: var(--vp-c-brand)}.dark{--vp-code-block-bg: #161618}:root:not(.dark) .vp-adaptive-theme{--vp-c-code-dimm: var(--vp-c-text-2);--vp-code-block-color: var(--vp-c-text-1);--vp-code-block-bg: #f8f8f8;--vp-code-block-divider-color: var(--vp-c-divider);--vp-code-line-highlight-color: #ececec;--vp-code-line-number-color: var(--vp-c-code-dimm);--vp-code-copy-code-bg: #e2e2e2;--vp-code-copy-code-hover-bg: #dcdcdc;--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-tab-divider: var(--vp-c-divider);--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)}:root{--vp-button-brand-border: var(--vp-c-brand-lighter);--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand);--vp-button-brand-hover-border: var(--vp-c-brand-lighter);--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-dark);--vp-button-brand-active-border: var(--vp-c-brand-lighter);--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-darker);--vp-button-alt-border: var(--vp-c-border);--vp-button-alt-text: var(--vp-c-neutral);--vp-button-alt-bg: var(--vp-c-mute);--vp-button-alt-hover-border: var(--vp-c-border);--vp-button-alt-hover-text: var(--vp-c-neutral);--vp-button-alt-hover-bg: var(--vp-c-mute-dark);--vp-button-alt-active-border: var(--vp-c-border);--vp-button-alt-active-text: var(--vp-c-neutral);--vp-button-alt-active-bg: var(--vp-c-mute-darker);--vp-button-sponsor-border: var(--vp-c-gray-light-3);--vp-button-sponsor-text: var(--vp-c-text-light-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}.dark{--vp-button-sponsor-border: var(--vp-c-gray-dark-1);--vp-button-sponsor-text: var(--vp-c-text-dark-2)}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: var(--vp-c-border);--vp-custom-block-info-text: var(--vp-c-text-2);--vp-custom-block-info-bg: var(--vp-c-bg-soft-up);--vp-custom-block-info-code-bg: var(--vp-c-bg-soft);--vp-custom-block-tip-border: var(--vp-c-green);--vp-custom-block-tip-text: var(--vp-c-green-dark);--vp-custom-block-tip-bg: var(--vp-c-bg-soft-up);--vp-custom-block-tip-code-bg: var(--vp-c-bg-soft);--vp-custom-block-warning-border: var(--vp-c-yellow);--vp-custom-block-warning-text: var(--vp-c-yellow);--vp-custom-block-warning-bg: var(--vp-c-bg-soft-up);--vp-custom-block-warning-code-bg: var(--vp-c-bg-soft);--vp-custom-block-danger-border: var(--vp-c-red);--vp-custom-block-danger-text: var(--vp-c-red);--vp-custom-block-danger-bg: var(--vp-c-bg-soft-up);--vp-custom-block-danger-code-bg: var(--vp-c-bg-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-details-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-hover-border-color: var(--vp-c-gray);--vp-input-switch-bg-color: var(--vp-c-mute)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg)}: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);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: var(--vp-c-border);--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-bg-soft-up);--vp-badge-tip-border: var(--vp-c-green-dark);--vp-badge-tip-text: var(--vp-c-green);--vp-badge-tip-bg: var(--vp-c-green-dimm-1);--vp-badge-warning-border: var(--vp-c-yellow-dark);--vp-badge-warning-text: var(--vp-c-yellow);--vp-badge-warning-bg: var(--vp-c-yellow-dimm-1);--vp-badge-danger-border: var(--vp-c-red-dark);--vp-badge-danger-text: var(--vp-c-red);--vp-badge-danger-bg: var(--vp-c-red-dimm-1)}: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);--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);--vp-local-search-highlight-bg: var(--vp-c-green-lighter);--vp-local-search-highlight-text: var(--vp-c-black)}*,: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);direction:ltr;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}.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.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.custom-block.info code{background-color:var(--vp-custom-block-info-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 code{background-color:var(--vp-custom-block-tip-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 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 code{background-color:var(--vp-custom-block-danger-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 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}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600}.custom-block a:hover{text-decoration:underline}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.dark .vp-code-light{display:none}html:not(.dark) .vp-code-dark{display:none}.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}.vp-code-group .tabs:after{position:absolute;right:0;bottom:0;left:0;height:1px;background-color:var(--vp-code-tab-divider);content:""}@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:absolute;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:10;height:1px;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-]{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{display:block}.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 .header-anchor{float:left;margin-left:-.87em;padding-right:.23em;font-weight:500;user-select:none;opacity:0;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 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}.vp-doc blockquote>p{margin:0;font-size:16px;color:var(--vp-c-text-2);transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand);text-decoration-style:dotted;transition:color .25s}.vp-doc a:hover{text-decoration:underline}.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{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 a{color:inherit;font-weight:600}.vp-doc .custom-block a:hover{text-decoration:underline}.vp-doc .custom-block code{font-size:var(--vp-custom-block-code-font-size);font-weight:700;color:inherit}.vp-doc .custom-block div[class*=language-]{margin:8px 0}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;color:var(--vp-c-text-code);background-color:var(--vp-c-mute);transition:color .5s,background-color .5s}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code{font-size:.9em}.vp-doc a>code{color:var(--vp-c-brand);transition:color .25s}.vp-doc a:hover>code{color:var(--vp-c-brand-dark)}.vp-doc div[class*=language-]{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-]{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;left:-65px;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;width:64px;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:"Copied"}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-c-code-dimm);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}.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-bottom:4px;text-align:center;letter-spacing:1px;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-bg-soft-down)}.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[data-v-ce917cfb]{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:10px;padding:0 8px;line-height:18px;font-size:12px;font-weight:600;transform:translateY(-2px)}h1 .VPBadge[data-v-ce917cfb],h2 .VPBadge[data-v-ce917cfb],h3 .VPBadge[data-v-ce917cfb],h4 .VPBadge[data-v-ce917cfb],h5 .VPBadge[data-v-ce917cfb],h6 .VPBadge[data-v-ce917cfb]{vertical-align:top}h2 .VPBadge[data-v-ce917cfb]{border-radius:11px;line-height:20px}.VPBadge.info[data-v-ce917cfb]{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip[data-v-ce917cfb]{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning[data-v-ce917cfb]{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger[data-v-ce917cfb]{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPSkipLink[data-v-73e3a132]{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);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-73e3a132]:focus{height:auto;width:auto;clip:auto;clip-path:none}.dark .VPSkipLink[data-v-73e3a132]{color:var(--vp-c-green)}@media (min-width: 1280px){.VPSkipLink[data-v-73e3a132]{top:14px;left:16px}}.VPBackdrop[data-v-54a304ca]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-54a304ca],.VPBackdrop.fade-leave-to[data-v-54a304ca]{opacity:0}.VPBackdrop.fade-leave-active[data-v-54a304ca]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-54a304ca]{display:none}}html:not(.dark) .VPImage.dark[data-v-dc109a54]{display:none}.dark .VPImage.light[data-v-dc109a54]{display:none}.title[data-v-1ab7b21f]{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}.title[data-v-1ab7b21f]:hover{opacity:.6}@media (min-width: 960px){.title[data-v-1ab7b21f]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-1ab7b21f]{border-bottom-color:var(--vp-c-divider)}}[data-v-1ab7b21f] .logo{margin-right:8px;height:24px}/*! @docsearch/css 3.3.4 | 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-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-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;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}@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{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{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;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;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;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{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:rgba(0,0,0,.2);transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);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{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;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}@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{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;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.DocSearch{--docsearch-primary-color: var(--vp-c-brand);--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-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 .DocSearch{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-bg-soft-mute);--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:32px;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: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);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:1px;letter-spacing:-12px;color:transparent}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:var(--vp-meta-key);font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.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);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-bg-soft-mute)}.DocSearch-Screen-Icon>svg{margin:auto}.icon[data-v-f3ed0000]{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;fill:var(--vp-c-text-3);transition:fill .25s;flex-shrink:0}.VPNavBarMenuLink[data-v-b7aed9c7]{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-b7aed9c7],.VPNavBarMenuLink[data-v-b7aed9c7]:hover{color:var(--vp-c-brand)}.VPMenuGroup+.VPMenuLink[data-v-fd8d5e7a]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-fd8d5e7a]{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-fd8d5e7a]:hover{color:var(--vp-c-brand);background-color:var(--vp-c-bg-elv-mute)}.link.active[data-v-fd8d5e7a]{color:var(--vp-c-brand)}.VPMenuGroup[data-v-a6b0397c]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-a6b0397c]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-a6b0397c]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-a6b0397c]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-e42ed9b3]{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-e42ed9b3] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-e42ed9b3] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-e42ed9b3] .group:last-child{padding-bottom:0}.VPMenu[data-v-e42ed9b3] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-e42ed9b3] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-e42ed9b3] .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-e42ed9b3] .action{padding-left:24px}.VPFlyout[data-v-6afe904b]{position:relative}.VPFlyout[data-v-6afe904b]:hover{color:var(--vp-c-brand);transition:color .25s}.VPFlyout:hover .text[data-v-6afe904b]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-6afe904b]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-6afe904b]{color:var(--vp-c-brand)}.VPFlyout.active:hover .text[data-v-6afe904b]{color:var(--vp-c-brand-dark)}.VPFlyout:hover .menu[data-v-6afe904b],.button[aria-expanded=true]+.menu[data-v-6afe904b]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-6afe904b]{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-6afe904b]{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-6afe904b]{margin-right:0;width:16px;height:16px;fill:currentColor}.text-icon[data-v-6afe904b]{margin-left:4px;width:14px;height:14px;fill:currentColor}.icon[data-v-6afe904b]{width:20px;height:20px;fill:currentColor;transition:fill .25s}.menu[data-v-6afe904b]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPNavBarMenu[data-v-f732b5d0]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-f732b5d0]{display:flex}}.VPNavBarTranslations[data-v-ff4524ae]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-ff4524ae]{display:flex;align-items:center}}.title[data-v-ff4524ae]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPSwitch[data-v-92d8f6fb]{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}.VPSwitch[data-v-92d8f6fb]:hover{border-color:var(--vp-input-hover-border-color)}.check[data-v-92d8f6fb]{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}.icon[data-v-92d8f6fb]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-92d8f6fb] svg{position:absolute;top:3px;left:3px;width:12px;height:12px;fill:var(--vp-c-text-2)}.dark .icon[data-v-92d8f6fb] svg{fill:var(--vp-c-text-1);transition:opacity .25s}.sun[data-v-67878c63]{opacity:1}.moon[data-v-67878c63],.dark .sun[data-v-67878c63]{opacity:0}.dark .moon[data-v-67878c63]{opacity:1}.dark .VPSwitchAppearance[data-v-67878c63] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-5e9f0637]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-5e9f0637]{display:flex;align-items:center}}.VPSocialLink[data-v-dbecf575]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-dbecf575]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-dbecf575]>svg{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-b8f6762d]{display:flex;flex-wrap:wrap;justify-content:center}.VPNavBarSocialLinks[data-v-ef6192dc]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-ef6192dc]{display:flex;align-items:center}}.VPNavBarExtra[data-v-c8c2ae4b]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-c8c2ae4b]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-c8c2ae4b]{display:none}}.trans-title[data-v-c8c2ae4b]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-c8c2ae4b],.item.social-links[data-v-c8c2ae4b]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-c8c2ae4b]{min-width:176px}.appearance-action[data-v-c8c2ae4b]{margin-right:-2px}.social-links-list[data-v-c8c2ae4b]{margin:-4px -8px}.VPNavBarHamburger[data-v-6bee1efd]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-6bee1efd]{display:none}}.container[data-v-6bee1efd]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-6bee1efd]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-6bee1efd]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-6bee1efd],.VPNavBarHamburger.active:hover .middle[data-v-6bee1efd],.VPNavBarHamburger.active:hover .bottom[data-v-6bee1efd]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-6bee1efd],.middle[data-v-6bee1efd],.bottom[data-v-6bee1efd]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-6bee1efd]{top:0;left:0;transform:translate(0)}.middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(4px)}.VPNavBar[data-v-c388e33c]{position:relative;border-bottom:1px solid transparent;padding:0 8px 0 24px;height:var(--vp-nav-height);transition:border-color .5s,background-color .5s;pointer-events:none;white-space:nowrap}.VPNavBar.has-sidebar[data-v-c388e33c]{border-bottom-color:var(--vp-c-gutter)}@media (min-width: 768px){.VPNavBar[data-v-c388e33c]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar[data-v-c388e33c]{border-bottom-color:transparent;padding:0}.VPNavBar.fill[data-v-c388e33c]:not(.has-sidebar){border-bottom-color:var(--vp-c-gutter);background-color:var(--vp-nav-bg-color)}}.container[data-v-c388e33c]{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-c388e33c],.container>.content[data-v-c388e33c]{pointer-events:none}.container[data-v-c388e33c] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-c388e33c]{max-width:100%}}.title[data-v-c388e33c]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-c388e33c]{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-c388e33c]{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-c388e33c]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-c388e33c]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-c388e33c]{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-c388e33c]{display:flex;justify-content:flex-end;align-items:center;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .content-body[data-v-c388e33c],.VPNavBar.fill .content-body[data-v-c388e33c]{position:relative;background-color:var(--vp-nav-bg-color)}}.menu+.translations[data-v-c388e33c]:before,.menu+.appearance[data-v-c388e33c]:before,.menu+.social-links[data-v-c388e33c]:before,.translations+.appearance[data-v-c388e33c]:before,.appearance+.social-links[data-v-c388e33c]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-c388e33c]:before,.translations+.appearance[data-v-c388e33c]:before{margin-right:16px}.appearance+.social-links[data-v-c388e33c]:before{margin-left:16px}.social-links[data-v-c388e33c]{margin-right:-8px}@media (min-width: 960px){.VPNavBar.has-sidebar .curtain[data-v-c388e33c]{position:absolute;right:0;bottom:-31px;width:calc(100% - var(--vp-sidebar-width));height:32px}.VPNavBar.has-sidebar .curtain[data-v-c388e33c]:before{display:block;width:100%;height:32px;background:linear-gradient(var(--vp-c-bg),transparent 70%);content:""}}@media (min-width: 1440px){.VPNavBar.has-sidebar .curtain[data-v-c388e33c]{width:calc(100% - ((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width)))}}.VPNavScreenMenuLink[data-v-a3572c96]{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-a3572c96]:hover{color:var(--vp-c-brand)}.VPNavScreenMenuGroupLink[data-v-d67c9e09]{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-d67c9e09]:hover{color:var(--vp-c-brand)}.VPNavScreenMenuGroupSection[data-v-1f191989]{display:block}.title[data-v-1f191989]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-76b97020]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-76b97020]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-76b97020]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-76b97020]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-76b97020]{padding-bottom:6px;color:var(--vp-c-brand)}.VPNavScreenMenuGroup.open .button-icon[data-v-76b97020]{transform:rotate(45deg)}.button[data-v-76b97020]{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-76b97020]:hover{color:var(--vp-c-brand)}.button-icon[data-v-76b97020]{width:14px;height:14px;fill:var(--vp-c-text-2);transition:fill .5s,transform .25s}.group[data-v-76b97020]:first-child{padding-top:0}.group+.group[data-v-76b97020],.group+.item[data-v-76b97020]{padding-top:4px}.VPNavScreenAppearance[data-v-0dc5cf49]{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-0dc5cf49]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenTranslations[data-v-41505286]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-41505286]{height:auto}.title[data-v-41505286]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-41505286]{width:16px;height:16px;fill:currentColor}.icon.lang[data-v-41505286]{margin-right:8px}.icon.chevron[data-v-41505286]{margin-left:4px}.list[data-v-41505286]{padding:4px 0 0 24px}.link[data-v-41505286]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-183ec3ec]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 1px);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 .5s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-183ec3ec],.VPNavScreen.fade-leave-active[data-v-183ec3ec]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-183ec3ec],.VPNavScreen.fade-leave-active .container[data-v-183ec3ec]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-183ec3ec],.VPNavScreen.fade-leave-to[data-v-183ec3ec]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-183ec3ec],.VPNavScreen.fade-leave-to .container[data-v-183ec3ec]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-183ec3ec]{display:none}}.container[data-v-183ec3ec]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-183ec3ec],.menu+.appearance[data-v-183ec3ec],.translations+.appearance[data-v-183ec3ec]{margin-top:24px}.menu+.social-links[data-v-183ec3ec]{margin-top:16px}.appearance+.social-links[data-v-183ec3ec]{margin-top:16px}.VPNav[data-v-5bdc5df3]{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-5bdc5df3]{position:fixed}}.root[data-v-a379eb72]{position:relative;z-index:1}.nested[data-v-a379eb72]{padding-left:13px}.outline-link[data-v-a379eb72]{display:block;line-height:28px;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s;font-weight:500}.outline-link[data-v-a379eb72]:hover,.outline-link.active[data-v-a379eb72]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-a379eb72]{padding-left:13px}.VPLocalNavOutlineDropdown[data-v-fb63c957]{padding:12px 20px 11px}.VPLocalNavOutlineDropdown button[data-v-fb63c957]{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-fb63c957]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-fb63c957]{color:var(--vp-c-text-1)}.icon[data-v-fb63c957]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}[data-v-fb63c957] .outline-link{font-size:14px;padding:2px 0}.open>.icon[data-v-fb63c957]{transform:rotate(90deg)}.items[data-v-fb63c957]{position:absolute;left:20px;right:20px;top:64px;background-color:var(--vp-local-nav-bg-color);padding:4px 10px 16px;border:1px solid var(--vp-c-divider);border-radius:8px;max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}.top-link[data-v-fb63c957]{display:block;color:var(--vp-c-brand);font-size:13px;font-weight:500;padding:6px 0;margin:0 13px 10px;border-bottom:1px solid var(--vp-c-divider)}.flyout-enter-active[data-v-fb63c957]{transition:all .2s ease-out}.flyout-leave-active[data-v-fb63c957]{transition:all .15s ease-in}.flyout-enter-from[data-v-fb63c957],.flyout-leave-to[data-v-fb63c957]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-d1e27b08]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);display:flex;justify-content:space-between;align-items:center;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);transition:border-color .5s,background-color .5s}@media (min-width: 960px){.VPLocalNav[data-v-d1e27b08]{display:none}}.menu[data-v-d1e27b08]{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-d1e27b08]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-d1e27b08]{padding:0 32px}}.menu-icon[data-v-d1e27b08]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPOutlineDropdown[data-v-d1e27b08]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-d1e27b08]{padding:12px 32px 11px}}.VPSidebarItem.level-0[data-v-0bb349fd]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-0bb349fd]{padding-bottom:10px}.item[data-v-0bb349fd]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-0bb349fd]{cursor:pointer}.indicator[data-v-0bb349fd]{position:absolute;top:6px;bottom:6px;left:-17px;width:1px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-0bb349fd],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-0bb349fd],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-0bb349fd],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-0bb349fd]{background-color:var(--vp-c-brand)}.link[data-v-0bb349fd]{display:flex;align-items:center;flex-grow:1}.text[data-v-0bb349fd]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-0bb349fd]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-0bb349fd],.VPSidebarItem.level-2 .text[data-v-0bb349fd],.VPSidebarItem.level-3 .text[data-v-0bb349fd],.VPSidebarItem.level-4 .text[data-v-0bb349fd],.VPSidebarItem.level-5 .text[data-v-0bb349fd]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-0bb349fd],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-0bb349fd],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-0bb349fd],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-0bb349fd],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-0bb349fd],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-0bb349fd]{color:var(--vp-c-brand)}.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-0bb349fd],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-0bb349fd],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-0bb349fd],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-0bb349fd],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-0bb349fd],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-0bb349fd]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-0bb349fd],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-0bb349fd],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-0bb349fd],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-0bb349fd],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-0bb349fd],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-0bb349fd]{color:var(--vp-c-brand)}.caret[data-v-0bb349fd]{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}.item:hover .caret[data-v-0bb349fd]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-0bb349fd]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-0bb349fd]{width:18px;height:18px;fill:currentColor;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-0bb349fd]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-0bb349fd],.VPSidebarItem.level-2 .items[data-v-0bb349fd],.VPSidebarItem.level-3 .items[data-v-0bb349fd],.VPSidebarItem.level-4 .items[data-v-0bb349fd],.VPSidebarItem.level-5 .items[data-v-0bb349fd]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-0bb349fd]{display:none}.VPSidebar[data-v-fe05da0a]{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-fe05da0a]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-fe05da0a]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-fe05da0a]{z-index:1;padding-top:var(--vp-nav-height);padding-bottom:128px;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-fe05da0a]{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-fe05da0a]{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-fe05da0a]{outline:0}.group+.group[data-v-fe05da0a]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-fe05da0a]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPButton[data-v-fa1633a1]{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-fa1633a1]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-fa1633a1]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-fa1633a1]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-fa1633a1]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-fa1633a1]: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-fa1633a1]: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-fa1633a1]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-fa1633a1]: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-fa1633a1]: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-fa1633a1]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-fa1633a1]: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-fa1633a1]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}.VPHero[data-v-73fffaef]{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-73fffaef]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-73fffaef]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-73fffaef]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-73fffaef]{flex-direction:row}}.main[data-v-73fffaef]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-73fffaef]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-73fffaef]{text-align:left}}@media (min-width: 960px){.main[data-v-73fffaef]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-73fffaef]{max-width:592px}}.name[data-v-73fffaef],.text[data-v-73fffaef]{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-73fffaef],.VPHero.has-image .text[data-v-73fffaef]{margin:0 auto}.name[data-v-73fffaef]{color:var(--vp-home-hero-name-color)}.clip[data-v-73fffaef]{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-73fffaef],.text[data-v-73fffaef]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-73fffaef],.text[data-v-73fffaef]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-73fffaef],.VPHero.has-image .text[data-v-73fffaef]{margin:0}}.tagline[data-v-73fffaef]{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-73fffaef]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-73fffaef]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-73fffaef]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-73fffaef]{margin:0}}.actions[data-v-73fffaef]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-73fffaef]{justify-content:center}@media (min-width: 640px){.actions[data-v-73fffaef]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-73fffaef]{justify-content:flex-start}}.action[data-v-73fffaef]{flex-shrink:0;padding:6px}.image[data-v-73fffaef]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-73fffaef]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-73fffaef]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-73fffaef]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-73fffaef]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-73fffaef]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-73fffaef]{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-73fffaef]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-73fffaef]{width:320px;height:320px}}[data-v-73fffaef] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-73fffaef] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-73fffaef] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-5f01e926]{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-5f01e926]:hover{border-color:var(--vp-c-brand);background-color:var(--vp-c-bg-soft-up)}.box[data-v-5f01e926]{display:flex;flex-direction:column;padding:24px;height:100%}.VPFeature[data-v-5f01e926] .VPImage{width:48px;height:48px;margin-bottom:20px}.icon[data-v-5f01e926]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-bg-soft-down);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-5f01e926]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-5f01e926]{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-5f01e926]{padding-top:8px}.link-text-value[data-v-5f01e926]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand)}.link-text-icon[data-v-5f01e926]{display:inline-block;margin-left:6px;width:14px;height:14px;fill:currentColor}.VPFeatures[data-v-5df66ecb]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-5df66ecb]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-5df66ecb]{padding:0 64px}}.container[data-v-5df66ecb]{margin:0 auto;max-width:1152px}.items[data-v-5df66ecb]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-5df66ecb]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-5df66ecb],.item.grid-4[data-v-5df66ecb],.item.grid-6[data-v-5df66ecb]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-5df66ecb],.item.grid-4[data-v-5df66ecb]{width:50%}.item.grid-3[data-v-5df66ecb],.item.grid-6[data-v-5df66ecb]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-5df66ecb]{width:25%}}.VPHome[data-v-20eabd3a]{padding-bottom:96px}.VPHome[data-v-20eabd3a] .VPHomeSponsors{margin-top:112px;margin-bottom:-128px}@media (min-width: 768px){.VPHome[data-v-20eabd3a]{padding-bottom:128px}}.VPDocAsideOutline[data-v-c834746b]{display:none}.VPDocAsideOutline.has-outline[data-v-c834746b]{display:block}.content[data-v-c834746b]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-c834746b]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:1px;height:18px;background-color:var(--vp-c-brand);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-c834746b]{letter-spacing:.4px;line-height:28px;font-size:13px;font-weight:600}.VPDocAside[data-v-cb998dce]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-cb998dce]{flex-grow:1}.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-cb998dce] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-0de45606]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-0de45606]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-fc0d1b73]{margin-top:64px}.edit-info[data-v-fc0d1b73]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-fc0d1b73]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-fc0d1b73]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:color .25s}.edit-link-button[data-v-fc0d1b73]:hover{color:var(--vp-c-brand-dark)}.edit-link-icon[data-v-fc0d1b73]{margin-right:8px;width:14px;height:14px;fill:currentColor}.prev-next[data-v-fc0d1b73]{border-top:1px solid var(--vp-c-divider);padding-top:24px}@media (min-width: 640px){.prev-next[data-v-fc0d1b73]{display:flex}}.pager.has-prev[data-v-fc0d1b73]{padding-top:8px}@media (min-width: 640px){.pager[data-v-fc0d1b73]{display:flex;flex-direction:column;flex-shrink:0;width:50%}.pager.has-prev[data-v-fc0d1b73]{padding-top:0;padding-left:16px}}.pager-link[data-v-fc0d1b73]{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-fc0d1b73]:hover{border-color:var(--vp-c-brand)}.pager-link.next[data-v-fc0d1b73]{margin-left:auto;text-align:right}.desc[data-v-fc0d1b73]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-fc0d1b73]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:color .25s}.VPDocOutlineDropdown[data-v-2d98506c]{margin-bottom:42px}.VPDocOutlineDropdown button[data-v-2d98506c]{display:block;font-size:14px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;border:1px solid var(--vp-c-border);padding:4px 12px;border-radius:8px}.VPDocOutlineDropdown button[data-v-2d98506c]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPDocOutlineDropdown button.open[data-v-2d98506c]{color:var(--vp-c-text-1)}.icon[data-v-2d98506c]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}[data-v-2d98506c] .outline-link{font-size:13px}.open>.icon[data-v-2d98506c]{transform:rotate(90deg)}.items[data-v-2d98506c]{margin-top:10px;border-left:1px solid var(--vp-c-divider)}.VPDoc[data-v-c11df1f0]{padding:32px 24px 96px;width:100%}.VPDoc .VPDocOutlineDropdown[data-v-c11df1f0]{display:none}@media (min-width: 960px) and (max-width: 1280px){.VPDoc .VPDocOutlineDropdown[data-v-c11df1f0]{display:block}}@media (min-width: 768px){.VPDoc[data-v-c11df1f0]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-c11df1f0]{padding:32px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-c11df1f0]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-c11df1f0]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-c11df1f0]{display:flex;justify-content:center}.VPDoc .aside[data-v-c11df1f0]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-c11df1f0]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-c11df1f0]{max-width:1104px}}.container[data-v-c11df1f0]{margin:0 auto;width:100%}.aside[data-v-c11df1f0]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-c11df1f0]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-c11df1f0]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 32px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-c11df1f0]::-webkit-scrollbar{display:none}.aside-curtain[data-v-c11df1f0]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-c11df1f0]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 32px));padding-bottom:32px}.content[data-v-c11df1f0]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-c11df1f0]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-c11df1f0]{order:1;margin:0;min-width:640px}}.content-container[data-v-c11df1f0]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-c11df1f0]{max-width:688px}.NotFound[data-v-e5bd6573]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-e5bd6573]{padding:96px 32px 168px}}.code[data-v-e5bd6573]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-e5bd6573]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-e5bd6573]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-e5bd6573]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-e5bd6573]{padding-top:20px}.link[data-v-e5bd6573]{display:inline-block;border:1px solid var(--vp-c-brand);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:border-color .25s,color .25s}.link[data-v-e5bd6573]:hover{border-color:var(--vp-c-brand-dark);color:var(--vp-c-brand-dark)}.VPContent[data-v-91952ce3]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-91952ce3]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-91952ce3]{margin:0}@media (min-width: 960px){.VPContent[data-v-91952ce3]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-91952ce3]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-91952ce3]{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-07acdfa3]{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-07acdfa3]{display:none}@media (min-width: 768px){.VPFooter[data-v-07acdfa3]{padding:32px}}.container[data-v-07acdfa3]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-07acdfa3],.copyright[data-v-07acdfa3]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.message[data-v-07acdfa3]{order:2}.copyright[data-v-07acdfa3]{order:1}.Layout[data-v-bffce215]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-978bd032]{border-top:1px solid var(--vp-c-gutter);padding:88px 24px 96px;background-color:var(--vp-c-bg)}.container[data-v-978bd032]{margin:0 auto;max-width:1152px}.love[data-v-978bd032]{margin:0 auto;width:28px;height:28px;color:var(--vp-c-text-3)}.icon[data-v-978bd032]{width:28px;height:28px;fill:currentColor}.message[data-v-978bd032]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-978bd032]{padding-top:32px}.action[data-v-978bd032]{padding-top:40px;text-align:center}.VPTeamPage[data-v-b1cfd8dc]{padding-bottom:96px}@media (min-width: 768px){.VPTeamPage[data-v-b1cfd8dc]{padding-bottom:128px}}.VPTeamPageSection+.VPTeamPageSection[data-v-b1cfd8dc-s],.VPTeamMembers+.VPTeamPageSection[data-v-b1cfd8dc-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-b1cfd8dc-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-b1cfd8dc-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-b1cfd8dc-s],.VPTeamMembers+.VPTeamPageSection[data-v-b1cfd8dc-s]{margin-top:96px}}.VPTeamMembers[data-v-b1cfd8dc-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-b1cfd8dc-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-b1cfd8dc-s]{padding:0 64px}}.VPTeamPageTitle[data-v-46c5e327]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-46c5e327]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-46c5e327]{padding:80px 64px 48px}}.title[data-v-46c5e327]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-46c5e327]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-46c5e327]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-46c5e327]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-3bf2e850]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 64px}}.title[data-v-3bf2e850]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-3bf2e850]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-3bf2e850]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-3bf2e850]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-3bf2e850]{padding-top:40px}.VPTeamMembersItem[data-v-b0e83e62]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-b0e83e62]{padding:32px}.VPTeamMembersItem.small .data[data-v-b0e83e62]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-b0e83e62]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-b0e83e62]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-b0e83e62]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-b0e83e62]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-b0e83e62]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-b0e83e62]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-b0e83e62]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-b0e83e62]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-b0e83e62]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-b0e83e62]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-b0e83e62]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-b0e83e62]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-b0e83e62]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-b0e83e62]{text-align:center}.avatar[data-v-b0e83e62]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-b0e83e62]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-b0e83e62]{margin:0;font-weight:600}.affiliation[data-v-b0e83e62]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-b0e83e62]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-b0e83e62]:hover{color:var(--vp-c-brand)}.desc[data-v-b0e83e62]{margin:0 auto}.desc[data-v-b0e83e62] a{font-weight:500;color:var(--vp-c-brand);text-decoration-style:dotted;transition:color .25s}.links[data-v-b0e83e62]{display:flex;justify-content:center;height:56px}.sp-link[data-v-b0e83e62]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-b0e83e62]:hover,.sp .sp-link.link[data-v-b0e83e62]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-b0e83e62]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPTeamMembers.small .container[data-v-6927e48e]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-6927e48e]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-6927e48e]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-6927e48e]{max-width:876px}.VPTeamMembers.medium .container[data-v-6927e48e]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-6927e48e]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-6927e48e]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-6927e48e]{max-width:760px}.container[data-v-6927e48e]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.VPLocalSearchBox[data-v-264b389a]{position:fixed;z-index:100;inset:0;display:flex}.backdrop[data-v-264b389a]{position:absolute;inset:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-264b389a]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 768px){.shell[data-v-264b389a]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-264b389a]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 768px){.search-bar[data-v-264b389a]{padding:0 8px}}.search-bar[data-v-264b389a]:focus-within{border-color:var(--vp-c-brand)}.search-icon[data-v-264b389a]{margin:8px}@media (max-width: 768px){.search-icon[data-v-264b389a]{display:none}}.search-input[data-v-264b389a]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 768px){.search-input[data-v-264b389a]{padding:6px 4px}}.search-actions[data-v-264b389a]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-264b389a]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-264b389a]{display:none}}.search-actions button[data-v-264b389a]{padding:8px}.search-actions button[data-v-264b389a]:hover,.toggle-layout-button.detailed-list[data-v-264b389a]{color:var(--vp-c-brand)}.search-keyboard-shortcuts[data-v-264b389a]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-264b389a]{display:flex;align-items:center;gap:4px}@media (max-width: 768px){.search-keyboard-shortcuts[data-v-264b389a]{display:none}}.search-keyboard-shortcuts kbd[data-v-264b389a]{background:rgba(128,128,128,.1);border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-264b389a]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-264b389a]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border)}.result>div[data-v-264b389a]{margin:12px;width:100%;overflow:hidden}@media (max-width: 768px){.result>div[data-v-264b389a]{margin:8px}}.titles[data-v-264b389a]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-264b389a]{display:flex;align-items:center;gap:4px}.title.main[data-v-264b389a]{font-weight:500}.title-icon[data-v-264b389a]{opacity:.5;font-weight:500;color:var(--vp-c-brand)}.title svg[data-v-264b389a]{opacity:.5}.result.selected[data-v-264b389a]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-264b389a]{position:relative}.excerpt[data-v-264b389a]{opacity:75%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;opacity:.5;margin-top:4px}.result.selected .excerpt[data-v-264b389a]{opacity:1}.excerpt[data-v-264b389a] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-264b389a] mark,.excerpt[data-v-264b389a] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-264b389a] .vp-code-group .tabs{display:none}.excerpt[data-v-264b389a] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-264b389a]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-264b389a]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-264b389a],.result.selected .title-icon[data-v-264b389a]{color:var(--vp-c-brand)!important}.no-results[data-v-264b389a]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-264b389a]{flex:none} diff --git a/assets/style.f2974067.css b/assets/style.f2974067.css new file mode 100644 index 00000000..62d4c2ed --- /dev/null +++ b/assets/style.f2974067.css @@ -0,0 +1 @@ +: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-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-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-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)}:root{--vp-font-family-base: "Chinese Quotes", "Inter var", "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}: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}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E")}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-green-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-green-1);--vp-code-line-diff-remove-color: var(--vp-c-red-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-red-1);--vp-code-line-warning-color: var(--vp-c-yellow-soft);--vp-code-line-error-color: var(--vp-c-red-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-brand-soft);--vp-custom-block-tip-code-bg: var(--vp-c-brand-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-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-gray-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-brand-1);--vp-badge-tip-bg: var(--vp-c-brand-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);direction:ltr;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{display:inline-block;margin:auto 2px -2px}mjx-container>svg{margin:auto}.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{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-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-brand-1)}.custom-block.tip a:hover{color:var(--vp-c-brand-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-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{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{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-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{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}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code-light{display:none}html:not(.dark) .vp-code-dark{display:none}.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 .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}.vp-doc blockquote>p{margin:0;font-size:16px;color:var(--vp-c-text-2);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{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{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.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-bottom:4px;text-align:center;letter-spacing:1px;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[data-v-ea5b2908]{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)}.vp-doc h1>.VPBadge[data-v-ea5b2908]{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge[data-v-ea5b2908]{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge[data-v-ea5b2908]{vertical-align:middle}.vp-doc h4>.VPBadge[data-v-ea5b2908],.vp-doc h5>.VPBadge[data-v-ea5b2908],.vp-doc h6>.VPBadge[data-v-ea5b2908]{vertical-align:middle;line-height:18px}.VPBadge.info[data-v-ea5b2908]{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip[data-v-ea5b2908]{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning[data-v-ea5b2908]{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger[data-v-ea5b2908]{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-54a304ca]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-54a304ca],.VPBackdrop.fade-leave-to[data-v-54a304ca]{opacity:0}.VPBackdrop.fade-leave-active[data-v-54a304ca]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-54a304ca]{display:none}}.NotFound[data-v-b9c0c15a]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-b9c0c15a]{padding:96px 32px 168px}}.code[data-v-b9c0c15a]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-b9c0c15a]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-b9c0c15a]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-b9c0c15a]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-b9c0c15a]{padding-top:20px}.link[data-v-b9c0c15a]{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-b9c0c15a]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-463da30f]{position:relative;z-index:1}.nested[data-v-463da30f]{padding-left:16px}.outline-link[data-v-463da30f]{display:block;line-height:28px;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s;font-weight:400}.outline-link[data-v-463da30f]:hover,.outline-link.active[data-v-463da30f]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-463da30f]{padding-left:13px}.VPDocAsideOutline[data-v-3a6c4994]{display:none}.VPDocAsideOutline.has-outline[data-v-3a6c4994]{display:block}.content[data-v-3a6c4994]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-3a6c4994]{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-3a6c4994]{letter-spacing:.4px;line-height:28px;font-size:13px;font-weight:600}.VPDocAside[data-v-cb998dce]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-cb998dce]{flex-grow:1}.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-cb998dce] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-19a7ae4e]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-19a7ae4e]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-a2d931e4]{margin-top:64px}.edit-info[data-v-a2d931e4]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-a2d931e4]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-a2d931e4]{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-a2d931e4]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-a2d931e4]{margin-right:8px;width:14px;height:14px;fill:currentColor}.prev-next[data-v-a2d931e4]{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-a2d931e4]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-a2d931e4]{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-a2d931e4]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-a2d931e4]{margin-left:auto;text-align:right}.desc[data-v-a2d931e4]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-a2d931e4]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDocOutlineDropdown[data-v-95bb0785]{margin-bottom:48px}.VPDocOutlineDropdown button[data-v-95bb0785]{display:block;font-size:14px;font-weight:500;line-height:24px;border:1px solid var(--vp-c-border);padding:4px 12px;color:var(--vp-c-text-2);background-color:var(--vp-c-default-soft);border-radius:8px;transition:color .5s}.VPDocOutlineDropdown button[data-v-95bb0785]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPDocOutlineDropdown button.open[data-v-95bb0785]{color:var(--vp-c-text-1)}.icon[data-v-95bb0785]{display:inline-block;vertical-align:middle;width:16px;height:16px;fill:currentColor}[data-v-95bb0785] .outline-link{font-size:14px;font-weight:400}.open>.icon[data-v-95bb0785]{transform:rotate(90deg)}.items[data-v-95bb0785]{margin-top:12px;border-left:1px solid var(--vp-c-divider)}.VPDoc[data-v-a3c25e27]{padding:32px 24px 96px;width:100%}.VPDoc .VPDocOutlineDropdown[data-v-a3c25e27]{display:none}@media (min-width: 960px) and (max-width: 1279px){.VPDoc .VPDocOutlineDropdown[data-v-a3c25e27]{display:block}}@media (min-width: 768px){.VPDoc[data-v-a3c25e27]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-a3c25e27]{padding:32px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-a3c25e27]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-a3c25e27]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-a3c25e27]{display:flex;justify-content:center}.VPDoc .aside[data-v-a3c25e27]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-a3c25e27]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-a3c25e27]{max-width:1104px}}.container[data-v-a3c25e27]{margin:0 auto;width:100%}.aside[data-v-a3c25e27]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-a3c25e27]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-a3c25e27]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 32px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-a3c25e27]::-webkit-scrollbar{display:none}.aside-curtain[data-v-a3c25e27]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-a3c25e27]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 32px));padding-bottom:32px}.content[data-v-a3c25e27]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-a3c25e27]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-a3c25e27]{order:1;margin:0;min-width:640px}}.content-container[data-v-a3c25e27]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-a3c25e27]{max-width:688px}.external-link-icon-enabled[data-v-a3c25e27] :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.VPButton[data-v-1e76fe75]{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-1e76fe75]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-1e76fe75]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-1e76fe75]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-1e76fe75]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-1e76fe75]: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-1e76fe75]: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-1e76fe75]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-1e76fe75]: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-1e76fe75]: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-1e76fe75]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-1e76fe75]: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-1e76fe75]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-ab19afbb]{display:none}.dark .VPImage.light[data-v-ab19afbb]{display:none}.VPHero[data-v-5a3e9999]{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-5a3e9999]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-5a3e9999]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-5a3e9999]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-5a3e9999]{flex-direction:row}}.main[data-v-5a3e9999]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-5a3e9999]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-5a3e9999]{text-align:left}}@media (min-width: 960px){.main[data-v-5a3e9999]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-5a3e9999]{max-width:592px}}.name[data-v-5a3e9999],.text[data-v-5a3e9999]{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-5a3e9999],.VPHero.has-image .text[data-v-5a3e9999]{margin:0 auto}.name[data-v-5a3e9999]{color:var(--vp-home-hero-name-color)}.clip[data-v-5a3e9999]{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-5a3e9999],.text[data-v-5a3e9999]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-5a3e9999],.text[data-v-5a3e9999]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-5a3e9999],.VPHero.has-image .text[data-v-5a3e9999]{margin:0}}.tagline[data-v-5a3e9999]{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-5a3e9999]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-5a3e9999]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-5a3e9999]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-5a3e9999]{margin:0}}.actions[data-v-5a3e9999]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-5a3e9999]{justify-content:center}@media (min-width: 640px){.actions[data-v-5a3e9999]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-5a3e9999]{justify-content:flex-start}}.action[data-v-5a3e9999]{flex-shrink:0;padding:6px}.image[data-v-5a3e9999]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-5a3e9999]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-5a3e9999]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-5a3e9999]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-5a3e9999]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-5a3e9999]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-5a3e9999]{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-5a3e9999]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-5a3e9999]{width:320px;height:320px}}[data-v-5a3e9999] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-5a3e9999] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-5a3e9999] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-ee984185]{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-ee984185]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-ee984185]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-ee984185]>.VPImage{margin-bottom:20px}.icon[data-v-ee984185]{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-ee984185]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-ee984185]{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-ee984185]{padding-top:8px}.link-text-value[data-v-ee984185]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-ee984185]{display:inline-block;margin-left:6px;width:14px;height:14px;fill:currentColor}.VPFeatures[data-v-b1eea84a]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-b1eea84a]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-b1eea84a]{padding:0 64px}}.container[data-v-b1eea84a]{margin:0 auto;max-width:1152px}.items[data-v-b1eea84a]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-b1eea84a]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-b1eea84a],.item.grid-4[data-v-b1eea84a],.item.grid-6[data-v-b1eea84a]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-b1eea84a],.item.grid-4[data-v-b1eea84a]{width:50%}.item.grid-3[data-v-b1eea84a],.item.grid-6[data-v-b1eea84a]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-b1eea84a]{width:25%}}.VPHome[data-v-20eabd3a]{padding-bottom:96px}.VPHome[data-v-20eabd3a] .VPHomeSponsors{margin-top:112px;margin-bottom:-128px}@media (min-width: 768px){.VPHome[data-v-20eabd3a]{padding-bottom:128px}}.VPContent[data-v-3cf691b6]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-3cf691b6]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-3cf691b6]{margin:0}@media (min-width: 960px){.VPContent[data-v-3cf691b6]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-3cf691b6]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-3cf691b6]{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-e4279f1c]{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-e4279f1c]{display:none}@media (min-width: 768px){.VPFooter[data-v-e4279f1c]{padding:32px}}.container[data-v-e4279f1c]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-e4279f1c],.copyright[data-v-e4279f1c]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-24251f6f]{padding:12px 20px 11px}.VPLocalNavOutlineDropdown button[data-v-24251f6f]{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-24251f6f]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-24251f6f]{color:var(--vp-c-text-1)}.icon[data-v-24251f6f]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}[data-v-24251f6f] .outline-link{font-size:14px;padding:2px 0}.open>.icon[data-v-24251f6f]{transform:rotate(90deg)}.items[data-v-24251f6f]{position:absolute;top:64px;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)}.header[data-v-24251f6f]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-24251f6f]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-24251f6f]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-24251f6f]{transition:all .2s ease-out}.flyout-leave-active[data-v-24251f6f]{transition:all .15s ease-in}.flyout-enter-from[data-v-24251f6f],.flyout-leave-to[data-v-24251f6f]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-9e669cc1]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);display:flex;justify-content:space-between;align-items:center;border-top:1px solid var(--vp-c-gutter);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-9e669cc1]{position:fixed}.VPLocalNav.reached-top[data-v-9e669cc1]{border-top-color:transparent}@media (min-width: 960px){.VPLocalNav[data-v-9e669cc1]{display:none}}.menu[data-v-9e669cc1]{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-9e669cc1]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-9e669cc1]{padding:0 32px}}.menu-icon[data-v-9e669cc1]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPOutlineDropdown[data-v-9e669cc1]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-9e669cc1]{padding:12px 32px 11px}}.VPSwitch[data-v-1c29e291]{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-1c29e291]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-1c29e291]{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-1c29e291]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-1c29e291] svg{position:absolute;top:3px;left:3px;width:12px;height:12px;fill:var(--vp-c-text-2)}.dark .icon[data-v-1c29e291] svg{fill:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-3329432d]{opacity:1}.moon[data-v-3329432d],.dark .sun[data-v-3329432d]{opacity:0}.dark .moon[data-v-3329432d]{opacity:1}.dark .VPSwitchAppearance[data-v-3329432d] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-283b26e9]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-283b26e9]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-f51f088d]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-f51f088d]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-f51f088d]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-f51f088d]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-a6b0397c]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-a6b0397c]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-a6b0397c]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-a6b0397c]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-e42ed9b3]{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-e42ed9b3] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-e42ed9b3] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-e42ed9b3] .group:last-child{padding-bottom:0}.VPMenu[data-v-e42ed9b3] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-e42ed9b3] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-e42ed9b3] .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-e42ed9b3] .action{padding-left:24px}.VPFlyout[data-v-aa8de344]{position:relative}.VPFlyout[data-v-aa8de344]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-aa8de344]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-aa8de344]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-aa8de344]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-aa8de344]{color:var(--vp-c-brand-2)}.VPFlyout:hover .menu[data-v-aa8de344],.button[aria-expanded=true]+.menu[data-v-aa8de344]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-aa8de344]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-aa8de344]{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-aa8de344]{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-aa8de344]{margin-right:0;width:16px;height:16px;fill:currentColor}.text-icon[data-v-aa8de344]{margin-left:4px;width:14px;height:14px;fill:currentColor}.icon[data-v-aa8de344]{width:20px;height:20px;fill:currentColor;transition:fill .25s}.menu[data-v-aa8de344]{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-16cf740a]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-16cf740a]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-16cf740a]>svg{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-e71e869c]{display:flex;justify-content:center}.VPNavBarExtra[data-v-c8c2ae4b]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-c8c2ae4b]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-c8c2ae4b]{display:none}}.trans-title[data-v-c8c2ae4b]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-c8c2ae4b],.item.social-links[data-v-c8c2ae4b]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-c8c2ae4b]{min-width:176px}.appearance-action[data-v-c8c2ae4b]{margin-right:-2px}.social-links-list[data-v-c8c2ae4b]{margin:-4px -8px}.VPNavBarHamburger[data-v-6bee1efd]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-6bee1efd]{display:none}}.container[data-v-6bee1efd]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-6bee1efd]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-6bee1efd]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-6bee1efd],.VPNavBarHamburger.active:hover .middle[data-v-6bee1efd],.VPNavBarHamburger.active:hover .bottom[data-v-6bee1efd]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-6bee1efd],.middle[data-v-6bee1efd],.bottom[data-v-6bee1efd]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-6bee1efd]{top:0;left:0;transform:translate(0)}.middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-cb318fec]{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-cb318fec],.VPNavBarMenuLink[data-v-cb318fec]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-f732b5d0]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-f732b5d0]{display:flex}}/*! @docsearch/css 3.5.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-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-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}@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: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}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-ef6192dc]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-ef6192dc]{display:flex;align-items:center}}.title[data-v-2973dbb4]{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-2973dbb4]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-2973dbb4]{border-bottom-color:var(--vp-c-divider)}}[data-v-2973dbb4] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-ff4524ae]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-ff4524ae]{display:flex;align-items:center}}.title[data-v-ff4524ae]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-f1abbc6e]{position:relative;border-bottom:1px solid transparent;padding:0 8px 0 24px;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap}@media (min-width: 768px){.VPNavBar[data-v-f1abbc6e]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar[data-v-f1abbc6e]{padding:0}.VPNavBar[data-v-f1abbc6e]:not(.has-sidebar):not(.top){border-bottom-color:var(--vp-c-gutter);background-color:var(--vp-nav-bg-color)}}.container[data-v-f1abbc6e]{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-f1abbc6e],.container>.content[data-v-f1abbc6e]{pointer-events:none}.container[data-v-f1abbc6e] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-f1abbc6e]{max-width:100%}}.title[data-v-f1abbc6e]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-f1abbc6e]{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-f1abbc6e]{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-f1abbc6e]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-f1abbc6e]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-f1abbc6e]{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-f1abbc6e]{display:flex;justify-content:flex-end;align-items:center;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.top) .content-body[data-v-f1abbc6e]{position:relative;background-color:var(--vp-nav-bg-color)}}@media (max-width: 767px){.content-body[data-v-f1abbc6e]{column-gap:.5rem}}.menu+.translations[data-v-f1abbc6e]:before,.menu+.appearance[data-v-f1abbc6e]:before,.menu+.social-links[data-v-f1abbc6e]:before,.translations+.appearance[data-v-f1abbc6e]:before,.appearance+.social-links[data-v-f1abbc6e]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-f1abbc6e]:before,.translations+.appearance[data-v-f1abbc6e]:before{margin-right:16px}.appearance+.social-links[data-v-f1abbc6e]:before{margin-left:16px}.social-links[data-v-f1abbc6e]{margin-right:-8px}@media (min-width: 960px){.VPNavBar.has-sidebar .curtain[data-v-f1abbc6e]{position:absolute;right:0;bottom:-31px;width:calc(100% - var(--vp-sidebar-width));height:32px}.VPNavBar.has-sidebar .curtain[data-v-f1abbc6e]:before{display:block;width:100%;height:32px;background:linear-gradient(var(--vp-c-bg),transparent 70%);content:""}}@media (min-width: 1440px){.VPNavBar.has-sidebar .curtain[data-v-f1abbc6e]{width:calc(100% - ((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width)))}}.VPNavScreenAppearance[data-v-0dc5cf49]{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-0dc5cf49]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-fe523e3d]{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-fe523e3d]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-aea78dd1]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-aea78dd1]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-f60dbfa7]{display:block}.title[data-v-f60dbfa7]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-c2c554ed]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-c2c554ed]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-c2c554ed]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-c2c554ed]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-c2c554ed]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-c2c554ed]{transform:rotate(45deg)}.button[data-v-c2c554ed]{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-c2c554ed]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-c2c554ed]{width:14px;height:14px;fill:var(--vp-c-text-2);transition:fill .5s,transform .25s}.group[data-v-c2c554ed]:first-child{padding-top:0}.group+.group[data-v-c2c554ed],.group+.item[data-v-c2c554ed]{padding-top:4px}.VPNavScreenTranslations[data-v-41505286]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-41505286]{height:auto}.title[data-v-41505286]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-41505286]{width:16px;height:16px;fill:currentColor}.icon.lang[data-v-41505286]{margin-right:8px}.icon.chevron[data-v-41505286]{margin-left:4px}.list[data-v-41505286]{padding:4px 0 0 24px}.link[data-v-41505286]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-57cce842]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 1px);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 .5s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-57cce842],.VPNavScreen.fade-leave-active[data-v-57cce842]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-57cce842],.VPNavScreen.fade-leave-active .container[data-v-57cce842]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-57cce842],.VPNavScreen.fade-leave-to[data-v-57cce842]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-57cce842],.VPNavScreen.fade-leave-to .container[data-v-57cce842]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-57cce842]{display:none}}.container[data-v-57cce842]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-57cce842],.menu+.appearance[data-v-57cce842],.translations+.appearance[data-v-57cce842]{margin-top:24px}.menu+.social-links[data-v-57cce842]{margin-top:16px}.appearance+.social-links[data-v-57cce842]{margin-top:16px}.VPNav[data-v-7ad780c2]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-7ad780c2]{position:fixed}}.VPSidebarItem.level-0[data-v-bd01e0d5]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-bd01e0d5]{padding-bottom:10px}.item[data-v-bd01e0d5]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-bd01e0d5]{cursor:pointer}.indicator[data-v-bd01e0d5]{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-bd01e0d5],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-bd01e0d5],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-bd01e0d5],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-bd01e0d5]{background-color:var(--vp-c-brand-1)}.link[data-v-bd01e0d5]{display:flex;align-items:center;flex-grow:1}.text[data-v-bd01e0d5]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-bd01e0d5]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-bd01e0d5],.VPSidebarItem.level-2 .text[data-v-bd01e0d5],.VPSidebarItem.level-3 .text[data-v-bd01e0d5],.VPSidebarItem.level-4 .text[data-v-bd01e0d5],.VPSidebarItem.level-5 .text[data-v-bd01e0d5]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-bd01e0d5]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-1.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-2.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-3.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-4.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-5.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-bd01e0d5]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-bd01e0d5]{color:var(--vp-c-brand-1)}.caret[data-v-bd01e0d5]{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-bd01e0d5]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-bd01e0d5]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-bd01e0d5]{width:18px;height:18px;fill:currentColor;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-bd01e0d5]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-bd01e0d5],.VPSidebarItem.level-2 .items[data-v-bd01e0d5],.VPSidebarItem.level-3 .items[data-v-bd01e0d5],.VPSidebarItem.level-4 .items[data-v-bd01e0d5],.VPSidebarItem.level-5 .items[data-v-bd01e0d5]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-bd01e0d5]{display:none}.VPSidebar[data-v-ee2efba5]{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-ee2efba5]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-ee2efba5]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-ee2efba5]{z-index:1;padding-top:var(--vp-nav-height);padding-bottom:128px;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-ee2efba5]{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-ee2efba5]{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-ee2efba5]{outline:0}.group+.group[data-v-ee2efba5]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-ee2efba5]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSkipLink[data-v-c8291ffa]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-c8291ffa]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-c8291ffa]{top:14px;left:16px}}.Layout[data-v-9d8abc1e]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-843cc1b2]{border-top:1px solid var(--vp-c-gutter);padding:88px 24px 96px;background-color:var(--vp-c-bg)}.container[data-v-843cc1b2]{margin:0 auto;max-width:1152px}.love[data-v-843cc1b2]{margin:0 auto;width:28px;height:28px;color:var(--vp-c-text-3)}.icon[data-v-843cc1b2]{width:28px;height:28px;fill:currentColor}.message[data-v-843cc1b2]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-843cc1b2]{padding-top:32px}.action[data-v-843cc1b2]{padding-top:40px;text-align:center}.VPTeamPage[data-v-b1cfd8dc]{padding-bottom:96px}@media (min-width: 768px){.VPTeamPage[data-v-b1cfd8dc]{padding-bottom:128px}}.VPTeamPageSection+.VPTeamPageSection[data-v-b1cfd8dc-s],.VPTeamMembers+.VPTeamPageSection[data-v-b1cfd8dc-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-b1cfd8dc-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-b1cfd8dc-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-b1cfd8dc-s],.VPTeamMembers+.VPTeamPageSection[data-v-b1cfd8dc-s]{margin-top:96px}}.VPTeamMembers[data-v-b1cfd8dc-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-b1cfd8dc-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-b1cfd8dc-s]{padding:0 64px}}.VPTeamPageTitle[data-v-46c5e327]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-46c5e327]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-46c5e327]{padding:80px 64px 48px}}.title[data-v-46c5e327]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-46c5e327]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-46c5e327]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-46c5e327]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-3bf2e850]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 64px}}.title[data-v-3bf2e850]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-3bf2e850]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-3bf2e850]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-3bf2e850]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-3bf2e850]{padding-top:40px}.VPTeamMembersItem[data-v-3a0078bd]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-3a0078bd]{padding:32px}.VPTeamMembersItem.small .data[data-v-3a0078bd]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-3a0078bd]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-3a0078bd]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-3a0078bd]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-3a0078bd]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-3a0078bd]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-3a0078bd]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-3a0078bd]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-3a0078bd]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-3a0078bd]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-3a0078bd]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-3a0078bd]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-3a0078bd]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-3a0078bd]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-3a0078bd]{text-align:center}.avatar[data-v-3a0078bd]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-3a0078bd]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-3a0078bd]{margin:0;font-weight:600}.affiliation[data-v-3a0078bd]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-3a0078bd]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-3a0078bd]:hover{color:var(--vp-c-brand-1)}.desc[data-v-3a0078bd]{margin:0 auto}.desc[data-v-3a0078bd] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-3a0078bd]{display:flex;justify-content:center;height:56px}.sp-link[data-v-3a0078bd]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-3a0078bd]:hover,.sp .sp-link.link[data-v-3a0078bd]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-3a0078bd]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPTeamMembers.small .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-bf782009]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-bf782009]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-bf782009]{max-width:876px}.VPTeamMembers.medium .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-bf782009]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-bf782009]{max-width:760px}.container[data-v-bf782009]{display:grid;gap:24px;margin:0 auto;max-width:1152px}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/MagiskChineseDocument/assets/inter-roman-cyrillic.5f2c6c8c.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/MagiskChineseDocument/assets/inter-roman-cyrillic-ext.e75737ce.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 var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/MagiskChineseDocument/assets/inter-roman-greek.d5a6d92a.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/MagiskChineseDocument/assets/inter-roman-greek-ext.ab0619bc.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/MagiskChineseDocument/assets/inter-roman-latin.2ed14f66.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,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 var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/MagiskChineseDocument/assets/inter-roman-latin-ext.0030eebd.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/MagiskChineseDocument/assets/inter-roman-vietnamese.14ce25a6.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/MagiskChineseDocument/assets/inter-italic-cyrillic.ea42a392.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/MagiskChineseDocument/assets/inter-italic-cyrillic-ext.33bd5a8e.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 var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/MagiskChineseDocument/assets/inter-italic-greek.8f4463c4.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/MagiskChineseDocument/assets/inter-italic-greek-ext.4fbe9427.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/MagiskChineseDocument/assets/inter-italic-latin.bd3b6f56.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,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 var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/MagiskChineseDocument/assets/inter-italic-latin-ext.bd8920cc.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/MagiskChineseDocument/assets/inter-italic-vietnamese.6ce511fb.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Chinese Quotes;src:local("PingFang SC Regular"),local("PingFang SC"),local("SimHei"),local("Source Han Sans SC");unicode-range:U+2018,U+2019,U+201C,U+201D}@font-face{font-family:JetBrains Mono Online;src:url(/MagiskChineseDocument/assets/JetBrainsMono.662a196d.ttf);font-style:normal}@font-face{font-family:JetBrains Mono Online;src:url(/MagiskChineseDocument/assets/JetBrainsMono-Italic.f115aaa1.ttf);font-style:italic}:root{--c-md-teal-50-alpha: #00968819;--c-md-teal-100-alpha: #0096874d;--c-md-teal-100: #b2dfdb;--c-md-teal-300: #4db6ac;--c-md-teal-400: #26a69a;--c-md-teal-500: #009688;--c-md-teal-600: #00897b;--c-md-teal-700: #00796b;--c-md-pink-50-alpha: #e91e6319;--c-md-pink-100-alpha: #e91e634d;--c-md-pink-100: #f8bbd0;--c-md-pink-300: #f06292;--c-md-pink-400: #ec407a;--c-md-pink-500: #e91e63;--c-md-pink-600: #d81b60;--c-md-pink-700: #c2185b}:root{--vp-c-brand-1: var(--c-md-teal-500);--vp-c-brand-2: var(--c-md-teal-300);--vp-c-brand-3: var(--c-md-teal-300);--vp-c-brand-soft: var(--c-md-teal-50-alpha);--color-selection: var(--c-md-teal-100-alpha);--vp-font-family-mono: "JetBrains Mono", "JetBrains Mono Online", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", var(--vp-font-family-base), monospace}:root.delta{--vp-c-brand-1: var(--c-md-pink-500);--vp-c-brand-2: var(--c-md-pink-300);--vp-c-brand-3: var(--c-md-pink-300);--vp-c-brand-soft: var(--c-md-pink-50-alpha);--color-selection: var(--c-md-pink-100-alpha)}::selection{background-color:var(--color-selection)}.VPLocalSearchBox[data-v-007ef435]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-007ef435]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-007ef435]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 767px){.shell[data-v-007ef435]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-007ef435]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-007ef435]{padding:0 8px}}.search-bar[data-v-007ef435]:focus-within{border-color:var(--vp-c-brand-1)}.search-icon[data-v-007ef435]{margin:8px}@media (max-width: 767px){.search-icon[data-v-007ef435]{display:none}}.search-input[data-v-007ef435]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-007ef435]{padding:6px 4px}}.search-actions[data-v-007ef435]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-007ef435]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-007ef435]{display:none}}.search-actions button[data-v-007ef435]{padding:8px}.search-actions button[data-v-007ef435]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-007ef435]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-007ef435]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-007ef435]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-007ef435]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-007ef435]{display:none}}.search-keyboard-shortcuts kbd[data-v-007ef435]{background:rgba(128,128,128,.1);border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-007ef435]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-007ef435]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-007ef435]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-007ef435]{margin:8px}}.titles[data-v-007ef435]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-007ef435]{display:flex;align-items:center;gap:4px}.title.main[data-v-007ef435]{font-weight:500}.title-icon[data-v-007ef435]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-007ef435]{opacity:.5}.result.selected[data-v-007ef435]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-007ef435]{position:relative}.excerpt[data-v-007ef435]{opacity:75%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;opacity:.5;margin-top:4px}.result.selected .excerpt[data-v-007ef435]{opacity:1}.excerpt[data-v-007ef435] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-007ef435] mark,.excerpt[data-v-007ef435] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-007ef435] .vp-code-group .tabs{display:none}.excerpt[data-v-007ef435] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-007ef435]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-007ef435]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-007ef435],.result.selected .title-icon[data-v-007ef435]{color:var(--vp-c-brand-1)!important}.no-results[data-v-007ef435]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-007ef435]{flex:none} diff --git a/assets/tools.md.4de0b4c5.js b/assets/tools.md.4de0b4c5.js deleted file mode 100644 index d254fe9a..00000000 --- a/assets/tools.md.4de0b4c5.js +++ /dev/null @@ -1,231 +0,0 @@ -import{_ as s,o as n,c as a,V as l}from"./chunks/framework.fc84ac3a.js";const d=JSON.parse('{"title":"Magisk 工具","description":"","frontmatter":{},"headers":[],"relativePath":"tools.md","filePath":"tools.md","lastUpdated":1684159014000}'),p={name:"tools.md"},e=l(`

    Magisk 工具

    Magisk 为开发人员提供了大量安装工具、守护程序和实用程序。本文档涵盖了4个二进制文件和所有包含的小程序。二进制文件和小程序如下所示:

    txt
    magiskboot                 /* binary */
    -magiskinit                 /* binary */
    -magiskpolicy               /* binary */
    -supolicy -> magiskpolicy
    -magisk                     /* binary */
    -resetprop -> magisk
    -su -> magisk

    magiskboot

    一个用于解压缩/重新打包 boot 映像、解析/修补/解压缩 cpio 、修补 dtb 、十六进制修补二进制文件,以及使用多种算法压缩/解压缩文件的工具。

    magiskboot 支持常见的压缩格式(这意味着它不依赖于外部工具),包括 gziplz4lz4_legacy仅在LG上使用)、lzmaxzbzip2

    magiskboot 的概念是使 boot 映像修改更简单。对于解包,它解析标头并提取映像中的所有部分,如果在任何部分中检测到压缩,则会立即解压缩。对于重新打包,需要原始 boot 映像,以便可以使用原始标头,只需更改必要的内容,如节大小和校验和。如果需要,所有部分将被压缩回原始格式。该工具还支持许多 CPIO 和 DTB 操作。

    txt
    用法: ./magiskboot <操作> [参数...]
    -
    -支持的操作:
    -  unpack [-n] [-h] <bootimg>
    -      将 <bootimg> 解压缩到其各个组件,每个组件到一个文件,并在当前目录中具有相
    -    应的文件名。
    -      支持的组件:kernel、kernel_dtb、ramdisk.cpio、second、dtb、extra 和
    -    recovery_dtbo。
    -      默认情况下,每个组件将在写入输出文件之前即时自动解压缩。
    -      如果提供“-n”,则将跳过所有解压缩操作;每个组件将保持不变,以原始格式转储。
    -      如果提供了“-h”,则启动映像标头信息将转储到文件“header”,该文件可用于
    -    在重新打包期间修改标头配置。
    -
    -    返回值:
    -    0:valid    1:error    2:chromeos
    -
    -  repack [-n] <原始bootimg> [输出bootimg]
    -      使用当前目录中的文件将启动映像组件重新打包到 [输出bootimg],如果未指
    -    定,则为“new-boot.img”。
    -      <原始bootimg> 是用于解压缩组件的原始启动映像。
    -      默认情况下,每个组件将使用 <原始bootimg> 中检测到的相应格式自动压缩。如
    -    果当前目录中的组件文件已被压缩,则不会对该特定组件执行任何附加压缩。
    -      如果提供“-n”,则将跳过所有压缩操作。
    -    如果 env 变量 PATCHVBMETAFLAG 设置为 true,则将设置启动映像的 vbmeta
    -    header 中的所有禁用标志。
    -
    -  hexpatch <文件> <hexpattern1> <hexpattern2>
    -    在 <文件> 中搜索 <hexpattern1>,并将其替换为 <hexpattern2>
    -
    -  cpio <incpio> [命令...]
    -    对 <incpio> 执行 cpio 命令(修改已到位)
    -    每个命令都是一个参数,请为每个命令添加引号。
    -    支持的命令:
    -      exists ENTRY
    -        如果 ENTRY 存在,则返回 0,否则返回 1
    -      rm [-r] ENTRY
    -        删除 ENTRY,指定 [-r] 以递归删除
    -      mkdir MODE ENTRY
    -        在 MODE 权限下创建目录 ENTRY
    -      ln TARGET ENTRY
    -        使用名称 ENTRY 创建指向 TARGET 的符号链接
    -      mv SOURCE DEST
    -        将 SOURCE 移动到 DEST
    -      add MODE ENTRY INFILE
    -        在 MODE 权限中添加 INFILE 作为 ENTRY;替换 ENTRY(如果存在)
    -      extract [ENTRY OUT]
    -        将 ENTRY 解压到 OUT,或将所有条目解压到当前目录
    -      test
    -        测试 cpio 的状态
    -        返回值为0或或运算以下值:
    -        0x1:Magisk    0x2:unsupported    0x4:Sony
    -      patch
    -        应用 ramdisk 补丁
    -        用 env 变量进行配置:KEEPVERITY KEEPFORCEENCRYPT
    -      backup ORIG
    -        从 ORIG 创建 ramdisk 备份
    -      restore
    -        从 incpio 中存储的 ramdisk 备份恢复 ramdisk
    -      sha1
    -        如果以前已在 ramdisk 中备份,则输出原始引导SHA1
    -
    -  dtb <文件> <操作> [参数...]
    -    对 <文件> 执行与 dtb 相关的操作
    -    支持的操作:
    -      print [-f]
    -        打印 dtb 的所有内容以进行调试
    -        指定 [-f] 以仅打印 fstab 节点
    -      patch
    -        搜索 fstab 并删除 verity/avb
    -        直接对文件进行修改
    -        使用 env 变量进行配置:KEEPVERITY
    -      test
    -        测试 fstab 的状态
    -        返回值:
    -        0:valid    1:error
    -
    -  split <文件>
    -    将 image.*-dtb 拆分为 kernel + kernel_dtb
    -
    -  sha1 <文件>
    -    出 <文件> 的 SHA1 校验和
    -
    -  cleanup
    -    清理当前工作目录
    -
    -  compress[=格式] <输入文件> [输出文件]
    -    使用 [格式] 将 <输入文件> 压缩为 [输出文件]。
    -    可以是“-”,以作为 STDIN/STDOUT。
    -    如果未指定 [格式],则将使用 gzip。
    -    如果未指定 [输出文件],则 <输入文件> 将被替换为
    -    后缀为匹配文件扩展名的另一个文件。
    -    支持格式: gzip zopfli xz lzma bzip2 lz4 lz4_legacy lz4_lg 
    -
    -  decompress <输入文件> [输出文件]
    -    检测格式并将 <输入文件> 解压缩到 [输出文件]。
    -    <输入文件>/[输出文件] 可以是“-”,以作为 STDIN/STDOUT。
    -    如果未指定 [输出文件],则 <输入文件> 将替换为另一个文件,
    -    删除其文件格式文件扩展名。
    -    支持格式: gzip zopfli xz lzma bzip2 lz4 lz4_legacy lz4_lg

    magiskinit

    这个二进制文件将替换 Magisk 补丁启动映像的 ramdisk 中的 init。它最初是为支持以 system-as-root 的设备而创建的,但该工具被扩展为支持所有设备,并成为 Magisk 的关键部分。更多详细信息可以在 Micsk Booting Process 中的 Pre-Init 部分找到。

    magiskpolicy

    (此工具别名为 supolicy,以与 SuperSU 的 sepolicy 工具兼容)

    高级开发人员可以使用此工具修改 SELinux 策略。在像 Linux 服务器管理员这样的常见场景中,他们会直接修改 SELinux 策略源(*.te)并重新编译 sepolicy 二进制文件,但在 Android 上,我们直接修补二进制文件(或运行时策略)。

    Magisk 守护进程派生的所有进程,包括 root shell 及其所有分支,都在上下文 u:r:magisk:s0 中运行。所有安装了 Magisk 的系统上使用的规则都可以被视为官方的 sepolicy 具有以下补丁:magiskpolicy --magisk 'allow magisk * * *'

    txt
    用法: ./magiskpolicy [--选项...] [策略声明...]
    -
    -选项:
    -   --help            显示 policy 语句的帮助消息
    -   --load FILE       从 FILE 加载 sepolicy
    -   --load-split      从预编译的 sepolicy 加载或编译拆分的 cil 策略
    -   --compile-split   编译拆分的cil策略
    -   --save FILE       将整体策略转储到 FILE 文件
    -   --live            立即将 sepolicy 加载到内核中
    -   --magisk          应用内置 Magisk sepolicy 规则
    -   --apply FILE      应用 FILE 中的规则,作为策略语句逐行读取和分析
    -                     (允许多重 --apply)
    -
    -如果既没有指定 --load、--load-split,也没有指定 --compile-split,则它
    -将从当前活动策略(/sys/fs/selinux/policy)加载
    -
    -
    -一个策略声明应被视为一个参数,这意味着每个策略声明都应该用引号括起来。
    -可以在一个命令中提供多个策略语句。
    -
    -语句的格式为“<rule_name> [args...]”。
    -标有 (^) 的参数可以接受一个或多个条目。多个条目由大括号 ({}) 中的空格分隔列表组成。
    -标有 (*) 的参数与 (^) 相同,但另外支持 match-all 运算符 (*)。
    -
    -示例:"allow { s1 s2 } { t1 t2 } class *"
    -将扩展到:
    -
    -allow s1 t1 class { all-permissions-of-class }
    -allow s1 t2 class { all-permissions-of-class }
    -allow s2 t1 class { all-permissions-of-class }
    -allow s2 t2 class { all-permissions-of-class }
    -
    -支持的策略声明:
    -
    -"allow *source_type *target_type *class *perm_set"
    -"deny *source_type *target_type *class *perm_set"
    -"auditallow *source_type *target_type *class *perm_set"
    -"dontaudit *source_type *target_type *class *perm_set"
    -
    -"allowxperm *source_type *target_type *class operation xperm_set"
    -"auditallowxperm *source_type *target_type *class operation xperm_set"
    -"dontauditxperm *source_type *target_type *class operation xperm_set"
    -- 唯一支持的操作是“ioctl”
    -- xperm_set 格式为 “low-high”、“value”或“*”。
    -  “*”将被视为“0x0000-0xFFFF”。
    -  所有值应以十六进制书写。
    -
    -"permissive ^type"
    -"enforce ^type"
    -
    -"typeattribute ^type ^attribute"
    -
    -"type type_name ^(attribute)"
    -- 参数“attribute”是可选的,默认为“domain”
    -
    -"attribute attribute_name"
    -
    -"type_transition source_type target_type class default_type (object_name)"
    -- 参数“object_name”是可选的
    -
    -"type_change source_type target_type class default_type"
    -"type_member source_type target_type class default_type"
    -
    -"genfscon fs_name partial_path fs_context"

    magisk

    当使用名称 magisk 调用 magisk 二进制文件时,它作为一个实用工具,具有许多助手函数和几个 Magisk 服务的入口点。

    txt
    用法: magisk [小程序 [参数]...]
    -   或: magisk [选项]...
    -
    -选项:
    -   -c                        打印当前二进制版本
    -   -v                        打印正在运行的守护程序版本
    -   -V                        打印正在运行的守护程序版本号
    -   --list                    列出所有可用的小程序
    -   --remove-modules          移除所有模块并重新启动
    -   --install-module ZIP      安装模块 zip 文件
    -
    -高级选项(内部 APIs):
    -   --daemon                  手动启动 Magisk 守护进程
    -   --stop                    移除所有 Magisk 更改并停止守护程序
    -   --[init trigger]          初始化触发器上的回调。有效的触发器:
    -                             post-fs-data, service, boot-complete, zygote-restart
    -   --unlock-blocks           将所有块设备的 BLKROSET 标志设置为 OFF
    -   --restorecon              恢复 Magisk 文件上的 selinux 上下文
    -   --clone-attr SRC DEST     克隆权限、所有者和 selinux 上下文
    -   --clone SRC DEST          克隆 SRC 到 DEST
    -   --sqlite SQL              执行 SQL 命令到 Magisk 数据库
    -   --path                    打印 Magisk tmpfs 挂载路径
    -   --denylist ARGS           拒绝列表配置 CLI
    -
    -可用的小程序:
    -    su, resetprop
    -
    -用法: magisk --denylist [操作 [参数...] ]
    -操作:
    -   status          返回强制的状态
    -   enable          启用拒绝列表强制
    -   disable         禁用拒绝列表强制
    -   add PKG [PROC]  将新目标添加到拒绝列表
    -   rm PKG [PROC]   从拒绝列表中删除目标
    -   ls              打印当前拒绝列表
    -   exec CMDs...    在隔离的挂载命名空间中执行命令并执行
    -                   所有卸载操作

    su

    MagiskSU 入口点 magisk 的小程序。不错的旧 su 命令。

    txt
    用法: su [选项] [-] [user [参数...]]
    -
    -选项:
    -  -c, --command 命令         将命令传递给调用的 shell
    -  -h, --help                    显示此帮助消息并退出
    -  -, -l, --login                将 shell 伪装成一个登录 shell
    -  -m, -p,
    -  --preserve-environment        保护整个环境
    -  -s, --shell SHELL             使用 SHELL 而不是默认的 /system/bin/sh
    -  -v, --version                 显示版本名并退出
    -  -V                            显示版本号并退出
    -  -mm, -M,
    -  --mount-master                在全局装载命名空间中强制运行

    注意

    尽管上面没有列出 -Z, --context 选项,但该选项仍然存在,以便与为 SuperSU 设计的应用程序进行 CLI 兼容。然而,该选项被默默忽略,因为它不再相应。

    resetprop

    magisk 的小程序。高级系统属性操作实用程序。查看 Resetprop 详细信息 以了解更多背景信息。

    txt
    用法: resetprop [标志] [选项...]
    -
    -选项:
    -   -h, --help        显示此消息
    -   (no arguments)    输出所有属性
    -   NAME              获取 NAME 属性
    -   NAME VALUE        使用 VALUE 设置 NAME 属性
    -   --file FILE       从 FILE 加载属性
    -   --delete NAME     删除 NAME 属性
    -
    -标志:
    -   -v      将详细输出打印到 stderr
    -   -n      设置 props 而不经过 property_service
    -           (此标志仅影响 setprop)
    -   -p      从/向持久存储读取/写入属性
    -           (此标志仅影响 getprop 和 delprop)

    参考链接

    `,27),o=[e];function t(c,i,C,A,r,y){return n(),a("div",null,o)}const g=s(p,[["render",t]]);export{d as __pageData,g as default}; diff --git a/assets/tools.md.4de0b4c5.lean.js b/assets/tools.md.4de0b4c5.lean.js deleted file mode 100644 index b7a9c18e..00000000 --- a/assets/tools.md.4de0b4c5.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,o as n,c as a,V as l}from"./chunks/framework.fc84ac3a.js";const d=JSON.parse('{"title":"Magisk 工具","description":"","frontmatter":{},"headers":[],"relativePath":"tools.md","filePath":"tools.md","lastUpdated":1684159014000}'),p={name:"tools.md"},e=l("",27),o=[e];function t(c,i,C,A,r,y){return n(),a("div",null,o)}const g=s(p,[["render",t]]);export{d as __pageData,g as default}; diff --git a/assets/tools.md.641886ad.js b/assets/tools.md.641886ad.js new file mode 100644 index 00000000..c35d3862 --- /dev/null +++ b/assets/tools.md.641886ad.js @@ -0,0 +1,461 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.ed90c782.js";const B=JSON.parse('{"title":"Magisk 工具","description":"","frontmatter":{},"headers":[],"relativePath":"tools.md","filePath":"tools.md","lastUpdated":1694965574000}'),p={name:"tools.md"},o=l(`

    Magisk 工具

    Magisk 为开发人员提供了大量安装工具、守护程序和实用程序。本文档涵盖了4个二进制文件和所有包含的小程序。二进制文件和小程序如下所示:

    txt
    magiskboot                 /* binary */
    +magiskinit                 /* binary */
    +magiskpolicy               /* binary */
    +supolicy -> magiskpolicy
    +magisk                     /* binary */
    +resetprop -> magisk
    +su -> magisk
    magiskboot                 /* binary */
    +magiskinit                 /* binary */
    +magiskpolicy               /* binary */
    +supolicy -> magiskpolicy
    +magisk                     /* binary */
    +resetprop -> magisk
    +su -> magisk

    magiskboot

    一个用于解压缩/重新打包 boot 映像、解析/修补/解压缩 cpio 、修补 dtb 、十六进制修补二进制文件,以及使用多种算法压缩/解压缩文件的工具。

    magiskboot 支持常见的压缩格式(这意味着它不依赖于外部工具),包括 gziplz4lz4_legacy仅在LG上使用)、lzmaxzbzip2

    magiskboot 的概念是使 boot 映像修改更简单。对于解包,它解析标头并提取映像中的所有部分,如果在任何部分中检测到压缩,则会立即解压缩。对于重新打包,需要原始 boot 映像,以便可以使用原始标头,只需更改必要的内容,如节大小和校验和。如果需要,所有部分将被压缩回原始格式。该工具还支持许多 CPIO 和 DTB 操作。

    bash
    用法: ./magiskboot <> [参数...]
    +
    +支持的操作:
    +  unpack [-n] [-h] <bootimg>
    +       <bootimg> 解压缩到其各个组件,每个组件到一个文件,并在当前目录中具有相
    +    应的文件名。
    +      支持的组件:kernel、kernel_dtb、ramdisk.cpio、second、dtb、extra 
    +    recovery_dtbo。
    +      默认情况下,每个组件将在写入输出文件之前即时自动解压缩。
    +      如果提供“-n”,则将跳过所有解压缩操作;每个组件将保持不变,以原始格式转储。
    +      如果提供了“-h”,则启动映像标头信息将转储到文件“header”,该文件可用于
    +    在重新打包期间修改标头配置。
    +
    +    返回值:
    +    0:valid    1:error    2:chromeos
    +
    +  repack [-n] <原始bootimg> [输出bootimg]
    +      使用当前目录中的文件将启动映像组件重新打包到 [输出bootimg],如果未指
    +    定,则为“new-boot.img”。
    +      <原始bootimg> 是用于解压缩组件的原始启动映像。
    +      默认情况下,每个组件将使用 <原始bootimg> 中检测到的相应格式自动压缩。如
    +    果当前目录中的组件文件已被压缩,则不会对该特定组件执行任何附加压缩。
    +      如果提供“-n”,则将跳过所有压缩操作。
    +    如果 env 变量 PATCHVBMETAFLAG 设置为 true,则将设置启动映像的 vbmeta
    +    header 中的所有禁用标志。
    +
    +  hexpatch <> <hexpattern1> <hexpattern2>
    +     <> 中搜索 <hexpattern1>,并将其替换为 <hexpattern2>
    +
    +  cpio <incpio> [命令...]
    +     <incpio> 执行 cpio 命令(修改已到位)
    +    每个命令都是一个参数,请为每个命令添加引号。
    +    支持的命令:
    +      exists ENTRY
    +        如果 ENTRY 存在,则返回 0,否则返回 1
    +      rm [-r] ENTRY
    +        删除 ENTRY,指定 [-r] 以递归删除
    +      mkdir MODE ENTRY
    +         MODE 权限下创建目录 ENTRY
    +      ln TARGET ENTRY
    +        使用名称 ENTRY 创建指向 TARGET 的符号链接
    +      mv SOURCE DEST
    +         SOURCE 移动到 DEST
    +      add MODE ENTRY INFILE
    +         MODE 权限中添加 INFILE 作为 ENTRY;替换 ENTRY(如果存在)
    +      extract [ENTRY OUT]
    +         ENTRY 解压到 OUT,或将所有条目解压到当前目录
    +      test
    +        测试 cpio 的状态
    +        返回值为0或或运算以下值:
    +        0x1:Magisk    0x2:unsupported    0x4:Sony
    +      patch
    +        应用 ramdisk 补丁
    +         env 变量进行配置:KEEPVERITY KEEPFORCEENCRYPT
    +      backup ORIG
    +         ORIG 创建 ramdisk 备份
    +      restore
    +         incpio 中存储的 ramdisk 备份恢复 ramdisk
    +      sha1
    +        如果以前已在 ramdisk 中备份,则输出原始引导SHA1
    +
    +  dtb <> <> [参数...]
    +     <> 执行与 dtb 相关的操作
    +    支持的操作:
    +      print [-f]
    +        打印 dtb 的所有内容以进行调试
    +        指定 [-f] 以仅打印 fstab 节点
    +      patch
    +        搜索 fstab 并删除 verity/avb
    +        直接对文件进行修改
    +        使用 env 变量进行配置:KEEPVERITY
    +      test
    +        测试 fstab 的状态
    +        返回值:
    +        0:valid    1:error
    +
    +  split <>
    +     image.*-dtb 拆分为 kernel + kernel_dtb
    +
    +  sha1 <>
    +     <>  SHA1 校验和
    +
    +  cleanup
    +    清理当前工作目录
    +
    +  compress[=格式] <输入文> [输出文件]
    +    使用 [格式] 将 <输入文件> 压缩为 [输出文件]。
    +    可以是“-”,以作为 STDIN/STDOUT。
    +    如果未指定 [格式],则将使用 gzip。
    +    如果未指定 [输出文件],则 <输入文件> 将被替换为
    +    后缀为匹配文件扩展名的另一个文件。
    +    支持格式: gzip zopfli xz lzma bzip2 lz4 lz4_legacy lz4_lg 
    +
    +  decompress <输入文> [输出文件]
    +    检测格式并将 <输入文> 解压缩到 [输出文件]。
    +    <输入文件>/[输出文件] 可以是“-”,以作为 STDIN/STDOUT。
    +    如果未指定 [输出文件],则 <输入文件> 将替换为另一个文件,
    +    删除其文件格式文件扩展名。
    +    支持格式: gzip zopfli xz lzma bzip2 lz4 lz4_legacy lz4_lg
    用法: ./magiskboot <> [参数...]
    +
    +支持的操作:
    +  unpack [-n] [-h] <bootimg>
    +       <bootimg> 解压缩到其各个组件,每个组件到一个文件,并在当前目录中具有相
    +    应的文件名。
    +      支持的组件:kernel、kernel_dtb、ramdisk.cpio、second、dtb、extra 
    +    recovery_dtbo。
    +      默认情况下,每个组件将在写入输出文件之前即时自动解压缩。
    +      如果提供“-n”,则将跳过所有解压缩操作;每个组件将保持不变,以原始格式转储。
    +      如果提供了“-h”,则启动映像标头信息将转储到文件“header”,该文件可用于
    +    在重新打包期间修改标头配置。
    +
    +    返回值:
    +    0:valid    1:error    2:chromeos
    +
    +  repack [-n] <原始bootimg> [输出bootimg]
    +      使用当前目录中的文件将启动映像组件重新打包到 [输出bootimg],如果未指
    +    定,则为“new-boot.img”。
    +      <原始bootimg> 是用于解压缩组件的原始启动映像。
    +      默认情况下,每个组件将使用 <原始bootimg> 中检测到的相应格式自动压缩。如
    +    果当前目录中的组件文件已被压缩,则不会对该特定组件执行任何附加压缩。
    +      如果提供“-n”,则将跳过所有压缩操作。
    +    如果 env 变量 PATCHVBMETAFLAG 设置为 true,则将设置启动映像的 vbmeta
    +    header 中的所有禁用标志。
    +
    +  hexpatch <> <hexpattern1> <hexpattern2>
    +     <> 中搜索 <hexpattern1>,并将其替换为 <hexpattern2>
    +
    +  cpio <incpio> [命令...]
    +     <incpio> 执行 cpio 命令(修改已到位)
    +    每个命令都是一个参数,请为每个命令添加引号。
    +    支持的命令:
    +      exists ENTRY
    +        如果 ENTRY 存在,则返回 0,否则返回 1
    +      rm [-r] ENTRY
    +        删除 ENTRY,指定 [-r] 以递归删除
    +      mkdir MODE ENTRY
    +         MODE 权限下创建目录 ENTRY
    +      ln TARGET ENTRY
    +        使用名称 ENTRY 创建指向 TARGET 的符号链接
    +      mv SOURCE DEST
    +         SOURCE 移动到 DEST
    +      add MODE ENTRY INFILE
    +         MODE 权限中添加 INFILE 作为 ENTRY;替换 ENTRY(如果存在)
    +      extract [ENTRY OUT]
    +         ENTRY 解压到 OUT,或将所有条目解压到当前目录
    +      test
    +        测试 cpio 的状态
    +        返回值为0或或运算以下值:
    +        0x1:Magisk    0x2:unsupported    0x4:Sony
    +      patch
    +        应用 ramdisk 补丁
    +         env 变量进行配置:KEEPVERITY KEEPFORCEENCRYPT
    +      backup ORIG
    +         ORIG 创建 ramdisk 备份
    +      restore
    +         incpio 中存储的 ramdisk 备份恢复 ramdisk
    +      sha1
    +        如果以前已在 ramdisk 中备份,则输出原始引导SHA1
    +
    +  dtb <> <> [参数...]
    +     <> 执行与 dtb 相关的操作
    +    支持的操作:
    +      print [-f]
    +        打印 dtb 的所有内容以进行调试
    +        指定 [-f] 以仅打印 fstab 节点
    +      patch
    +        搜索 fstab 并删除 verity/avb
    +        直接对文件进行修改
    +        使用 env 变量进行配置:KEEPVERITY
    +      test
    +        测试 fstab 的状态
    +        返回值:
    +        0:valid    1:error
    +
    +  split <>
    +     image.*-dtb 拆分为 kernel + kernel_dtb
    +
    +  sha1 <>
    +     <>  SHA1 校验和
    +
    +  cleanup
    +    清理当前工作目录
    +
    +  compress[=格式] <输入文> [输出文件]
    +    使用 [格式] 将 <输入文件> 压缩为 [输出文件]。
    +    可以是“-”,以作为 STDIN/STDOUT。
    +    如果未指定 [格式],则将使用 gzip。
    +    如果未指定 [输出文件],则 <输入文件> 将被替换为
    +    后缀为匹配文件扩展名的另一个文件。
    +    支持格式: gzip zopfli xz lzma bzip2 lz4 lz4_legacy lz4_lg 
    +
    +  decompress <输入文> [输出文件]
    +    检测格式并将 <输入文> 解压缩到 [输出文件]。
    +    <输入文件>/[输出文件] 可以是“-”,以作为 STDIN/STDOUT。
    +    如果未指定 [输出文件],则 <输入文件> 将替换为另一个文件,
    +    删除其文件格式文件扩展名。
    +    支持格式: gzip zopfli xz lzma bzip2 lz4 lz4_legacy lz4_lg

    magiskinit

    这个二进制文件将替换 Magisk 补丁启动映像的 ramdisk 中的 init。它最初是为支持以 system-as-root 的设备而创建的,但该工具被扩展为支持所有设备,并成为 Magisk 的关键部分。更多详细信息可以在 Magisk 启动过程 中的 预初始化(Pre-Init) 部分找到。

    magiskpolicy

    (此工具别名为 supolicy,以与 SuperSU 的 sepolicy 工具兼容)

    高级开发人员可以使用此工具修改 SELinux 策略。在像 Linux 服务器管理员这样的常见场景中,他们会直接修改 SELinux 策略源(*.te)并重新编译 sepolicy 二进制文件,但在 Android 上,我们直接修补二进制文件(或运行时策略)。

    Magisk 守护进程派生的所有进程,包括 root shell 及其所有分支,都在上下文 u:r:magisk:s0 中运行。所有安装了 Magisk 的系统上使用的规则都可以被视为官方的 sepolicy 具有以下补丁:magiskpolicy --magisk 'allow magisk * * *'

    bash
    用法: ./magiskpolicy [--选项...] [策略声明...]
    +
    +选项:
    +   --help            显示 policy 语句的帮助消息
    +   --load FILE        FILE 加载 sepolicy
    +   --load-split      从预编译的 sepolicy 加载或编译拆分的 cil 策略
    +   --compile-split   编译拆分的cil策略
    +   --save FILE       将整体策略转储到 FILE 文件
    +   --live            立即将 sepolicy 加载到内核中
    +   --magisk          应用内置 Magisk sepolicy 规则
    +   --apply FILE      应用 FILE 中的规则,作为策略语句逐行读取和分析
    +                     (允许多重 --apply)
    +
    +如果既没有指定 --load、--load-split,也没有指定 --compile-split,则它
    +将从当前活动策略(/sys/fs/selinux/policy)加载
    +
    +
    +一个策略声明应被视为一个参数,这意味着每个策略声明都应该用引号括起来。
    +可以在一个命令中提供多个策略语句。
    +
    +语句的格式为“<rule_name> [args...]”。
    +标有 (^) 的参数可以接受一个或多个条目。多个条目由大括号 ({}) 中的空格分隔列表组成。
    +标有 (*) 的参数与 (^) 相同,但另外支持 match-all 运算符 (*)。
    +
    +示例:"allow { s1 s2 } { t1 t2 } class *"
    +将扩展到:
    +
    +allow s1 t1 class { all-permissions-of-class }
    +allow s1 t2 class { all-permissions-of-class }
    +allow s2 t1 class { all-permissions-of-class }
    +allow s2 t2 class { all-permissions-of-class }
    +
    +支持的策略声明:
    +
    +"allow *source_type *target_type *class *perm_set"
    +"deny *source_type *target_type *class *perm_set"
    +"auditallow *source_type *target_type *class *perm_set"
    +"dontaudit *source_type *target_type *class *perm_set"
    +
    +"allowxperm *source_type *target_type *class operation xperm_set"
    +"auditallowxperm *source_type *target_type *class operation xperm_set"
    +"dontauditxperm *source_type *target_type *class operation xperm_set"
    +- 唯一支持的操作是“ioctl”
    +- xperm_set 格式为 “low-high”、“value”或“*”。
    +  “*”将被视为“0x0000-0xFFFF”。
    +  所有值应以十六进制书写。
    +
    +"permissive ^type"
    +"enforce ^type"
    +
    +"typeattribute ^type ^attribute"
    +
    +"type type_name ^(attribute)"
    +- 参数“attribute”是可选的,默认为“domain”
    +
    +"attribute attribute_name"
    +
    +"type_transition source_type target_type class default_type (object_name)"
    +- 参数“object_name”是可选的
    +
    +"type_change source_type target_type class default_type"
    +"type_member source_type target_type class default_type"
    +
    +"genfscon fs_name partial_path fs_context"
    用法: ./magiskpolicy [--选项...] [策略声明...]
    +
    +选项:
    +   --help            显示 policy 语句的帮助消息
    +   --load FILE        FILE 加载 sepolicy
    +   --load-split      从预编译的 sepolicy 加载或编译拆分的 cil 策略
    +   --compile-split   编译拆分的cil策略
    +   --save FILE       将整体策略转储到 FILE 文件
    +   --live            立即将 sepolicy 加载到内核中
    +   --magisk          应用内置 Magisk sepolicy 规则
    +   --apply FILE      应用 FILE 中的规则,作为策略语句逐行读取和分析
    +                     (允许多重 --apply)
    +
    +如果既没有指定 --load、--load-split,也没有指定 --compile-split,则它
    +将从当前活动策略(/sys/fs/selinux/policy)加载
    +
    +
    +一个策略声明应被视为一个参数,这意味着每个策略声明都应该用引号括起来。
    +可以在一个命令中提供多个策略语句。
    +
    +语句的格式为“<rule_name> [args...]”。
    +标有 (^) 的参数可以接受一个或多个条目。多个条目由大括号 ({}) 中的空格分隔列表组成。
    +标有 (*) 的参数与 (^) 相同,但另外支持 match-all 运算符 (*)。
    +
    +示例:"allow { s1 s2 } { t1 t2 } class *"
    +将扩展到:
    +
    +allow s1 t1 class { all-permissions-of-class }
    +allow s1 t2 class { all-permissions-of-class }
    +allow s2 t1 class { all-permissions-of-class }
    +allow s2 t2 class { all-permissions-of-class }
    +
    +支持的策略声明:
    +
    +"allow *source_type *target_type *class *perm_set"
    +"deny *source_type *target_type *class *perm_set"
    +"auditallow *source_type *target_type *class *perm_set"
    +"dontaudit *source_type *target_type *class *perm_set"
    +
    +"allowxperm *source_type *target_type *class operation xperm_set"
    +"auditallowxperm *source_type *target_type *class operation xperm_set"
    +"dontauditxperm *source_type *target_type *class operation xperm_set"
    +- 唯一支持的操作是“ioctl”
    +- xperm_set 格式为 “low-high”、“value”或“*”。
    +  “*”将被视为“0x0000-0xFFFF”。
    +  所有值应以十六进制书写。
    +
    +"permissive ^type"
    +"enforce ^type"
    +
    +"typeattribute ^type ^attribute"
    +
    +"type type_name ^(attribute)"
    +- 参数“attribute”是可选的,默认为“domain”
    +
    +"attribute attribute_name"
    +
    +"type_transition source_type target_type class default_type (object_name)"
    +- 参数“object_name”是可选的
    +
    +"type_change source_type target_type class default_type"
    +"type_member source_type target_type class default_type"
    +
    +"genfscon fs_name partial_path fs_context"

    magisk

    当使用名称 magisk 调用 magisk 二进制文件时,它作为一个实用工具,具有许多助手函数和几个 Magisk 服务的入口点。

    bash
    用法: magisk [小程序 [参数]...]
    +   或: magisk [选项]...
    +
    +选项:
    +   -c                        打印当前二进制版本
    +   -v                        打印正在运行的守护程序版本
    +   -V                        打印正在运行的守护程序版本号
    +   --list                    列出所有可用的小程序
    +   --remove-modules          移除所有模块并重新启动
    +   --install-module ZIP      安装模块 zip 文件
    +
    +高级选项(内部 APIs):
    +   --daemon                  手动启动 Magisk 守护进程
    +   --stop                    移除所有 Magisk 更改并停止守护程序
    +   --[init trigger]          初始化触发器上的回调。有效的触发器:
    +                             post-fs-data, service, boot-complete, zygote-restart
    +   --unlock-blocks           将所有块设备的 BLKROSET 标志设置为 OFF
    +   --restorecon              恢复 Magisk 文件上的 selinux 上下文
    +   --clone-attr SRC DEST     克隆权限、所有者和 selinux 上下文
    +   --clone SRC DEST          克隆 SRC  DEST
    +   --sqlite SQL              执行 SQL 命令到 Magisk 数据库
    +   --path                    打印 Magisk tmpfs 挂载路径
    +   --denylist ARGS           拒绝列表配置 CLI
    +
    +可用的小程序:
    +    su, resetprop
    +
    +用法: magisk --denylist [操作 [参数...] ]
    +操作:
    +   status          返回强制的状态
    +   enable          启用拒绝列表强制
    +   disable         禁用拒绝列表强制
    +   add PKG [PROC]  将新目标添加到拒绝列表
    +   rm PKG [PROC]   从拒绝列表中删除目标
    +   ls              打印当前拒绝列表
    +   exec CMDs...    在隔离的挂载命名空间中执行命令并执行
    +                   所有卸载操作
    用法: magisk [小程序 [参数]...]
    +   或: magisk [选项]...
    +
    +选项:
    +   -c                        打印当前二进制版本
    +   -v                        打印正在运行的守护程序版本
    +   -V                        打印正在运行的守护程序版本号
    +   --list                    列出所有可用的小程序
    +   --remove-modules          移除所有模块并重新启动
    +   --install-module ZIP      安装模块 zip 文件
    +
    +高级选项(内部 APIs):
    +   --daemon                  手动启动 Magisk 守护进程
    +   --stop                    移除所有 Magisk 更改并停止守护程序
    +   --[init trigger]          初始化触发器上的回调。有效的触发器:
    +                             post-fs-data, service, boot-complete, zygote-restart
    +   --unlock-blocks           将所有块设备的 BLKROSET 标志设置为 OFF
    +   --restorecon              恢复 Magisk 文件上的 selinux 上下文
    +   --clone-attr SRC DEST     克隆权限、所有者和 selinux 上下文
    +   --clone SRC DEST          克隆 SRC  DEST
    +   --sqlite SQL              执行 SQL 命令到 Magisk 数据库
    +   --path                    打印 Magisk tmpfs 挂载路径
    +   --denylist ARGS           拒绝列表配置 CLI
    +
    +可用的小程序:
    +    su, resetprop
    +
    +用法: magisk --denylist [操作 [参数...] ]
    +操作:
    +   status          返回强制的状态
    +   enable          启用拒绝列表强制
    +   disable         禁用拒绝列表强制
    +   add PKG [PROC]  将新目标添加到拒绝列表
    +   rm PKG [PROC]   从拒绝列表中删除目标
    +   ls              打印当前拒绝列表
    +   exec CMDs...    在隔离的挂载命名空间中执行命令并执行
    +                   所有卸载操作

    su

    MagiskSU 入口点 magisk 的小程序。不错的旧 su 命令。

    bash
    用法: su [选项] [-] [user [参数...]]
    +
    +选项:
    +  -c, --command 命令         将命令传递给调用的 shell
    +  -h, --help                    显示此帮助消息并退出
    +  -, -l, --login                 shell 伪装成一个登录 shell
    +  -m, -p,
    +  --preserve-environment        保护整个环境
    +  -s, --shell SHELL             使用 SHELL 而不是默认的 /system/bin/sh
    +  -v, --version                 显示版本名并退出
    +  -V                            显示版本号并退出
    +  -mm, -M,
    +  --mount-master                在全局装载命名空间中强制运行
    用法: su [选项] [-] [user [参数...]]
    +
    +选项:
    +  -c, --command 命令         将命令传递给调用的 shell
    +  -h, --help                    显示此帮助消息并退出
    +  -, -l, --login                 shell 伪装成一个登录 shell
    +  -m, -p,
    +  --preserve-environment        保护整个环境
    +  -s, --shell SHELL             使用 SHELL 而不是默认的 /system/bin/sh
    +  -v, --version                 显示版本名并退出
    +  -V                            显示版本号并退出
    +  -mm, -M,
    +  --mount-master                在全局装载命名空间中强制运行

    注意

    尽管上面没有列出 -Z, --context 选项,但该选项仍然存在,以便与为 SuperSU 设计的应用程序进行 CLI 兼容。然而,该选项被默默地忽略,因为它不再相关。

    resetprop

    magisk 的小程序。高级系统属性操作实用程序。查看 Resetprop 详细信息 以了解更多背景信息。

    bash
    用法: resetprop [标志] [选项...]
    +
    +选项:
    +   -h, --help        显示此消息
    +   (no arguments)    输出所有属性
    +   NAME              获取 NAME 属性
    +   NAME VALUE        使用 VALUE 设置 NAME 属性
    +   --file FILE        FILE 加载属性
    +   --delete NAME     删除 NAME 属性
    +
    +标志:
    +   -v      将详细输出打印到 stderr
    +   -n      设置 props 而不经过 property_service
    +           (此标志仅影响 setprop)
    +   -p      从/向持久存储读取/写入属性
    +           (此标志仅影响 getprop  delprop)
    用法: resetprop [标志] [选项...]
    +
    +选项:
    +   -h, --help        显示此消息
    +   (no arguments)    输出所有属性
    +   NAME              获取 NAME 属性
    +   NAME VALUE        使用 VALUE 设置 NAME 属性
    +   --file FILE        FILE 加载属性
    +   --delete NAME     删除 NAME 属性
    +
    +标志:
    +   -v      将详细输出打印到 stderr
    +   -n      设置 props 而不经过 property_service
    +           (此标志仅影响 setprop)
    +   -p      从/向持久存储读取/写入属性
    +           (此标志仅影响 getprop  delprop)

    参考链接

    `,27),e=[o];function c(t,r,E,y,F,i){return n(),a("div",null,e)}const g=s(p,[["render",c]]);export{B as __pageData,g as default}; diff --git a/assets/tools.md.641886ad.lean.js b/assets/tools.md.641886ad.lean.js new file mode 100644 index 00000000..737933a2 --- /dev/null +++ b/assets/tools.md.641886ad.lean.js @@ -0,0 +1 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.ed90c782.js";const B=JSON.parse('{"title":"Magisk 工具","description":"","frontmatter":{},"headers":[],"relativePath":"tools.md","filePath":"tools.md","lastUpdated":1694965574000}'),p={name:"tools.md"},o=l("",27),e=[o];function c(t,r,E,y,F,i){return n(),a("div",null,e)}const g=s(p,[["render",c]]);export{B as __pageData,g as default}; diff --git a/boot.html b/boot.html index a836b9ec..3fd03d44 100644 --- a/boot.html +++ b/boot.html @@ -5,20 +5,23 @@ Android 引导诡计 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    Android 引导诡计

    术语

    • rootdir:根目录 (/)。所有 文件、文件夹或文件系统 都存储在 rootdir 中或挂载在 rootdir 下。在 Android 上,文件系统可以是 rootfssystem 分区。
    • initramfs:Android 启动映像中的一个部分,Linux 内核将使用它作为rootfs。人们也可以使用术语 ramdisk
    • recoveryboot 分区:这两个实际上非常相似:都是包含 ramdisk 和 Linux 内核的 Android 启动映像(加上其他一些东西)。 唯一的区别是,启动 boot 分区将把我们带到 Android,而 recovery 有一个用于修复和升级设备的极简自带 Linux 环境。
    • SAR:系统作为根(System-as-root)。也就是说,设备使用 system 作为rootdir,而不是 rootfs
    • A/B, A-only:对于支持无缝系统更新的设备,它将具有所有只读分区的2个插槽(partition);我们称这些为A/B设备。为了区分,非A/B设备将称为A-only
    • 2SI:两阶段初始化。Android 10+ 的启动方式。稍后提供更多信息。

    以下是一些参数,可帮助您更精确地定义设备的 Android 版本:

    • LV:推出版本。设备推出时使用的安卓版本。也就是说,设备首次上市时预装的 Android 版本。
    • RV:运行版本。设备当前运行的 Android 版本。

    我们将使用 Android API 级别 来表示 LV 和 RV 。API 级别和 Android 版本之间的映射可以在 (https://source.android.google.cn/setup/start/build-numbers#platform-code-names-versions-api-levels-and-ndk-releases) 中看到。例如:Pixel XL 随 Android 7.1 发布,并运行 Android 10,这些参数将为 (LV = 25, RV = 29)

    引导方法

    Android 启动可以大致分为 3 种主要的不同方法。我们提供了一个一般的经验法则,以确定您的设备最有可能使用哪种方法,但例外情况单独列出。

    方法初始根目录最终根目录
    Arootfsrootfs
    Bsystemsystem
    Crootfssystem
    • 方法 A - 传统 ramdisk:这是所有 Android 设备过去启动的方式(过去的美好时光)。内核使用 initramfs 作为 rootdir,exec /init 来引导。
      • 不属于方法 B 和 C 标准中的设备
    • 方法 B - 传统 SAR:此方法首次出现在 Pixel 1 上。内核直接挂载 system 分区作为 rootdir 并且 exec /init 来引导。
      • 具有 (LV = 28) 的设备
      • 谷歌:Pixel 1 和 2。Pixel3 和 3a 为 (RV = 28)
      • 一加:6 - 7
      • 也许一些 (LV < 29) Android Go 设备?
    • 方法 C - 2SI ramdisk SAR:此方法首次出现在 Pixel 3 Android 10 开发者预览版中。内核使用 initramfs 作为 rootdir,在 rootfs 中使用 exec /init。这个 init 负责挂载 system 分区并将其用作新的 rootdir,最后执行 /system/bin/init 来引导。
      • 具有 (LV >= 29) 的设备
      • 具有 (LV < 28, RV >= 29) 的设备,不包括已在使用方法 B 的设备
      • 谷歌:Pixel 3 和 3a 为 (RV >= 29)

    讨论

    从文档来看,谷歌对 SAR 的定义只考虑了内核如何引导设备(上表中的初始根目录),这意味着从谷歌的角度来看,只有使用方法B的设备才被正式视为 SAR 设备。

    然而,对于 Magisk 来说,真正的区别在于设备在完全启动时使用的是什么(上表中的最终根目录),这意味着就 Magisk 而言,方法 B 和方法 C 都是 SAR 的一种形式,但实施方式不同。除非另有特别说明,否则本文件后面提到的每一个 SAR 实例都将参考 Magisk 的定义

    通俗地说,方法 C 的标准有点复杂:您的设备足够现代,可以使用 Android 10+ 启动,或者您在使用方法 A 的设备上运行 Android 10+ 第三方 ROM。

    • 任何运行 Android 10+ 的设备都将自动使用方法 C
    • 方法 B 设备卡在方法 B 上,唯一的例外是 Pixel 3 和 3a,Google 对设备进行了改造以适应新方法。

    SAR 是 Project Treble 中非常重要的一部分,因为 rootdir 应该与平台绑定。这也是方法 B 和 C 带有 (LV >= ver) 标准的原因,因为谷歌每年都强制所有 OEM 遵守更新的要求。

    一些历史

    当谷歌发布第一代 Pixel 时,它还推出了 A/B(无缝)系统更新。由于存储大小问题,与仅 A 相比有几个区别,最相关的是删除 recovery 分区和 recovery ramdisk ,合并到boot中。

    让我们回到 Google 第一次设计 A/B 的时候。如果使用 SAR(当时只有引导方法 B 存在),内核不需要 initramfs 来引导 Android(因为 rootdir 在 system 中)。这意味着我们可以很聪明,只需将 recovery ramdisk(包含极简的 Linux 环境)塞入 boot ,删除 recovery ,然后让内核根据引导加载程序的信息选择要使用的任何根目录(ramdisk 或 system)。

    随着时间从 Android 7.1 到 Android 10 的流逝,谷歌推出了动态分区。这对 SAR 来说是个坏消息,因为 Linux 内核无法直接理解这种新的分区格式,因此无法直接将 system 挂载为 rootdir。这是他们想出引导方法 C 的时候:总是引导到 initramfs ,并让 userspace 处理其余的引导。这包括决定是否启动到 Android 或 recovery,或者他们正式称之为 USES_RECOVERY_AS_BOOT

    一些使用带有 2SI 的 A/B 的现代设备还带有 recovery_a/_b 分区。谷歌的标准正式支持这一点。当 recovery 存储在单独的分区中时,这些设备将只使用 boot ramdisk 引导到 Android。

    将事物拼凑在一起

    有了上面的所有知识,现在我们可以将所有 Android 设备分类为以下不同类型:

    类型引导方式分区2SIboot 里的 ramdisk
    IAA-onlyNoboot ramdisk
    IIBA/BAnyrecovery ramdisk
    IIIBA-onlyAnyN/A
    IVCAnyYes混合 ramdisk

    这些类型按首次可用时的时间顺序排序。

    • I 类:好的旧传统 ramdisk 引导
    • II 类:旧版 A/B 设备。Pixel 1 是这种类型的第一个设备,同时也是第一个 A/B 和 SAR 设备。
    • III 类:2018年末-2019年仅限A级的设备就 Magisk 而言,这是迄今为止最糟糕的一种设备类型
    • IV 类:所有使用引导方法 C 的设备都是 IV 型设备。A/B IV 类 ramdisk 可以根据引导加载程序的信息启动到 Android 或 recovery;A-only IV 类 ramdisk 只能引导到 Android。

    关于 III 类设备的更多详细信息:Magisk 始终安装在引导映像的 ramdisk 中。对于所有其他类型的设备,由于其 boot 分区包含 ramdisk,因此可以通过 Magisk app 或第三方 recovery 中的刷入 ZIP 修补引导映像来轻松安装 Magisk。然而,对于 III 型设备,它们仅限于将 Magisk 安装到 recovery 分区中。Magisk 在正常启动时无法运行;相反,III 类设备用户必须始终重新启动到 recovery,以保持 Magisk 访问。

    一些 III 类设备的引导加载程序仍然会接受并提供手动添加到内核“引导”映像中的 initramfs(例如一些小米手机),但许多设备不接受(例如三星 S10,Note 10)。这完全取决于 OEM 如何实现其引导加载程序。

    参考链接

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/build.html b/build.html index 73166c0c..3f5db93b 100644 --- a/build.html +++ b/build.html @@ -5,23 +5,29 @@ 构建和开发 Magisk | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    构建和开发 Magisk

    设置环境

    • 支持的平台:
      • Linux x64
      • macOS x64 (Intel)
      • macOS arm64 (Apple Silicon)
      • Windows x64
    • 仅 Windows: 启用开发者模式。因为需要支持符号链接。
    • 安装 Python 3.8+:
      • 在 Unix 上,使用您喜欢的软件包管理器安装 python3
      • 在 Windows 上,在官方网站上下载并安装 Python 最新的版本.
        请在安装过程中选择 “Add Python to PATH(将 Python 添加到 PATH)”
      • (在 Windows 上,可选):运行 pip install colorama 以安装 colorama python 包
    • 安装 Git:
      • 在 Unix 上,使用您喜欢的软件包管理器安装 git
      • 在 Windows 上,在官方网站上下载并安装最新的 Git 版本.
        请确保在安装过程前 “启用符号链接”
    • 安装 Android Studio 并按照说明进行初始设置。
    • 将环境变量 ANDROID_SDK_ROOT 设置为 Android SDK 文件夹。此路径可以在 Android Studio 设置中找到。
    • 设置 JDK:
      • 建议的选项是将环境变量 ANDROID_STUDIO 设置为 Android Studio 的安装路径。构建脚本将自动查找并使用捆绑的 JDK。
      • 您也可以自己设置 JDK 17,但本指南不包含说明。
    • 克隆源代码:
    bash
    git clone --recurse-submodules https://github.com/topjohnwu/Magisk.git
    • 运行 ./build.py ndk 让脚本下载并安装 NDK

    构建

    • 要构建所有内容并创建最终的 Magisk APK,请运行 ./build.py all
    • 您还可以构建特定的子组件。调用 build.py 查看您的选项
      对于每个操作,使用 -h 访问帮助(例如 ./build.py binary -h
    • 使用 config.prop 配置构建。提供了示例 config.prop.sample

    IDE 支持

    • Magisk 的存储库可以作为一个项目直接使用 Android Studio 打开。
    • 项目中的 Kotlin、Java、C++ 和 C 代码应该在 Android Studio 中得到开箱即用的适当支持。
    • 在处理原生(native)代码之前运行 ./build.py binary ,因为某些生成的代码仅在构建过程中创建。

    在 Android Studio 中开发 Rust

    由于 Magisk NDK 软件包 ONDK(与 ./build.py ndk 一起安装的软件包)包含一个完全独立的 Clang + Rust 工具链,因此单独构建 Magisk 项目不需要配置工具链。但是,由于 Intellij Rust 插件的工作方式,您必须进行一些额外的设置才能使 Android Studio 与 Magisk 的 Rust 代码库一起使用:

    • 安装官方 Rust 工具链管理器 rustup
    • 链接 ONDK Rust 工具链并将其设置为默认值:
    bash
    # 将 ONDK 工具链与名称“magisk”链接起来
    -rustup toolchain link magisk "$ANDROID_SDK_ROOT/ndk/magisk/toolchains/rust"
    -# 设置为默认
    -rustup default magisk
    • 在 Android Studio 中安装 Intellij Rust 插件
    • 在 首选项(Preferences) > 语言和框架(Languages & Frameworks) > Rust 中,将 $ANDROID_SDK_ROOT/ndk/magisk/toolchains/rust/bin 设置为工具链位置
    • 打开 native/src/Cargo.toml ,然后在“未找到 Cargo 项目(No Cargo projects found)”横幅中选择“附加(Attach)”

    签名和分发

    • 在发布版本中,Magisk 的 root 守护程序将使用对 Magisk APK 进行密钥签名的证书作为参考,拒绝并强制卸载任何不匹配的 Magisk 应用,保护用户免受恶意和未经验证的 Magisk APK 的侵害。
    • 要在 Magisk 本身上进行任何开发,请切换到 官方调试版本并重新安装 Magisk 以关闭签名检查。
    • 要分发使用您自己的密钥签名的自己的 Magisk 构建,请在 config.prop 中设置您的签名配置。
    • 查看 Google 的文档,了解有关生成自己的密钥的更多详细信息。

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/changes.html b/changes.html index c5539550..36cd32a2 100644 --- a/changes.html +++ b/changes.html @@ -5,20 +5,23 @@ Magisk 更新日志 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    Magisk 更新日志

    v26.1

    • [App] Fix crashing when revoking root permissions
    • [MagiskInit] Always prefer ext4 partitions over f2fs when selecting the pre-init partition
    • [General] Restore module files' context/owner/group from mirror. This is a regression introduced in v26.0

    v26.0

    • [General] Bump minimum supported Android version to Android 6.0
    • [General] New magic mount backend. It supports loading modules into system with overlayfs files injected
    • [Zygisk] Release new API version 4
    • [Zygisk] Prevent crashing daemon in error
    • [Zygisk] Rewrite zygote code injection with new loader library approach
    • [Zygisk] Rewrite code unloading implementation
    • [MagiskBoot] Support amonet microloader devices
    • [MagiskBoot] Always use lz4_legacy compression on v4 boot images. This fixes boot image patching issues on Android U preview.
    • [MagiskInit] Support replacing existing *.rc files in overlay.d
    • [MagiskInit] Rewrite sepolicy.rules mounting and loading implementation
    • [App] Make stub patching 100% offline
    • [App] Support patching init_boot.img for Samsung ODIN firmware
    • [MagiskPolicy] Fix minor bug in command line argument parsing
    • [MagiskPolicy] Update rules to support Android U

    v25.2

    • [MagiskInit] Fix a potential issue when stub cpio is used
    • [MagiskInit] Fix reboot to recovery when stub cpio is used
    • [MagiskInit] Fix sepolicy.rules symlink for rootfs devices
    • [General] Better data encryption detection
    • [General] Move the whole logging infrastructure into Rust

    v25.1

    • [MagiskBoot] Fix ramdisk backup being incorrectly skipped
    • [MagiskBoot] Add new feature to detect unsupported dtb and abort during installation
    • [Zygisk] Change binary hijack paths
    • [App] Fix incorrect recovery mode detection and installation
    • [MagiskInit] Fix config not properly exported in legacy SAR devices
    • [General] Enforce the Magisk app to always match or be newer than magiskd

    v25.0

    • [MagiskInit] Update 2SI implementation, significantly increase device compatibility (e.g. Sony Xperia devices)
    • [MagiskInit] Introduce new sepolicy injection mechanism
    • [MagiskInit] Support Oculus Go
    • [MagiskInit] Support Android 13 GKIs (Pixel 6)
    • [MagiskBoot] Fix vbmeta extraction implementation
    • [App] Fix stub app on older Android versions
    • [App] [MagiskSU] Properly support apps using sharedUserId
    • [MagiskSU] Fix a possible crash in magiskd
    • [MagiskSU] Prune unused UIDs as soon as system_server restarts to prevent UID reuse attacks
    • [MagiskSU] Verify and enforce the installed Magisk app's certificate to match the distributor's signature
    • [MagiskSU] [Zygisk] Proper package management and detection
    • [Zygisk] Fix function hooking on devices running Android 12 with old kernels
    • [Zygisk] Fix Zygisk's self code unloading implementation
    • [DenyList] Fix DenyList on shared UID apps
    • [BusyBox] Add workaround for devices running old kernels

    v24.3

    • [General] Stop using getrandom syscall
    • [Zygisk] Update API to v3, adding new fields to AppSpecializeArgs
    • [App] Improve app repackaging installation workflow

    v24.2

    • [MagiskSU] Fix buffer overflow
    • [MagiskSU] Fix owner managed multiuser superuser settings
    • [MagiskSU] Fix command logging when using su -c <cmd>
    • [MagiskSU] Prevent su request indefinite blocking
    • [MagiskBoot] Support lz4_legacy archive with multiple magic
    • [MagiskBoot] Fix lz4_lg compression
    • [DenyList] Allow targeting processes running as system UID
    • [Zygisk] Workaround Samsung's "early zygote"
    • [Zygisk] Improved Zygisk loading mechanism
    • [Zygisk] Fix application UID tracking
    • [Zygisk] Fix improper umask being set in zygote
    • [App] Fix BusyBox execution test
    • [App] Improve stub loading mechanism
    • [App] Major app upgrade flow improvements
    • [General] Improve commandline error handling and messaging

    v24.1

    • [App] Stability improvements

    v24.0

    • [General] MagiskHide is removed from Magisk
    • [General] Support Android 12
    • [General] Support devices that do not support 32-bit and only runs 64-bit code
    • [General] Update BusyBox to 1.34.1
    • [Zygisk] Introduce new feature: Zygisk
    • [Zygisk] Introduce DenyList feature to revert Magisk features in user selected processes
    • [MagiskBoot] Support patching 32-bit kernel zImages
    • [MagiskBoot] Support boot image header v4
    • [MagiskBoot] Support patching out skip_initramfs from dtb bootargs
    • [MagiskBoot] Add new env variable PATCHVBMETAFLAG to configure whether vbmeta flags should be patched
    • [MagiskInit] Support loading fstab from /system/etc (required for Pixel 6)
    • [MagiskInit] Support /proc/bootconfig for loading boot configurations
    • [MagiskInit] Better support for some Meizu devices
    • [MagiskInit] Better support for some OnePlus/Oppo/Realme devices
    • [MagiskInit] Support init.real on some Sony devices
    • [MagiskInit] Skip loading Magisk when detecting DSU
    • [MagiskPolicy] Load *_compat_cil_file from system_ext
    • [MagiskSU] Use isolated devpts if the kernel supports it
    • [MagiskSU] Fix root shell if isolated mount namespace is set
    • [resetprop] Deleted properties are now wiped from memory instead of just unlinking
    • [App] Build a single APK for all ABIs
    • [App] Switch to use standard bottom navigation bar
    • [App] Downloading modules from the centralized Magisk-Modules-Repo is removed
    • [App] Support user configuration of boot image vbmeta patching
    • [App] Restore the ability to install Magisk on the other slot on some A/B devices
    • [App] Allow modules to specify an update URL for in-app update + install

    v23.0

    • [App] Update snet extension. This fixes SafetyNet API errors.
    • [App] Fix a bug in the stub app that causes APK installation to fail
    • [App] Hide annoying errors in logs when hidden as stub
    • [App] Fix issues when patching ODIN tar files when the app is hidden
    • [General] Remove all pre Android 5.0 support
    • [General] Update BusyBox to use proper libc
    • [General] Fix C++ undefined behaviors
    • [General] Several sepolicy.rule copy/installation fixes
    • [MagiskPolicy] Remove unnecessary sepolicy rules
    • [MagiskHide] Update package and process name validation logic
    • [MagiskHide] Some changes that prevents zygote deadlock

    v22.1

    • [App] Prevent multiple installation sessions running in parallel
    • [App] Prevent OutOfMemory crashes when checking boot signature on PXA boot images
    • [General] Proper cgroup migration implementation
    • [General] Rewrite log writer from scratch, should resolve any crashes and deadlocks
    • [General] Many scripts updates fixing regressions
    • [MagiskHide] Prevent possible deadlock when signal arrives
    • [MagiskHide] Partial match process names if necessary
    • [MagiskBoot] Preserve and patch AVB 2.0 structures/headers in boot images
    • [MagiskBoot] Properly strip out data encryption flags
    • [MagiskBoot] Prevent possible integer overflow
    • [MagiskInit] Fix sepolicy.rule mounting strategy
    • [resetprop] Always delete existing ro. props before updating. This will fix bootloops that could be caused by modifying device fingerprint properties.

    v22.0

    • [General] Magisk and Magisk Manager is now merged into the same package!
    • [App] The term "Magisk Manager" is no longer used elsewhere. We refer it as the Magisk app.
    • [App] Support hiding the Magisk app with advanced technique (stub APK loading) on Android 5.0+ (it used to be 9.0+)
    • [App] Disallow re-packaging the Magisk app on devices lower than Android 5.0
    • [App] Detect and warn about multiple invalid states and provide instructions on how to resolve it
    • [MagiskHide] Fix a bug when stopping MagiskHide does not take effect
    • [MagiskBoot] Fix bug when unpacking lz4_lg compressed boot images
    • [MagiskInit] Support Galaxy S21 series
    • [MagiskSU] Fix incorrect APEX paths that caused libsqlite.so fail to load

    v21.4

    • [MagiskSU] Fix su -c behavior that broke many root apps
    • [General] Properly handle read/write over sockets (the broken pipe issue)

    v21.3

    • [MagiskInit] Avoid mounting f2fs userdata as it may result in kernel crashes. This shall fix a lot of bootloops
    • [MagiskBoot] Fix a minor header checksum bug for DHTB header and ASUS blob image formats
    • [MagiskHide] Allowing hiding isolated processes if the mount namespace is separated

    v21.2

    • [MagiskInit] Detect 2SI after mounting system_root on legacy SAR devices
    • [General] Make sure post-fs-data scripts cannot block more than 35 seconds
    • [General] Fix the magisk --install-module command
    • [General] Trim Windows newline when reading files
    • [General] Directly log to file to prevent logcat weirdness
    • [MagiskBoot] Fix header dump/load for header v3 images

    v21.1

    • [MagiskBoot] Support boot header v3 (Pixel 5 and 4a 5G)
    • [MagiskBoot] Distinguish lz4_lg and lz4_legacy (Pixel 5 and 4a 5G)
    • [MagiskBoot] Support vendor boot images (for dev, not relevant for Magisk installation)
    • [MagiskInit] Support kernel cmdline androidboot.fstab_suffix
    • [MagiskInit] Support kernel initialized dm-verity on legacy SAR
    • [General] Significantly broaden sepolicy.rule compatibility
    • [General] Add Magisk binaries to PATH when executing boot scripts
    • [General] Update --remove-modules command implementation
    • [General] Make Magisk properly survive after factory reset on Android 11
    • [MagiskSU] Add APEX package com.android.i18n to LD_LIBRARY_PATH when linking libsqlite.so
    • [MagiskHide] Support hiding apps installed in secondary users (e.g. work profile)
    • [MagiskHide] Make zygote detection more robust

    v21.0

    • [General] Support Android 11 🎉
    • [General] Add Safe Mode detection. Disable all modules when the device is booting into Safe Mode.
    • [General] Increase post-fs-data mode timeout from 10 seconds to 40 seconds
    • [MagiskInit] Rewritten 2SI support from scratch
    • [MagiskInit] Support when no /sbin folder exists (Android 11)
    • [MagiskInit] Dump fstab from device-tree to rootfs and force init to use it for 2SI devices
    • [MagiskInit] Strip out AVB for 2SI as it may cause bootloop
    • [Modules] Rewritten module mounting logic from scratch
    • [MagiskSU] For Android 8.0+, a completely new policy setup is used. This reduces compromises in Android's sandbox, providing more policy isolation and better security for root users.
    • [MagiskSU] Isolated mount namespace will now first inherit from parent process, then isolate itself from the world
    • [MagiskSU] Update communication protocol with Magisk Manager to work with the hardened SELinux setup
    • [MagiskPolicy] Optimize match all rules. This will significantly reduce policy binary size and save memory and improve general kernel performance.
    • [MagiskPolicy] Support declaring new types and attributes
    • [MagiskPolicy] Make policy statement closer to stock *.te format. Please check updated documentation or magiskpolicy --help for more details.
    • [MagiskBoot] Support compressed extra blobs
    • [MagiskBoot] Pad boot images to original size with zeros
    • [MagiskHide] Manipulate additional vendor properties

    v20.4

    • [MagiskInit] Fix potential bootloop in A-only 2SI devices
    • [MagiskInit] Properly support Tegra partition naming
    • [General] Load libsqlite.so dynamically, which removes the need to use wrapper scripts on Android 10+
    • [General] Detect API level with a fallback method on some devices
    • [General] Workaround possible bug in x86 kernel readlinkat system call
    • [BusyBox] Enable SELinux features. Add chcon/runcon etc., and '-Z' option to many applets
    • [BusyBox] Introduce standalone mode. More details in release notes
    • [MagiskHide] Disable MagiskHide by default
    • [MagiskHide] Add more potential detectable system properties
    • [MagiskHide] Add workaround for Xiaomi devices bootloop when MagiskHide is enabled on cross region ROMs
    • [MagiskBoot] Support patching special Motorolla DTB format
    • [MagiskPolicy] Support 'genfscon' sepolicy rules
    • [Scripts] Support NAND based boot images (character nodes in /dev/block)
    • [Scripts] Better addon.d (both v1 and v2) support
    • [Scripts] Support Lineage Recovery for Android 10+

    v20.3

    • [MagiskBoot] Fix lz4_legacy decompression

    v20.2

    • [MagiskSU] Properly handle communication between daemon and application (root request prompt)
    • [MagiskInit] Fix logging in kmsg
    • [MagiskBoot] Support patching dtb/dtbo partition formats
    • [General] Support pre-init sepolicy patch in modules
    • [Scripts] Update magisk stock image backup format

    v20.1

    • [MagiskSU] Support component name agnostic communication (for stub APK)
    • [MagiskBoot] Set proper header_size in boot image headers (fix vbmeta error on Samsung devices)
    • [MagiskHide] Scan zygote multiple times
    • [MagiskInit] Support recovery images without /sbin/recovery binary. This will fix some A/B devices unable to boot to recovery after flashing Magisk
    • [General] Move acct to prevent daemon being killed
    • [General] Make sure "--remove-modules" will execute uninstall.sh after removal

    v20.0

    • [MagiskBoot] Support inject/modify mnt_point value in DTB fstab
    • [MagiskBoot] Support patching QCDT
    • [MagiskBoot] Support patching DTBH
    • [MagiskBoot] Support patching PXA-DT
    • [MagiskInit] [2SI] Support non A/B setup (Android 10)
    • [MagiskHide] Fix bug that reject process names with ":"
    • [MagicMount] Fix a bug that cause /product mirror not created

    v19.4

    • [MagiskInit] [SAR] Boot system-as-root devices with system mounted as /
    • [MagiskInit] [2SI] Support 2-stage-init for A/B devices (Pixel 3 Android 10)
    • [MagiskInit] [initramfs] Delay sbin overlay creation to post-fs-data
    • [MagiskInit] [SARCompat] Old system-as-root implementation is deprecated, no more future changes
    • [MagiskInit] Add overlay.d support for root directory overlay for new system-as-root implementation
    • [MagiskSU] Unblock all signals in root shells (fix bash on Android)
    • [MagicMount] Support replacing files in /product
    • [MagiskHide] Support Android 10's Zygote blastula pool
    • [MagiskHide] All random strings now also have random length
    • [MagiskBoot] Allow no recompression for ramdisk.cpio
    • [MagiskBoot] Support some weird Huawei boot images
    • [General] Add new --remove-modules command to remove modules without root in ADB shell
    • [General] Support Android 10 new APEX libraries (Project Mainline)

    v19.3

    • [MagiskHide] Hugely improve process monitor implementation, hopefully should no longer cause 100% CPU and daemon crashes
    • [MagiskInit] Wait for partitions to be ready for early mount, should fix bootloops on a handful of devices
    • [MagiskInit] Support EROFS used in EMUI 9.1
    • [MagiskSU] Properly implement mount namespace isolation
    • [MagiskBoot] Proper checksum calculation for header v2

    v19.2

    • [General] Fix uninstaller
    • [General] Fix bootloops on some devices with tmpfs mounting to /data
    • [MagiskInit] Add Kirin hi6250 support
    • [MagiskSU] Stop claiming device focus for su logging/notify if feasible. This fix issues with users locking Magisk Manager with app lock, and prevent video apps get messed up when an app is requesting root in the background.

    v19.1

    • [General] Support recovery based Magisk
    • [General] Support Android Q Beta 2
    • [MagiskInit] New sbin overlay setup process for better compatibility
    • [MagiskInit] Allow long pressing volume up to boot to recovery in recovery mode
    • [MagicMount] Use proper system_root mirror
    • [MagicMount] Use self created device nodes for mirrors
    • [MagicMount] Do not allow adding new files/folders in partition root folder (e.g. /system or /vendor)

    v19.0

    • [General] Remove usage of magisk.img
    • [General] Add 64 bit magisk binary for native 64 bit support
    • [General] Support A only system-as-root devices that released with Android 9.0
    • [General] Support non EXT4 system and vendor partitions
    • [MagiskHide] Use Zygote ptracing for monitoring new processes
    • [MagiskHide] Targets are now per-application component
    • [MagiskInit] Support Android Q (no logical partition support yet!)
    • [MagiskPolicy] Support Android Q new split sepolicy setup
    • [MagiskInit] Move sbin overlay creation from main daemon post-fs-data to early-init
    • [General] Service scripts now run in parallel
    • [MagiskInit] Directly inject magisk services to init.rc
    • [General] Use lzma2 compressed ramdisk in extreme conditions
    • [MagicMount] Clone attributes from original file if exists
    • [MagiskSU] Use ACTION_REBOOT intent to workaround some OEM broadcast restrictions
    • [General] Use skip_mount instead of auto_mount: from opt-in to opt-out

    v18.1

    • [General] Support EMUI 9.0
    • [General] Support Kirin 960 devices
    • [General] Support down to Android 4.2
    • [General] Major code base modernization under-the-hood

    v18.0

    • [General] Migrate all code base to C++
    • [General] Modify database natively instead of going through Magisk Manager
    • [General] Deprecate path /sbin/.core, please start using /sbin/.magisk
    • [General] Boot scripts are moved from <magisk_img>/.core/<stage>.d to /data/adb/<stage>.d
    • [General] Remove native systemless hosts (Magisk Manager is updated with a built-in systemless hosts module)
    • [General] Allow module post-fs-data.sh scripts to disable/remove modules
    • [MagiskHide] Use component names instead of process names as targets
    • [MagiskHide] Add procfs protection on SDK 24+ (Nougat)
    • [MagiskHide] Remove the folder /.backup to prevent detection
    • [MagiskHide] Hide list is now stored in database instead of raw textfile in images
    • [MagiskHide] Add "--status" option to CLI
    • [MagiskHide] Stop unmounting non-custom related mount points
    • [MagiskSU] Add FLAG_INCLUDE_STOPPED_PACKAGES in broadcasts to force wake Magisk Manager
    • [MagiskSU] Fix a bug causing SIGWINCH not properly detected
    • [MagiskPolicy] Support new av rules: type_change, type_member
    • [MagiskPolicy] Remove all AUDITDENY rules after patching sepolicy to log all denies for debugging
    • [MagiskBoot] Properly support extra_cmdline in boot headers
    • [MagiskBoot] Try to repair broken v1 boot image headers
    • [MagiskBoot] Add new CPIO command: "exists"

    v17.3

    • [MagiskBoot] Support boot image header v1 (Pixel 3)
    • [MagiskSU] No more linked lists for caching su_info
    • [MagiskSU] Parse command-lines in client side and send only options to daemon
    • [MagiskSU] Early ACK to prevent client freezes and early denies
    • [Daemon] Prevent bootloops in situations where /data is mounted twice
    • [Daemon] Prevent logcat failures when /system/bin is magic mounting, could cause MagiskHide to fail
    • [Scripts] Switch hexpatch to remove Samsung Defex to a more general pattern
    • [Scripts] Update data encryption detection for better custom recovery support

    v17.2

    • [ResetProp] Update to AOSP upstream to support serialized system properties
    • [MagiskInit] Randomize Magisk service names to prevent detection (e.g. FGO)
    • [MagiskSU] New communication scheme to communicate with Magisk Manager

    v17.0/17.1

    • [General] Bring back install to inactive slot for OTAs on A/B devices
    • [Script] Remove system based root in addon.d
    • [Script] Add proper addon.d-v2 for preserving Magisk on custom ROMs on A/B devices
    • [Script] Enable KEEPVERITY when the device is using system_root_image
    • [Script] Add hexpatch to remove Samsung defex in new Oreo kernels
    • [Daemon] Support non ext4 filesystems for mirrors (system/vendor)
    • [MagiskSU] Make pts sockets always run in dev_pts secontext, providing all terminal emulator root shell the same power as adb shells
    • [MagiskHide] Kill all processes with same UID of the target to workaround OOS embryo optimization
    • [MagiskInit] Move all sepolicy patches pre-init to prevent Pixel 2 (XL) boot service breakdown

    v16.7

    • [Scripts] Fix boot image patching errors on Android P (workaround the strengthened seccomp)
    • [MagiskHide] Support hardlink based ns proc mnt (old kernel support)
    • [Daemon] Fix permission of /dev/null after logcat commands, fix ADB on EMUI
    • [Daemon] Log fatal errors only on debug builds
    • [MagiskInit] Detect early mount partname from fstab in device tree

    v16.6

    • [General] Add wrapper script to overcome weird LD_XXX flags set in apps
    • [General] Prevent bootloop when flashing Magisk after full wipe on FBE devices
    • [Scripts] Support patching DTB placed in extra sections in boot images (Samsung S9/S9+)
    • [Scripts] Add support for addon.d-v2 (untested)
    • [Scripts] Fix custom recovery console output in addon.d
    • [Scripts] Fallback to parsing sysfs for detecting block devices
    • [Daemon] Check whether a valid Magisk Manager is installed on boot, if not, install stub APK embedded in magiskinit
    • [Daemon] Check whether Magisk Manager is repackaged (hidden), and prevent malware from hijacking com.topjohnwu.magisk
    • [Daemon] Introduce new daemon: magisklogd, a dedicated daemon to handle all logcat related monitoring
    • [Daemon] Replace old invincible mode with handshake between magiskd and magisklogd, one will respawn the other if disconnected
    • [Daemon] Support GSI adbd bind mounting
    • [MagiskInit] Support detecting block names in upper case (Samsung)
    • [MagiskBoot] Check DTB headers to prevent false detections within kernel binary
    • [MagiskHide] Compare mount namespace with PPID to make sure the namespace is actually separated, fix root loss
    • [MagiskSU] Simplify su_info caching system, should use less resources and computing power
    • [MagiskSU] Reduce the amount of broadcasting to Magisk Manager
    • [ImgTool] Separate all ext4 image related operations to a new applet called "imgtool"
    • [ImgTool] Use precise free space calculation methods
    • [ImgTool] Use our own set of loop devices hidden along side with sbin tmpfs overlay. This not only eliminates another possible detection method, but also fixes apps that mount OBB files as loop devices (huge thanks to dev of Pzizz for reporting this issue)

    v16.4

    • [Daemon] Directly check logcat command instead of detecting logd, should fix logging and MagiskHide on several Samsung devices
    • [Daemon] Fix startup Magisk Manager APK installation on Android P
    • [MagiskPolicy] Switch from AOSP u:r:su:s0 to u:r:magisk:s0 to prevent conflicts
    • [MagiskPolicy] Remove unnecessary sepolicy rules to reduce security penalty
    • [Daemon] Massive re-design /sbin tmpfs overlay and daemon start up
    • [MagiskInit] Remove magiskinit_daemon, the actual magisk daemon (magiskd) shall handle everything itself
    • [Daemon] Remove post-fs stage as it is very limited and also will not work on A/B devices; replaced with simple mount in post-fs-data, which will run ASAP even before the daemon is started
    • [General] Remove all 64-bit binaries as there is no point in using them; all binaries are now 32-bit only. Some weirdly implemented root apps might break (e.g. Tasker, already reported to the developer), but it is not my fault 😃
    • [resetprop] Add Protobuf encode/decode to support manipulating persist properties on Android P
    • [MagiskHide] Include app sub-services as hiding targets. This might significantly increase the amount of apps that could be properly hidden

    v16.3

    • [General] Remove symlinks used for backwards compatibility
    • [MagiskBoot] Fix a small size calculation bug

    v16.2

    • [General] Force use system binaries in handling ext4 images (fix module installation on Android P)
    • [MagiskHide] Change property state to disable if logd is disabled

    v16.1

    • [MagiskBoot] Fix MTK boot image packaging
    • [MagiskBoot] Add more Nook/Acclaim headers support
    • [MagiskBoot] Support unpacking DTB with empty kernel image
    • [MagiskBoot] Update high compression mode detection logic
    • [Daemon] Support new mke2fs tool on Android P
    • [resetprop] Support Android P new property context files
    • [MagiskPolicy] Add new rules for Android P

    v16.0

    • [MagiskInit] Support non skip_initramfs devices with slot suffix (Huawei Treble)
    • [MagiskPolicy] Add rules for Magisk Manager
    • [Compiler] Workaround an NDK compiler bug that causes bootloops

    v15.4

    • [MagiskBoot] Support Samsung PXA, DHTB header images
    • [MagiskBoot] Support ASUS blob images
    • [MagiskBoot] Support Nook Green Loader images
    • [MagiskBoot] Support pure ramdisk images
    • [MagiskInit] Prevent OnePlus angela sepolicy_debug from loading
    • [MagiskInit] Obfuscate Magisk socket entry to prevent detection and security
    • [Daemon] Fix subfolders in /sbin shadowed by overlay
    • [Daemon] Obfuscate binary names to prevent naive detections
    • [Daemon] Check logd before force trying to start logcat in a loop

    v15.3

    • [Daemon] Fix the bug that only one script would be executed in post-fs-data.d/service.d
    • [Daemon] Add MS_SILENT flag when mounting, should fix some devices that cannot mount magisk.img
    • [MagiskBoot] Fix potential segmentation fault when patching ramdisk, should fix some installation failures

    v15.2

    • [MagiskBoot] Fix dtb verity patches, should fix dm-verity bootloops on newer devices placing fstabs in dtb
    • [MagiskPolicy] Add new rules for proper Samsung support, should fix MagiskHide
    • [MagiskInit] Support non skip_initramfs devices using split sepolicies (e.g. Zenfone 4 Oreo)
    • [Daemon] Use specific logcat buffers, some devices does not support all log buffers
    • [scripts] Update scripts to double check whether boot slot is available, some devices set a boot slot without A/B partitions

    v15.1

    • [MagiskBoot] Fix faulty code in ramdisk patches which causes bootloops in some config and fstab format combos

    v15.0

    • [Daemon] Fix the bug that Magisk cannot properly detect /data encryption state
    • [Daemon] Add merging /cache/magisk.img and /data/adb/magisk_merge.img support
    • [Daemon] Update to upstream libsepol to support cutting edge split policy custom ROM cil compilations

    v14.6 (1468)

    • [General] Move all files into a safe location: /data/adb
    • [Daemon] New invincible implementation: use magiskinit_daemon to monitor sockets
    • [Daemon] Rewrite logcat monitor to be more efficient
    • [Daemon] Fix a bug where logcat monitor may spawn infinite logcat processes
    • [MagiskSU] Update su to work the same as proper Linux implementation: Initialize window size; all environment variables will be migrated (except HOME, SHELL, USER, LOGNAME, these will be set accordingly), "--preserve-environment" option will preserve all variables, including those four exceptions. Check the Linux su manpage for more info
    • [MagiskBoot] Massive refactor, rewrite all cpio operations and CLI
    • [MagiskInit][magiskboot] Support ramdisk high compression mode

    v14.5 (1456)

    • [Magiskinit] Fix bootloop issues on several devices
    • [misc] Build binaries with NDK r10e, should get rid of the nasty linker warning when executing magisk

    v14.5 (1455)

    • [Daemon] Moved internal path to /sbin/.core, new image mountpoint is /sbin/.core/img
    • [MagiskSU] Support switching package name, used when Magisk Manager is hidden
    • [MagiskHide] Add temporary /magisk removal
    • [MagiskHide] All changes above contributes to hiding from nasty apps like FGO and several banking apps
    • [Magiskinit] Use magiskinit for all devices (dynamic initramfs)
    • [Magiskinit] Fix Xiaomi A1 support
    • [Magiskinit] Add Pixel 2 (XL) support
    • [Magiskboot] Add support to remove avb-verity in dtbo.img
    • [Magiskboot] Fix typo in handling MTK boot image headers
    • [script] Along with updates in Magisk Manager, add support to sign boot images (AVB 1.0)
    • [script] Add dtbo.img backup and restore support
    • [misc] Many small adjustments to properly support old platforms like Android 5.0

    v14.3 (1437)

    • [MagiskBoot] Fix Pixel C installation
    • [MagiskBoot] Handle special lz4_legacy format properly, should fix all LG devices
    • [Daemon] New universal logcat monitor is added, support plug-and-play to worker threads
    • [Daemon] Invincible mode: daemon will be restarted by init, everything should seamlessly through daemon restarts
    • [Daemon] Add new restorecon action, will go through and fix all Magisk files with selinux unlabeled to system_file context
    • [Daemon] Add brute-force image resizing mode, should prevent the notorious Samsung crappy resize2fs from affecting the result
    • [resetprop] Add new "-p" flag, used to toggle whether alter/access the actual persist storage for persist props

    v14.2

    • [MagicMount] Clone attributes to tmpfs mountpoint, should fix massive module breakage

    v14.1

    • [MagiskInit] Introduce a new init binary to support skip_initramfs devices (Pixel family)
    • [script] Fix typo in update-binary for x86 devices
    • [script] Fix stock boot image backup not moved to proper location
    • [script] Add functions to support A/B slot and skip_initramfs devices
    • [script] Detect Meizu boot blocks
    • [MagiskBoot] Add decompress zImage support
    • [MagiskBoot] Support extracting dtb appended to zImage block
    • [MagiskBoot] Support patching fstab within dtb
    • [Daemon/MagiskSU] Proper file based encryption support
    • [Daemon] Create core folders if not exist
    • [resetprop] Fix a bug which delete props won't remove persist props not in memory
    • [MagicMount] Remove usage of dummy folder, directly mount tmpfs and construct file structure skeleton in place

    v14.0

    • [script] Simplify installation scripts
    • [script] Fix a bug causing backing up and restoring stock boot images failure
    • [script] Installation and uninstallation will migrate old or broken stock boot image backups to proper format
    • [script] Fix an issue with selabel setting in util_functions.sh on Lollipop
    • [rc script] Enable logd in post-fs to start logging as early as possible
    • [MagiskHide] magisk.img mounted is no longer a requirement Devices with issues mounting magisk.img can now run in proper core-only mode
    • [MagiskBoot] Add native function to extract stock SHA1 from ramdisk
    • [b64xz] New tool to extract compressed and encoded binary dumps in shell script
    • [busybox] Add busybox to Magisk source, and embed multi-arch busybox binary into update-binary shell script
    • [busybox] Busybox is added into PATH for all boot scripts (post-fs-data.d, service.d, and all module scripts)
    • [MagiskSU] Fully fix multiuser issues
    • [Magic Mount] Fix a typo in cloning attributes
    • [Daemon] Fix the daemon crashing when boot scripts opens a subshell
    • [Daemon] Adjustments to prevent stock Samsung kernel restrictions on exec system calls for binaries started from /data
    • [Daemon] Workaround on Samsung device with weird fork behaviors

    v13.3

    • [MagiskHide] Update to bypass Google CTS (2017.7.17)
    • [resetprop] Properly support removing persist props
    • [uninstaller] Remove Magisk Manager and persist props

    v13.2

    • [magiskpolicy] Fix magiskpolicy segfault on old Android versions, should fix tons of older devices that couldn't use v13.1
    • [MagiskHide] Set proper selinux context while re-linking /sbin to hide Magisk, should potentially fix many issues
    • [MagiskBoot] Change lzma compression encoder flag from LZMA_CHECK_CRC64 to LZMA_CHECK_CRC32, kernel only supports latter
    • [General] Core-only mode now properly mounts systemless hosts and magiskhide

    v13.1

    • [General] Merge MagiskSU, magiskhide, resetprop, magiskpolicy into one binary
    • [General] Add Android O support (tested on DP3)
    • [General] Dynamic link libselinux.so, libsqlite.so from system to greatly reduce binary size
    • [General] Remove bundled busybox because it causes a lot of issues
    • [General] Unlock all block devices for read-write support instead of emmc only (just figured not all devices uses emmc lol)
    • [Scripts] Run all ext4 image operations through magisk binary in flash scripts
    • [Scripts] Updated scripts to use magisk native commands to increase compatibility
    • [Scripts] Add addon.d survival support
    • [Scripts] Introduce util_functions.sh, used as a global shell script function source for all kinds of installation
    • [MagiskBoot] Moved boot patch logic into magiskboot binary
    • [MagiskSU] Does not fork new process for each request, add new threads instead
    • [MagiskSU] Added multiuser support
    • [MagiskSU] Introduce new timeout queue mechanism, prevent performance hit with poorly written su apps
    • [MagiskSU] Multiple settings moved from prop detection to database
    • [MagiskSU] Add namespace mode option support
    • [MagiskSU] Add master-mount option
    • [resetprop] Updated to latest AOSP upstream, support props from 5.0 to Android O
    • [resetprop] Renamed all functions to prevent calling functions from external libc
    • [magiskpolicy] Updated libsepol from official SELinux repo
    • [magiskpolicy] Added xperm patching support (in order to make Android O work properly)
    • [magiskpolicy] Updated rules for Android O, and Liveboot support
    • [MagiskHide] Remove pseudo permissive mode, directly hide permissive status instead
    • [MagiskHide] Remove unreliable list file monitor, change to daemon request mode
    • [MagiskHide] MagiskHide is now enabled by default
    • [MagiskHide] Update unmount policies, passes CTS in SafetyNet!
    • [MagiskHide] Add more props for hiding
    • [MagiskHide] Remove background magiskhide daemon, spawn short life process for unmounting purpose
    • [Magic Mount] Ditched shell script based mounting, use proper C program to parse and mount files. Speed is SIGNIFICANTLY improved

    v12.0

    • [General] Move most binaries into magisk.img (Samsung cannot run su daemon in /data)
    • [General] Move sepolicy live patch to late_start service This shall fix the long boot times, especially on Samsung devices
    • [General] Add Samsung RKP hexpatch back, should now work on Samsung stock kernels
    • [General] Fix installation with SuperSU
    • [MagiskHide] Support other logcat am_proc_start patterns
    • [MagiskHide] Change /sys/fs/selinux/enforce(policy) permissions if required Samsung devices cannot switch selinux states, if running on permissive custom kernel, the users will stuck at permissive If this scenario is detected, change permissions to hide the permissive state, leads to SafetyNet passes
    • [MagiskHide] Add built in prop rules to fake KNOX status Samsung apps requiring KNOX status to be 0x0 should now work (Samsung Pay not tested)
    • [MagiskHide] Remove all ro.build props, since they cause more issues than they benefit...
    • [MagiskBoot] Add lz4 legacy format support (most linux kernel using lz4 for compression is using this)
    • [MagiskBoot] Fix MTK kernels with MTK headers

    v11.5/11.6

    • [Magic Mount] Fix mounting issues with devices that have separate /vendor partitions
    • [MagiskBoot] Whole new boot image patching tool, please check release note for more info
    • [magiskpolicy] Rename sepolicy-inject to magiskpolicy
    • [magiskpolicy] Update a rule to allow chcon everything properly
    • [MagiskHide] Prevent multirom crashes
    • [MagiskHide] Add patches for ro.debuggable, ro.secure, ro.build.type, ro.build.tags, ro.build.selinux
    • [MagiskHide] Change /sys/fs/selinux/enforce, /sys/fs/selinux/policy permissions for Samsung compatibility
    • [MagiskSU] Fix read-only partition mounting issues
    • [MagiskSU] Disable -cn option, the option will do nothing, preserved for compatibility

    v11.1

    • [sepolicy-inject] Add missing messages
    • [magiskhide] Start MagiskHide with scripts

    v11.0

    • [Magic Mount] Support replacing symlinks. Symlinks cannot be a target of a bind mounted, so they are treated the same as new files
    • [Magic Mount] Fix the issue when file/folder name contains spaces
    • [BusyBox] Updated to v1.26.2. Should fix the black screen issues of FlashFire
    • [resetprop] Support reading prop files that contains spaces in prop values
    • [MagiskSU] Adapt communication to Magisk Manager; stripped out unused data transfer
    • [MagiskSU] Implement SuperUser access option (Disable, APP only, ADB Only, APP & ADB) phh Superuser app has this option but the feature isn't implemented within the su binary
    • [MagiskSU] Fixed all issues with su -c "commands" (run commands with root) This feature is supposed to only allow one single option, but apparently adb shell su -c "command" doesn't work this way, and plenty of root apps don't follow the rule. The su binary will now consider everything after -c as a part of the command.
    • [MagiskSU] Removed legacy context hack for TiBack, what it currently does is slowing down the invocation
    • [MagiskSU] Preserve the current working directory after invoking su Previously phh superuser will change the path to /data/data after obtaining root shell. It will now stay in the same directory where you called su
    • [MagiskSU] Daemon now also runs in u:r:su:s0 context
    • [MagiskSU] Removed an unnecessary fork, reduce running processes and speed up the invocation
    • [MagiskSU] Add -cn option to the binary Not sure if this is still relevant, and also not sure if implemented correctly, but hey it's here
    • [sepolicy-inject] Complete re-write the command-line options, now nearly matches supolicy syntax
    • [sepolicy-inject] Support all matching mode for nearly every action (makes pseudo enforced possible)
    • [sepolicy-inject] Fixed an ancient bug that allocated memory isn't reset
    • [uninstaller] Now works as a independent script that can be executed at boot Fully support recovery with no /data access, Magisk uninstallation with Magisk Manager
    • [Addition] Busybox, MagiskHide, hosts settings can now be applied instantly; no reboots required
    • [Addition] Add post-fs-data.d and service.d
    • [Addition] Add option to disable Magisk (MagiskSU will still be started)

    v10.2

    • [Magic Mount] Remove apps/priv-app from whitelist, should fix all crashes
    • [phh] Fix binary out-of-date issue
    • [scripts] Fix root disappear issue when upgrading within Magisk Manager

    v10

    • [Magic Mount] Use a new way to mount system (vendor) mirrors
    • [Magic Mount] Use universal way to deal with /vendor, handle both separate partition or not
    • [Magic Mount] Adding anything to any place is now officially supported (including /system root and /vendor root)
    • [Magic Mount] Use symlinks for mirroring back if possible, reduce bind mounts for adding files
    • [Magisk Hide] Check init namespace, zygote namespace to prevent Magic Mount breakage (a.k.a root loss)
    • [Magisk Hide] Send SIGSTOP to pause target process ASAP to prevent crashing if unmounting too late
    • [Magisk Hide] Hiding should work under any conditions, including adding libs and /system root etc.
    • [phh] Root the device if no proper root detected
    • [phh] Move /sbin to /sbin_orig and link back, fix Samsung no-suid issue
    • [scripts] Improve SuperSU integration, now uses sukernel to patch ramdisk, support SuperSU built in ramdisk restore
    • [template] Add PROPFILE option to load system.prop

    v9

    • [API Change] Remove the interface for post-fs modules
    • [resetprop] New tool "resetprop" is added to Magisk to replace most post-fs modules' functionality
    • [resetprop] Magisk will now patch "ro.boot.verifiedbootstate", "ro.boot.flash.locked", "ro.boot.veritymode" to bypass Safety Net
    • [Magic Mount] Move dummy skeleton / mirror / mountinfo filesystem tree to tmpfs
    • [Magic Mount] Rewritten dummy cloning mechanism from scratch, will result in minimal bind mounts, minimal file traversal, eliminate all possible issues that might happen in extreme cases
    • [Magic Mount] Adding new items to /system/bin, /system/vendor, /system/lib(64) is properly supported (devices with separate vendor partition is not supported yet)
    • [Magisk Hide] Rewritten from scratch, now run in daemon mode, proper list monitoring, proper mount detection, and maybe more.....
    • [Boot Image] Add support for Motorola boot image dtb, it shall now unpack correctly
    • [Uninstaller] Add removal of SuperSU custom patch script

    v8

    • Add Magisk Hide to bypass SafetyNet
    • Improve SuperSU integration: no longer changes the SuperSU PATH
    • Support rc script entry points not located in init.rc

    v7

    • Fully open source
    • Remove supolicy dependency, use my own sepolicy-injection
    • Run everything in its own selinux domain, should fix all selinux issues
    • Add Note 7 stock kernel hex patches
    • Add support to install Magisk in Magisk Manager
    • Add support for image merging for module flashing in Magisk Manager
    • Add root helpers for SuperSU auto module-ize and auto upgrading legacy phh superuser
    • New paths to toggle busybox, and support all root solutions
    • Remove root management API; both SuperSU and phh has their own superior solutions

    v6

    • Fixed the algorithm for adding new files and dummy system
    • Updated the module template with a default permission, since people tend to forget them 😃

    v5

    • Hotfix for older Android versions (detect policy before patching)
    • Update uninstaller to NOT uninstall Magisk Manager, since it cause problems

    v4

    • Important: Uninstall v1 - v3 Magisk before upgrading with the uninstaller in the OP!!
    • Massive Rewrite Magisk Interface API! All previous mods are NOT compatible! Please download the latest version of the mods you use (root/xposed)
    • Mods are now installed independently in their own subfolder. This paves the way for future Magisk Manager versions to manage mods, just like how Xposed Modules are handled
    • Support small boot partition devices (Huawei devices)
    • Use minimal sepolicy patch in boot image for smaller ramdisk size. Live patch policies after bootup
    • Include updated open source sepolicy injection tool (source code available), support nearly all SuperSU supolicy tool's functionality

    v3

    • Fix bootimg-extract for Exynos Samsung devices (thanks to @phhusson), should fix all Samsung device issues
    • Add supolicy back to patch sepolicy (stock Samsung do not accept permissive domain)
    • Update sepolicy-injection to patch su domain for Samsung devices to use phh's root
    • Update root disable method, using more aggressive approach
    • Use lazy unmount to unmount root from system, should fix some issues with custom roms
    • Use the highest possible compression rate for ramdisk, hope to fix some devices with no boot partition space
    • Detect boot partition space insufficient, will abort installer instead of breaking your device

    v2

    • Fix verity patch. It should now work on all devices (might fix some of the unable-to-boot issues)
    • All scripts will now run in selinux permissive mode for maximum compatibility (this will NOT turn your device to permissive)
    • Add Nougat Developer Preview 5 support
    • Add systemless host support for AdBlock Apps (enabled by default)
    • Add support for new root disable method
    • Remove sepolicy patches that uses SuperSU's supolicy tool; it is now using a minimal set of modifications
    • Removed Magisk Manager in Magisk patch, it is now included in Magisk phh's superuser only

    v1

    • Initial release

    参考链接

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/delta/faq.html b/delta/faq.html new file mode 100644 index 00000000..4cef18dc --- /dev/null +++ b/delta/faq.html @@ -0,0 +1,27 @@ + + + + + + 常见问题 | Magisk 中文文档 + + + + + + + + + + + + + + +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + + + + \ No newline at end of file diff --git a/delta/internal-guide.html b/delta/internal-guide.html new file mode 100644 index 00000000..409bdfc2 --- /dev/null +++ b/delta/internal-guide.html @@ -0,0 +1,49 @@ + + + + + + Magisk Delta 内部文档 | Magisk 中文文档 + + + + + + + + + + + + + + +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + + + + \ No newline at end of file diff --git a/details.html b/details.html index f0c819a7..35463afc 100644 --- a/details.html +++ b/details.html @@ -5,66 +5,115 @@ 内部细节 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    内部细节

    文档结构

    “Magisk tmpfs 目录”中的路径

    Magisk 将安装一个 tmpfs 目录来存储一些临时数据。对于带有 /sbin 文件夹的设备,将选择该文件夹,因为它还将充当将二进制文件注入 PATH 的覆盖层。从 Android 11 开始,/sbin 文件夹可能不存在,因此 Magisk 将在 /dev 下随机创建一个文件夹,并将其用作基本文件夹。

    shell
    # 为了获得Magisk正在使用的当前基本文件夹,使用命令 `magisk--path`。
    -# 二进制文件,如 magisk、magiskinit 和所有小程序的符号链接直接存储
    -# 在此路径中。这意味着当这是/sbin,这些二进制文件将直接在 PATH 中。
    -MAGISKTMP=$(magisk --path)
    -
    -# Magisk 内部材料
    -INTERNALDIR=$MAGISKTMP/.magisk
    -
    -# /data/adb/modules 将挂载到此处。
    -# 由于 nosuid 挂载标志,未使用原始文件夹。
    -$INTERNALDIR/modules
    -
    -# 当前 Magisk 安装配置
    -$INTERNALDIR/config
    -
    -# 分区映像
    -# 此路径中的每个目录都将装载其目录名的分区。
    -# 例如 system,system_ext,vendor,data ...
    -$INTERNALDIR/mirror
    -
    -# 根目录修补程序文件
    -# 在 system-as-root 的系统上,/不可写。
    -# 所有预初始化补丁文件都存储在这里绑定挂载。
    -$INTERNALDIR/rootdir

    /data 中的路径

    一些二进制文件和文件应存储在 /data 中的非易失性存储中。为了防止检测,所有东西都必须存储在 /data 中安全且不可检测的地方。选 /data/adb 文件夹是因为其具有以下优点:

    • 它是现代安卓系统上的一个现有文件夹,因此不能作为 Magisk 存在的标志。
    • 文件夹的权限默认为 700,所有者为 root,因此非 root 进程无法以任何可能的方式进入、读取和写入文件夹。
    • 文件夹 secontext 标记为 u:object_r:adb_data_file:s0,很少有进程有权与该 secontext 进行任何交互。
    • 该文件夹位于设备加密存储区中,因此一旦数据正确装载到 FBE(File-Based Encryption,基于文件的加密)设备中,即可访问该文件夹。
    shell
    SECURE_DIR=/data/adb
    -
    -# 存储常规 post-fs-data 脚本的文件夹
    -$SECURE_DIR/post-fs-data.d
    -
    -#存储常规 late_start 服务脚本的文件夹
    -$SECURE_DIR/service.d
    -
    -# Magisk 模块
    -$SECURE_DIR/modules
    -
    -# 等待升级的 Magisk 模块
    -# 模块文件在挂载时无法安全修改
    -# 通过 Magisk app 安装的模块将存储在此处并将在下次重新启动时
    -# 合并到 $SECURE_DIR/modules 中
    -$SECURE_DIR/modules_update
    -
    -# 数据库存储设置和 Root 权限
    -MAGISKDB=$SECURE_DIR/magisk.db
    -
    -# 所有与 magisk 相关的二进制文件,包括 busybox、脚本
    -# 和 magisk 二进制文件。用于支持模块安装、addon.d、 
    -# Magisk app 等。
    -DATABIN=$SECURE_DIR/magisk

    Magisk引导过程

    预初始化(Pre-Init)

    magiskinit 将替换 init 作为第一个运行的程序。

    • 挂载早期所需的分区。在已停产 system-as-root 设备上,我们将 root 切换到系统;在 2SI 设备上,我们修补原始的 init ,将第二阶段的 init 文件重定向到 magiskinit,并执行它为我们装载分区。
    • 将 magisk 服务注入 init.rc
    • 在使用 monolithic 策略的设备上,从 /sepolicy 加载 sepolicy ;否则我们使用 FIFO 劫持 selinuxfs 中的节点,将 LD_PRELOAD 设置为钩住 security_load_policy,并在 2SI 设备上协助劫持,然后启动守护程序,等待 init 尝试加载 sepolicy。
    • 修补 sepolicy 规则。如果我们使用“劫持”方法,将修补的 sepolicy 加载到内核中,取消阻止 init 并退出守护进程
    • 执行原始的 init 以继续启动过程

    解密后(post-fs-data)

    /data 被解密和装载时会在 post-fs-data 上触发。守护程序 magiskd 将被启动,执行 post-fs-data 脚本,并神奇地安装模块文件。

    后期启动(late_start)

    在稍后的引导过程中,将触发类 late_start ,并启动 Magisk “服务”模式。在此模式下,执行服务(service)脚本。

    重置属性(Resetprop)

    通常,系统属性(properties)被设计为仅由 init 更新,并且对非 root 进程是只读的。使用 root,您可以通过使用诸如 setprop 之类的命令向 property_service(由 init 托管)发送请求来更改属性,但仍然禁止更改只读属性(以ro.开头的属性,如ro.build.product)和删除属性。

    resetprop 是通过从 AOSP 中提取出与系统属性相关的源代码来实现的,并进行了修补,以允许直接修改属性区域或 prop_area,而无需通过 property_service 。由于我们绕过了 property_service ,因此需要注意一些:

    • 如果属性更改未通过 property_service ,则不会触发在 *.rc 脚本中注册的on property:foo=bar 操作。resetprop 的默认设置属性行为与 setprop 匹配,这将触发事件(通过首先删除属性,然后通过 property_service 设置它来实现)。如果您需要此特殊行为,则有一个标志 -n 可以禁用它。
    • 持久属性(以 persist. 开头的属性,如 persist.sys.usb.config )存储在 prop_area/data/property 中。默认情况下,删除属性不会将其从持久存储中删除,这意味着该属性将在下次重新启动后恢复;读取属性不会从持久存储中读取,因为这是 getprop 的行为。使用标志 -p ,删除属性将同时删除 prop_area/data/property 中的属性,读取属性将从 prop_area 和持久存储中读取。

    SELinux 政策

    Magisk 将修补现成的 sepolicy ,以确保 Root 和 Magisk 操作能够以安全可靠的方式完成。新域 magisk 是有效的,这就是 magiskd 和所有 root shell 将在其中运行的内容。magisk_file 是一种新的文件类型,设置为允许每个域(不受限制的文件上下文)访问。

    在 Android 8.0 之前,所有允许的 su 客户端域都可以直接连接到 magiskd 并与守护进程建立连接,以获得远程 root shell。Magisk 还必须放宽一些 ioctl 操作,以便 root shell 能够正常运行。

    在 Android 8.0 之后,为了减少 Android 沙盒中规则的放宽,部署了新的 SELinux 模型。 magisk 二进制文件标记为 magisk_exec 文件类型,并且执行 magisk 二进制文件(包括 su 命令)的 su 客户端域将通过使用 type_transition 规则传输到 magisk_client 。规则严格限制仅允许 magisk 域进程将文件归因于 magisk_exec 。不允许直接连接到 magiskd 的 sockets;访问守护进程的唯一方法是通过 magisk_client 进程。这些更改使我们能够保持沙盒完好无损,并将 Magisk 特定规则与其他策略分开。

    完整的规则可以在 magiskpolicy/rules.cpp 中找到。

    参考链接

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/faq.html b/faq.html index c91bc063..fff41ce3 100644 --- a/faq.html +++ b/faq.html @@ -5,20 +5,23 @@ 常见问题 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    常见问题

    Q: 我安装了一个模块,然后启动时卡在了开机动画。求助

    如果在开发人员选项中启用了USB调试,请将手机连接到 PC。如果检测到了设备(通过 adb devices 检查),请进入 ADB shell 并运行命令 magisk --remove-modules。这将删除所有模块并自动重新启动设备。

    如果您没有启用 USB 调试,请重新启动到安全模式。大多数现代 Android 设备都支持在启动时按特殊键组合键以进入安全模式作为紧急选项。Magisk 将检测到安全模式被激活,所有模块将被禁用。然后重启回到正常模式(模块禁用状态持续),并通过 Magisk App 管理模块。

    提示

    如果您不知道什么是 ADB shell ,那么请在电脑上直接运行以下命令

    shell
    adb shell magisk --remove-modules

    如果您还不知道什么是 ADB ,那么请查看《Android 调试桥 (adb)》

    Q: 为什么 XXX应用会检测到 Root?

    Magisk 不再处理 Root 隐藏。有大量 Magisk/Zygisk 模块专门提供这些功能,请在网络上查找它们。😉(您可以在“酷安”或者“哔哩哔哩”中搜索)

    比较流行的模块是 Shamiko

    警告

    如果你使用的是「Magisk Delta」,则无法使用此模块!

    Q: 在我隐藏 Magisk App 后,应用图标显示异常

    当隐藏 Magisk App 时,它将安装一个“存根”APK,其中没有任何内容。这个存根应用程序的唯一功能是将完整的 Magisk app APK 下载到其内部存储并动态加载。由于APK实际上是 empty,因此它不包含 APP 的图标资源。

    当您打开隐藏的 Magisk App 时,它将为您提供在主屏幕中创建快捷方式的选项(其中包含正确的应用名称和图标),以方便您使用。您还可以手动要求应用在应用设置中创建图标。

    Q: 为什么这个文档很多错误或者不通顺的地方

    这个文档本质上还是机器翻译的,然而机器翻译的正确率有待提高。如果您发现了这些错误或者不通顺的地方,希望您可以向我们提交反馈

    参考链接

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/guides.html b/guides.html index 24827f4c..7cb10a34 100644 --- a/guides.html +++ b/guides.html @@ -5,153 +5,289 @@ 开发者指南 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    开发者指南

    BusyBox

    Magisk 附带了一个完整的 BusyBox 二进制(包括完整的 SELinux 支持)。可执行文件位于 /data/adb/magisk/busybox 。Magisk 的 BusyBox 支持运行时可切换的“ASH独立外壳模式”。这种独立模式的意思是,当在 BusyBox 的 ash shell 中运行时,无论设置为 PATH ,每个命令都将直接使用 BusyBox 中的 applet。例如,像 lsrmchmod 这样的命令将不使用 PATH 中的内容(在 Android 的情况下,默认情况下将分别为 /system/bin/ls/system/bin/rm/system/bin/chmod ),而是直接调用内部 BusyBox 小程序。这确保脚本始终在可预测的环境中运行,并且无论在哪个 Android 版本上运行,都始终具有完整的命令集。要强制命令不使用BusyBox,必须使用完整路径调用可执行文件。

    在 Magisk 上下文中运行的每个 shell 脚本都将在启用独立模式(Standalone Mode)的 BusyBox 的 ash shell 中执行。对于与第三方开发人员相关的内容,这包括所有启动脚本和模块安装脚本。

    对于想在 Magisk 之外使用“独立模式”功能的开发者,有两种方法可以启用它:

    1. 将环境变量 ASH_STANDALONE 设置为 1
      示例:ASH_STANDALONE=1 /data/adb/magisk/busybox sh <script>
    2. 使用命令行选项切换:
      /data/adb/magisk/busybox sh -o standalone <script>

    为了确保所有后续执行的 sh shell 也以独立模式运行,选项1是首选方法(这是 Magisk 和 Magisk app 内部使用的方法),因为环境变量向下继承到子进程。

    Magisk 模块

    Magisk 模块是放置在 /data/adb/modules 中的文件夹,结构如下:

    txt
    /data/adb/modules
    -├── .
    -├── .
    -|
    -├── $MODID                  <--- 文件夹以模块的 ID 命名
    -│   │
    -│   │      *** 模块 ID ***
    -│   │
    -│   ├── module.prop         <--- 此文件存储模块的元数据(metadata)
    -│   │
    -│   │      *** 主要内容 ***
    -│   │
    -│   ├── system              <--- 如果 skip_mount 不存在,将挂载此文件夹
    -│   │   ├── ...
    -│   │   ├── ...
    -│   │   └── ...
    -│   │
    -│   ├── zygisk              <--- 此文件夹包含模块的 Zygisk native 库
    -│   │   ├── arm64-v8a.so
    -│   │   ├── armeabi-v7a.so
    -│   │   ├── x86.so
    -│   │   ├── x86_64.so
    -│   │   └── unloaded        <--- 如果存在,则 native 库不兼容
    -│   │
    -│   │      *** 状态标志 ***
    -│   │
    -│   ├── skip_mount          <--- 如果存在,Magisk 将不会挂载您的 system 文件夹
    -│   ├── disable             <--- 如果存在,模块将被禁用
    -│   ├── remove              <--- 如果存在,模块将在下次重新启动时删除
    -│   │
    -│   │      *** 可选文件 ***
    -│   │
    -│   ├── post-fs-data.sh     <--- 此脚本将在 post-fs-data 中执行
    -│   ├── service.sh          <--- 此脚本将在 late_start 服务中执行
    -|   ├── uninstall.sh        <--- 当 Magisk 删除您的模块时,将执行此脚本
    -│   ├── system.prop         <--- resetprop 将此文件中的属性作为系统属性加载
    -│   ├── sepolicy.rule       <--- 其他自定义 sepolicy 规则
    -│   │
    -│   │      *** 自动生成,请勿手动创建或修改 ***
    -│   │
    -│   ├── vendor              <--- $MODID/system/vendor 的符号链接
    -│   ├── product             <--- $MODID/system/product 的符号链接
    -│   ├── system_ext          <--- $MODID/system/system_ext 的符号链接
    -│   │
    -│   │      *** 允许任何其他文件/文件夹 ***
    -│   │
    -│   ├── ...
    -│   └── ...
    -|
    -├── 其他模块
    -│   ├── .
    -│   └── .
    -├── .
    -├── .

    module.prop

    这是 module.prop 必须遵守的格式

    (以下代码块虽然标注为 js,但实际上是 prop,此操作仅为提供代码高亮)

    js
    id=<字符串> <string>
    -name=<字符串> <string>
    -version=<字符串> <string>
    -versionCode=<整数> <int>
    -author=<字符串> <string>
    -description=<字符串> <string>
    -updateJson=<链接> <url> (可选)
    • id 必须匹配此正则表达式:^[a-zA-Z][a-zA-Z0-9._-]+$(也就是开头必须为字母,后面为字母、数字、点 . 、下划线 _ 和减号 -
      示例: a_module a.module module-101 a module 1_module -a-module
      这是模块的唯一标识符。模块发布后,您不应更改它。
    • versionCode 必须是整数。这用于对比版本,以便检查更新。
    • updateJson 应该指向一个 URL,该 URL 下载 JSON 以提供信息,以便 Magisk app 可以更新模块。
    • 上面没有提到的其他字符串可以是任何单行字符串。
    • 确保使用 UNIX (LF) 换行类型,而不是 Windows (CR+LF)Macintosh (CR)

    更新的JSON的格式:

    json
    {
    -    "version": string,
    -    "versionCode": int,
    -    "zipUrl": url,
    -    "changelog": url
    -}

    Shell 脚本 (*.sh)

    请阅读 启动脚本 部分,了解 post-fs-data.shservice.sh 之间的区别。对于大多数模块开发人员来说,如果您只需要运行引导脚本,service.sh 应该足够好了。

    在模块的所有脚本中,请使用 MODDIR=${0%/*} 获取模块的基本目录路径;不要在脚本中硬编码模块路径。
    如果启用了Zygisk,则环境变量 ZYGISK_ENABLED 将设置为 1

    system 文件夹

    要替换/注入的所有文件都应放在此文件夹中。此文件夹将以递归方式合并到真正的 /system 中,也就是说:真实 /system 中的现有文件将被模块 system 中的文件替换,模块 system 中的新文件将被添加到真实 /system 中。

    如果您将名为 .replace 的文件放在任何文件夹中,而不是合并其内容,则该文件夹将直接替换实际系统中的文件夹。这对于交换整个文件夹非常方便。

    如果要替换 /vendor/product/system_ext 中的文件,请分别将它们放在 system/vendorsystem/productsystem/system_ext 下。Magisk 将透明地处理这些分区是否位于单独的分区中。

    zygisk

    Zygisk 是 Magisk 的一项功能,它允许高级模块开发人员在每个 Android 应用程序的进程中直接运行代码,然后再进行专业化和运行。有关 Zygisk API 和构建 Zygisk 模块的更多详细信息,请查看 Zygisk 模块示例 项目。

    system.prop

    此文件遵循与 build.prop 相同的格式。每行由 [key]=[value]组成。

    sepolicy.rule

    如果您的模块需要一些额外的 sepolicy 补丁,请将这些规则添加到此文件中。此文件中的每一行都将被视为策略语句。有关如何格式化策略语句的更多详细信息,请查看 magiskpolicy 的文档。

    Magisk 模块安装程序

    Magisk 模块安装程序是打包在 zip 文件中的 Magisk 模块,可以在 Magisk 应用程序或第三方recovery(如 TWRP)中刷入。最简单的 Magisk 模块安装程序只是一个打包为 zip 文件的 Magisk 模块,此外还有以下文件:

    • update-binary:下载最新的 module_installer.sh 并将该脚本重命名或复制为 update-binary
    • updater-script:这个文件应该只包含字符串 “#MAGISK

    模块安装程序脚本将会设置环境,将模块文件从 zip 文件提取到正确的位置,然后完成安装过程,这对于大多数简单的 Magisk 模块来说应该足够好了。

    txt
    模块module.zip
    -
    -├── META-INF
    -│   └── com
    -│       └── google
    -│           └── android
    -│               ├── update-binary      <--- 您下载 module_installer.sh
    -│               └── updater-script     <--- 应只包含字符串“#MAGISK”
    -
    -├── customize.sh                       <--- (可选,稍后将详细介绍)
    -│                                           此脚本将来源于 update-binary
    -├── ...
    -├── ...  /* 模块的其余文件 */
    -

    自定义

    如果需要自定义模块安装过程,可以选择在安装程序中创建名为 customize.sh 的脚本。在提取所有文件并设置默认权限和 secontext 后,该脚本将由 update-binary 脚本提供(未执行!)。如果您的模块需要基于设备 ABI 进行其他设置,或者您需要为某些模块文件设置特殊权限/secontext,这将非常有用。

    如果要完全控制和自定义安装过程,请在 customize.sh 中声明 SKIPUNZIP=1 以跳过所有默认安装步骤。这样,您的 customize.sh 将负责自行安装所有内容。

    customize.sh 脚本在 Magisk 的 BusyBox ash shell 中运行,并启用了“独立模式”。以下变量和函数可用:

    变量

    • MAGISK_VER (string): 当前安装的 Magisk 的版本字符串(例如 v20.0
    • MAGISK_VER_CODE (int): 当前安装的Magisk的版本代码(例如 20000
    • BOOTMODE (bool): 如果模块在 Magisk app 中安装,则为 true
    • MODPATH (path): 模块文件应安装的路径
    • TMPDIR (path): 可以临时存储文件的地方
    • ZIPFILE (path): your module's installation zip 模块的压缩文件
    • ARCH (string): 设备的 CPU 架构。值为 armarm64x86x64
    • IS64BIT (bool): 如果 $ARCHarm64x64 ,则为 true
    • API (int): 设备的 API 级别(安卓版本)(例如,Android 6.0 的 23

    提示

    您可以在 这里 找到所有 Android 版本对应的 API 级别

    函数

    shell
    ui_print <msg>
    -    打印 <msg> 到控制台
    -    请避免使用“echo”,因为它不会显示在第三方 recovery 的控制台中
    +    
    Skip to content

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +service myservice ${MAGISKTMP}/myscript.sh + oneshot

    参考链接

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json index 0715a1d1..0cf727df 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"guides.md":"19fb9662","index.md":"43313836","install.md":"d1d3e2f1","faq.md":"0f89f64c","readme.md":"04cb5627","releases_25100.md":"7021edff","details.md":"8ac7ccaf","releases_24000.md":"1958b910","releases_24100.md":"6b9a3320","releases_24200.md":"6091c70d","releases_25200.md":"1983de15","releases_26000.md":"dc2422e5","releases_26100.md":"6724a4c6","releases_index.md":"b47a879f","releases_24300.md":"3ff8f899","boot.md":"a0ab583f","app_changes.md":"6856ae7f","releases_25000.md":"6c7ad114","build.md":"4713d06e","changes.md":"0bfaa152","ota.md":"93c63cee","releases_18000.md":"7c18a94a","releases_18100.md":"512c5ac9","releases_19000.md":"13328490","releases_19100.md":"e4827b55","releases_19200.md":"7a067985","releases_19300.md":"63682635","releases_19400.md":"cd99945f","releases_20000.md":"74fa467b","releases_20100.md":"4cc41a26","releases_20300.md":"285288fe","releases_20400.md":"b4d99bf2","releases_20200.md":"f6d2625d","releases_21000.md":"792fbc82","releases_21100.md":"945acb51","releases_21200.md":"c9fd3f8c","releases_21400.md":"b582e920","releases_22000.md":"8c658003","tools.md":"4de0b4c5","releases_22100.md":"551a2e63","releases_23000.md":"bacddf11"} +{"releases_19000.md":"ed972ef1","releases_19100.md":"10d48686","releases_19200.md":"79dfaefa","releases_19300.md":"a7abaab5","releases_19400.md":"40a338af","releases_20100.md":"4151533a","releases_20200.md":"5d9b9708","releases_20300.md":"b29964a4","releases_20400.md":"f3caa241","releases_21000.md":"94426129","releases_21100.md":"ac6f3d1f","install.md":"4596894c","ota.md":"65ab8a7c","build.md":"66bfa6cb","boot.md":"5c35ff3b","changes.md":"1854017d","releases_18100.md":"4d7c3cf0","tools.md":"641886ad","releases_index.md":"2825e5f5","releases_18000.md":"6eb41e04","releases_20000.md":"6a645446","releases_21200.md":"f65699a3","faq.md":"d3f195dc","releases_21400.md":"bf9f03aa","releases_22000.md":"a664d51e","releases_22100.md":"fafc6195","releases_23000.md":"7d4a1d83","releases_24000.md":"a2288654","releases_24100.md":"15429fef","releases_24200.md":"eab9d9d7","releases_24300.md":"8db6782c","releases_25000.md":"a96540ec","releases_25100.md":"16546601","releases_25200.md":"94a4189a","guides.md":"513bdfd5","releases_26000.md":"8ba36e0d","releases_26100.md":"3336cb75","releases_26200.md":"20898ea4","releases_26300.md":"7a9b8346","delta_faq.md":"f7380f2d","delta_internal-guide.md":"65b191bb","details.md":"a7ca6af8","index.md":"df26462f","readme.md":"e3702901","app_changes.md":"de37dcd7"} diff --git a/index.html b/index.html index 373bd244..7a06ecd0 100644 --- a/index.html +++ b/index.html @@ -5,39 +5,61 @@ Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content

    Magisk 中文文档 由 Jesse205 翻译 非官方

    logo 本文档翻译了 Magisk 官方文档 并补充了很多内容。

    原始文档版本:2023年05月13日

    以下部分面向开发者:

    Magisk 许可(License)使用 百度翻译 汉化

    WARNING

    中文汉化版许可仅供参考,请以英文原版为准

    txt
    Magisk,包括所有 git 子模块都是自由软件:
    -您可以根据自由软件基金会发布的 GNU 通用公共许可证的条款(许可证的第3版,
    -或(根据您的选择)任何更高版本重新分发和/或修改它。
    -
    -分发此程序是希望它有用,但没有任何保证;甚至没有适销性或特定用途适用性
    -的隐含保证。有关详细信息,请参阅GNU通用公共许可证。
    -
    -你应该已经收到了GNU通用公共许可证的副本以及这个程序。如果没有,请参见
    -<http://www.gnu.org/licenses/>.
    英文原版
    txt
    Magisk, including all git submodules are free software:
    -you can redistribute it and/or modify it under the terms of the
    -GNU General Public License as published by the Free Software Foundation,
    -either version 3 of the License, or (at your option) any later version.
    -
    -This program is distributed in the hope that it will be useful,
    -but WITHOUT ANY WARRANTY; without even the implied warranty of
    -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    -GNU General Public License for more details.
    -
    -You should have received a copy of the GNU General Public License
    -along with this program.  If not, see <http://www.gnu.org/licenses/>.

    相关链接

    友情链接

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/install.html b/install.html index 27f7b877..994ae40c 100644 --- a/install.html +++ b/install.html @@ -5,26 +5,29 @@ 安装 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    安装

    如果您已经安装了 Magisk ,强烈建议直接通过 Magisk 应用程序的「直接安装」方法进行升级。以下教程仅针对初始安装。

    • 如果您在使用运行着 EMUI 8 或更高版本的华为设备,请查看相应部分
    • 如果您使用的是搭载 Android 9.0 或更高版本的三星设备(2019 年新设备),请查看相应部分

    入门

    在你开始之前:

    • 本教程假设您了解如何使用 adbfastboot
    • 如果您还计划安装第三方内核(kernel),请在安装 Magisk 之后安装它
    • 必须解锁设备的引导加载程序(bootloader)

    下载并安装最新的 Magisk 应用程序 (只需下载「Magisk-版本.apk」即可) 在主屏幕中,您应该看到:

    Ramdisk 的结果确定您的设备在 boot 分区中是否有 ramdisk。如果您的设备没有启动 ramdisk,请在继续之前阅读 Recovery 中的 Magisk 部分。

    信息

    不幸的是,有一些例外情况,因为某些设备的引导加载程序会接受 ramdisk,即使它不应该接受。 在这种情况下,您必须按照说明进行操作,就好像您的设备的 boot 分区包含 ramdisk 一样。 没有什么办法检测到这一点,因此唯一可以确定的方法就是实际尝试。 幸运的是,据我们所知,只有部分小米设备具有此属性,所以大多数人可以忽略这条信息。

    如果您的设备有启动 ramdisk,请获取 boot.img 或者 init_boot.img(如果存在。在出厂时搭载 Android 13 的设备通常是这样的,比如红米 K60Pro)的副本。

    如果您的设备没有启动 ramdisk,请获取 recovery.img 的副本。

    您可以从官方固件包或第三方 ROM 刷机包中提取所需文件。

    接下来,我们需要知道您的设备是否有单独的 vbmeta 分区。

    • 如果您的官方固件包包含 vbmeta.img ,那么您的设备有一个单独的 vbmeta 分区
    • 您还可以通过将设备连接到 PC 并运行以下命令进行检查:
    shell
    adb shell ls -l /dev/block/by-name
    -# 如果您遇到如 No such file or directory 的报错,那么请尝试把命令更换为
    -adb shell ls -l /dev/block/bootdevice/by-name
    -# 如果还是报错(比如华为设备),那么请联网搜索您的设备相对应的方法
    • 如果找到 vbmetavbmeta_avbmeta_b ,那么您的设备有一个单独的 vbmeta 分区
    • 否则,您的设备没有单独的 vbmeta 分区

    快速回顾一下,此时,您应该已经知道并准备好了:

    1. 设备是否有启动 ramdisk
    2. 设备是否有单独的 vbmeta 分区
    3. 基于 (1) 的 boot.imginit_boot.imgrecovery.img

    让我们继续修补映像.

    修补映像

    • 将 boot 、init_boot 或 recovery 映像( *.img 文件)复制到设备
    • 按下 Magisk 主屏幕中的 「安装」 按钮
    • 如果要修补 recovery 映像,请选中 「Recovery 模式」 选项
    • 如果您的设备没有单独的 vbmeta 分区,请选中 「修补 boot 映像中的 vbmeta」 选项
    • 在方式中选择 「选择并修补一个文件」 ,然后选择 boot 、init_boot 或 recovery 映像
    • 开始安装,并使用 ADB 将修补的映像复制到您的电脑:
    shell
    adb pull /sdcard/Download/magisk_patched_[随机字符].img PC上magisk_patched.img的路径

    提示,你可以将文件从资源管理器直接拖到终端中来获得文件绝对路径。

    不要使用 MTP,因为它可能会损坏大文件。

    • 将修补好的 boot 、init_boot 或 recovery 映像刷入到您的设备。
      对于大多数设备,可以重启到 fastboot 模式,并使用以下命令刷入:
    shell
    fastboot flash boot[_x] PC上magisk_patched_[随机字符].img的路径 # 或
    -fastboot flash init_boot[_x] PC上magisk_patched_[随机字符].img的路径
    -# 如果刚刚修补的是 recovery 映像则改用:
    -fastboot flash recovery PC上magisk_patched_[随机字符].img的路径

    [_x] 应该取决于您的设备,应为 _a_b 或者不写

    • 可选 如果您的设备有单独的 vbmeta 分区,则可以使用以下命令修补 vbmeta 分区
    shell
    fastboot flash vbmeta --disable-verity --disable-verification vbmeta.img

    WARNING

    此操作可能清除您的数据

    • 重启并启动 Magisk 应用程序(如果您清除数据,您将看到一个用于占位的 Magisk 应用程序),您将看到一个询问修复环境的对话框,点击它并等待重启
    • 瞧!

    卸载

    卸载 Magisk 的最简单方法是直接通过 Magisk 应用程序。如果您坚持使用第三方 Recovery,请将 Magisk APK 文件 重命名为 uninstall.zip 后像其他普通的刷机包一样刷入。

    Recovery 中的 Magisk

    如果您的设备在 boot 映像中没有 ramdisk ,Magisk 别无选择,只能劫持 Recovery 分区。对于这些设备,每次启用 Magisk 时都必须重新启动至 Recovery

    当 Magisk 劫持 recovery 时,有一个特殊的机制允许您实际进入到 Recovery 模式。每个设备都有自己的启动到 Recovery 模式的按键组合,(例如几乎所有的小米设备均为「电源」+「音量增大」以及 Galaxy S10 的「电源」+「Bixby」+「音量增大」)。百度搜索(或者 Bing 搜索、Google 搜索)可以很容易地获得这些信息。一旦你按下组合键,设备就会显示启动屏幕(可能还会振动),释放所有按键即可启动 Magisk。如果您决定引导到实际的 Recovery 模式,请长按音量增大,直到看到 Recovery 屏幕

    总之,在 recovery 中安装 Magisk 后 (从关机开始)

    • (正常开机) → (无 Magisk 的系统)
    • (按键组合) → (启动屏幕) → (释放所有按钮) → (带有 Magisk 的系统)
    • (按键组合) → (启动屏幕) → (长按音量增大) → (Recovery 模式)

    (注意:在这种情况下,您不能使用 第三方 Recovery 来安装或升级 Magisk!!)

    三星 (System-as-root)

    警告

    如果您的三星设备未安装 Android 9.0 或更高版本,则说明以下内容不适用于您的设备。

    安装 Magisk 之前

    • 安装 Magisk 将熔断 KNOX
    • 首次安装 Magisk 需要完整的数据擦除(这不包括在解锁 bootloader 时的数据擦除)。请在继续之前备份您的数据。
    • 下载支持您设备的 Odin (仅限 Windows 上运行) 或者 Heimdall (仅 Linux)。

    解锁 Bootloader

    在较新三星设备上解锁 bootloader 有一些注意事项。新引入的 VaultKeeper 服务会使 bootloader 在某些情况下拒绝任何非官方分区。

    • 允许在解锁 bootloader,在 开发者选项 → OEM 解锁
    • 重启到下载模式:将设备关机,然后按下设备的下载模式键组合
    • 长按音量上限可解锁引导加载程序这将擦除数据并自动重新启动
    • 完成初始设置。跳过所有步骤,因为数据将在后面的步骤中再次擦除。在设置过程中将设备连接到互联网
    • 启用开发者选项,确认「OEM解锁」选项存在且呈灰色。 这意味着 VaultKeeper 服务释放了引导加载程序。
    • 您的 bootloader 现在在下载模式允许非官方映像

    操作指南

    • 使用 samfirm.jsFrija,或 Samloader 直接从三星服务器下载设备的最新 zip 固件 。

    • 解压缩固件并将 AP 归档文件复制到设备。它通常命名为 AP_[device_model_sw_ver].tar.md5

    • 按下 Magisk 主屏幕中的 「安装」 按钮

    • 如果您的设备没有启动 ramdisk,勾选 「Recovery模式」 选项

    • 在方式中选择 「选择并修补一个文件」 ,然后选择 AP 归档文件

    • 开始安装,并使用 ADB 将修补的归档文件复制到您的电脑:

      shell
      adb pull /sdcard/Download/magisk_patched_[random_strings].tar

      注意:不要使用MTP,因为它可能会损坏大型文件。

    • 重新启动到下载模式。在您的 PC 上打开 Odin,将 magisk_patched.tar 作为 AP,连同原始固件中的 BLCPCSC不是 HOME_CSC,因为我们要清除数据)一起刷入。

    • 一旦 Odin 完成刷机,您的设备应该会自动重启。 如果被要求恢复出厂设置,请同意。

    • 如果您的设备没有启动 ramdisk,请立即重新启动到 recovery 以启用 Magisk(原因在 Recovery 中的 Magisk 中说明)。

    • 安装您已经下载的 Magisk 应用程序 并启动该应用程序。 它应该显示一个对话框,要求进行额外的设置。

    • 让应用程序完成它的工作并自动重启设备。

    系统更新

    一旦你的三星设备获得了 root 权限,你就不能再通过 OTA 进行 Android 系统更新了。要进行系统更新,您必须手动下载新的固件归档文件并完成上一节中编写的相同 AP 修补过程。这里唯一的区别在于Odin刷入步骤:不要使用 CSC 归档文件,而是使用 HOME_CSC 归档文件,因为我们正在执行升级,而不是初始安装

    注意事项

    • 永远、永远不要尝试将 bootrecoveryvbmeta 分区恢复到原样! 您这样做会破坏您的设备,并且从中恢复的唯一方法是清除数据并进行完整的 Odin 恢复
    • 要使用新的固件升级您的设备,切勿出于上述原因直接使用原厂 AP 归档文件。 始终在 Magisk 应用程序中修补 AP 并改用它。
    • 永远不要只刷入 AP ,否则 Odin 可能会缩小 /data 文件系统的大小。升级时请刷入 AP + BL + CP + HOME_CSC

    华为

    DANGER

    这部分现已从官方文档中移除。您正在浏览的是 2021.03.22 并补充后的版本。

    Magisk 不再正式支持较新的华为设备,因为其设备上的 bootloader 不可通过官方途径解锁,更重要的是他们不遵循标准的 Android 分区方案。以下只是一些一般性指导。

    使用了麒麟处理器的华为设备与大多数常见设备的分区方式不同。Magisk 通常安装在设备的 boot 分区,但是华为设备没有这个分区。根据您的设备运行的 EMUI 版本,说明会略有不同。

    DANGER

    请勿使用最新版本的 Magisk 应用!我推荐使用 Magisk v23.0 或使用 Magisk v20.4 (下载「Magisk-v20.4.zip」)搭配 Magisk Manager v7.5.1 (下载「MagiskManager-v7.5.1.apk」)

    Magisk 兼容性列表
    名称型号EMUI 版本Android 版本详情
    华为畅享7SLA-AL00EMUI 5.1.2Android 7.0使用 Magisk v25.2 时会触发引导循环并直接重启至 eRecovery
    荣耀畅玩4CCHM-TL00HEMUI 4.0Android 6.0使用新版 Magisk 会导致无法授权
    荣耀畅玩6XBLN-AL10EMUI 8.0Android 8.0没有这个问题

    获得官方映像

    华为不发布官方出厂映像以及 OTA 归档文件,但大多数固件压缩包可以从华为固件下载站下载。 要从压缩包中的「UPDATE.APP」中提取映像,您必须使用 Huawei Update Extractor(仅限 Windows!)

    EMUI 5 及以下

    遵循入门的教程,唯一的不同在于请勿使用最新版本的 Magisk 应用!

    注意:华为设备进入 fastboot 模式需要将手机使用数据线连接电脑,而进入 Recovery 模式则不能将手机连接到电脑!所以如果您在 fastboot 模式中刷入 Recovery 映像后请将手机与电脑断开连接后再按下「电源」+「音量增大」来进入 Recovery,否则您将进入的是「eRecovery」。

    EMUI 8

    对于运行 EMUI 8 的设备,您的设备有一个名为 ramdisk 的分区,这是将要安装 Magisk 的地方。

    • 如果您打算使用第三方 Recovery,只需按照第三方 Recovery 的说明进行操作即可。

    • 如果您不打算使用第三方 Recovery,则必须从您的固件中提取 RAMDISK.img 。 按照上面的修补映像说明进行操作,但使用 RAMDISK.img 文件而不是 boot 映像!

    • 要将修补后的映像刷入您的设备,请使用 fastboot 命令:

      shell
      fastboot flash ramdisk /path/to/magisk_patched.img

    请注意,您正在刷入 ramdisk,而不是 boot

    EMUI 9 或更高版本

    对于 EMUI 9+ 设备,ramdisk 分区不再存在。 作为解决方法,Magisk 将安装到 recovery_ramdisk 分区。 在按照以下说明操作之前,请先阅读 Recovery 中的 Magisk

    注意:正如在 荣耀 View 10 上测试的那样,华为的内核似乎无法在早期启动时捕获按键事件,因此长按音量增大不会在我的设备上不会启动到 Recovery。 您的体验可能会有所不同。

    • 如果您打算使用第三方 Recovery,只需按照第三方 Recovery 的说明进行操作即可。
      警告:Magisk 将覆盖第三方 Recovery。

    • 如果您不打算使用第三方 Recovery,则必须从固件中提取 RECOVERY_RAMDIS.img (这不是拼写错误),而不是 recovery.img(部分设备依旧需要修补 recovery.img )。 按照上面的引导映像修补说明进行操作,但使用 RECOVERY_RAMDIS.img 文件而不是 boot 映像!

    • 要将修补后的映像刷入您的设备,请使用 fastboot 命令:

      shell
      fastboot flash recovery_ramdisk /path/to/magisk_patched.img

    请注意,您正在刷入 recovery_ramdisk,而不是 boot

    第三方 Recovery

    警告

    这种安装方法已被弃用,并且可以用很小的工作量来维护。

    仅当您的设备启动 ramdisk 时,才能使用第三方 Recovery 进行安装。不建议在新的设备上通过第三方 Recovery 安装 Magisk。如果您遇到任何问题,请使用正确的修补映像方法。

    • 下载 Magisk 安装包
    • .apk 文件扩展名重命名为 .zip ,例如:Magisk-v25.2.apkMagisk-v25.2.zip 。如果重命名文件扩展名时遇到问题(比如在 Windows 文件资源管理器中默认不显示文件扩展名),请使用 Android 上的文件管理器或第三方 Recovery 中的文件管理功能重命名文件。
    • 像其他普通的刷机包一样刷入归档文件。
    • 重新启动并检查是否已安装 Magisk 应用程序。如果未自动安装,请手动安装 APK。
    • 启动 Magisk 应用程序,它将显示一个让您重新安装的对话框。请直接在 APP 内重新安装并重新启动(MTK 设备将在重启后自动给 boot 分区上锁,请使用 fastboot 或者第三方 recovery 修补映像)。

    警告

    模块的 sepolicy.rule 文可能存储在 cache 分区中。请不要擦除 CACHE 分区。

    TIP

    您也可以提供 adb sideload 刷入 Magisk,这对于不能正常解密 data 分区且无外置存储设备(SD 卡,U 盘等)的设备特别友好,并且在这种情况下无需将 .apk 文件扩展名重命名为 .zip

    参考链接

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/ota.html b/ota.html index d0ade9b5..96a9a309 100644 --- a/ota.html +++ b/ota.html @@ -5,20 +5,23 @@ OTA 升级指南 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    OTA 升级指南

    Magisk 不修改大多数只读分区,这意味着应用官方 OTA 要简单得多。以下是几种不同类型的设备的教程,以应用 OTA 并在安装后保留 Magisk(如果可能)。这只是一个通用指南,因为每个设备的程序可能有所不同。

    注意:为了应用 OTA,您必须确保自己没有以任何方式修改只读分区(如 /system/vendor )。即使将分区重新挂载到 rw 也会篡改块验证

    必要条件

    • 请在开发人员选项中禁用自动系统更新,这样在未经您确认的情况下,它不会安装 OTA。

    • 当OTA可用时,首先转到(Magisk app → 卸载 → 恢复映像),不要重新启动,否则将卸载 Magisk。 这将使 Magisk 修改的分区从安装时的生成备份恢复到官方,以便通过 OTA 前的块验证。在执行以下步骤之前,需要执行此步骤

    带 A/B 分区的设备

    可以将 OTA 安装到非活动插槽,并让 Magisk app 将 Magisk 安装到更新的分区上。开箱即用的 OTA 安装工作无缝,安装后可以保存 Magisk。

    • 恢复官方映像后,按正常方式应用 OTA(设置 → 系统 → 系统更新)。
    • 等待安装完成(OTA 的 步骤1:“安装更新” 和 步骤2:“优化您的设备”),不要按“重新启动”按钮! 相反,请转到(Magisk app → 安装 → 安装到非活动插槽)将 Magisk 安装到更新的插槽。

    • 安装完成后,按下 Magisk app 中的重新启动按钮。在 hood 下,Magisk app 强制您的设备切换到更新的插槽,绕过任何可能的 OTA 后验证。

    “非 A/B” 设备

    不幸的是,在这些设备上应用 OTA 并没有真正好的方法。以下教程不会保留 Magisk;升级后,您必须手动重新 root 设备,这将需要通过电脑。这些只是“最佳实践”。

    • 如果您安装了第三方 recovery,则可以从以前的备份、在线转储或 OEM 提供的出厂映像中恢复。 如果您决定在不接触 recovery 分区的情况下开始安装 Magisk,您可以有几种选择,无论是哪种方式,您都可以最终使用 Magisk root 的设备,但 recovery 仍然保持不变:
      • 如果支持,请使用 fastboot boot <recovery_img> 启动第三方 Recovery 并安装 Magisk。
      • 如果您有官方映像转储的副本,请使用 Magisk app 的“修补映像”功能安装 Magisk
    • 恢复到官方映像和其他映像后,下载 OTA。可选地,一旦下载了 OTA 的更新 zip,就可以找到提取 zip 的方法(因为它通常涉及 root 用户)
    • 应用 OTA 并重启设备。这将使用您设备的官方映像 OTA 安装机制来升级您的系统。
    • 一旦完成,您将得到一个升级的、100% 官方的、未 root 的设备。你必须手动将 Magisk 刷回。如果您想经常接收官方 OTA,请考虑使用 步骤1 中所述的方法,在不接触恢复分区的情况下刷入 Magisk。

    参考链接

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/18000.html b/releases/18000.html index 221c40e1..c95812c9 100644 --- a/releases/18000.html +++ b/releases/18000.html @@ -3,22 +3,25 @@ - Magisk 中文文档 | Magisk 中文文档 + 2018.12.7 Magisk v18.0 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2018.12.7 Magisk v18.0

    Here comes a stable release, this time with quite a few major updates!

    MagiskHide Improvements

    Starting from v18, the process monitor matches component names instead of process names. Android allow app services to name their process arbitrarily, and many apps starting to use dedicated services to detect root; it used to require adding all of these service process names to the list to hide Magisk effectively. Component names have the format: <package name>/<java class name>, which means we can always know which application spawned a given process.

    TL;DR, ALL processes spawned from the applications on the hide list will be targeted.

    Recently I discovered a very widespread Linux kernel bug affecting tons of Android devices (full write-up: Medium Article). This bug exposes the supposedly protected procfs, which is abused in some apps to detect Magisk with information leaked from other processes. Magisk will patch this bug on all Android 7.0+ devices. Yes, a fully effective MagiskHide requires the enhanced Android Sandbox in modern Android versions.

    Path Changes

    The name of the folder /sbin/.core is confusing and will no longer be used; it is replaced with /sbin/.magisk. Another major change is the location to store general boot scripts. As these boot scripts should still run even if magisk.img is not mounted, they are moved out of magisk.img, from <img>/.core/<stage>.d to /data/adb/<stage>.d (stage is either post-fs-data or service). Say goodbye to stupid paths like /sbin/.core/img/.core/post-fs-data.d!

    Quick recap:

    • New magisk.img mountpoint: /sbin/.magisk/img
    • New internal busybox PATH: /sbin/.magisk/busybox
    • The folder <img>/.core is no longer used in any places. magisk.img is solely used for storing modules, no other functionality depends on it.
    • Symlinks are created so all old paths will still work. None of the existing apps/scripts depending on these internal paths should break, but please migrate to the new paths ASAP.

    Dropping Legacy Support

    The NEXT Magisk Manager upgrade (not this one) will only support v18+, please upgrade ASAP. Magisk Manager is always designed to be fully functional across a wide range of Magisk versions. However, to enforce full obfuscation, I will have to drop legacy support eventually.

    This is also a good opportunity to push the whole community forward, all module developers should forget about backward compatibility (e.g. stop supporting the old Magisk paths, please don't torture yourself...). I expect very few structural changes in the near future, so again, please upgrade ASAP 😃

    Modern C++ Code Base

    Although this has nothing to do with the end user, tons of effort was done to migrate Magisk to a more modern C++ code base instead of the previous good plain old C. This makes the code easier to maintain and allows me to utilized many C++ language features.

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/18100.html b/releases/18100.html index 68d42ab6..40261113 100644 --- a/releases/18100.html +++ b/releases/18100.html @@ -5,20 +5,23 @@ 2019.2.4 Magisk v18.1 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2019.2.4 Magisk v18.1

    What is a better way to celebrate Chinese New Year than a new Magisk update!

    EMUI 9 Support

    Welcome on board "again", Huawei! Even though Huawei had officially blocked bootloader unlocks, people still love to buy them (duh), and there are paid services that unlock Huawei bootloaders. So hey, get Magisk installed on that bad boy! One caveat is that since Huawei have changed the partitions, special workarounds has to be done. Details and instructions are in the newly created instruction page

    Support Down to Android 4.2

    Because why not, it was quite a lot of fun LOL. All devices running KitKat and higher will have all features enabled. MagiskHide and resetprop aren't possible on Jellybean, and Magic Mount (modules) is temporarily disabled; basically it only works as a root solution for now. Android 4.1 isn't 100% usable yet, so installation is also temporarily blocked. Eventually, all Jellybean devices will have full Magic Mount and MagiskSU support.

    Major Magisk Manager Update

    Aside from the obvious major UI overhaul, tons of little user experience and performance improvements are also added. The app is finally less crappy now 😃

    Final Words

    I'm aware that there are apps updated to detect Magisk, however no MagiskHide improvements efforts are done in this release; v18.1 is aimed to be as stable as possible. Stay tuned for future public betas, or if you are more adventurous, jump on the Canary Channel bandwagon for more aggressive hiding techniques 😃

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/19000.html b/releases/19000.html index a9a4391f..3f6a075d 100644 --- a/releases/19000.html +++ b/releases/19000.html @@ -5,20 +5,23 @@ 2019.3.28 Magisk v19.0 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2019.3.28 Magisk v19.0

    I would say this is one of my most ambitious release of all time! Due to the extremely massive changes, this release will be a public beta. Calling it v18.2 doesn't do it justice, so v19.0 we go.

    Magisk Module installer

    Magisk module developers: pay extra attention! A completely new Magisk Module Installer replaces the old Magisk module template. This new format decouples ALL installation logic from modules, and encourages developers to use the provided API for installation. This new format is ENFORCED, meaning all existing modules should upgrade ASAP, and new modules are REQUIRED to follow the rules.

    Carefully read through the updated docs!

    Warning: All existing modules that does not use the new module format will be automatically removed on May 1st, 2019. Module devs: upgrade your existing modules ASAP!

    Imageless Magisk

    Since the existence of Magisk, all modules are stored within an EXT4 image which will be loop mounted at boot. This approach has a few problems: resizing the image is a huge headache (no live resizing, resize2fs on some devices refuse to work properly), and also MANY devices using F2FS ships a broken driver with the kernel, causing EXT4 loop devices unable to be mounted at all. All these problems come to an end now: modules are now directly stored in /data! Backwards compatibility is provided, for modules that uses the official module template, installation should work just fine.

    Warning: Although module migration was tested, there are still chances that your modules will get lost in the process. Be prepared to reinstall your existing modules in that case.

    Native 64 Bit is Back

    At one point in history, Magisk uses native 64 binaries. However due to binary size considerations, all binaries was switched to 32 bit. Starting from v19, all static binaries are still 32 bit only, but the most important part: the main magisk binary now runs in native 64 bit on supported devices.

    Zygote Ptrace Based MagiskHide

    MagiskHide used to use logcat to monitor activity manager events for new process creation. That method is extremely unreliable: even with constant improvements since introduction, it is still not working 100% of the time. Here comes a fundamentally new approach: ptrace the zygote process and step through all fork events. In layman's term, this new method is able to target a process before it even starts to run! The code for it is extremely tricky, but it was tested for quite a while in the canary channel, so I'm confident enough to release this to the public 😃

    Android Q

    Full support for Android Q Beta 1 is also introduced in this release. However, you cannot use it on the Pixel 3 (XL) due to the fact that Google decided to use logical partitions on the 3rd gen Pixels starting with Q. A solution is still WIP, please stay tuned!

    Final Words

    What you can expect in upcoming releases: Samsung S10 support, and full logical partition support. Also, I AM aware of Google Pay issues, but these are not my main focus now since there are still tons of other issues for me to focus on. Several discussion threads on XDA provide seemingly working solutions, please do some research on your own.

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/19100.html b/releases/19100.html index ff1615b3..b3d043d4 100644 --- a/releases/19100.html +++ b/releases/19100.html @@ -5,20 +5,23 @@ 2019.5.1 Magisk v19.1 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2019.5.1 Magisk v19.1

    Finally, a lovely stable release!

    For those that were using v18.1, here are some quick highlights of v19.0

    • Imageless Magisk: Although module migration was tested, there are still chances that your modules will get lost in the process. Be prepared to reinstall your existing modules in that case.
    • Native 64-bit support
    • Zygote Ptrace Based MagiskHide

    Other than adding support for Samsung system-as-root devices, this release is mostly bug fixes from v19.0. Enjoy 😃

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/19200.html b/releases/19200.html index d07c8525..8953f246 100644 --- a/releases/19200.html +++ b/releases/19200.html @@ -5,20 +5,23 @@ TODO | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/19300.html b/releases/19300.html index 18d0911b..8d3c8c83 100644 --- a/releases/19300.html +++ b/releases/19300.html @@ -5,20 +5,23 @@ TODO | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/19400.html b/releases/19400.html index e75754bd..e53d4fcf 100644 --- a/releases/19400.html +++ b/releases/19400.html @@ -5,20 +5,23 @@ 2019.9.19 Magisk v19.4 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2019.9.19 Magisk v19.4

    This version is heavily tested and tons of bugs were squashed before release. However due to the massive changes, it is decided to release a public beta for people/root app developers to adjust/update before things hit public stable.

    New System-as-root Implementation

    Magisk has supported system-as-root devices for a long time since the first Pixel came out. The goal is always to revert things back to the good old initramfs based root dir. However, this not only creates tons of issues on many devices, not easily hide-able with MagiskHide, but most importantly not even possible on Android 10. Starting with v19.4, Magisk will follow how Google has designed system-as-root: mounting system actually to / (root).

    This implies several MASSIVE consequences for system-as-root devices:

    • /system is no longer a valid mount point. For existing root apps that remounts /system to rw, you will have to remount / instead of /system
    • The root directory (/) is no longer rootfs, but actually system. Remounting / to rw and modify files means you are writing to the actual system partition, NOT volatile storage as it used to be in rootfs. This is not recommended as user is not necessary aware that you are tampering an actual partition, sometimes dangerous if dm-verity/AVB-verity is enforced, or sometimes outright impossible since many devices now ship with read-only system partitions (e.g. EROFS, EXT4 dedup)
    • Several custom kernel rely on Magisk's root directory overlay system (overlay) for modifying /. This is no longer compatible with the new implementation. A new overlay system (overlay.d) will replace the existing one as an alternative (details in documentations). To provide backwards compatibility, Magisk will switch to "Compat Mode" when /overlay is detected, which simply reverts to the old system-as-root setup. Compat Mode will not work on Android 10 and will cause bootloop. Although things will still work as it used to, please upgrade to overlay.d ASAP.

    Android 10 Support

    Other than A-only devices running Android 10, Android 10 is fully supported with MagiskHide fully functioning. Android 10's biggest challenge is the new "2-Stage-Init" system-as-root implementation, which is the sole reason why A-only is not support yet. Stay tuned for further updates as that is the next thing on the list.

    (For those interested in "2-Stage-Init" and other details of system-as-root, check this Twitter thread I tweeted)

    Product Partition Support

    Magisk Module developers can now finally properly modify files in /product! This partition is now an essential part in Android 10, and many files are moved from system to product. Please check documentations for more details.

    A-Only System-as-root

    A huge number of new devices have A-only system-as-root setups (Android 9.0). These unfortunate devices will have to install Magisk into the recovery partition. Please check the fully updated Installation Guide for more details.

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/20000.html b/releases/20000.html index 3727d9b8..4fb382df 100644 --- a/releases/20000.html +++ b/releases/20000.html @@ -5,20 +5,23 @@ 2019.10.11 Magisk v20.0 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2019.10.11 Magisk v20.0

    The following release notes are mostly the same as v19.4. Compared to v19.4 beta, the most notable change is adding tons of support for more devices on Android 10, along with several bug fixes.

    New System-as-root Implementation

    Magisk has supported system-as-root devices for a long time since the first Pixel came out. The goal is always to revert things back to the good old initramfs based root dir. However, this not only creates tons of issues on many devices, not easily hide-able with MagiskHide, but most importantly not even possible on Android 10. Magisk will now start to follow how Google has designed system-as-root: mounting system actually to / (root).

    This implies several MASSIVE consequences for system-as-root devices:

    • /system is no longer a valid mount point. For existing root apps that remounts /system to rw, you will have to remount / instead of /system
    • The root directory (/) is no longer rootfs, but actually system. Remounting / to rw and modify files means you are writing to the actual system partition, NOT volatile storage as it used to be in rootfs. This is not recommended as user is not necessary aware that you are tampering an actual partition, sometimes dangerous if dm-verity/AVB-verity is enforced, or sometimes outright impossible since many devices now ship with read-only system partitions (e.g. EROFS, EXT4 dedup)
    • Several custom kernel rely on Magisk's root directory overlay system (overlay) for modifying /. This is no longer compatible with the new implementation. A new overlay system (overlay.d) will replace the existing one as an alternative (details in documentations). To provide backwards compatibility, Magisk will switch to "Compat Mode" when /overlay is detected, which simply reverts to the old system-as-root setup. Compat Mode will not work on Android 10 and will cause bootloop. Although things will still work as it used to, please upgrade to overlay.d ASAP.

    Android 10 Support

    Android 10 is now fully supported with MagiskHide working as expected. Android 10's biggest challenge is the new "2-Stage-Init" system-as-root implementation, which requires modding early mount fstab in a specific way, and in many devices' cases involves patching DTBs in the boot image.

    (For those interested in "2-Stage-Init" and other details of system-as-root, check this Twitter thread I tweeted)

    Product Partition Support

    Magisk Module developers can now finally properly modify files in /product! This partition is now an essential part in Android 10, and many files are moved from system to product. Please check documentations for more details.

    A-Only System-as-root

    A huge number of new devices have A-only system-as-root setups (Android 9.0). These unfortunate devices will have to install Magisk into the recovery partition. Please check the fully updated Installation Guide for more details.

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/20100.html b/releases/20100.html index 0b8f0fe2..d0fd8d57 100644 --- a/releases/20100.html +++ b/releases/20100.html @@ -5,20 +5,23 @@ 2019.11.2 Magisk v20.1 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2019.11.2 Magisk v20.1

    Lots of bug fixes from v20.0, and some cool new features!

    Updated Magisk Manager Hiding

    Starting with Magisk v20.1 paired with Magisk Manager v7.4.0, a new hiding mode is introduced for Android 9.0+. On supported devices, Magisk Manager will download and customize a heavily obfuscated stub APK and use it as a replacement. The stub app will then download the full app into its private internal data, then dynamically load and run the actual full Magisk Manager.

    Note, not all Android 9.0+ devices will be able to use this feature. To use an obfuscated stub as Magisk Manager, the Magisk daemon will have to rely on a special way to communicate with the app, and some OEMs (most likely Chinese manufacturers) block certain broadcasts, breaking the communication channel.

    Magisk Manager will verify compatibility before it uses stubs to hide itself on Android 9.0+. The verification relies on Magisk v20.1+, which means you have to fully upgrade and reboot in order to opt in this feature. If you are already running a hidden Magisk Manager, restore and upgrade Magisk Manager, upgrade Magisk and reboot, then re-hide the app.

    For those incompatible with the hiding-with-stub feature, there are also a few updates that everyone, regardless whether using stubs or not, can enjoy:

    • You can now customize the app name of the repackaged Magisk Manager
    • Magisk Manager will generate new keys to sign the repackaged APK to prevent signature detection

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/20200.html b/releases/20200.html index c14921db..7287326e 100644 --- a/releases/20200.html +++ b/releases/20200.html @@ -5,20 +5,23 @@ 2020.1.2 Magisk v20.2 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2020.1.2 Magisk v20.2

    Happy New Year! Let's start 2020 with a new Magisk release 😃

    Pre-Init sepolicy Patches for Modules

    Magisk v20.2 add support for modules to include its own custom sepolicy patches. Developers used to use boot scripts along with the magiskpolicy tool to do live sepolicy patches; however, this method leads to numerous issues as Android is no longer designed to allow live sepolicy patches, and on some devices (e.g. Huawei) this method is outright inapplicable.

    To address this issue, Magisk allow module devs to create a new file called sepolicy.rule in their modules. The module installer script and Magisk daemon will make sure this file is stored in somewhere accessible pre-init to allow magiskinit to do its job every time your device boots up.

    New Module Installer Format

    The old template is actually pretty convoluted: developers are expected to implement specific callback functions in their install.sh, and the zip file structure does not directly represent how modules are actually stored on your device. The new module installer format makes creating new modules very easy, but still give experienced developers tons of freedom to do anything they want in the installation process.

    For details regarding sepolicy.rule and the new module installer format, please read the updated Developer Guides. Note that the old "Module Installer Template" is obsolete; creating a Magisk module no longer requires a "template" as it is now a straightforward process.

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/20300.html b/releases/20300.html index 74e0934a..ae7ecd96 100644 --- a/releases/20300.html +++ b/releases/20300.html @@ -5,20 +5,23 @@ 2020.1.10 Magisk v20.3 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2020.1.10 Magisk v20.3

    Magisk

    • Fix magiskboot crashing when dealing with lz4_legacy format

    Magisk Manager

    • Fix MagiskHide app component toggles

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/20400.html b/releases/20400.html index de1bbf5d..24d2d1f5 100644 --- a/releases/20400.html +++ b/releases/20400.html @@ -3,22 +3,25 @@ - Magisk 中文文档 | Magisk 中文文档 + 2020.3.23 Magisk v20.4 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2020.3.23 Magisk v20.4

    Miscellaneous

    This release is mainly focused on stability and bug squashing. Please be aware that MagiskHide is no longer enabled by default. Since Google has enabled hardware-based key attestation in SafetyNet (FAQ), there is no effective way to pass full CTS SafetyNet anymore (although Google seems to have temporarily reverted the change).

    I decided that the fully redesigned Magisk Manager isn't fully ready for prime time yet, so this time around no Magisk Manager update is released. The WIP manager will continue to be improved and is available for testing on the canary channel.

    BusyBox Standalone Mode

    Starting with Magisk v20.4, all Magisk related scripts, including boot scripts and module installation scripts, will run on BusyBox's shell (ash) in standalone mode. In BusyBox ash standalone mode, every single command will be forced to use the one that is in Magisk's BusyBox (if available). For instance, no matter how you change the environment variable PATH, the rm command will always use the one in BusyBox, not the one in system, external BusyBox, vendor, or included in custom recovery.

    The reason behind this change is that all scripts will be guaranteed to have 100% consistent results no matter how the environment is setup. The internal BusyBox is significantly beefed up with patches from @osm0sis, and also with SELinux features enabled. It shall offer a very complete, reliable, and consistent scripting environment. If in any case you require to use a command outside of BusyBox, please call it with the full path (e.g. /system/bin/nslookup)

    Magisk Changelog

    • [MagiskInit] Fix potential bootloop in A-only 2SI devices
    • [MagiskInit] Properly support Tegra partition naming
    • [General] Load libsqlite.so dynamically, which removes the need to use wrapper scripts on Android 10+
    • [General] Detect API level with a fallback method on some devices
    • [General] Workaround possible bug in x86 kernel readlinkat system call
    • [BusyBox] Enable SELinux features. Add chcon/runcon etc., and '-Z' option to many applets
    • [BusyBox] Introduce standalone mode. More details in release notes
    • [MagiskHide] Disable MagiskHide by default
    • [MagiskHide] Add more potential detectable system properties
    • [MagiskHide] Add workaround for Xiaomi devices bootloop when MagiskHide is enabled on cross region ROMs
    • [MagiskBoot] Support patching special Motorolla DTB format
    • [MagiskPolicy] Support 'genfscon' sepolicy rules
    • [Scripts] Support NAND based boot images (character nodes in /dev/block)
    • [Scripts] Better addon.d (both v1 and v2) support
    • [Scripts] Support Lineage Recovery for Android 10+

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/21000.html b/releases/21000.html index 4b950a84..b8c9bc7e 100644 --- a/releases/21000.html +++ b/releases/21000.html @@ -3,22 +3,25 @@ - Magisk 中文文档 | Magisk 中文文档 + 2020.10.3 Magisk v21.0 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2020.10.3 Magisk v21.0

    Long time no see! v21.0 is the largest release in Magisk's history. It comes with full Android 11 support (tons of stuff had to be rewritten from scratch!), and a completely redesigned Magisk Manager. These are the reasons why this particular public release took me over half a year to wrap up.

    To the end user, not much has changed other than the fact that Magisk Manager has completely changed its appearance. However developers should pay attention to some changes due to adjustments for Android 11. Full changelogs are too massive to fit, so here I'll point out the main changes and links to updated documentations.

    Highlights

    • Android 11 support 🎉
    • Completely redesigned Magisk Manager
    • Safe Mode detection: if you installed a module that bootloops your device, reboot into Safe Mode and all modules will be disabled. More instructions on how to deal with broken modules is linked here.

    The following are for advanced users/developer:

    • On Android 8.0+, Magisk now uses a new SELinux setup that keeps Android sandbox less compromised. This provides better security to rooted users, and also separates Magisk rules from original rules. Details here.
    • On Android 11, /sbin may no longer exist. For developers, this means the Magisk's internal tmpfs directory is no longer always /sbin, and instead randomly created every boot. To get the tmpfs path, use the command magisk --path (more details here). For custom kernel developers that uses overlay.d, updated docs are here.
    • magiskpolicy gained more features and some minor syntax changes, details here.

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/21100.html b/releases/21100.html index 9173de39..e40e915f 100644 --- a/releases/21100.html +++ b/releases/21100.html @@ -3,22 +3,25 @@ - Magisk 中文文档 | Magisk 中文文档 + 2020.11.13 Magisk v21.1 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2020.11.13 Magisk v21.1

    v21.1 is a maintenance update from v21.0, mostly addressing bugs, refining some details, and adding new boot image format support (for Pixel 5 and 4a 5G). Checkout the full v21.0 release notes if coming from older releases.

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/21200.html b/releases/21200.html index 0b5238b5..7c9ef3f5 100644 --- a/releases/21200.html +++ b/releases/21200.html @@ -3,22 +3,25 @@ - Magisk 中文文档 | Magisk 中文文档 + 2020.12.28 Magisk v21.2 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2020.12.28 Magisk v21.2

    v21.2 is a maintenance update, mostly addressing bugs, and expanding device compatibility. Checkout the full v21.0 release notes if coming from older releases.

    v21.2

    • [MagiskInit] Detect 2SI after mounting system_root on legacy SAR devices
    • [General] Make sure post-fs-data scripts cannot block more than 35 seconds
    • [General] Fix the magisk --install-module command
    • [General] Trim Windows newline when reading files
    • [General] Directly log to file to prevent logcat weirdness
    • [MagiskBoot] Fix header dump/load for header v3 images

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/21400.html b/releases/21400.html index 916addce..c66dd779 100644 --- a/releases/21400.html +++ b/releases/21400.html @@ -3,22 +3,25 @@ - Magisk 中文文档 | Magisk 中文文档 + 2021.1.17 Magisk v21.4 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2021.1.17 Magisk v21.4

    Update: v21.4 adds more regression hot fixes.

    Happy 2021! v21.3 adds a workaround for devices with buggy F2FS Linux kernel drivers. This F2FS bug may cause bootloops on many devices. Checkout the full v21.0 release notes if coming from older releases.

    v21.4

    • [MagiskSU] Fix su -c behavior that broke many root apps
    • [General] Properly handle read/write over sockets (the broken pipe issue)

    v21.3

    • [MagiskInit] Avoid mounting f2fs userdata as it may result in kernel crashes. This shall fix a lot of bootloops
    • [MagiskBoot] Fix a minor header checksum bug for DHTB header and ASUS blob image formats
    • [MagiskHide] Allowing hiding isolated processes if the mount namespace is separated

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/22000.html b/releases/22000.html index ad5ab411..fc43b378 100644 --- a/releases/22000.html +++ b/releases/22000.html @@ -3,22 +3,25 @@ - Magisk 中文文档 | Magisk 中文文档 + 2021.2.23 Magisk v22.0 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2021.2.23 Magisk v22.0

    RESTORE THE EXISTING MAGISK MANAGER BACK TO NORMAL BEFORE UPGRADING IF HIDDEN!

    Another major Magisk release! This time our focus is not the core Magisk implementation, but rather on improving the whole Magisk user experience.

    Magisk Manager is dead.
    Long live the Magisk app!

    Ever since the first Magisk release, Magisk (the core components) and Magisk Manager (the companion app) are released separately and isn't necessarily always in sync. This leads to some confusion and a lot of complexity when downloading/installing Magisk through the app. Starting from v22.0, the Magisk app (renamed from Magisk Manager) includes everything it needs within the APK itself, making installation a 100% offline process.

    Custom recovery lovers, no worries! The Magisk app APK itself is a custom recovery flashable zip, just like MAGIC™🌈. Check out the updated installation guide for more info.

    App Hiding

    Another major breakthrough in this release is that devices lower than Android 9.0 can now also use the advanced app hiding technique to hide the Magisk app. Due to this incompatible change, RESTORE THE EXISTING MAGISK MANAGER BACK TO NORMAL BEFORE UPGRADING IF HIDDEN!

    Bug Fixes

    • [MagiskHide] Fix a bug when stopping MagiskHide does not take effect
    • [MagiskBoot] Fix bug when unpacking lz4_lg compressed boot images
    • [MagiskInit] Support Galaxy S21 series
    • [MagiskSU] Fix incorrect APEX paths that caused libsqlite.so fail to load

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/22100.html b/releases/22100.html index f6de37e1..7c660ff0 100644 --- a/releases/22100.html +++ b/releases/22100.html @@ -3,22 +3,25 @@ - Magisk 中文文档 | Magisk 中文文档 + 2021.4.9 Magisk v22.1 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2021.4.9 Magisk v22.1

    This release is focused on fixing regressions and bugs. Check the v22.0 release notes if coming from older releases.

    Note: Magisk v22 is the last major version to support Jellybean and Kitkat. Magisk v23 will only support Android 5.0 and higher.

    Bug Fixes

    • [App] Prevent multiple installation sessions running in parallel
    • [App] Prevent OutOfMemory crashes when checking boot signature on PXA boot images
    • [General] Proper cgroup migration implementation
    • [General] Rewrite log writer from scratch, should resolve any crashes and deadlocks
    • [General] Many scripts updates fixing regressions
    • [MagiskHide] Prevent possible deadlock when signal arrives
    • [MagiskHide] Partial match process names if necessary
    • [MagiskBoot] Preserve and patch AVB 2.0 structures/headers in boot images
    • [MagiskBoot] Properly strip out data encryption flags
    • [MagiskBoot] Prevent possible integer overflow
    • [MagiskInit] Fix sepolicy.rule mounting strategy
    • [resetprop] Always delete existing ro. props before updating. This will fix bootloops that could be caused by modifying device fingerprint properties.

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/23000.html b/releases/23000.html index 43871333..21cb121c 100644 --- a/releases/23000.html +++ b/releases/23000.html @@ -3,22 +3,25 @@ - Magisk 中文文档 | Magisk 中文文档 + 2021.5.12 Magisk v23.0 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2021.5.12 Magisk v23.0

    This release is focused on fixing regressions and bugs.

    Note: Magisk v22 is the last major version to support Jellybean and Kitkat. Magisk v23 only supports Android 5.0 and higher.

    Bug Fixes

    • [App] Update snet extension. This fixes SafetyNet API errors.
    • [App] Fix a bug in the stub app that causes APK installation to fail
    • [App] Hide annoying errors in logs when hidden as stub
    • [App] Fix issues when patching ODIN tar files when the app is hidden
    • [General] Remove all pre Android 5.0 support
    • [General] Update BusyBox to use proper libc
    • [General] Fix C++ undefined behaviors
    • [General] Several sepolicy.rule copy/installation fixes
    • [MagiskPolicy] Remove unnecessary sepolicy rules
    • [MagiskHide] Update package and process name validation logic
    • [MagiskHide] Some changes that prevents zygote deadlock

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/24000.html b/releases/24000.html index 4bf8e916..8e3f3f33 100644 --- a/releases/24000.html +++ b/releases/24000.html @@ -3,22 +3,25 @@ - Magisk 中文文档 | Magisk 中文文档 + 2022.1.26 Magisk v24.0 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2022.1.26 Magisk v24.0

    It has been a while since the last public release, long time no see! A personal update for those unaware: I am now working at Google on the Android Platform Security team. Without further ado, let's jump right into it!

    MagiskHide Removal

    I have lost interest in fighting this battle for quite a while; plus, the existing MagiskHide implementation is flawed in so many ways. Decoupling Magisk from root hiding is, in my opinion, beneficial to the community. Ever since my announcement on Twitter months ago, highly effective "root hiding" modules (much MUCH better than MagiskHide) has been flourishing, which again shows that people are way more capable than I am on this subject. So why not give those determined their time to shine, and let me focus on improving Magisk instead of drowning in the everlasting cat-and-mouse game 😉.

    Sunsetting Magisk-Modules-Repo

    Due to lack of time and maintenance, the centralized Magisk-Modules-Repo was frozen, and the functionality to download modules from the repo is removed in v24.0. As a supplement, module developers can now specify an updateJson URL in their modules. The Magisk app will use that to check, download, and install module updates.

    Introducing Zygisk

    Zygisk is Magisk in Zygote, the next big thing for Magisk! When this feature is enabled, a part of Magisk will run in the Zygote daemon process, allowing module developers to run code directly in every Android apps' processes. If you've heard of Riru, then Zygisk is inspired by that project and is functionally similar, though the implementation is quite different internally. I cannot wait to see what module developers can achieve using Zygisk!

    Documentation

    For developers, details about updateJson and building Zygisk modules can all be found in the updated documentation.

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/24100.html b/releases/24100.html index ca61595d..434be668 100644 --- a/releases/24100.html +++ b/releases/24100.html @@ -3,22 +3,25 @@ - Magisk 中文文档 | Magisk 中文文档 + 2022.1.28 Magisk v24.1 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2022.1.28 Magisk v24.1

    For those coming from v24.0, v24.1 only has some minor app improvements. The following are copied from v24.0 release notes.

    It has been a while since the last public release, long time no see! A personal update for those unaware: I am now working at Google on the Android Platform Security team. Without further ado, let's jump right into it!

    MagiskHide Removal

    I have lost interest in fighting this battle for quite a while; plus, the existing MagiskHide implementation is flawed in so many ways. Decoupling Magisk from root hiding is, in my opinion, beneficial to the community. Ever since my announcement on Twitter months ago, highly effective "root hiding" modules (much MUCH better than MagiskHide) has been flourishing, which again shows that people are way more capable than I am on this subject. So why not give those determined their time to shine, and let me focus on improving Magisk instead of drowning in the everlasting cat-and-mouse game 😉.

    Sunsetting Magisk-Modules-Repo

    Due to lack of time and maintenance, the centralized Magisk-Modules-Repo was frozen, and the functionality to download modules from the repo is removed in v24.0. As a supplement, module developers can now specify an updateJson URL in their modules. The Magisk app will use that to check, download, and install module updates.

    Introducing Zygisk

    Zygisk is Magisk in Zygote, the next big thing for Magisk! When this feature is enabled, a part of Magisk will run in the Zygote daemon process, allowing module developers to run code directly in every Android apps' processes. If you've heard of Riru, then Zygisk is inspired by that project and is functionally similar, though the implementation is quite different internally. I cannot wait to see what module developers can achieve using Zygisk!

    Documentation

    For developers, details about updateJson and building Zygisk modules can all be found in the updated documentation.

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/24200.html b/releases/24200.html index 0d525aa5..8492f448 100644 --- a/releases/24200.html +++ b/releases/24200.html @@ -3,22 +3,25 @@ - Magisk 中文文档 | Magisk 中文文档 + 2022.3.1 Magisk v24.2 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2022.3.1 Magisk v24.2

    Maintenance release fixing various issues.

    • [MagiskSU] Fix buffer overflow
    • [MagiskSU] Fix owner managed multiuser superuser settings
    • [MagiskSU] Fix command logging when using su -c <cmd>
    • [MagiskSU] Prevent su request indefinite blocking
    • [MagiskBoot] Support lz4_legacy archive with multiple magic
    • [MagiskBoot] Fix lz4_lg compression
    • [DenyList] Allow targeting processes running as system UID
    • [Zygisk] Workaround Samsung's "early zygote"
    • [Zygisk] Improved Zygisk loading mechanism
    • [Zygisk] Fix application UID tracking
    • [Zygisk] Fix improper umask being set in zygote
    • [App] Fix BusyBox execution test
    • [App] Improve stub loading mechanism
    • [App] Major app upgrade flow improvements
    • [General] Improve commandline error handling and messaging

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/24300.html b/releases/24300.html index eddd19b1..37235ab6 100644 --- a/releases/24300.html +++ b/releases/24300.html @@ -3,22 +3,25 @@ - Magisk 中文文档 | Magisk 中文文档 + 2022.3.10 Magisk v24.3 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2022.3.10 Magisk v24.3

    For those coming from v24.1, check the full changelog for changes introduced in v24.2.

    • [General] Stop using getrandom syscall
    • [Zygisk] Update API to v3, adding new fields to AppSpecializeArgs
    • [App] Improve app repackaging installation workflow

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/25000.html b/releases/25000.html index fe7e800c..7470d427 100644 --- a/releases/25000.html +++ b/releases/25000.html @@ -3,22 +3,25 @@ - Magisk 中文文档 | Magisk 中文文档 + 2022.6.7 Magisk v25.0 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2022.6.7 Magisk v25.0

    Another major release! A lot of the changes aren't visible at the surface, but v25 is actually a really substantial upgrade!

    MagiskInit Rewrite

    A significant portion of magiskinit (the critical software that runs before your device boots up) is completely rewritten from scratch. Ever since Android introduced Project Treble in Android 8.0, Magisk has been constantly fighting against the increasingly complex partitioning and early mount setups of all kinds of devices, sometimes with weird OEM specific implementations. It got to a point that magiskinit had become so complicated that few people (including myself!) were aware of every detail, and maintaining this piece of software like this was clearly not sustainable. After many months of planning (yes, this whole re-architecture has been in my head for a long time) and some help from external contributors, a whole new sepolicy injection mechanism is introduced into Magisk, solving the "SELinux Problem" once and for all.

    Since this is a full paradigm shift on how Magisk hot-patch the device at boot, several behaviors that many developers implicitly relied on might not exist. For example, Magisk no longer patches fstabs in most scenarios, which means AVB will remain intact; some custom kernels rely on AVB being stripped out for them by Magisk.

    MagiskSU Security Enhancements

    The superuser functionality of Magisk has not seen much changes ever since its introduction. v25 focuses on making root permission management more accurate and secure:

    • Add a whole new package tracking system to ensure malicious UID reuse attack cannot be performed
    • Properly support and implement the UX in the Magisk app for packages using sharedUserId
    • Enforce root manager APK signature verification to combat the rampant unofficial Magisk app "mods"

    Many might not realize, but using a trusted, unmodified Magisk app is really important. Magisk's root daemon treats the Magisk app differently and gives it blanket root access without any restrictions. A modded Magisk app can potentially backdoor your device.

    And in case some of you are about to put on your tin foil hats, this is not designed to "vendor lock-in"; the goal is to make sure your root management app comes from the same developer of the underlying root implementation. Magisk's build system allows custom distributors to use its own signing keys, and in addition, I am also providing official debug builds which skips any signature verification for development.

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/25100.html b/releases/25100.html index 35f2961f..eceb77d9 100644 --- a/releases/25100.html +++ b/releases/25100.html @@ -3,22 +3,25 @@ - Magisk 中文文档 | Magisk 中文文档 + 2022.6.19 Magisk v25.1 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2022.6.19 Magisk v25.1

    v25.1 fixes some minor bugs over v25.0. The following are the same as v25.0 release notes.

    Another major release! A lot of the changes aren't visible at the surface, but v25 is actually a really substantial upgrade!

    MagiskInit Rewrite

    A significant portion of magiskinit (the critical software that runs before your device boots up) is completely rewritten from scratch. Ever since Android introduced Project Treble in Android 8.0, Magisk has been constantly fighting against the increasingly complex partitioning and early mount setups of all kinds of devices, sometimes with weird OEM specific implementations. It got to a point that magiskinit had become so complicated that few people (including myself!) were aware of every detail, and maintaining this piece of software like this was clearly not sustainable. After many months of planning (yes, this whole re-architecture has been in my head for a long time) and some help from external contributors, a whole new sepolicy injection mechanism is introduced into Magisk, solving the "SELinux Problem" once and for all.

    Since this is a full paradigm shift on how Magisk hot-patch the device at boot, several behaviors that many developers implicitly relied on might not exist. For example, Magisk no longer patches fstabs in most scenarios, which means AVB will remain intact; some custom kernels rely on AVB being stripped out for them by Magisk.

    MagiskSU Security Enhancements

    The superuser functionality of Magisk has not seen much changes ever since its introduction. v25 focuses on making root permission management more accurate and secure:

    • Add a whole new package tracking system to ensure malicious UID reuse attack cannot be performed
    • Properly support and implement the UX in the Magisk app for packages using sharedUserId
    • Enforce root manager APK signature verification to combat the rampant unofficial Magisk app "mods"

    Many might not realize, but using a trusted, unmodified Magisk app is really important. Magisk's root daemon treats the Magisk app differently and gives it blanket root access without any restrictions. A modded Magisk app can potentially backdoor your device.

    And in case some of you are about to put on your tin foil hats, this is not designed to "vendor lock-in"; the goal is to make sure your root management app comes from the same developer of the underlying root implementation. Magisk's build system allows custom distributors to use its own signing keys, and in addition, I am also providing official debug builds which skips any signature verification for development.

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/25200.html b/releases/25200.html index 6d0f4251..3327e677 100644 --- a/releases/25200.html +++ b/releases/25200.html @@ -3,22 +3,25 @@ - Magisk 中文文档 | Magisk 中文文档 + 2022.7.20 Magisk v25.2 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2022.7.20 Magisk v25.2

    Maintenance release fixing various issues.

    • [MagiskInit] Fix a potential issue when stub cpio is used
    • [MagiskInit] Fix reboot to recovery when stub cpio is used
    • [MagiskInit] Fix sepolicy.rules symlink for rootfs devices
    • [General] Better data encryption detection
    • [General] Move the whole logging infrastructure into Rust

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/26000.html b/releases/26000.html index 97707b71..95615e07 100644 --- a/releases/26000.html +++ b/releases/26000.html @@ -3,22 +3,25 @@ - Magisk 中文文档 | Magisk 中文文档 + 2023.4.5 Magisk v26.0 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2023.4.5 Magisk v26.0

    Hey! Long time no see!

    Bumping Minimum Android Version to 6.0

    Magisk's support for Android Lollipop has been pretty broken for a while without it being noticed. Also, none of the active developers of Magisk have actual hardware to run Android Lollipop. We rely on using the official Android emulator for regression testing on older platforms, however Google never shipped a Lollipop emulator image with SELinux support, leaving us with no option but to drop Lollipop support since we don't feel comfortable supporting Android Lollipop without adequate testing.

    New Magic Mount Implementation

    Magic Mount, the feature that make modules modify partitions, has gone through a major rewrite. The existing implementation doesn't work well with OEMs injecting overlays into their system using overlayfs. The new implementation fundamentally changes how filesystem mirrors are created, giving us a more accurate clone of the unmodified filesystem.

    New sepolicy.rule Implementation

    Magisk allows modules to provide custom SELinux patches by including the file sepolicy.rule. Due to the complicated nature of SELinux patching, the compatibility of this functionality has been pretty spotty; many devices are not supported. In this release, a brand new pre-init partition detection mechanism has been designed to support even more devices. Due to complicated reasons, this detection mechanism cannot be performed in a custom recovery environment.

    This means that any installation of Magisk v26+ using custom recovery will be incomplete; a subsequent re-installation through the Magisk app after booting up is required.

    Zygisk Updates

    The new Zygisk API v4 is now live! It comes with new features and a refined PLT function hook API. The implementaton of Zygisk has also gone through some major refactoring, including new code loading/unloading mechanisms and a new PLT function hook implementation.

    Head over to the Zygisk Module Sample repository to check out the new API and documentation!

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/26100.html b/releases/26100.html index 136e4564..a8204c31 100644 --- a/releases/26100.html +++ b/releases/26100.html @@ -3,22 +3,25 @@ - Magisk 中文文档 | Magisk 中文文档 + 2023.4.11 Magisk v26.1 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    2023.4.11 Magisk v26.1

    Changes from v26.0

    • [App] Fix crashing when revoking root permissions
    • [MagiskInit] Always prefer ext4 partitions over f2fs when selecting the pre-init partition
    • [General] Restore module files' context/owner/group from mirror. This is a regression introduced in v26.0

    (The following is the same as v26.0 release notes)

    Hey! Long time no see!

    Bumping Minimum Android Version to 6.0

    Magisk's support for Android Lollipop has been pretty broken for a while without it being noticed. Also, none of the active developers of Magisk have actual hardware to run Android Lollipop. We rely on using the official Android emulator for regression testing on older platforms, however Google never shipped a Lollipop emulator image with SELinux support, leaving us with no option but to drop Lollipop support since we don't feel comfortable supporting Android Lollipop without adequate testing.

    New Magic Mount Implementation

    Magic Mount, the feature that make modules modify partitions, has gone through a major rewrite. The existing implementation doesn't work well with OEMs injecting overlays into their system using overlayfs. The new implementation fundamentally changes how filesystem mirrors are created, giving us a more accurate clone of the unmodified filesystem.

    New sepolicy.rule Implementation

    Magisk allows modules to provide custom SELinux patches by including the file sepolicy.rule. Due to the complicated nature of SELinux patching, the compatibility of this functionality has been pretty spotty; many devices are not supported. In this release, a brand new pre-init partition detection mechanism has been designed to support even more devices. Due to complicated reasons, this detection mechanism cannot be performed in a custom recovery environment.

    This means that any installation of Magisk v26+ using custom recovery will be incomplete; a subsequent re-installation through the Magisk app after booting up is required.

    Zygisk Updates

    The new Zygisk API v4 is now live! It comes with new features and a refined PLT function hook API. The implementaton of Zygisk has also gone through some major refactoring, including new code loading/unloading mechanisms and a new PLT function hook implementation.

    Head over to the Zygisk Module Sample repository to check out the new API and documentation!

    Full Changelog: here

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file diff --git a/releases/26200.html b/releases/26200.html new file mode 100644 index 00000000..631e68ca --- /dev/null +++ b/releases/26200.html @@ -0,0 +1,27 @@ + + + + + + 2023.8.27 Magisk v26.2 | Magisk 中文文档 + + + + + + + + + + + + + + +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + + + + \ No newline at end of file diff --git a/releases/26300.html b/releases/26300.html new file mode 100644 index 00000000..bc081244 --- /dev/null +++ b/releases/26300.html @@ -0,0 +1,27 @@ + + + + + + 2023.9.4 Magisk v26.3 | Magisk 中文文档 + + + + + + + + + + + + + + +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + + + + \ No newline at end of file diff --git a/releases/index.html b/releases/index.html index bad593f5..a1b07023 100644 --- a/releases/index.html +++ b/releases/index.html @@ -5,20 +5,23 @@ 发布日志 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + - - + + \ No newline at end of file diff --git a/tools.html b/tools.html index e2a81853..8b606536 100644 --- a/tools.html +++ b/tools.html @@ -5,250 +5,483 @@ Magisk 工具 | Magisk 中文文档 - - + + + - - - - - - + + + + + + + -
    Skip to content
    本页内容

    Magisk 工具

    Magisk 为开发人员提供了大量安装工具、守护程序和实用程序。本文档涵盖了4个二进制文件和所有包含的小程序。二进制文件和小程序如下所示:

    txt
    magiskboot                 /* binary */
    -magiskinit                 /* binary */
    -magiskpolicy               /* binary */
    -supolicy -> magiskpolicy
    -magisk                     /* binary */
    -resetprop -> magisk
    -su -> magisk

    magiskboot

    一个用于解压缩/重新打包 boot 映像、解析/修补/解压缩 cpio 、修补 dtb 、十六进制修补二进制文件,以及使用多种算法压缩/解压缩文件的工具。

    magiskboot 支持常见的压缩格式(这意味着它不依赖于外部工具),包括 gziplz4lz4_legacy仅在LG上使用)、lzmaxzbzip2

    magiskboot 的概念是使 boot 映像修改更简单。对于解包,它解析标头并提取映像中的所有部分,如果在任何部分中检测到压缩,则会立即解压缩。对于重新打包,需要原始 boot 映像,以便可以使用原始标头,只需更改必要的内容,如节大小和校验和。如果需要,所有部分将被压缩回原始格式。该工具还支持许多 CPIO 和 DTB 操作。

    txt
    用法: ./magiskboot <操作> [参数...]
    -
    -支持的操作:
    -  unpack [-n] [-h] <bootimg>
    -      将 <bootimg> 解压缩到其各个组件,每个组件到一个文件,并在当前目录中具有相
    -    应的文件名。
    -      支持的组件:kernel、kernel_dtb、ramdisk.cpio、second、dtb、extra 和
    -    recovery_dtbo。
    -      默认情况下,每个组件将在写入输出文件之前即时自动解压缩。
    -      如果提供“-n”,则将跳过所有解压缩操作;每个组件将保持不变,以原始格式转储。
    -      如果提供了“-h”,则启动映像标头信息将转储到文件“header”,该文件可用于
    -    在重新打包期间修改标头配置。
    -
    -    返回值:
    -    0:valid    1:error    2:chromeos
    -
    -  repack [-n] <原始bootimg> [输出bootimg]
    -      使用当前目录中的文件将启动映像组件重新打包到 [输出bootimg],如果未指
    -    定,则为“new-boot.img”。
    -      <原始bootimg> 是用于解压缩组件的原始启动映像。
    -      默认情况下,每个组件将使用 <原始bootimg> 中检测到的相应格式自动压缩。如
    -    果当前目录中的组件文件已被压缩,则不会对该特定组件执行任何附加压缩。
    -      如果提供“-n”,则将跳过所有压缩操作。
    -    如果 env 变量 PATCHVBMETAFLAG 设置为 true,则将设置启动映像的 vbmeta
    -    header 中的所有禁用标志。
    -
    -  hexpatch <文件> <hexpattern1> <hexpattern2>
    -    在 <文件> 中搜索 <hexpattern1>,并将其替换为 <hexpattern2>
    -
    -  cpio <incpio> [命令...]
    -    对 <incpio> 执行 cpio 命令(修改已到位)
    -    每个命令都是一个参数,请为每个命令添加引号。
    -    支持的命令:
    -      exists ENTRY
    -        如果 ENTRY 存在,则返回 0,否则返回 1
    -      rm [-r] ENTRY
    -        删除 ENTRY,指定 [-r] 以递归删除
    -      mkdir MODE ENTRY
    -        在 MODE 权限下创建目录 ENTRY
    -      ln TARGET ENTRY
    -        使用名称 ENTRY 创建指向 TARGET 的符号链接
    -      mv SOURCE DEST
    -        将 SOURCE 移动到 DEST
    -      add MODE ENTRY INFILE
    -        在 MODE 权限中添加 INFILE 作为 ENTRY;替换 ENTRY(如果存在)
    -      extract [ENTRY OUT]
    -        将 ENTRY 解压到 OUT,或将所有条目解压到当前目录
    -      test
    -        测试 cpio 的状态
    -        返回值为0或或运算以下值:
    -        0x1:Magisk    0x2:unsupported    0x4:Sony
    -      patch
    -        应用 ramdisk 补丁
    -        用 env 变量进行配置:KEEPVERITY KEEPFORCEENCRYPT
    -      backup ORIG
    -        从 ORIG 创建 ramdisk 备份
    -      restore
    -        从 incpio 中存储的 ramdisk 备份恢复 ramdisk
    -      sha1
    -        如果以前已在 ramdisk 中备份,则输出原始引导SHA1
    -
    -  dtb <文件> <操作> [参数...]
    -    对 <文件> 执行与 dtb 相关的操作
    -    支持的操作:
    -      print [-f]
    -        打印 dtb 的所有内容以进行调试
    -        指定 [-f] 以仅打印 fstab 节点
    -      patch
    -        搜索 fstab 并删除 verity/avb
    -        直接对文件进行修改
    -        使用 env 变量进行配置:KEEPVERITY
    -      test
    -        测试 fstab 的状态
    -        返回值:
    -        0:valid    1:error
    -
    -  split <文件>
    -    将 image.*-dtb 拆分为 kernel + kernel_dtb
    -
    -  sha1 <文件>
    -    出 <文件> 的 SHA1 校验和
    -
    -  cleanup
    -    清理当前工作目录
    -
    -  compress[=格式] <输入文件> [输出文件]
    -    使用 [格式] 将 <输入文件> 压缩为 [输出文件]。
    -    可以是“-”,以作为 STDIN/STDOUT。
    -    如果未指定 [格式],则将使用 gzip。
    -    如果未指定 [输出文件],则 <输入文件> 将被替换为
    -    后缀为匹配文件扩展名的另一个文件。
    -    支持格式: gzip zopfli xz lzma bzip2 lz4 lz4_legacy lz4_lg 
    -
    -  decompress <输入文件> [输出文件]
    -    检测格式并将 <输入文件> 解压缩到 [输出文件]。
    -    <输入文件>/[输出文件] 可以是“-”,以作为 STDIN/STDOUT。
    -    如果未指定 [输出文件],则 <输入文件> 将替换为另一个文件,
    -    删除其文件格式文件扩展名。
    -    支持格式: gzip zopfli xz lzma bzip2 lz4 lz4_legacy lz4_lg

    magiskinit

    这个二进制文件将替换 Magisk 补丁启动映像的 ramdisk 中的 init。它最初是为支持以 system-as-root 的设备而创建的,但该工具被扩展为支持所有设备,并成为 Magisk 的关键部分。更多详细信息可以在 Micsk Booting Process 中的 Pre-Init 部分找到。

    magiskpolicy

    (此工具别名为 supolicy,以与 SuperSU 的 sepolicy 工具兼容)

    高级开发人员可以使用此工具修改 SELinux 策略。在像 Linux 服务器管理员这样的常见场景中,他们会直接修改 SELinux 策略源(*.te)并重新编译 sepolicy 二进制文件,但在 Android 上,我们直接修补二进制文件(或运行时策略)。

    Magisk 守护进程派生的所有进程,包括 root shell 及其所有分支,都在上下文 u:r:magisk:s0 中运行。所有安装了 Magisk 的系统上使用的规则都可以被视为官方的 sepolicy 具有以下补丁:magiskpolicy --magisk 'allow magisk * * *'

    txt
    用法: ./magiskpolicy [--选项...] [策略声明...]
    -
    -选项:
    -   --help            显示 policy 语句的帮助消息
    -   --load FILE       从 FILE 加载 sepolicy
    -   --load-split      从预编译的 sepolicy 加载或编译拆分的 cil 策略
    -   --compile-split   编译拆分的cil策略
    -   --save FILE       将整体策略转储到 FILE 文件
    -   --live            立即将 sepolicy 加载到内核中
    -   --magisk          应用内置 Magisk sepolicy 规则
    -   --apply FILE      应用 FILE 中的规则,作为策略语句逐行读取和分析
    -                     (允许多重 --apply)
    -
    -如果既没有指定 --load、--load-split,也没有指定 --compile-split,则它
    -将从当前活动策略(/sys/fs/selinux/policy)加载
    -
    -
    -一个策略声明应被视为一个参数,这意味着每个策略声明都应该用引号括起来。
    -可以在一个命令中提供多个策略语句。
    -
    -语句的格式为“<rule_name> [args...]”。
    -标有 (^) 的参数可以接受一个或多个条目。多个条目由大括号 ({}) 中的空格分隔列表组成。
    -标有 (*) 的参数与 (^) 相同,但另外支持 match-all 运算符 (*)。
    -
    -示例:"allow { s1 s2 } { t1 t2 } class *"
    -将扩展到:
    -
    -allow s1 t1 class { all-permissions-of-class }
    -allow s1 t2 class { all-permissions-of-class }
    -allow s2 t1 class { all-permissions-of-class }
    -allow s2 t2 class { all-permissions-of-class }
    -
    -支持的策略声明:
    -
    -"allow *source_type *target_type *class *perm_set"
    -"deny *source_type *target_type *class *perm_set"
    -"auditallow *source_type *target_type *class *perm_set"
    -"dontaudit *source_type *target_type *class *perm_set"
    -
    -"allowxperm *source_type *target_type *class operation xperm_set"
    -"auditallowxperm *source_type *target_type *class operation xperm_set"
    -"dontauditxperm *source_type *target_type *class operation xperm_set"
    -- 唯一支持的操作是“ioctl”
    -- xperm_set 格式为 “low-high”、“value”或“*”。
    -  “*”将被视为“0x0000-0xFFFF”。
    -  所有值应以十六进制书写。
    -
    -"permissive ^type"
    -"enforce ^type"
    -
    -"typeattribute ^type ^attribute"
    -
    -"type type_name ^(attribute)"
    -- 参数“attribute”是可选的,默认为“domain”
    -
    -"attribute attribute_name"
    -
    -"type_transition source_type target_type class default_type (object_name)"
    -- 参数“object_name”是可选的
    -
    -"type_change source_type target_type class default_type"
    -"type_member source_type target_type class default_type"
    -
    -"genfscon fs_name partial_path fs_context"

    magisk

    当使用名称 magisk 调用 magisk 二进制文件时,它作为一个实用工具,具有许多助手函数和几个 Magisk 服务的入口点。

    txt
    用法: magisk [小程序 [参数]...]
    -   或: magisk [选项]...
    -
    -选项:
    -   -c                        打印当前二进制版本
    -   -v                        打印正在运行的守护程序版本
    -   -V                        打印正在运行的守护程序版本号
    -   --list                    列出所有可用的小程序
    -   --remove-modules          移除所有模块并重新启动
    -   --install-module ZIP      安装模块 zip 文件
    -
    -高级选项(内部 APIs):
    -   --daemon                  手动启动 Magisk 守护进程
    -   --stop                    移除所有 Magisk 更改并停止守护程序
    -   --[init trigger]          初始化触发器上的回调。有效的触发器:
    -                             post-fs-data, service, boot-complete, zygote-restart
    -   --unlock-blocks           将所有块设备的 BLKROSET 标志设置为 OFF
    -   --restorecon              恢复 Magisk 文件上的 selinux 上下文
    -   --clone-attr SRC DEST     克隆权限、所有者和 selinux 上下文
    -   --clone SRC DEST          克隆 SRC 到 DEST
    -   --sqlite SQL              执行 SQL 命令到 Magisk 数据库
    -   --path                    打印 Magisk tmpfs 挂载路径
    -   --denylist ARGS           拒绝列表配置 CLI
    -
    -可用的小程序:
    -    su, resetprop
    -
    -用法: magisk --denylist [操作 [参数...] ]
    -操作:
    -   status          返回强制的状态
    -   enable          启用拒绝列表强制
    -   disable         禁用拒绝列表强制
    -   add PKG [PROC]  将新目标添加到拒绝列表
    -   rm PKG [PROC]   从拒绝列表中删除目标
    -   ls              打印当前拒绝列表
    -   exec CMDs...    在隔离的挂载命名空间中执行命令并执行
    -                   所有卸载操作

    su

    MagiskSU 入口点 magisk 的小程序。不错的旧 su 命令。

    txt
    用法: su [选项] [-] [user [参数...]]
    -
    -选项:
    -  -c, --command 命令         将命令传递给调用的 shell
    -  -h, --help                    显示此帮助消息并退出
    -  -, -l, --login                将 shell 伪装成一个登录 shell
    -  -m, -p,
    -  --preserve-environment        保护整个环境
    -  -s, --shell SHELL             使用 SHELL 而不是默认的 /system/bin/sh
    -  -v, --version                 显示版本名并退出
    -  -V                            显示版本号并退出
    -  -mm, -M,
    -  --mount-master                在全局装载命名空间中强制运行

    注意

    尽管上面没有列出 -Z, --context 选项,但该选项仍然存在,以便与为 SuperSU 设计的应用程序进行 CLI 兼容。然而,该选项被默默忽略,因为它不再相应。

    resetprop

    magisk 的小程序。高级系统属性操作实用程序。查看 Resetprop 详细信息 以了解更多背景信息。

    txt
    用法: resetprop [标志] [选项...]
    -
    -选项:
    -   -h, --help        显示此消息
    -   (no arguments)    输出所有属性
    -   NAME              获取 NAME 属性
    -   NAME VALUE        使用 VALUE 设置 NAME 属性
    -   --file FILE       从 FILE 加载属性
    -   --delete NAME     删除 NAME 属性
    -
    -标志:
    -   -v      将详细输出打印到 stderr
    -   -n      设置 props 而不经过 property_service
    -           (此标志仅影响 setprop)
    -   -p      从/向持久存储读取/写入属性
    -           (此标志仅影响 getprop 和 delprop)

    参考链接

    原始文档版本: 2023年05月13日
    在 GPL-3.0 许可下发布

    - +
    Skip to content

    原始 Magisk 文档版本: 2023年05月13日
    + 原始 Magisk Delta 文档版本: 2023年08月15日
    + 在 GPL-3.0 许可下发布

    + \ No newline at end of file